From e0efa21f219a30864325c645dd1ba53d794747ff Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Wed, 19 Aug 2020 13:56:28 +0200 Subject: [PATCH 01/17] Implement timecode metadata --- src/org/freedesktop/gstreamer/Buffer.java | 58 ++++++++--- src/org/freedesktop/gstreamer/Gst.java | 6 +- .../gstreamer/lowlevel/GstBufferAPI.java | 9 +- .../gstreamer/lowlevel/GstMetaApi.java | 97 +++++++++++++++++++ .../freedesktop/gstreamer/meta/GstMeta.java | 19 ++++ .../gstreamer/meta/GstMetaData.java | 28 ++++++ .../gstreamer/meta/GstMetaFlags.java | 34 +++++++ .../gstreamer/meta/GstVideoTimeCodeMeta.java | 49 ++++++++++ .../gstreamer/timecode/GstVideoTimeCode.java | 95 ++++++++++++++++++ .../timecode/GstVideoTimeCodeConfig.java | 63 ++++++++++++ .../timecode/GstVideoTimeCodeFlags.java | 35 +++++++ 11 files changed, 474 insertions(+), 19 deletions(-) create mode 100644 src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java create mode 100644 src/org/freedesktop/gstreamer/meta/GstMeta.java create mode 100644 src/org/freedesktop/gstreamer/meta/GstMetaData.java create mode 100644 src/org/freedesktop/gstreamer/meta/GstMetaFlags.java create mode 100644 src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java create mode 100644 src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java create mode 100644 src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java create mode 100644 src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index db0194bf..f73d6e9b 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -5,16 +5,16 @@ * Copyright (C) 2007 Wayne Meissner * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans - * + * * This file is part of gstreamer-java. * - * This code is free software: you can redistribute it and/or modify it under + * This code is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3 only, as * published by the Free Software Foundation. * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3 for more details. * * You should have received a copy of the GNU Lesser General Public License @@ -22,18 +22,19 @@ */ package org.freedesktop.gstreamer; -import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; - -import java.nio.ByteBuffer; - -import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; -import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; -import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; - import com.sun.jna.Pointer; +import java.nio.ByteBuffer; import java.util.EnumSet; import org.freedesktop.gstreamer.glib.NativeFlags; import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GNative; +import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; +import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; +import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; +import org.freedesktop.gstreamer.lowlevel.GstNative; +import org.freedesktop.gstreamer.meta.GstMetaData; +import org.freedesktop.gstreamer.meta.GstVideoTimeCodeMeta; +import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; /** * Buffers are the basic unit of data transfer in GStreamer. They contain the @@ -252,6 +253,37 @@ public EnumSet getFlags() { return NativeFlags.fromInt(BufferFlags.class, nativeInt); } + /** + * Get the time code metadata for buffer. When there is no such metadata, NULL is returned. + * + * @return return time code (SMPTE) for current buffer + */ + public GstVideoTimeCodeMeta getVideoTimeCodeMeta() { + return new GstVideoTimeCodeMeta(GSTBUFFER_API.gst_buffer_get_meta(this, GstMetaData.VIDEO_TIME_CODE_META.getType())); + } + + + /** + * Check if buffer contains selected type of metadata + * + * @param gstMetaData type of metadata + * @return return true only if buffer contains selected type of metadata + */ + public boolean containsMetadata(GstMetaData gstMetaData) { + return getNumberOfMeta(gstMetaData) > 0; + } + + /** + * Check number of metadata for selected type. There can be more metadata in case multiple video/audio layer + * + * @param gstMetaData type of metadata + * @return return number of metadata + */ + public int getNumberOfMeta(GstMetaData gstMetaData) { + return GSTBUFFER_API.gst_buffer_get_n_meta(this, gstMetaData.getType()); + } + + /** * Set some of the GstBufferFlags describing this buffer. This is a union * operation and does not clear flags that are not mentioned. diff --git a/src/org/freedesktop/gstreamer/Gst.java b/src/org/freedesktop/gstreamer/Gst.java index 23fb2da9..58d40f89 100644 --- a/src/org/freedesktop/gstreamer/Gst.java +++ b/src/org/freedesktop/gstreamer/Gst.java @@ -19,6 +19,7 @@ */ package org.freedesktop.gstreamer; +import org.freedesktop.gstreamer.meta.GstMeta; import org.freedesktop.gstreamer.query.Query; import org.freedesktop.gstreamer.message.Message; import org.freedesktop.gstreamer.event.Event; @@ -59,6 +60,7 @@ import static org.freedesktop.gstreamer.lowlevel.GstParseAPI.GSTPARSE_API; import static org.freedesktop.gstreamer.glib.Natives.registration; import static org.freedesktop.gstreamer.lowlevel.GlibAPI.GLIB_API; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; import org.freedesktop.gstreamer.webrtc.WebRTC; /** @@ -648,7 +650,9 @@ private static synchronized void loadAllClasses() { new Query.Types(), new Controllers(), new Elements(), - new WebRTC.Types()) + new WebRTC.Types(), + new GstMeta(), + new GstVideoTimeCode.TimeTypes()) .flatMap(NativeObject.TypeProvider::types) .forEachOrdered(GstTypes::register); if (!DISABLE_EXTERNAL) { diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java index b0dce298..42626b25 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java @@ -20,15 +20,13 @@ package org.freedesktop.gstreamer.lowlevel; +import com.sun.jna.NativeLong; +import com.sun.jna.Pointer; import java.util.Arrays; import java.util.List; - import org.freedesktop.gstreamer.Buffer; import org.freedesktop.gstreamer.lowlevel.GstMiniObjectAPI.MiniObjectStruct; import org.freedesktop.gstreamer.lowlevel.annotations.CallerOwnsReturn; - -import com.sun.jna.NativeLong; -import com.sun.jna.Pointer; import static org.freedesktop.gstreamer.lowlevel.GstAPI.GST_PADDING; /** @@ -104,7 +102,8 @@ protected List getFieldOrder() { void gst_buffer_unmap(Buffer buffer, MapInfoStruct info); int gst_buffer_n_memory(Buffer buffer); boolean gst_buffer_map_range(Buffer buffer, int idx, int length, MapInfoStruct info, int flags); - + Pointer gst_buffer_get_meta(Buffer buffer, GType gType); + int gst_buffer_get_n_meta(Buffer buffer,GType gType); // re-introduces in gstreamer 1.9 int gst_buffer_get_flags(Buffer buffer); boolean gst_buffer_set_flags(Buffer buffer, int flags); diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java new file mode 100644 index 00000000..340934e3 --- /dev/null +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java @@ -0,0 +1,97 @@ +package org.freedesktop.gstreamer.lowlevel; + +import com.sun.jna.Library; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; + +/** + * @author Jokertwo + */ +public interface GstMetaApi extends Library { + GstMetaApi GST_META_API = GstNative.load("gstvideo", GstMetaApi.class); + + GType gst_video_time_code_meta_api_get_type(); + + GType gst_video_crop_meta_api_get_type(); + + GType gst_video_gl_texture_upload_meta_api_get_type(); + + GType gst_video_meta_api_get_type(); + + GType gst_video_region_of_interest_meta_api_get_type(); + + GstMetaInfo gst_video_time_code_meta_get_info(); + + + @Structure.FieldOrder({"meta", "tc"}) + class GstVideoTimeCodeMetaStruct extends Structure { + public GstMetaStruct.ByValue meta; + public GstVideoTimeCodeStruct.ByValue tc; + + public GstVideoTimeCodeMetaStruct(Pointer p) { + super(p); + read(); + } + } + + @Structure.FieldOrder({"config", "hours", "minutes", "seconds", "frames", "field_count"}) + class GstVideoTimeCodeStruct extends Structure { + public static class ByValue extends GstVideoTimeCodeStruct implements Structure.ByValue { + } + + public GstVideoTimeCodeConfigStruct.ByValue config; + public int hours; + public int minutes; + public int seconds; + public int frames; + public int field_count; + + public GstVideoTimeCodeStruct() { + } + + public GstVideoTimeCodeStruct(Pointer p) { + super(p); + read(); + } + } + + @Structure.FieldOrder({"flags", "info"}) + class GstMetaStruct extends Structure { + public static final class ByValue extends GstMetaStruct implements Structure.ByValue { + } + + public long flags; + public GstMetaInfo.ByReference info; + } + + @Structure.FieldOrder({"api", "type", "size"}) + class GstMetaInfo extends Structure { + public static class ByReference extends GstMetaInfo implements Structure.ByReference { + } + + public GType api; + public GType type; + public long size; + } + + @Structure.FieldOrder({"fps_n", "fps_d", "flags", "latest_daily_jam"}) + class GstVideoTimeCodeConfigStruct extends Structure { + public static class ByValue extends GstVideoTimeCodeConfigStruct implements Structure.ByValue { + } + + public int fps_n; + public int fps_d; + public GstVideoTimeCodeFlags flags; + public Pointer latest_daily_jam; + + public GstVideoTimeCodeConfigStruct() { + } + + public GstVideoTimeCodeConfigStruct(Pointer p) { + super(p); + read(); + } + } + +} diff --git a/src/org/freedesktop/gstreamer/meta/GstMeta.java b/src/org/freedesktop/gstreamer/meta/GstMeta.java new file mode 100644 index 00000000..d0fd8935 --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/GstMeta.java @@ -0,0 +1,19 @@ +package org.freedesktop.gstreamer.meta; + +import java.util.stream.Stream; +import org.freedesktop.gstreamer.glib.NativeObject; +import static org.freedesktop.gstreamer.glib.Natives.registration; + +/** + * @author Jokertwo + */ +public class GstMeta implements NativeObject.TypeProvider { + + @Override + public Stream> types() { + return Stream.of( + registration(GstVideoTimeCodeMeta.class, + GstVideoTimeCodeMeta.GTYPE_NAME, + GstVideoTimeCodeMeta::new)); + } +} diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaData.java b/src/org/freedesktop/gstreamer/meta/GstMetaData.java new file mode 100644 index 00000000..07bda1db --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/GstMetaData.java @@ -0,0 +1,28 @@ +package org.freedesktop.gstreamer.meta; + +import java.util.function.Supplier; +import org.freedesktop.gstreamer.lowlevel.GType; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; + +/** + * Gst meta data GTypes + * @author Jokertwo + */ +public enum GstMetaData { + + VIDEO_CROP_META(GST_META_API::gst_video_crop_meta_api_get_type), + VIDEO_GL_TEXTURE_META(GST_META_API::gst_video_gl_texture_upload_meta_api_get_type), + VIDEO_META(GST_META_API::gst_video_meta_api_get_type), + VIDEO_REGION_OF_INTEREST(GST_META_API::gst_video_region_of_interest_meta_api_get_type), + VIDEO_TIME_CODE_META(GST_META_API::gst_video_time_code_meta_api_get_type); + + private final Supplier gTypeMetaSup; + + GstMetaData(Supplier gTypeMetaSup) { + this.gTypeMetaSup = gTypeMetaSup; + } + + public GType getType() { + return gTypeMetaSup.get(); + } +} diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java b/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java new file mode 100644 index 00000000..7bdf933f --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java @@ -0,0 +1,34 @@ +package org.freedesktop.gstreamer.meta; + +import org.freedesktop.gstreamer.glib.NativeEnum; +import org.freedesktop.gstreamer.glib.NativeFlags; + +/** + * @author Jokertwo + */ +public enum GstMetaFlags implements NativeEnum { + + GST_META_FLAG_NONE(0), // no flags + GST_META_FLAG_READONLY(1), // metadata should not be modified + GST_META_FLAG_POOLED(2), // metadata is managed by a bufferpool + GST_META_FLAG_LOCKED(4), // metadata should not be removed + GST_META_FLAG_LAST(65536); + + private final int value; + + GstMetaFlags(int value) { + this.value = value; + } + + /** + * Gets the integer value of the enum. + * + * @return The integer value for this enum. + */ + @Override + public int intValue() { + return value; + } + + +} diff --git a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java new file mode 100644 index 00000000..8d033268 --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java @@ -0,0 +1,49 @@ +package org.freedesktop.gstreamer.meta; + +import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.MiniObject; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfo; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; + +/** + * Extra buffer metadata describing the GstVideoTimeCode of the frame. + * @author Jokertwo + */ +public class GstVideoTimeCodeMeta extends MiniObject { + + public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; + private final GstVideoTimeCodeMetaStruct metaStruct; + private final GstVideoTimeCode timeCode; + + public GstVideoTimeCodeMeta(Pointer pointer) { + this(Natives.initializer(pointer,false,false)); + } + + GstVideoTimeCodeMeta(Initializer init) { + super(init); + metaStruct = new GstVideoTimeCodeMetaStruct(getRawPointer()); + timeCode = new GstVideoTimeCode(metaStruct.tc.getPointer()); + } + + /** + * Time code attach to frame + * + * @return return time code + */ + public GstVideoTimeCode getTimeCode() { + return timeCode; + } + + public GstMetaInfo getMetaInfo() { + return metaStruct.meta.info; + } + + @Override + public void disown() { + timeCode.disown(); + super.disown(); + } + +} diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java new file mode 100644 index 00000000..981079dc --- /dev/null +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java @@ -0,0 +1,95 @@ +package org.freedesktop.gstreamer.timecode; + +import com.sun.jna.Pointer; +import java.util.stream.Stream; +import org.freedesktop.gstreamer.MiniObject; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.glib.Natives; +import static org.freedesktop.gstreamer.glib.Natives.registration; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeStruct; + +/** + * A representation of a SMPTE time code. + * @author Jokertwo + */ +public class GstVideoTimeCode extends MiniObject { + + public static final String GTYPE_NAME = "GstVideoTimeCode"; + private final GstVideoTimeCodeStruct timeCodeStruct; + private final GstVideoTimeCodeConfig timeCodeConfig; + + public GstVideoTimeCode(Pointer pointer) { + this(Natives.initializer(pointer,false,false)); + } + + GstVideoTimeCode(Initializer init) { + super(init); + timeCodeStruct = new GstVideoTimeCodeStruct(getRawPointer()); + timeCodeConfig = new GstVideoTimeCodeConfig(timeCodeStruct.config.getPointer()); + } + + public GstVideoTimeCodeConfig getTCConfig() { + return timeCodeConfig; + } + + /** + * Hours field, must be less than 24 + * + * @return return number of hours + */ + public int getHours() { + return timeCodeStruct.hours; + } + + /** + * Minutes field, must be less than 60 + * + * @return return number of minutes + */ + public int getMinutes() { + return timeCodeStruct.minutes; + } + + /** + * Second field, must be less than 60 + * + * @return return number of seconds + */ + public int getSeconds() { + return timeCodeStruct.seconds; + } + + /** + * Frames field + * + * @return return number of seconds + */ + public int getFrames() { + return timeCodeStruct.frames; + } + + @Override + public String toString() { + return "GstVideoTimeCode{" + getHours() + ":" + getMinutes() + ":" + getSeconds() + ":" + getFrames() + ", timeconfig=" + timeCodeConfig + "}"; + } + + @Override + public void disown() { + timeCodeConfig.disown(); + super.disown(); + } + + public static final class TimeTypes implements NativeObject.TypeProvider { + + @Override + public Stream> types() { + return Stream.of( + registration(GstVideoTimeCode.class, + GstVideoTimeCode.GTYPE_NAME, + GstVideoTimeCode::new), + registration(GstVideoTimeCodeConfig.class, + GstVideoTimeCodeConfig.GTYPE_NAME, + GstVideoTimeCodeConfig::new)); + } + } +} diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java new file mode 100644 index 00000000..c372dacd --- /dev/null +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java @@ -0,0 +1,63 @@ +package org.freedesktop.gstreamer.timecode; + +import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.MiniObject; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; + +/** + * The configuration of the time code. + * @author Jokertwo + */ +public class GstVideoTimeCodeConfig extends MiniObject { + + public static final String GTYPE_NAME = "GstVideoTimeCodeConfig"; + private final GstVideoTimeCodeConfigStruct timeCodeConfig; + + public GstVideoTimeCodeConfig(Pointer pointer) { + this(Natives.initializer(pointer,false,false)); + } + + GstVideoTimeCodeConfig(Initializer init) { + super(init); + timeCodeConfig = new GstVideoTimeCodeConfigStruct(getRawPointer()); + } + + /** + * The corresponding {@link GstVideoTimeCodeFlags} + * + * @return return flag for current timecode + */ + public GstVideoTimeCodeFlags getTimeCodeFlags() { + return timeCodeConfig.flags; + } + + /** + * Numerator of the frame rate + * + * @return return positive number + */ + public int getFramerateNumerator() { + return timeCodeConfig.fps_n; + } + + /** + * Denominator of the frame rate + * + * @return return positive number + */ + public int getFramerateDenominator() { + return timeCodeConfig.fps_d; + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("GstVideoTimeCodeConfig{"); + sb.append("flags=").append(getTimeCodeFlags()) + .append(", numerator=").append(getFramerateNumerator()) + .append(", denominator=").append(getFramerateDenominator()) + .append('}'); + return sb.toString(); + } +} diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java new file mode 100644 index 00000000..e9cd614a --- /dev/null +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java @@ -0,0 +1,35 @@ +package org.freedesktop.gstreamer.timecode; + +import org.freedesktop.gstreamer.glib.NativeFlags; + +/** + * Flags related to the time code information. For drop frame, only 30000/1001 and 60000/1001 frame rates are supported. + * + * @author Jokertwo + */ +public enum GstVideoTimeCodeFlags implements NativeFlags { + /** + * No flags + */ + GST_VIDEO_TIME_CODE_FLAGS_NONE(0), // No flags + /** + * Whether we have drop frame rate + */ + GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME(1), + /** + * Whether we have interlaced video + */ + GST_VIDEO_TIME_CODE_FLAGS_INTERLACED(2); + + + private final int value; + + GstVideoTimeCodeFlags(int value) { + this.value = value; + } + + @Override + public int intValue() { + return value; + } +} From 984421434b1fd1aa0de8327dfaa67ccc38572c3e Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Wed, 19 Aug 2020 13:57:02 +0200 Subject: [PATCH 02/17] added test for timecode metadata --- .../freedesktop/gstreamer/SampleTester.java | 49 +++-- .../lowlevel/LowLevelStructureTest.java | 26 ++- .../gstreamer/meta/GstMetaDataTest.java | 47 +++++ .../gstreamer/meta/GstTimeCodeMetaTest.java | 184 ++++++++++++++++++ .../timecode/GstVideoTimeCodeConfigTest.java | 44 +++++ .../timecode/GstVideoTimeCodeFlagsTest.java | 40 ++++ .../timecode/GstVideoTimeCodeTest.java | 66 +++++++ 7 files changed, 432 insertions(+), 24 deletions(-) create mode 100644 test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java create mode 100644 test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java create mode 100644 test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java create mode 100644 test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java create mode 100644 test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java diff --git a/test/org/freedesktop/gstreamer/SampleTester.java b/test/org/freedesktop/gstreamer/SampleTester.java index 32489da1..a9468bc1 100644 --- a/test/org/freedesktop/gstreamer/SampleTester.java +++ b/test/org/freedesktop/gstreamer/SampleTester.java @@ -1,6 +1,6 @@ -/* +/* * Copyright (c) 2020 John Cortell - * + * * This file is part of gstreamer-java. * * gstreamer-java is free software: you can redistribute it and/or modify @@ -19,18 +19,17 @@ package org.freedesktop.gstreamer; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; - import java.util.ArrayList; import java.util.function.Consumer; - import org.freedesktop.gstreamer.elements.AppSink; import org.freedesktop.gstreamer.glib.GError; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; /** * Utility class for unit testing API that operates on a Sample. - * + *

* Call {@link SampleTester#test(Consumer)} and pass a callback which will * perform the test on a Sample it is supplied. The callback runs on the * AppSink.NEW_SAMPLE thread. The sample is produced by a simple, ephemeral @@ -38,21 +37,42 @@ */ public class SampleTester { public static void test(Consumer callback) { - new SampleTester(callback); + test(callback, "videotestsrc ! videoconvert ! appsink name=myappsink"); + } + + public static void test(Consumer callback, String pipelineDescription) { + new SampleTester(callback, pipelineDescription, 0); + } + + public static void test(Consumer callback, String pipelineDescription, int skipFrames) { + new SampleTester(callback, pipelineDescription, skipFrames); } private static class NewSampleListener implements AppSink.NEW_SAMPLE { private Consumer callback; - Throwable exception; + private final int skipFrames; + private Throwable exception; + private int counter = 0; + NewSampleListener(Consumer callback) { + this(callback, 0); + } + + NewSampleListener(Consumer callback, int skip) { this.callback = callback; + skipFrames = skip; } @Override public FlowReturn newSample(AppSink appSink) { if (callback != null) { Sample sample = appSink.pullSample(); + if (counter < skipFrames) { + counter++; + sample.dispose(); + return FlowReturn.OK; + } try { // Run the client's test logic on the sample (only once) try { @@ -74,16 +94,17 @@ public FlowReturn newSample(AppSink appSink) { } } - private SampleTester(Consumer callback) { + private SampleTester(Consumer callback, String pipelineDescription, int skipFrames) { + assertNotNull("Pipeline description can not be null", pipelineDescription); + assertFalse("Pipeline description can not be empty", pipelineDescription.isEmpty()); ArrayList errors = new ArrayList(); - String pipeline_descr = "videotestsrc ! videoconvert ! appsink name=myappsink"; - Bin bin = Gst.parseBinFromDescription(pipeline_descr, false, errors); + Bin bin = Gst.parseBinFromDescription(pipelineDescription, false, errors); assertNotNull("Unable to create Bin from pipeline description: ", bin); AppSink appSink = (AppSink)bin.getElementByName("myappsink"); appSink.set("emit-signals", true); - NewSampleListener sampleListener = new NewSampleListener(callback); + NewSampleListener sampleListener = new NewSampleListener(callback, skipFrames); appSink.connect(sampleListener); bin.play(); @@ -99,7 +120,7 @@ private SampleTester(Consumer callback) { } bin.stop(); - appSink.disconnect(sampleListener); + appSink.disconnect(sampleListener); // If the test threw an exception on the sample listener thread, throw it here // (on the main thread) diff --git a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java index c69851d3..8257bd1c 100644 --- a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java +++ b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java @@ -1,26 +1,23 @@ package org.freedesktop.gstreamer.lowlevel; -import static org.junit.Assert.assertTrue; - +import com.sun.jna.Structure; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; - +import org.freedesktop.gstreamer.Gst; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; - -import com.sun.jna.Structure; -import org.freedesktop.gstreamer.Gst; +import static org.junit.Assert.assertTrue; /** - * * @author Neil C Smith */ public class LowLevelStructureTest { @@ -88,9 +85,14 @@ private void testStruct(Class struct) { } try { - Method getFieldOrder = inst.getClass().getDeclaredMethod("getFieldOrder"); - getFieldOrder.setAccessible(true); - fields = (List) getFieldOrder.invoke(inst); + Structure.FieldOrder fieldOrder = inst.getClass().getAnnotation(Structure.FieldOrder.class); + if (fieldOrder != null) { + fields = Arrays.asList(fieldOrder.value()); + } else { + Method getFieldOrder = inst.getClass().getDeclaredMethod("getFieldOrder"); + getFieldOrder.setAccessible(true); + fields = (List) getFieldOrder.invoke(inst); + } } catch (Exception ex) { LOG.log(Level.SEVERE, "Can't find getFieldOrder() method", ex); assertTrue(false); @@ -164,6 +166,10 @@ private static void initStructList() { structs.add(GstElementAPI.GstElementClass.class); structs.add(GstEventAPI.EventStruct.class); + structs.add(GstMetaApi.GstVideoTimeCodeMetaStruct.class); + structs.add(GstMetaApi.GstVideoTimeCodeStruct.class); + structs.add(GstMetaApi.GstMetaInfo.class); + structs.add(GstMetaApi.GstMetaStruct.class); // structs.add(GstInterpolationControlSourceAPI.GstInterpolationControlSourceStruct.class); // structs.add(GstInterpolationControlSourceAPI.GstInterpolationControlSourceClass.class); diff --git a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java b/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java new file mode 100644 index 00000000..10275616 --- /dev/null +++ b/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java @@ -0,0 +1,47 @@ +package org.freedesktop.gstreamer.meta; + +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.freedesktop.gstreamer.Gst; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import static org.junit.Assert.assertNotNull; + +/** + * @author Jokertwo + */ +@RunWith(Parameterized.class) +public class GstMetaDataTest { + + @Parameterized.Parameters + public static Collection data() { + return Stream.of(GstMetaData.values()).map(gstMetaData -> new Object[]{gstMetaData}).collect(Collectors.toList()); + } + + private final GstMetaData gstMetaData; + + @BeforeClass + public static void beforeClass() { + Gst.init(); + } + + @AfterClass + public static void afterClass() { + Gst.deinit(); + } + + public GstMetaDataTest(GstMetaData gstMetaData) { + this.gstMetaData = gstMetaData; + } + + + @Test + public void testGetType() { + assertNotNull(gstMetaData.getType()); + System.out.println(gstMetaData.getType()); + } +} \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java new file mode 100644 index 00000000..9ebb3e36 --- /dev/null +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -0,0 +1,184 @@ +package org.freedesktop.gstreamer.meta; + +import org.freedesktop.gstreamer.Buffer; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.SampleTester; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeConfig; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; +import static org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * @author Jokertwo + */ +public class GstTimeCodeMetaTest { + + @BeforeClass + public static void beforeClass() { + Gst.init(); + } + + @AfterClass + public static void afterClass() { + Gst.deinit(); + } + + @Test + public void testVideoWithoutMeta() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertFalse("Default video not contains region metadata", buffer.containsMetadata(GstMetaData.VIDEO_REGION_OF_INTEREST)); + assertFalse("Default video not contains metadata", buffer.containsMetadata(GstMetaData.VIDEO_META)); + assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(GstMetaData.VIDEO_GL_TEXTURE_META)); + assertFalse("Default video not contains crop metadata", buffer.containsMetadata(GstMetaData.VIDEO_CROP_META)); + }, "videotestsrc do-timestamp=true ! x264enc ! mxfmux ! decodebin ! appsink name=myappsink"); + } + + /** + * Contains video meta + */ + @Test + public void testVideoMeta() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertFalse("Default video not contains region metadata", buffer.containsMetadata(GstMetaData.VIDEO_REGION_OF_INTEREST)); + assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(GstMetaData.VIDEO_GL_TEXTURE_META)); + assertFalse("Default video not contains crop metadata", buffer.containsMetadata(GstMetaData.VIDEO_CROP_META)); + assertTrue(buffer.containsMetadata(GstMetaData.VIDEO_META)); + }, "videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! appsink name=myappsink"); + } + + /** + * Contains video meta + */ + @Test + public void testVideoCropMeta() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertFalse("Default video not contains region metadata", buffer.containsMetadata(GstMetaData.VIDEO_REGION_OF_INTEREST)); + assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(GstMetaData.VIDEO_GL_TEXTURE_META)); + assertFalse("Default video not contains crop metadata", buffer.containsMetadata(GstMetaData.VIDEO_CROP_META)); + assertFalse("Default video not contains metadata", buffer.containsMetadata(GstMetaData.VIDEO_META)); + }, "videotestsrc ! videoscale !" + + " appsink name=myappsink"); + } + + @Test + public void testVideoTimeCodeMetaPal() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + + GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + assertNotNull(meta); + GstVideoTimeCode timeCode = meta.getTimeCode(); + + //first frame 00:00:00:00 + assertEquals(0, timeCode.getHours()); + assertEquals(0, timeCode.getMinutes()); + assertEquals(0, timeCode.getSeconds()); + assertEquals(0, timeCode.getFrames()); + + GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + // PAL standard 25/1 + assertEquals(25, timeCodeConfig.getFramerateNumerator()); + assertEquals(1, timeCodeConfig.getFramerateDenominator()); + assertEquals(GST_VIDEO_TIME_CODE_FLAGS_NONE, timeCodeConfig.getTimeCodeFlags()); + + + meta.disown(); + }, "videotestsrc ! video/x-raw,framerate=25/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); + } + + @Test + public void testVideoTimeCodeNTSCDrop() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + + GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + assertNotNull(meta); + GstVideoTimeCode timeCode = meta.getTimeCode(); + + //first frame 00:00:00;00 + assertEquals(0, timeCode.getHours()); + assertEquals(0, timeCode.getMinutes()); + assertEquals(0, timeCode.getSeconds()); + assertEquals(0, timeCode.getFrames()); + + GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + // NTSC drop standard 30000/1001 + assertEquals(30000, timeCodeConfig.getFramerateNumerator()); + assertEquals(1001, timeCodeConfig.getFramerateDenominator()); + assertEquals(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, timeCodeConfig.getTimeCodeFlags()); + + meta.disown(); + + }, "videotestsrc ! video/x-raw,framerate=30000/1001 ! timecodestamper drop-frame=true ! videoconvert ! appsink name=myappsink"); + } + + /** + * Handle last frame of first minute + */ + @Test + public void testVideoTimeCodeNTSCDropFrame() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + + GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + assertNotNull(meta); + GstVideoTimeCode timeCode = meta.getTimeCode(); + + //first frame 00:00:00;29 + assertEquals(0, timeCode.getHours()); + assertEquals(0, timeCode.getMinutes()); + assertEquals(0, timeCode.getSeconds()); + assertEquals(29, timeCode.getFrames()); + + GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + // NTSC drop standard 30000/1001 + assertEquals(30000, timeCodeConfig.getFramerateNumerator()); + assertEquals(1001, timeCodeConfig.getFramerateDenominator()); + assertEquals(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, timeCodeConfig.getTimeCodeFlags()); + }, "videotestsrc ! video/x-raw,framerate=30000/1001 ! videoconvert ! timecodestamper drop-frame=true ! videoconvert ! appsink name=myappsink", 29); + } + + @Test + public void testVideoTimeCodeNTSCNonDrop() { + SampleTester.test(sample -> { + Buffer buffer = sample.getBuffer(); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + + GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + assertNotNull(meta); + GstVideoTimeCode timeCode = meta.getTimeCode(); + + //first frame 00:00:00:00 + assertEquals(0, timeCode.getHours()); + assertEquals(0, timeCode.getMinutes()); + assertEquals(0, timeCode.getSeconds()); + assertEquals(0, timeCode.getFrames()); + + GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + // NTSC drop standard 30/1 + assertEquals(30, timeCodeConfig.getFramerateNumerator()); + assertEquals(1, timeCodeConfig.getFramerateDenominator()); + assertEquals(GST_VIDEO_TIME_CODE_FLAGS_NONE, timeCodeConfig.getTimeCodeFlags()); + + meta.disown(); + + }, "videotestsrc ! video/x-raw,framerate=30/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); + } +} diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java new file mode 100644 index 00000000..894789f9 --- /dev/null +++ b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java @@ -0,0 +1,44 @@ +package org.freedesktop.gstreamer.timecode; + +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.lowlevel.GstMetaApi; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +/** + * @author Jokertwo + */ +public class GstVideoTimeCodeConfigTest { + private GstMetaApi.GstVideoTimeCodeConfigStruct origStruct; + private GstVideoTimeCodeConfig codeConfig; + + + @Before + public void setUp() { + origStruct = new GstMetaApi.GstVideoTimeCodeConfigStruct(); + origStruct.fps_d = 25; + origStruct.fps_n = 1; + origStruct.flags = GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; + origStruct.write(); + + codeConfig = new GstVideoTimeCodeConfig(origStruct.getPointer()); + } + + @Test + public void testGetTimeCodeFlags() { + assertEquals(origStruct.flags, codeConfig.getTimeCodeFlags()); + } + + @Test + public void testGetFramerateNumerator() { + assertEquals(origStruct.fps_n, codeConfig.getFramerateNumerator()); + } + + @Test + public void testGetFramerateDenominator() { + assertEquals(origStruct.fps_d, codeConfig.getFramerateDenominator()); + } +} \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java new file mode 100644 index 00000000..a33c5686 --- /dev/null +++ b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java @@ -0,0 +1,40 @@ +package org.freedesktop.gstreamer.timecode; + +import java.util.Arrays; +import java.util.Collection; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * @author Jokertwo + */ +@RunWith(Parameterized.class) +public class GstVideoTimeCodeFlagsTest { + + private final GstVideoTimeCodeFlags flags; + private final int intValue; + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList( + new Object[][]{ + {GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE, 0}, + {GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, 1}, + {GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_INTERLACED, 2} + }); + } + + public GstVideoTimeCodeFlagsTest(GstVideoTimeCodeFlags flags, int intValue) { + this.flags = flags; + this.intValue = intValue; + } + + @Test + public void testIntValue() { + assertEquals(intValue,flags.intValue()); + } +} \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java new file mode 100644 index 00000000..ff6d190d --- /dev/null +++ b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java @@ -0,0 +1,66 @@ +package org.freedesktop.gstreamer.timecode; + +import org.freedesktop.gstreamer.lowlevel.GstMetaApi; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author Jokertwo + */ +public class GstVideoTimeCodeTest { + + + private GstMetaApi.GstVideoTimeCodeStruct timeCodeStruct; + private GstMetaApi.GstVideoTimeCodeConfigStruct.ByValue configStruct; + + private GstVideoTimeCode timeCode; + + @Before + public void setUp() { + timeCodeStruct = new GstMetaApi.GstVideoTimeCodeStruct(); + configStruct = new GstMetaApi.GstVideoTimeCodeConfigStruct.ByValue(); + + // 01:02:03:04 + timeCodeStruct.hours = 1; + timeCodeStruct.minutes = 2; + timeCodeStruct.seconds = 3; + timeCodeStruct.frames = 4; + + timeCodeStruct.field_count = 55; + + // config + timeCodeStruct.config = configStruct; + + timeCodeStruct.write(); + timeCode = new GstVideoTimeCode(timeCodeStruct.getPointer()); + + + } + + @Test + public void testGetTCConfig() { + assertNotNull(timeCode.getTCConfig()); + } + + @Test + public void testGetHours() { + assertEquals(1,timeCode.getHours()); + } + + @Test + public void testGetMinutes() { + assertEquals(2,timeCode.getMinutes()); + } + + @Test + public void testGetSeconds() { + assertEquals(3,timeCode.getSeconds()); + } + + @Test + public void testGetFrames() { + assertEquals(4,timeCode.getFrames()); + } +} \ No newline at end of file From 378b8751169e1e8f7e4a3e58c6b59c247e4cd50c Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Mon, 24 Aug 2020 11:54:27 +0200 Subject: [PATCH 03/17] Add metadata info structure and objects --- .../gstreamer/lowlevel/GstMetaApi.java | 15 ++++-- .../freedesktop/gstreamer/meta/GstMeta.java | 5 +- .../gstreamer/meta/GstMetaInfo.java | 48 +++++++++++++++++++ .../gstreamer/meta/GstVideoTimeCodeMeta.java | 11 +++-- .../lowlevel/LowLevelStructureTest.java | 2 +- 5 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 src/org/freedesktop/gstreamer/meta/GstMetaInfo.java diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java index 340934e3..657b9e7b 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java @@ -3,6 +3,7 @@ import com.sun.jna.Library; import com.sun.jna.Pointer; import com.sun.jna.Structure; +import org.freedesktop.gstreamer.meta.GstMetaInfo; import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; /** @@ -62,12 +63,20 @@ public static final class ByValue extends GstMetaStruct implements Structure.ByV } public long flags; - public GstMetaInfo.ByReference info; + public GstMetaInfoStruct.ByReference info; } @Structure.FieldOrder({"api", "type", "size"}) - class GstMetaInfo extends Structure { - public static class ByReference extends GstMetaInfo implements Structure.ByReference { + class GstMetaInfoStruct extends Structure { + public static class ByReference extends GstMetaInfoStruct implements Structure.ByReference { + } + + public GstMetaInfoStruct() { + } + + public GstMetaInfoStruct(Pointer p) { + super(p); + read(); } public GType api; diff --git a/src/org/freedesktop/gstreamer/meta/GstMeta.java b/src/org/freedesktop/gstreamer/meta/GstMeta.java index d0fd8935..1e0c3cbf 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstMeta.java @@ -14,6 +14,9 @@ public Stream> types() { return Stream.of( registration(GstVideoTimeCodeMeta.class, GstVideoTimeCodeMeta.GTYPE_NAME, - GstVideoTimeCodeMeta::new)); + GstVideoTimeCodeMeta::new), + registration(GstMetaInfo.class, + GstMetaInfo.GTYPE_NAME, + GstMetaInfo::new)); } } diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java b/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java new file mode 100644 index 00000000..790ea6f6 --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java @@ -0,0 +1,48 @@ +package org.freedesktop.gstreamer.meta; + +import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.MiniObject; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GType; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfoStruct; + +/** + * The GstMetaInfo provides information about a specific metadata structure. + * + * @author Jokertwo + * @see GstMetaInfo + */ +public class GstMetaInfo extends MiniObject { + + public static final String GTYPE_NAME = "GstMetaInfo"; + private GstMetaInfoStruct metaStruct; + + public GstMetaInfo(Pointer pointer) { + this(Natives.initializer(pointer, false, false)); + } + + + GstMetaInfo(Initializer init) { + super(init); + metaStruct = new GstMetaInfoStruct(getRawPointer()); + } + + /** + * Type identifying the implementor of the api + * + * @return return dynamic GType + */ + public GType getGType() { + return this.metaStruct.type; + } + + /** + * Tag identifying the metadata structure and api + * + * @return return dynamic api type + */ + public GType getApiType() { + return this.metaStruct.api; + } + +} diff --git a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java index 8d033268..821c9b88 100644 --- a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java @@ -4,7 +4,7 @@ import org.freedesktop.gstreamer.MiniObject; import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfo; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; /** @@ -18,7 +18,7 @@ public class GstVideoTimeCodeMeta extends MiniObject { private final GstVideoTimeCode timeCode; public GstVideoTimeCodeMeta(Pointer pointer) { - this(Natives.initializer(pointer,false,false)); + this(Natives.initializer(pointer, false, false)); } GstVideoTimeCodeMeta(Initializer init) { @@ -36,8 +36,13 @@ public GstVideoTimeCode getTimeCode() { return timeCode; } + /** + * Information about metadata + * + * @return return structure with information about metadata + */ public GstMetaInfo getMetaInfo() { - return metaStruct.meta.info; + return GST_META_API.gst_video_time_code_meta_get_info(); } @Override diff --git a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java index 8257bd1c..37d6c89c 100644 --- a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java +++ b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java @@ -168,7 +168,7 @@ private static void initStructList() { structs.add(GstEventAPI.EventStruct.class); structs.add(GstMetaApi.GstVideoTimeCodeMetaStruct.class); structs.add(GstMetaApi.GstVideoTimeCodeStruct.class); - structs.add(GstMetaApi.GstMetaInfo.class); + structs.add(GstMetaApi.GstMetaInfoStruct.class); structs.add(GstMetaApi.GstMetaStruct.class); // structs.add(GstInterpolationControlSourceAPI.GstInterpolationControlSourceStruct.class); From cbafd49be0bf377e373ea8f5e7f5ff0ba6164843 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Mon, 24 Aug 2020 12:16:52 +0200 Subject: [PATCH 04/17] Added missing documentation, and checking of version --- src/org/freedesktop/gstreamer/Buffer.java | 37 +++++++++++-------- .../gstreamer/meta/GstMetaFlags.java | 1 + .../gstreamer/meta/GstVideoTimeCodeMeta.java | 1 + .../gstreamer/timecode/GstVideoTimeCode.java | 1 + .../timecode/GstVideoTimeCodeConfig.java | 1 + .../timecode/GstVideoTimeCodeFlags.java | 1 + 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index f73d6e9b..9b64f196 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -27,11 +27,9 @@ import java.util.EnumSet; import org.freedesktop.gstreamer.glib.NativeFlags; import org.freedesktop.gstreamer.glib.Natives; -import org.freedesktop.gstreamer.lowlevel.GNative; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; -import org.freedesktop.gstreamer.lowlevel.GstNative; import org.freedesktop.gstreamer.meta.GstMetaData; import org.freedesktop.gstreamer.meta.GstVideoTimeCodeMeta; import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; @@ -63,7 +61,7 @@ public Buffer() { * Creates a newly allocated buffer with data of the given size. The buffer * memory is not cleared. If the requested amount of memory cannot be * allocated, an exception will be thrown. - * + *

* Note that when size == 0, the buffer data pointer will be NULL. * * @param size @@ -143,7 +141,7 @@ public long getDecodeTimestamp() { * Set the decode timestamp of the Buffer * * @param val a long representing the timestamp or - * {@link ClockTime#NONE} when the timestamp is not known or relevant. + * {@link ClockTime#NONE} when the timestamp is not known or relevant. */ public void setDecodeTimestamp(long val) { this.struct.writeField("dts", val); @@ -165,7 +163,7 @@ public long getPresentationTimestamp() { * Set the presentation timestamp of the Buffer * * @param val a long representing the timestamp or - * {@link ClockTime#NONE} when the timestamp is not known or relevant. + * {@link ClockTime#NONE} when the timestamp is not known or relevant. */ public void setPresentationTimestamp(long val) { this.struct.writeField("pts", val); @@ -185,7 +183,7 @@ public long getDuration() { * Set the duration of this buffer. * * @param val a long representing the duration or - * {@link ClockTime#NONE} when the timestamp is not known or relevant. + * {@link ClockTime#NONE} when the timestamp is not known or relevant. */ public void setDuration(long val) { this.struct.writeField("duration", val); @@ -207,9 +205,9 @@ public long getOffset() { * Set the offset (media-specific) of this buffer * * @param val a media specific offset for the buffer data. For video frames, - * this is the frame number of this buffer. For audio samples, this is the - * offset of the first sample in this buffer. For file data or compressed - * data this is the byte offset of the first byte in this buffer. + * this is the frame number of this buffer. For audio samples, this is the + * offset of the first sample in this buffer. For file data or compressed + * data this is the byte offset of the first byte in this buffer. */ public void setOffset(long val) { this.struct.writeField("offset", val); @@ -231,9 +229,9 @@ public long getOffsetEnd() { * Set the offset (media-specific) of this buffer * * @param val a media specific offset for the buffer data. For video frames, - * this is the frame number of this buffer. For audio samples, this is the - * offset of the first sample in this buffer. For file data or compressed - * data this is the byte offset of the first byte in this buffer. + * this is the frame number of this buffer. For audio samples, this is the + * offset of the first sample in this buffer. For file data or compressed + * data this is the byte offset of the first byte in this buffer. */ public void setOffsetEnd(long val) { this.struct.writeField("offset_end", val); @@ -241,7 +239,7 @@ public void setOffsetEnd(long val) { /** * Get the GstBufferFlags describing this buffer. - * + *

* Since GStreamer 1.10 * * @return an EnumSet of {@link BufferFlags} @@ -265,21 +263,29 @@ public GstVideoTimeCodeMeta getVideoTimeCodeMeta() { /** * Check if buffer contains selected type of metadata + *

+ * Since GStreamer 1.14 * * @param gstMetaData type of metadata * @return return true only if buffer contains selected type of metadata */ + @Gst.Since(minor = 14) public boolean containsMetadata(GstMetaData gstMetaData) { + Gst.checkVersion(1, 14); return getNumberOfMeta(gstMetaData) > 0; } /** * Check number of metadata for selected type. There can be more metadata in case multiple video/audio layer + *

+ * Since GStreamer 1.14 * * @param gstMetaData type of metadata * @return return number of metadata */ + @Gst.Since(minor = 14) public int getNumberOfMeta(GstMetaData gstMetaData) { + Gst.checkVersion(1, 14); return GSTBUFFER_API.gst_buffer_get_n_meta(this, gstMetaData.getType()); } @@ -287,7 +293,7 @@ public int getNumberOfMeta(GstMetaData gstMetaData) { /** * Set some of the GstBufferFlags describing this buffer. This is a union * operation and does not clear flags that are not mentioned. - * + *

* Since GStreamer 1.10 * * @param flags an EnumSet of {@link BufferFlags} to be set on the buffer. @@ -302,12 +308,11 @@ public boolean setFlags(EnumSet flags) { /** * unset the GstBufferFlags describing this buffer. This is a difference * operation and does not clear flags that are not mentioned. - * + *

* Since GStreamer 1.10 * * @param flags an EnumSet of {@link BufferFlags} to be cleared on the buffer. * @return true if flags were successfully cleared on this buffer - * */ @Gst.Since(minor = 10) public boolean unsetFlags(EnumSet flags) { diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java b/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java index 7bdf933f..437fdf39 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java +++ b/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java @@ -5,6 +5,7 @@ /** * @author Jokertwo + * @see GstMetaFlags */ public enum GstMetaFlags implements NativeEnum { diff --git a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java index 821c9b88..50725d71 100644 --- a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java @@ -10,6 +10,7 @@ /** * Extra buffer metadata describing the GstVideoTimeCode of the frame. * @author Jokertwo + * @see GstVideoTimeCodeMeta */ public class GstVideoTimeCodeMeta extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java index 981079dc..65471156 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java @@ -11,6 +11,7 @@ /** * A representation of a SMPTE time code. * @author Jokertwo + * @see GstVideoTimeCode */ public class GstVideoTimeCode extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java index c372dacd..5f296738 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java @@ -9,6 +9,7 @@ /** * The configuration of the time code. * @author Jokertwo + * @see GstVideoTimeCodeConfig */ public class GstVideoTimeCodeConfig extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java index e9cd614a..58b918f0 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java @@ -6,6 +6,7 @@ * Flags related to the time code information. For drop frame, only 30000/1001 and 60000/1001 frame rates are supported. * * @author Jokertwo + * @see GstVideoTimeCodeFlags */ public enum GstVideoTimeCodeFlags implements NativeFlags { /** From da3e198b108a8f5c1223944ab9df2ed849fab952 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Mon, 24 Aug 2020 12:30:50 +0200 Subject: [PATCH 05/17] added checking version in tests --- .../gstreamer/meta/GstTimeCodeMetaTest.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index 9ebb3e36..d3796baf 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -6,6 +6,7 @@ import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeConfig; +import org.freedesktop.gstreamer.util.TestAssumptions; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -33,6 +34,7 @@ public static void afterClass() { @Test public void testVideoWithoutMeta() { + TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); @@ -48,6 +50,7 @@ public void testVideoWithoutMeta() { */ @Test public void testVideoMeta() { + TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); @@ -63,6 +66,7 @@ public void testVideoMeta() { */ @Test public void testVideoCropMeta() { + TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); @@ -78,8 +82,9 @@ public void testVideoCropMeta() { public void testVideoTimeCodeMetaPal() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - + if(Gst.testVersion(1,14)) { + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + } GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); GstVideoTimeCode timeCode = meta.getTimeCode(); @@ -105,8 +110,9 @@ public void testVideoTimeCodeMetaPal() { public void testVideoTimeCodeNTSCDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - + if(Gst.testVersion(1,14)) { + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + } GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); GstVideoTimeCode timeCode = meta.getTimeCode(); @@ -135,8 +141,9 @@ public void testVideoTimeCodeNTSCDrop() { public void testVideoTimeCodeNTSCDropFrame() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - + if(Gst.testVersion(1,14)) { + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + } GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); GstVideoTimeCode timeCode = meta.getTimeCode(); @@ -159,8 +166,9 @@ public void testVideoTimeCodeNTSCDropFrame() { public void testVideoTimeCodeNTSCNonDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - + if(Gst.testVersion(1,14)) { + assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + } GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); GstVideoTimeCode timeCode = meta.getTimeCode(); From 597f6f8bee08ed893360a93ab3e820ef899d1953 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Mon, 24 Aug 2020 13:28:33 +0200 Subject: [PATCH 06/17] added a check for backward compatibility --- .travis.yml | 1 + .../freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2ab1814b..2e2a3e3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,3 +5,4 @@ addons: apt: packages: - gstreamer1.0-plugins-good + - gstreamer1.0-plugins-bad diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index d3796baf..1aab434a 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -34,6 +34,7 @@ public static void afterClass() { @Test public void testVideoWithoutMeta() { + // method containsMetadata is available since 1.14 TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); @@ -50,6 +51,7 @@ public void testVideoWithoutMeta() { */ @Test public void testVideoMeta() { + // method containsMetadata is available since 1.14 TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); @@ -66,6 +68,7 @@ public void testVideoMeta() { */ @Test public void testVideoCropMeta() { + // method containsMetadata is available since 1.14 TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); @@ -108,6 +111,8 @@ public void testVideoTimeCodeMetaPal() { @Test public void testVideoTimeCodeNTSCDrop() { + // timecodestamper is available since 1.10 + TestAssumptions.requireGstVersion(1,10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { @@ -139,6 +144,8 @@ public void testVideoTimeCodeNTSCDrop() { */ @Test public void testVideoTimeCodeNTSCDropFrame() { + // timecodestamper is available since 1.10 + TestAssumptions.requireGstVersion(1,10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { @@ -164,6 +171,8 @@ public void testVideoTimeCodeNTSCDropFrame() { @Test public void testVideoTimeCodeNTSCNonDrop() { + // timecodestamper is available since 1.10 + TestAssumptions.requireGstVersion(1,10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { From 75de65ae5ff11357f7d66dc4ce7faf2520f77683 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Mon, 24 Aug 2020 16:07:29 +0200 Subject: [PATCH 07/17] added licence --- .../freedesktop/gstreamer/meta/GstMeta.java | 19 +++++++++++++++-- .../gstreamer/meta/GstMetaData.java | 20 ++++++++++++++++-- .../gstreamer/meta/GstMetaFlags.java | 20 ++++++++++++++++-- .../gstreamer/meta/GstMetaInfo.java | 21 +++++++++++++++++-- .../gstreamer/meta/GstVideoTimeCodeMeta.java | 21 +++++++++++++++++-- .../gstreamer/timecode/GstVideoTimeCode.java | 20 ++++++++++++++++-- .../timecode/GstVideoTimeCodeConfig.java | 20 ++++++++++++++++-- .../timecode/GstVideoTimeCodeFlags.java | 19 +++++++++++++++-- .../gstreamer/meta/GstMetaDataTest.java | 19 +++++++++++++++-- .../gstreamer/meta/GstTimeCodeMetaTest.java | 19 +++++++++++++++-- .../timecode/GstVideoTimeCodeConfigTest.java | 19 +++++++++++++++-- .../timecode/GstVideoTimeCodeFlagsTest.java | 19 +++++++++++++++-- .../timecode/GstVideoTimeCodeTest.java | 19 +++++++++++++++-- 13 files changed, 229 insertions(+), 26 deletions(-) diff --git a/src/org/freedesktop/gstreamer/meta/GstMeta.java b/src/org/freedesktop/gstreamer/meta/GstMeta.java index 1e0c3cbf..40344d0f 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstMeta.java @@ -4,8 +4,23 @@ import org.freedesktop.gstreamer.glib.NativeObject; import static org.freedesktop.gstreamer.glib.Natives.registration; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * */ public class GstMeta implements NativeObject.TypeProvider { diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaData.java b/src/org/freedesktop/gstreamer/meta/GstMetaData.java index 07bda1db..6cba6f57 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaData.java +++ b/src/org/freedesktop/gstreamer/meta/GstMetaData.java @@ -4,9 +4,25 @@ import org.freedesktop.gstreamer.lowlevel.GType; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; -/** +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * * Gst meta data GTypes - * @author Jokertwo + * */ public enum GstMetaData { diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java b/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java index 437fdf39..de023945 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java +++ b/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java @@ -3,8 +3,24 @@ import org.freedesktop.gstreamer.glib.NativeEnum; import org.freedesktop.gstreamer.glib.NativeFlags; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * + * * @see GstMetaFlags */ public enum GstMetaFlags implements NativeEnum { diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java b/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java index 790ea6f6..d10d1304 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java +++ b/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java @@ -6,10 +6,27 @@ import org.freedesktop.gstreamer.lowlevel.GType; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfoStruct; -/** + +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * + * * The GstMetaInfo provides information about a specific metadata structure. * - * @author Jokertwo * @see GstMetaInfo */ public class GstMetaInfo extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java index 50725d71..cf37e4f9 100644 --- a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java @@ -7,9 +7,26 @@ import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; -/** +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * * Extra buffer metadata describing the GstVideoTimeCode of the frame. - * @author Jokertwo + * + * * @see GstVideoTimeCodeMeta */ public class GstVideoTimeCodeMeta extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java index 65471156..d1429852 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java @@ -8,9 +8,25 @@ import static org.freedesktop.gstreamer.glib.Natives.registration; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeStruct; -/** +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * * A representation of a SMPTE time code. - * @author Jokertwo + * * @see GstVideoTimeCode */ public class GstVideoTimeCode extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java index 5f296738..45822633 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java @@ -6,9 +6,25 @@ import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; -/** +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * * The configuration of the time code. - * @author Jokertwo + * * @see GstVideoTimeCodeConfig */ public class GstVideoTimeCodeConfig extends MiniObject { diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java index 58b918f0..33b16875 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java @@ -2,10 +2,25 @@ import org.freedesktop.gstreamer.glib.NativeFlags; -/** +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * * Flags related to the time code information. For drop frame, only 30000/1001 and 60000/1001 frame rates are supported. * - * @author Jokertwo * @see GstVideoTimeCodeFlags */ public enum GstVideoTimeCodeFlags implements NativeFlags { diff --git a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java b/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java index 10275616..25967948 100644 --- a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java @@ -11,8 +11,23 @@ import org.junit.runners.Parameterized; import static org.junit.Assert.assertNotNull; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * */ @RunWith(Parameterized.class) public class GstMetaDataTest { diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index 1aab434a..94089f58 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -17,8 +17,23 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * */ public class GstTimeCodeMetaTest { diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java index 894789f9..b90f9722 100644 --- a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java +++ b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java @@ -8,8 +8,23 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * */ public class GstVideoTimeCodeConfigTest { private GstMetaApi.GstVideoTimeCodeConfigStruct origStruct; diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java index a33c5686..31b05d23 100644 --- a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java +++ b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java @@ -9,8 +9,23 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * */ @RunWith(Parameterized.class) public class GstVideoTimeCodeFlagsTest { diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java index ff6d190d..f6e667ed 100644 --- a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java +++ b/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java @@ -6,8 +6,23 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -/** - * @author Jokertwo +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * */ public class GstVideoTimeCodeTest { From ef9a6a7fa5926631cf7cf5d1d0dcd508e3e05299 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Mon, 24 Aug 2020 16:15:43 +0200 Subject: [PATCH 08/17] fix build --- src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java | 3 +++ src/org/freedesktop/gstreamer/meta/GstMetaData.java | 5 +++++ .../freedesktop/gstreamer/timecode/GstVideoTimeCode.java | 2 ++ .../gstreamer/timecode/GstVideoTimeCodeConfig.java | 2 ++ test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java | 9 ++++++--- .../freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java | 2 ++ 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java index 657b9e7b..cb4dc48a 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java @@ -3,6 +3,7 @@ import com.sun.jna.Library; import com.sun.jna.Pointer; import com.sun.jna.Structure; +import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.meta.GstMetaInfo; import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; @@ -37,6 +38,7 @@ public GstVideoTimeCodeMetaStruct(Pointer p) { } @Structure.FieldOrder({"config", "hours", "minutes", "seconds", "frames", "field_count"}) + @Gst.Since(minor = 10) class GstVideoTimeCodeStruct extends Structure { public static class ByValue extends GstVideoTimeCodeStruct implements Structure.ByValue { } @@ -85,6 +87,7 @@ public GstMetaInfoStruct(Pointer p) { } @Structure.FieldOrder({"fps_n", "fps_d", "flags", "latest_daily_jam"}) + @Gst.Since(minor = 10) class GstVideoTimeCodeConfigStruct extends Structure { public static class ByValue extends GstVideoTimeCodeConfigStruct implements Structure.ByValue { } diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaData.java b/src/org/freedesktop/gstreamer/meta/GstMetaData.java index 6cba6f57..4a0480e2 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaData.java +++ b/src/org/freedesktop/gstreamer/meta/GstMetaData.java @@ -1,6 +1,7 @@ package org.freedesktop.gstreamer.meta; import java.util.function.Supplier; +import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.lowlevel.GType; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; @@ -30,6 +31,7 @@ public enum GstMetaData { VIDEO_GL_TEXTURE_META(GST_META_API::gst_video_gl_texture_upload_meta_api_get_type), VIDEO_META(GST_META_API::gst_video_meta_api_get_type), VIDEO_REGION_OF_INTEREST(GST_META_API::gst_video_region_of_interest_meta_api_get_type), + @Gst.Since(minor = 10) VIDEO_TIME_CODE_META(GST_META_API::gst_video_time_code_meta_api_get_type); private final Supplier gTypeMetaSup; @@ -39,6 +41,9 @@ public enum GstMetaData { } public GType getType() { + if(name().equals(VIDEO_TIME_CODE_META.name())){ + Gst.checkVersion(1,10); + } return gTypeMetaSup.get(); } } diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java index d1429852..8f188d46 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java @@ -2,6 +2,7 @@ import com.sun.jna.Pointer; import java.util.stream.Stream; +import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.MiniObject; import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; @@ -29,6 +30,7 @@ * * @see GstVideoTimeCode */ +@Gst.Since(minor = 10) public class GstVideoTimeCode extends MiniObject { public static final String GTYPE_NAME = "GstVideoTimeCode"; diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java index 45822633..9b55cdc5 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java @@ -1,6 +1,7 @@ package org.freedesktop.gstreamer.timecode; import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.MiniObject; import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; @@ -27,6 +28,7 @@ * * @see GstVideoTimeCodeConfig */ +@Gst.Since(minor = 10) public class GstVideoTimeCodeConfig extends MiniObject { public static final String GTYPE_NAME = "GstVideoTimeCodeConfig"; diff --git a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java b/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java index 25967948..10f52f50 100644 --- a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java @@ -1,8 +1,8 @@ package org.freedesktop.gstreamer.meta; import java.util.Collection; +import java.util.EnumSet; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.freedesktop.gstreamer.Gst; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -34,7 +34,11 @@ public class GstMetaDataTest { @Parameterized.Parameters public static Collection data() { - return Stream.of(GstMetaData.values()).map(gstMetaData -> new Object[]{gstMetaData}).collect(Collectors.toList()); + return // remove unsupported api for baseline 1.8 + EnumSet.complementOf(EnumSet.of(GstMetaData.VIDEO_TIME_CODE_META)) + .stream() + .map(gstMetaData -> new Object[]{gstMetaData}) + .collect(Collectors.toList()); } private final GstMetaData gstMetaData; @@ -57,6 +61,5 @@ public GstMetaDataTest(GstMetaData gstMetaData) { @Test public void testGetType() { assertNotNull(gstMetaData.getType()); - System.out.println(gstMetaData.getType()); } } \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index 94089f58..75040d2b 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -98,6 +98,8 @@ public void testVideoCropMeta() { @Test public void testVideoTimeCodeMetaPal() { + // timecodestamper is available since 1.10 + TestAssumptions.requireGstVersion(1,10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { From 249222390c0b1bdc62b9189af2807c1af98ad819 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Tue, 25 Aug 2020 17:28:45 +0200 Subject: [PATCH 09/17] replace mini object by native object --- .../gstreamer/lowlevel/GstVideoAPI.java | 9 +++-- .../gstreamer/meta/GstMetaInfo.java | 34 +++++++++++++------ .../gstreamer/meta/GstVideoTimeCodeMeta.java | 26 ++++++++++++-- .../gstreamer/timecode/GstVideoTimeCode.java | 28 +++++++++++++-- .../timecode/GstVideoTimeCodeConfig.java | 34 +++++++++++++++---- .../gstreamer/meta/GstTimeCodeMetaTest.java | 6 ---- 6 files changed, 107 insertions(+), 30 deletions(-) diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java index 7938e931..523f5f46 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java @@ -1,4 +1,4 @@ -/* +/* * This file is part of gstreamer-java. * * This code is free software: you can redistribute it and/or modify it under @@ -21,13 +21,18 @@ import com.sun.jna.Library; import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.lowlevel.annotations.CallerOwnsReturn; +import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; public interface GstVideoAPI extends Library { public final static GstVideoAPI GSTVIDEO_API = GstNative.load("gstvideo", GstVideoAPI.class); + @CallerOwnsReturn + Pointer gst_video_time_code_new_empty(); + void gst_video_time_code_free(Pointer gstVideoTimeCode); GValue gst_video_frame_rate(Pad pad); boolean gst_video_get_size(Pad pad, int [] width, int [] height); - + /* */ Pointer ptr_gst_video_event_new_downstream_force_key_unit( long timestamp, long stream_time, long running_time, diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java b/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java index d10d1304..3305e04a 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java +++ b/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java @@ -1,8 +1,7 @@ package org.freedesktop.gstreamer.meta; -import com.sun.jna.Pointer; -import org.freedesktop.gstreamer.MiniObject; -import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.lowlevel.GPointer; import org.freedesktop.gstreamer.lowlevel.GType; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfoStruct; @@ -29,18 +28,14 @@ * * @see GstMetaInfo */ -public class GstMetaInfo extends MiniObject { +public class GstMetaInfo extends NativeObject { public static final String GTYPE_NAME = "GstMetaInfo"; - private GstMetaInfoStruct metaStruct; - - public GstMetaInfo(Pointer pointer) { - this(Natives.initializer(pointer, false, false)); - } + private final GstMetaInfoStruct metaStruct; GstMetaInfo(Initializer init) { - super(init); + super(new Handle(init.ptr, init.ownsHandle)); metaStruct = new GstMetaInfoStruct(getRawPointer()); } @@ -62,4 +57,23 @@ public GType getApiType() { return this.metaStruct.api; } + + private static final class Handle extends NativeObject.Handle { + + /** + * Construct a Handle for the supplied native reference. + * + * @param ptr native reference + * @param ownsReference whether the Handle owns the native reference and + */ + public Handle(GPointer ptr, boolean ownsReference) { + super(ptr, ownsReference); + } + + @Override + protected void disposeNativeHandle(GPointer ptr) { + // Meta info is destructed by nested function + } + } + } diff --git a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java index cf37e4f9..bbe627e1 100644 --- a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java @@ -1,8 +1,9 @@ package org.freedesktop.gstreamer.meta; import com.sun.jna.Pointer; -import org.freedesktop.gstreamer.MiniObject; +import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GPointer; import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; @@ -29,7 +30,7 @@ * * @see GstVideoTimeCodeMeta */ -public class GstVideoTimeCodeMeta extends MiniObject { +public class GstVideoTimeCodeMeta extends NativeObject { public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; private final GstVideoTimeCodeMetaStruct metaStruct; @@ -40,7 +41,7 @@ public GstVideoTimeCodeMeta(Pointer pointer) { } GstVideoTimeCodeMeta(Initializer init) { - super(init); + super(new Handle(init.ptr, init.ownsHandle)); metaStruct = new GstVideoTimeCodeMetaStruct(getRawPointer()); timeCode = new GstVideoTimeCode(metaStruct.tc.getPointer()); } @@ -69,4 +70,23 @@ public void disown() { super.disown(); } + private static final class Handle extends NativeObject.Handle { + + /** + * Construct a Handle for the supplied native reference. + * + * @param ptr native reference + * @param ownsReference whether the Handle owns the native reference and + */ + public Handle(GPointer ptr, boolean ownsReference) { + super(ptr, ownsReference); + } + + @Override + protected void disposeNativeHandle(GPointer ptr) { + // structure will be released automatically by GStreamer + /** by nested function*/ + } + } + } diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java index 8f188d46..86311575 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java @@ -6,6 +6,8 @@ import org.freedesktop.gstreamer.MiniObject; import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; import static org.freedesktop.gstreamer.glib.Natives.registration; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeStruct; @@ -31,18 +33,22 @@ * @see GstVideoTimeCode */ @Gst.Since(minor = 10) -public class GstVideoTimeCode extends MiniObject { +public class GstVideoTimeCode extends NativeObject { public static final String GTYPE_NAME = "GstVideoTimeCode"; private final GstVideoTimeCodeStruct timeCodeStruct; private final GstVideoTimeCodeConfig timeCodeConfig; + public GstVideoTimeCode(){ + this(Natives.initializer(GstVideoAPI.GSTVIDEO_API.gst_video_time_code_new_empty())); + } + public GstVideoTimeCode(Pointer pointer) { this(Natives.initializer(pointer,false,false)); } GstVideoTimeCode(Initializer init) { - super(init); + super(new Handle(init.ptr,init.ownsHandle)); timeCodeStruct = new GstVideoTimeCodeStruct(getRawPointer()); timeCodeConfig = new GstVideoTimeCodeConfig(timeCodeStruct.config.getPointer()); } @@ -111,4 +117,22 @@ public Stream> types() { GstVideoTimeCodeConfig::new)); } } + + public static final class Handle extends NativeObject.Handle{ + + /** + * Construct a Handle for the supplied native reference. + * + * @param ptr native reference + * @param ownsReference whether the Handle owns the native reference and + */ + public Handle(GPointer ptr, boolean ownsReference) { + super(ptr, ownsReference); + } + + @Override + protected void disposeNativeHandle(GPointer ptr) { + GstVideoAPI.GSTVIDEO_API.gst_video_time_code_free(ptr.getPointer()); + } + } } diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java index 9b55cdc5..7536e473 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java @@ -2,10 +2,11 @@ import com.sun.jna.Pointer; import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.MiniObject; +import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.lowlevel.GlibAPI; import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; /* * Copyright (c) 2020 Petr Lastovka @@ -29,17 +30,17 @@ * @see GstVideoTimeCodeConfig */ @Gst.Since(minor = 10) -public class GstVideoTimeCodeConfig extends MiniObject { +public class GstVideoTimeCodeConfig extends NativeObject { public static final String GTYPE_NAME = "GstVideoTimeCodeConfig"; private final GstVideoTimeCodeConfigStruct timeCodeConfig; - public GstVideoTimeCodeConfig(Pointer pointer) { - this(Natives.initializer(pointer,false,false)); + GstVideoTimeCodeConfig(Pointer pointer) { + this(Natives.initializer(pointer, false, false)); } - GstVideoTimeCodeConfig(Initializer init) { - super(init); + GstVideoTimeCodeConfig(NativeObject.Initializer init) { + super(new Handle(init.ptr, init.ownsHandle)); timeCodeConfig = new GstVideoTimeCodeConfigStruct(getRawPointer()); } @@ -79,4 +80,23 @@ public String toString() { .append('}'); return sb.toString(); } + + private static final class Handle extends NativeObject.Handle { + + /** + * Construct a Handle for the supplied native reference. + * + * @param ptr native reference + * @param ownsReference whether the Handle owns the native reference and + */ + public Handle(GPointer ptr, boolean ownsReference) { + super(ptr, ownsReference); + } + + @Override + protected void disposeNativeHandle(GPointer ptr) { + // usually video timecode config will be released together with video timecode + GlibAPI.GLIB_API.g_free(ptr.getPointer()); + } + } } diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index 75040d2b..921a73ae 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -121,8 +121,6 @@ public void testVideoTimeCodeMetaPal() { assertEquals(1, timeCodeConfig.getFramerateDenominator()); assertEquals(GST_VIDEO_TIME_CODE_FLAGS_NONE, timeCodeConfig.getTimeCodeFlags()); - - meta.disown(); }, "videotestsrc ! video/x-raw,framerate=25/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); } @@ -151,8 +149,6 @@ public void testVideoTimeCodeNTSCDrop() { assertEquals(1001, timeCodeConfig.getFramerateDenominator()); assertEquals(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, timeCodeConfig.getTimeCodeFlags()); - meta.disown(); - }, "videotestsrc ! video/x-raw,framerate=30000/1001 ! timecodestamper drop-frame=true ! videoconvert ! appsink name=myappsink"); } @@ -211,8 +207,6 @@ public void testVideoTimeCodeNTSCNonDrop() { assertEquals(1, timeCodeConfig.getFramerateDenominator()); assertEquals(GST_VIDEO_TIME_CODE_FLAGS_NONE, timeCodeConfig.getTimeCodeFlags()); - meta.disown(); - }, "videotestsrc ! video/x-raw,framerate=30/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); } } From 530bc71d3ef0c7c171212192740ba3ae81c24d7c Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Tue, 25 Aug 2020 18:16:35 +0200 Subject: [PATCH 10/17] rename by naming conventions --- src/org/freedesktop/gstreamer/Buffer.java | 20 ++--- src/org/freedesktop/gstreamer/Gst.java | 4 +- .../gstreamer/lowlevel/GstMetaApi.java | 8 +- .../gstreamer/lowlevel/GstVideoAPI.java | 1 - .../freedesktop/gstreamer/meta/GstMeta.java | 12 +-- .../meta/{GstMetaData.java => MetaData.java} | 4 +- .../{GstMetaFlags.java => MetaFlags.java} | 5 +- .../meta/{GstMetaInfo.java => MetaInfo.java} | 4 +- ...meCodeMeta.java => VideoTimeCodeMeta.java} | 16 ++-- ...tVideoTimeCode.java => VideoTimeCode.java} | 27 ++++--- ...deConfig.java => VideoTimeCodeConfig.java} | 10 +-- ...CodeFlags.java => VideoTimeCodeFlags.java} | 4 +- .../gstreamer/meta/GstTimeCodeMetaTest.java | 76 ++++++++++--------- ...GstMetaDataTest.java => MetaDataTest.java} | 14 ++-- ...Test.java => VideoTimeCodeConfigTest.java} | 11 +-- ...sTest.java => VideoTimeCodeFlagsTest.java} | 13 ++-- ...meCodeTest.java => VideoTimeCodeTest.java} | 6 +- 17 files changed, 116 insertions(+), 119 deletions(-) rename src/org/freedesktop/gstreamer/meta/{GstMetaData.java => MetaData.java} (95%) rename src/org/freedesktop/gstreamer/meta/{GstMetaFlags.java => MetaFlags.java} (90%) rename src/org/freedesktop/gstreamer/meta/{GstMetaInfo.java => MetaInfo.java} (96%) rename src/org/freedesktop/gstreamer/meta/{GstVideoTimeCodeMeta.java => VideoTimeCodeMeta.java} (87%) rename src/org/freedesktop/gstreamer/timecode/{GstVideoTimeCode.java => VideoTimeCode.java} (82%) rename src/org/freedesktop/gstreamer/timecode/{GstVideoTimeCodeConfig.java => VideoTimeCodeConfig.java} (92%) rename src/org/freedesktop/gstreamer/timecode/{GstVideoTimeCodeFlags.java => VideoTimeCodeFlags.java} (92%) rename test/org/freedesktop/gstreamer/meta/{GstMetaDataTest.java => MetaDataTest.java} (81%) rename test/org/freedesktop/gstreamer/timecode/{GstVideoTimeCodeConfigTest.java => VideoTimeCodeConfigTest.java} (82%) rename test/org/freedesktop/gstreamer/timecode/{GstVideoTimeCodeFlagsTest.java => VideoTimeCodeFlagsTest.java} (75%) rename test/org/freedesktop/gstreamer/timecode/{GstVideoTimeCodeTest.java => VideoTimeCodeTest.java} (93%) diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index 9b64f196..76939059 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -30,8 +30,8 @@ import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; -import org.freedesktop.gstreamer.meta.GstMetaData; -import org.freedesktop.gstreamer.meta.GstVideoTimeCodeMeta; +import org.freedesktop.gstreamer.meta.MetaData; +import org.freedesktop.gstreamer.meta.VideoTimeCodeMeta; import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; /** @@ -256,8 +256,8 @@ public EnumSet getFlags() { * * @return return time code (SMPTE) for current buffer */ - public GstVideoTimeCodeMeta getVideoTimeCodeMeta() { - return new GstVideoTimeCodeMeta(GSTBUFFER_API.gst_buffer_get_meta(this, GstMetaData.VIDEO_TIME_CODE_META.getType())); + public VideoTimeCodeMeta getVideoTimeCodeMeta() { + return new VideoTimeCodeMeta(GSTBUFFER_API.gst_buffer_get_meta(this, MetaData.VIDEO_TIME_CODE_META.getType())); } @@ -266,13 +266,13 @@ public GstVideoTimeCodeMeta getVideoTimeCodeMeta() { *

* Since GStreamer 1.14 * - * @param gstMetaData type of metadata + * @param metaData type of metadata * @return return true only if buffer contains selected type of metadata */ @Gst.Since(minor = 14) - public boolean containsMetadata(GstMetaData gstMetaData) { + public boolean containsMetadata(MetaData metaData) { Gst.checkVersion(1, 14); - return getNumberOfMeta(gstMetaData) > 0; + return getNumberOfMeta(metaData) > 0; } /** @@ -280,13 +280,13 @@ public boolean containsMetadata(GstMetaData gstMetaData) { *

* Since GStreamer 1.14 * - * @param gstMetaData type of metadata + * @param metaData type of metadata * @return return number of metadata */ @Gst.Since(minor = 14) - public int getNumberOfMeta(GstMetaData gstMetaData) { + public int getNumberOfMeta(MetaData metaData) { Gst.checkVersion(1, 14); - return GSTBUFFER_API.gst_buffer_get_n_meta(this, gstMetaData.getType()); + return GSTBUFFER_API.gst_buffer_get_n_meta(this, metaData.getType()); } diff --git a/src/org/freedesktop/gstreamer/Gst.java b/src/org/freedesktop/gstreamer/Gst.java index 58d40f89..d07e7343 100644 --- a/src/org/freedesktop/gstreamer/Gst.java +++ b/src/org/freedesktop/gstreamer/Gst.java @@ -60,7 +60,7 @@ import static org.freedesktop.gstreamer.lowlevel.GstParseAPI.GSTPARSE_API; import static org.freedesktop.gstreamer.glib.Natives.registration; import static org.freedesktop.gstreamer.lowlevel.GlibAPI.GLIB_API; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; +import org.freedesktop.gstreamer.timecode.VideoTimeCode; import org.freedesktop.gstreamer.webrtc.WebRTC; /** @@ -652,7 +652,7 @@ private static synchronized void loadAllClasses() { new Elements(), new WebRTC.Types(), new GstMeta(), - new GstVideoTimeCode.TimeTypes()) + new VideoTimeCode.TimeTypes()) .flatMap(NativeObject.TypeProvider::types) .forEachOrdered(GstTypes::register); if (!DISABLE_EXTERNAL) { diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java index cb4dc48a..cf42f687 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java @@ -4,8 +4,8 @@ import com.sun.jna.Pointer; import com.sun.jna.Structure; import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.meta.GstMetaInfo; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags; +import org.freedesktop.gstreamer.meta.MetaInfo; +import org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags; /** * @author Jokertwo @@ -23,7 +23,7 @@ public interface GstMetaApi extends Library { GType gst_video_region_of_interest_meta_api_get_type(); - GstMetaInfo gst_video_time_code_meta_get_info(); + MetaInfo gst_video_time_code_meta_get_info(); @Structure.FieldOrder({"meta", "tc"}) @@ -94,7 +94,7 @@ public static class ByValue extends GstVideoTimeCodeConfigStruct implements Stru public int fps_n; public int fps_d; - public GstVideoTimeCodeFlags flags; + public VideoTimeCodeFlags flags; public Pointer latest_daily_jam; public GstVideoTimeCodeConfigStruct() { diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java index 523f5f46..a619e24d 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java @@ -22,7 +22,6 @@ import com.sun.jna.Library; import com.sun.jna.Pointer; import org.freedesktop.gstreamer.lowlevel.annotations.CallerOwnsReturn; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; public interface GstVideoAPI extends Library { public final static GstVideoAPI GSTVIDEO_API = GstNative.load("gstvideo", GstVideoAPI.class); diff --git a/src/org/freedesktop/gstreamer/meta/GstMeta.java b/src/org/freedesktop/gstreamer/meta/GstMeta.java index 40344d0f..7c6fd684 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMeta.java +++ b/src/org/freedesktop/gstreamer/meta/GstMeta.java @@ -27,11 +27,11 @@ public class GstMeta implements NativeObject.TypeProvider { @Override public Stream> types() { return Stream.of( - registration(GstVideoTimeCodeMeta.class, - GstVideoTimeCodeMeta.GTYPE_NAME, - GstVideoTimeCodeMeta::new), - registration(GstMetaInfo.class, - GstMetaInfo.GTYPE_NAME, - GstMetaInfo::new)); + registration(VideoTimeCodeMeta.class, + VideoTimeCodeMeta.GTYPE_NAME, + VideoTimeCodeMeta::new), + registration(MetaInfo.class, + MetaInfo.GTYPE_NAME, + MetaInfo::new)); } } diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaData.java b/src/org/freedesktop/gstreamer/meta/MetaData.java similarity index 95% rename from src/org/freedesktop/gstreamer/meta/GstMetaData.java rename to src/org/freedesktop/gstreamer/meta/MetaData.java index 4a0480e2..ed0466c5 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaData.java +++ b/src/org/freedesktop/gstreamer/meta/MetaData.java @@ -25,7 +25,7 @@ * Gst meta data GTypes * */ -public enum GstMetaData { +public enum MetaData { VIDEO_CROP_META(GST_META_API::gst_video_crop_meta_api_get_type), VIDEO_GL_TEXTURE_META(GST_META_API::gst_video_gl_texture_upload_meta_api_get_type), @@ -36,7 +36,7 @@ public enum GstMetaData { private final Supplier gTypeMetaSup; - GstMetaData(Supplier gTypeMetaSup) { + MetaData(Supplier gTypeMetaSup) { this.gTypeMetaSup = gTypeMetaSup; } diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java b/src/org/freedesktop/gstreamer/meta/MetaFlags.java similarity index 90% rename from src/org/freedesktop/gstreamer/meta/GstMetaFlags.java rename to src/org/freedesktop/gstreamer/meta/MetaFlags.java index de023945..fea7beb1 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaFlags.java +++ b/src/org/freedesktop/gstreamer/meta/MetaFlags.java @@ -1,7 +1,6 @@ package org.freedesktop.gstreamer.meta; import org.freedesktop.gstreamer.glib.NativeEnum; -import org.freedesktop.gstreamer.glib.NativeFlags; /* * Copyright (c) 2020 Petr Lastovka @@ -23,7 +22,7 @@ * * @see GstMetaFlags */ -public enum GstMetaFlags implements NativeEnum { +public enum MetaFlags implements NativeEnum { GST_META_FLAG_NONE(0), // no flags GST_META_FLAG_READONLY(1), // metadata should not be modified @@ -33,7 +32,7 @@ public enum GstMetaFlags implements NativeEnum { private final int value; - GstMetaFlags(int value) { + MetaFlags(int value) { this.value = value; } diff --git a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java b/src/org/freedesktop/gstreamer/meta/MetaInfo.java similarity index 96% rename from src/org/freedesktop/gstreamer/meta/GstMetaInfo.java rename to src/org/freedesktop/gstreamer/meta/MetaInfo.java index 3305e04a..aec5c34d 100644 --- a/src/org/freedesktop/gstreamer/meta/GstMetaInfo.java +++ b/src/org/freedesktop/gstreamer/meta/MetaInfo.java @@ -28,13 +28,13 @@ * * @see GstMetaInfo */ -public class GstMetaInfo extends NativeObject { +public class MetaInfo extends NativeObject { public static final String GTYPE_NAME = "GstMetaInfo"; private final GstMetaInfoStruct metaStruct; - GstMetaInfo(Initializer init) { + MetaInfo(Initializer init) { super(new Handle(init.ptr, init.ownsHandle)); metaStruct = new GstMetaInfoStruct(getRawPointer()); } diff --git a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java similarity index 87% rename from src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java rename to src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java index bbe627e1..e5a6285e 100644 --- a/src/org/freedesktop/gstreamer/meta/GstVideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java @@ -4,7 +4,7 @@ import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; +import org.freedesktop.gstreamer.timecode.VideoTimeCode; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; @@ -30,20 +30,20 @@ * * @see GstVideoTimeCodeMeta */ -public class GstVideoTimeCodeMeta extends NativeObject { +public class VideoTimeCodeMeta extends NativeObject { public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; private final GstVideoTimeCodeMetaStruct metaStruct; - private final GstVideoTimeCode timeCode; + private final VideoTimeCode timeCode; - public GstVideoTimeCodeMeta(Pointer pointer) { + public VideoTimeCodeMeta(Pointer pointer) { this(Natives.initializer(pointer, false, false)); } - GstVideoTimeCodeMeta(Initializer init) { + VideoTimeCodeMeta(Initializer init) { super(new Handle(init.ptr, init.ownsHandle)); metaStruct = new GstVideoTimeCodeMetaStruct(getRawPointer()); - timeCode = new GstVideoTimeCode(metaStruct.tc.getPointer()); + timeCode = new VideoTimeCode(metaStruct.tc.getPointer()); } /** @@ -51,7 +51,7 @@ public GstVideoTimeCodeMeta(Pointer pointer) { * * @return return time code */ - public GstVideoTimeCode getTimeCode() { + public VideoTimeCode getTimeCode() { return timeCode; } @@ -60,7 +60,7 @@ public GstVideoTimeCode getTimeCode() { * * @return return structure with information about metadata */ - public GstMetaInfo getMetaInfo() { + public MetaInfo getMetaInfo() { return GST_META_API.gst_video_time_code_meta_get_info(); } diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java similarity index 82% rename from src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java rename to src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java index 86311575..dffe4b89 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java @@ -3,7 +3,6 @@ import com.sun.jna.Pointer; import java.util.stream.Stream; import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.MiniObject; import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GPointer; @@ -33,27 +32,27 @@ * @see GstVideoTimeCode */ @Gst.Since(minor = 10) -public class GstVideoTimeCode extends NativeObject { +public class VideoTimeCode extends NativeObject { public static final String GTYPE_NAME = "GstVideoTimeCode"; private final GstVideoTimeCodeStruct timeCodeStruct; - private final GstVideoTimeCodeConfig timeCodeConfig; + private final VideoTimeCodeConfig timeCodeConfig; - public GstVideoTimeCode(){ + public VideoTimeCode(){ this(Natives.initializer(GstVideoAPI.GSTVIDEO_API.gst_video_time_code_new_empty())); } - public GstVideoTimeCode(Pointer pointer) { + public VideoTimeCode(Pointer pointer) { this(Natives.initializer(pointer,false,false)); } - GstVideoTimeCode(Initializer init) { + VideoTimeCode(Initializer init) { super(new Handle(init.ptr,init.ownsHandle)); timeCodeStruct = new GstVideoTimeCodeStruct(getRawPointer()); - timeCodeConfig = new GstVideoTimeCodeConfig(timeCodeStruct.config.getPointer()); + timeCodeConfig = new VideoTimeCodeConfig(timeCodeStruct.config.getPointer()); } - public GstVideoTimeCodeConfig getTCConfig() { + public VideoTimeCodeConfig getTCConfig() { return timeCodeConfig; } @@ -109,12 +108,12 @@ public static final class TimeTypes implements NativeObject.TypeProvider { @Override public Stream> types() { return Stream.of( - registration(GstVideoTimeCode.class, - GstVideoTimeCode.GTYPE_NAME, - GstVideoTimeCode::new), - registration(GstVideoTimeCodeConfig.class, - GstVideoTimeCodeConfig.GTYPE_NAME, - GstVideoTimeCodeConfig::new)); + registration(VideoTimeCode.class, + VideoTimeCode.GTYPE_NAME, + VideoTimeCode::new), + registration(VideoTimeCodeConfig.class, + VideoTimeCodeConfig.GTYPE_NAME, + VideoTimeCodeConfig::new)); } } diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java similarity index 92% rename from src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java rename to src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java index 7536e473..5276a27b 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java @@ -30,26 +30,26 @@ * @see GstVideoTimeCodeConfig */ @Gst.Since(minor = 10) -public class GstVideoTimeCodeConfig extends NativeObject { +public class VideoTimeCodeConfig extends NativeObject { public static final String GTYPE_NAME = "GstVideoTimeCodeConfig"; private final GstVideoTimeCodeConfigStruct timeCodeConfig; - GstVideoTimeCodeConfig(Pointer pointer) { + VideoTimeCodeConfig(Pointer pointer) { this(Natives.initializer(pointer, false, false)); } - GstVideoTimeCodeConfig(NativeObject.Initializer init) { + VideoTimeCodeConfig(NativeObject.Initializer init) { super(new Handle(init.ptr, init.ownsHandle)); timeCodeConfig = new GstVideoTimeCodeConfigStruct(getRawPointer()); } /** - * The corresponding {@link GstVideoTimeCodeFlags} + * The corresponding {@link VideoTimeCodeFlags} * * @return return flag for current timecode */ - public GstVideoTimeCodeFlags getTimeCodeFlags() { + public VideoTimeCodeFlags getTimeCodeFlags() { return timeCodeConfig.flags; } diff --git a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java similarity index 92% rename from src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java rename to src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java index 33b16875..ba24b3c2 100644 --- a/src/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlags.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java @@ -23,7 +23,7 @@ * * @see GstVideoTimeCodeFlags */ -public enum GstVideoTimeCodeFlags implements NativeFlags { +public enum VideoTimeCodeFlags implements NativeFlags { /** * No flags */ @@ -40,7 +40,7 @@ public enum GstVideoTimeCodeFlags implements NativeFlags private final int value; - GstVideoTimeCodeFlags(int value) { + VideoTimeCodeFlags(int value) { this.value = value; } diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index 921a73ae..f056aa75 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -1,17 +1,21 @@ package org.freedesktop.gstreamer.meta; +import java.util.concurrent.TimeUnit; import org.freedesktop.gstreamer.Buffer; +import org.freedesktop.gstreamer.FlowReturn; import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.Pipeline; +import org.freedesktop.gstreamer.Sample; import org.freedesktop.gstreamer.SampleTester; -import org.freedesktop.gstreamer.glib.Natives; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCode; -import org.freedesktop.gstreamer.timecode.GstVideoTimeCodeConfig; +import org.freedesktop.gstreamer.elements.AppSink; +import org.freedesktop.gstreamer.timecode.VideoTimeCode; +import org.freedesktop.gstreamer.timecode.VideoTimeCodeConfig; import org.freedesktop.gstreamer.util.TestAssumptions; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import static org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; -import static org.freedesktop.gstreamer.timecode.GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE; +import static org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; +import static org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -53,11 +57,11 @@ public void testVideoWithoutMeta() { TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - assertFalse("Default video not contains region metadata", buffer.containsMetadata(GstMetaData.VIDEO_REGION_OF_INTEREST)); - assertFalse("Default video not contains metadata", buffer.containsMetadata(GstMetaData.VIDEO_META)); - assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(GstMetaData.VIDEO_GL_TEXTURE_META)); - assertFalse("Default video not contains crop metadata", buffer.containsMetadata(GstMetaData.VIDEO_CROP_META)); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertFalse("Default video not contains region metadata", buffer.containsMetadata(MetaData.VIDEO_REGION_OF_INTEREST)); + assertFalse("Default video not contains metadata", buffer.containsMetadata(MetaData.VIDEO_META)); + assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(MetaData.VIDEO_GL_TEXTURE_META)); + assertFalse("Default video not contains crop metadata", buffer.containsMetadata(MetaData.VIDEO_CROP_META)); }, "videotestsrc do-timestamp=true ! x264enc ! mxfmux ! decodebin ! appsink name=myappsink"); } @@ -70,11 +74,11 @@ public void testVideoMeta() { TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - assertFalse("Default video not contains region metadata", buffer.containsMetadata(GstMetaData.VIDEO_REGION_OF_INTEREST)); - assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(GstMetaData.VIDEO_GL_TEXTURE_META)); - assertFalse("Default video not contains crop metadata", buffer.containsMetadata(GstMetaData.VIDEO_CROP_META)); - assertTrue(buffer.containsMetadata(GstMetaData.VIDEO_META)); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertFalse("Default video not contains region metadata", buffer.containsMetadata(MetaData.VIDEO_REGION_OF_INTEREST)); + assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(MetaData.VIDEO_GL_TEXTURE_META)); + assertFalse("Default video not contains crop metadata", buffer.containsMetadata(MetaData.VIDEO_CROP_META)); + assertTrue(buffer.containsMetadata(MetaData.VIDEO_META)); }, "videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! appsink name=myappsink"); } @@ -87,11 +91,11 @@ public void testVideoCropMeta() { TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); - assertFalse("Default video not contains region metadata", buffer.containsMetadata(GstMetaData.VIDEO_REGION_OF_INTEREST)); - assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(GstMetaData.VIDEO_GL_TEXTURE_META)); - assertFalse("Default video not contains crop metadata", buffer.containsMetadata(GstMetaData.VIDEO_CROP_META)); - assertFalse("Default video not contains metadata", buffer.containsMetadata(GstMetaData.VIDEO_META)); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertFalse("Default video not contains region metadata", buffer.containsMetadata(MetaData.VIDEO_REGION_OF_INTEREST)); + assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(MetaData.VIDEO_GL_TEXTURE_META)); + assertFalse("Default video not contains crop metadata", buffer.containsMetadata(MetaData.VIDEO_CROP_META)); + assertFalse("Default video not contains metadata", buffer.containsMetadata(MetaData.VIDEO_META)); }, "videotestsrc ! videoscale !" + " appsink name=myappsink"); } @@ -103,11 +107,11 @@ public void testVideoTimeCodeMetaPal() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); } - GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); - GstVideoTimeCode timeCode = meta.getTimeCode(); + VideoTimeCode timeCode = meta.getTimeCode(); //first frame 00:00:00:00 assertEquals(0, timeCode.getHours()); @@ -115,7 +119,7 @@ public void testVideoTimeCodeMetaPal() { assertEquals(0, timeCode.getSeconds()); assertEquals(0, timeCode.getFrames()); - GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); // PAL standard 25/1 assertEquals(25, timeCodeConfig.getFramerateNumerator()); assertEquals(1, timeCodeConfig.getFramerateDenominator()); @@ -131,11 +135,11 @@ public void testVideoTimeCodeNTSCDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); } - GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); - GstVideoTimeCode timeCode = meta.getTimeCode(); + VideoTimeCode timeCode = meta.getTimeCode(); //first frame 00:00:00;00 assertEquals(0, timeCode.getHours()); @@ -143,7 +147,7 @@ public void testVideoTimeCodeNTSCDrop() { assertEquals(0, timeCode.getSeconds()); assertEquals(0, timeCode.getFrames()); - GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); // NTSC drop standard 30000/1001 assertEquals(30000, timeCodeConfig.getFramerateNumerator()); assertEquals(1001, timeCodeConfig.getFramerateDenominator()); @@ -162,11 +166,11 @@ public void testVideoTimeCodeNTSCDropFrame() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); } - GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); - GstVideoTimeCode timeCode = meta.getTimeCode(); + VideoTimeCode timeCode = meta.getTimeCode(); //first frame 00:00:00;29 assertEquals(0, timeCode.getHours()); @@ -174,7 +178,7 @@ public void testVideoTimeCodeNTSCDropFrame() { assertEquals(0, timeCode.getSeconds()); assertEquals(29, timeCode.getFrames()); - GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); // NTSC drop standard 30000/1001 assertEquals(30000, timeCodeConfig.getFramerateNumerator()); assertEquals(1001, timeCodeConfig.getFramerateDenominator()); @@ -189,11 +193,11 @@ public void testVideoTimeCodeNTSCNonDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(GstMetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); } - GstVideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); assertNotNull(meta); - GstVideoTimeCode timeCode = meta.getTimeCode(); + VideoTimeCode timeCode = meta.getTimeCode(); //first frame 00:00:00:00 assertEquals(0, timeCode.getHours()); @@ -201,7 +205,7 @@ public void testVideoTimeCodeNTSCNonDrop() { assertEquals(0, timeCode.getSeconds()); assertEquals(0, timeCode.getFrames()); - GstVideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); // NTSC drop standard 30/1 assertEquals(30, timeCodeConfig.getFramerateNumerator()); assertEquals(1, timeCodeConfig.getFramerateDenominator()); diff --git a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java b/test/org/freedesktop/gstreamer/meta/MetaDataTest.java similarity index 81% rename from test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java rename to test/org/freedesktop/gstreamer/meta/MetaDataTest.java index 10f52f50..a5a63bb2 100644 --- a/test/org/freedesktop/gstreamer/meta/GstMetaDataTest.java +++ b/test/org/freedesktop/gstreamer/meta/MetaDataTest.java @@ -30,18 +30,18 @@ * */ @RunWith(Parameterized.class) -public class GstMetaDataTest { +public class MetaDataTest { @Parameterized.Parameters public static Collection data() { return // remove unsupported api for baseline 1.8 - EnumSet.complementOf(EnumSet.of(GstMetaData.VIDEO_TIME_CODE_META)) + EnumSet.complementOf(EnumSet.of(MetaData.VIDEO_TIME_CODE_META)) .stream() - .map(gstMetaData -> new Object[]{gstMetaData}) + .map(metaData -> new Object[]{metaData}) .collect(Collectors.toList()); } - private final GstMetaData gstMetaData; + private final MetaData metaData; @BeforeClass public static void beforeClass() { @@ -53,13 +53,13 @@ public static void afterClass() { Gst.deinit(); } - public GstMetaDataTest(GstMetaData gstMetaData) { - this.gstMetaData = gstMetaData; + public MetaDataTest(MetaData metaData) { + this.metaData = metaData; } @Test public void testGetType() { - assertNotNull(gstMetaData.getType()); + assertNotNull(metaData.getType()); } } \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java similarity index 82% rename from test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java rename to test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java index b90f9722..77d610ef 100644 --- a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeConfigTest.java +++ b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java @@ -1,10 +1,7 @@ package org.freedesktop.gstreamer.timecode; -import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.lowlevel.GstMetaApi; -import org.junit.AfterClass; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -26,9 +23,9 @@ * version 3 along with this work. If not, see . * */ -public class GstVideoTimeCodeConfigTest { +public class VideoTimeCodeConfigTest { private GstMetaApi.GstVideoTimeCodeConfigStruct origStruct; - private GstVideoTimeCodeConfig codeConfig; + private VideoTimeCodeConfig codeConfig; @Before @@ -36,10 +33,10 @@ public void setUp() { origStruct = new GstMetaApi.GstVideoTimeCodeConfigStruct(); origStruct.fps_d = 25; origStruct.fps_n = 1; - origStruct.flags = GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; + origStruct.flags = VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; origStruct.write(); - codeConfig = new GstVideoTimeCodeConfig(origStruct.getPointer()); + codeConfig = new VideoTimeCodeConfig(origStruct.getPointer()); } @Test diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java similarity index 75% rename from test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java rename to test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java index 31b05d23..4586517b 100644 --- a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeFlagsTest.java +++ b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java @@ -2,7 +2,6 @@ import java.util.Arrays; import java.util.Collection; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -28,22 +27,22 @@ * */ @RunWith(Parameterized.class) -public class GstVideoTimeCodeFlagsTest { +public class VideoTimeCodeFlagsTest { - private final GstVideoTimeCodeFlags flags; + private final VideoTimeCodeFlags flags; private final int intValue; @Parameterized.Parameters public static Collection data() { return Arrays.asList( new Object[][]{ - {GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE, 0}, - {GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, 1}, - {GstVideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_INTERLACED, 2} + {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE, 0}, + {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, 1}, + {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_INTERLACED, 2} }); } - public GstVideoTimeCodeFlagsTest(GstVideoTimeCodeFlags flags, int intValue) { + public VideoTimeCodeFlagsTest(VideoTimeCodeFlags flags, int intValue) { this.flags = flags; this.intValue = intValue; } diff --git a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java similarity index 93% rename from test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java rename to test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java index f6e667ed..c2db4e80 100644 --- a/test/org/freedesktop/gstreamer/timecode/GstVideoTimeCodeTest.java +++ b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java @@ -24,13 +24,13 @@ * version 3 along with this work. If not, see . * */ -public class GstVideoTimeCodeTest { +public class VideoTimeCodeTest { private GstMetaApi.GstVideoTimeCodeStruct timeCodeStruct; private GstMetaApi.GstVideoTimeCodeConfigStruct.ByValue configStruct; - private GstVideoTimeCode timeCode; + private VideoTimeCode timeCode; @Before public void setUp() { @@ -49,7 +49,7 @@ public void setUp() { timeCodeStruct.config = configStruct; timeCodeStruct.write(); - timeCode = new GstVideoTimeCode(timeCodeStruct.getPointer()); + timeCode = new VideoTimeCode(timeCodeStruct.getPointer()); } From 3688adfbd8f2813490a9affeceef6b65665bcb0f Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Wed, 26 Aug 2020 11:35:18 +0200 Subject: [PATCH 11/17] created factory method for creating metadata classes --- src/org/freedesktop/gstreamer/Buffer.java | 32 ++++-- src/org/freedesktop/gstreamer/meta/Meta.java | 23 ++++ .../freedesktop/gstreamer/meta/MetaData.java | 49 --------- .../gstreamer/meta/MetaDataFactory.java | 104 ++++++++++++++++++ .../gstreamer/meta/VideoTimeCodeMeta.java | 4 +- .../gstreamer/meta/GstTimeCodeMetaTest.java | 35 ++---- .../gstreamer/meta/MetaDataFactoryTest.java | 80 ++++++++++++++ .../gstreamer/meta/MetaDataTest.java | 65 ----------- 8 files changed, 242 insertions(+), 150 deletions(-) create mode 100644 src/org/freedesktop/gstreamer/meta/Meta.java delete mode 100644 src/org/freedesktop/gstreamer/meta/MetaData.java create mode 100644 src/org/freedesktop/gstreamer/meta/MetaDataFactory.java create mode 100644 test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java delete mode 100644 test/org/freedesktop/gstreamer/meta/MetaDataTest.java diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index 76939059..eef7b8a7 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -30,8 +30,8 @@ import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; -import org.freedesktop.gstreamer.meta.MetaData; -import org.freedesktop.gstreamer.meta.VideoTimeCodeMeta; +import org.freedesktop.gstreamer.meta.Meta; +import org.freedesktop.gstreamer.meta.MetaDataFactory; import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; /** @@ -252,12 +252,19 @@ public EnumSet getFlags() { } /** - * Get the time code metadata for buffer. When there is no such metadata, NULL is returned. + * Get metadata from buffer. In case that in buffer is not selected type of metadata return null * - * @return return time code (SMPTE) for current buffer + * @param clazz requested type of metadata + * @return return metadata from buffer. Return null if in buffer is not selected metadata type */ - public VideoTimeCodeMeta getVideoTimeCodeMeta() { - return new VideoTimeCodeMeta(GSTBUFFER_API.gst_buffer_get_meta(this, MetaData.VIDEO_TIME_CODE_META.getType())); + public M getMetadata(Class clazz) { + MetaDataFactory metaDataFactory = new MetaDataFactory(); + Pointer pointer = GSTBUFFER_API.gst_buffer_get_meta(this, metaDataFactory.getGType(clazz)); + // can not create metadata class from null pointer + if (pointer == null) { + return null; + } + return metaDataFactory.getInstance(clazz, pointer); } @@ -266,13 +273,13 @@ public VideoTimeCodeMeta getVideoTimeCodeMeta() { *

* Since GStreamer 1.14 * - * @param metaData type of metadata + * @param clazz type of metadata * @return return true only if buffer contains selected type of metadata */ @Gst.Since(minor = 14) - public boolean containsMetadata(MetaData metaData) { + public boolean containsMetadata(Class clazz) { Gst.checkVersion(1, 14); - return getNumberOfMeta(metaData) > 0; + return getNumberOfMeta(clazz) > 0; } /** @@ -280,13 +287,14 @@ public boolean containsMetadata(MetaData metaData) { *

* Since GStreamer 1.14 * - * @param metaData type of metadata + * @param clazz type of metadata * @return return number of metadata */ @Gst.Since(minor = 14) - public int getNumberOfMeta(MetaData metaData) { + public int getNumberOfMeta(Class clazz) { Gst.checkVersion(1, 14); - return GSTBUFFER_API.gst_buffer_get_n_meta(this, metaData.getType()); + MetaDataFactory metaDataFactory = new MetaDataFactory(); + return GSTBUFFER_API.gst_buffer_get_n_meta(this, metaDataFactory.getGType(clazz)); } diff --git a/src/org/freedesktop/gstreamer/meta/Meta.java b/src/org/freedesktop/gstreamer/meta/Meta.java new file mode 100644 index 00000000..c6f46f8f --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/Meta.java @@ -0,0 +1,23 @@ +package org.freedesktop.gstreamer.meta; +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * + * + * Default interface for all metadata classes + */ +public interface Meta { +} diff --git a/src/org/freedesktop/gstreamer/meta/MetaData.java b/src/org/freedesktop/gstreamer/meta/MetaData.java deleted file mode 100644 index ed0466c5..00000000 --- a/src/org/freedesktop/gstreamer/meta/MetaData.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.freedesktop.gstreamer.meta; - -import java.util.function.Supplier; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.lowlevel.GType; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; - -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - * - * Gst meta data GTypes - * - */ -public enum MetaData { - - VIDEO_CROP_META(GST_META_API::gst_video_crop_meta_api_get_type), - VIDEO_GL_TEXTURE_META(GST_META_API::gst_video_gl_texture_upload_meta_api_get_type), - VIDEO_META(GST_META_API::gst_video_meta_api_get_type), - VIDEO_REGION_OF_INTEREST(GST_META_API::gst_video_region_of_interest_meta_api_get_type), - @Gst.Since(minor = 10) - VIDEO_TIME_CODE_META(GST_META_API::gst_video_time_code_meta_api_get_type); - - private final Supplier gTypeMetaSup; - - MetaData(Supplier gTypeMetaSup) { - this.gTypeMetaSup = gTypeMetaSup; - } - - public GType getType() { - if(name().equals(VIDEO_TIME_CODE_META.name())){ - Gst.checkVersion(1,10); - } - return gTypeMetaSup.get(); - } -} diff --git a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java new file mode 100644 index 00000000..c962bb42 --- /dev/null +++ b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java @@ -0,0 +1,104 @@ +package org.freedesktop.gstreamer.meta; + +import com.sun.jna.Pointer; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; +import org.freedesktop.gstreamer.lowlevel.GType; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; + +/* + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * + * Factory for creating metadata + */ +public class MetaDataFactory { + private static final Map, MetaDataCrate> metaMapping; + + static { + metaMapping = new HashMap<>(); + metaMapping.put(VideoTimeCodeMeta.class, new MetaDataCrate(GST_META_API::gst_video_time_code_meta_api_get_type, VideoTimeCodeMeta::new)); + //metaMapping.put(video_interest_meta_class,new MetaDataCrate(GST_META_API::gst_video_region_of_interest_meta_api_get_type,ideo_interest_meta_class::new); + //metaMapping.put(video_meta_class,GST_META_API::gst_video_meta_api_get_type,video_meta_class::new); + //metaMapping.put(video_texture_meta_class,GST_META_API::gst_video_gl_texture_upload_meta_api_get_type,video_texture_meta_class::new); + //metaMapping.put(video_crop_meta_class,GST_META_API::gst_video_crop_meta_api_get_type,video_crop_meta_class::new); + } + + /** + * Return GType for selected Metadata class + * + * @param clazz metadata class + * @return Return GStreamer GType related to Java metadata class + * @throws IllegalArgumentException throws exception in case that selected type is not registered in factory + */ + public GType getGType(Class clazz) { + MetaDataCrate crate = metaMapping.get(clazz); + if (crate != null) { + return crate.getGType().get(); + } + throw new IllegalArgumentException("Unknown meta class: " + clazz); + } + + /** + * Create Java class instance of metadata based on type of class + * + * @param clazz selected type of metadata + * @param pointer pointer to memory with gstreamer metadata + * @return return create metadata instance filled with data from gstreamer + * @throws IllegalArgumentException throws exception in case that selected type is not registered in factory + */ + public M getInstance(Class clazz, Pointer pointer) { + MetaDataCrate crate = metaMapping.get(clazz); + if (crate != null) { + return (M) crate.getCreator().apply(pointer); + } + throw new IllegalArgumentException("Unknown meta class: " + clazz); + } + + /** + * Helper class holding function for obtain GType and new instance some implementation of {@link Meta} + */ + public static final class MetaDataCrate { + private final Supplier gTypeSup; + private final Function creator; + + public MetaDataCrate(Supplier gTypeSup, Function creator) { + this.gTypeSup = gTypeSup; + this.creator = creator; + } + + public Supplier getGType() { + return gTypeSup; + } + + public Function getCreator() { + return creator; + } + } + + /** + * Register new metadata. This method enable register new type metadata outside of this library + * + * @param clazz metadata class + * @param crate create with GType and function for creating new metadata instance + */ + public static void registerMetadata(Class clazz, MetaDataCrate crate) { + metaMapping.put(clazz, crate); + } + +} diff --git a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java index e5a6285e..40606d24 100644 --- a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java @@ -1,6 +1,7 @@ package org.freedesktop.gstreamer.meta; import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GPointer; @@ -30,7 +31,8 @@ * * @see GstVideoTimeCodeMeta */ -public class VideoTimeCodeMeta extends NativeObject { +@Gst.Since(minor = 10) +public class VideoTimeCodeMeta extends NativeObject implements Meta{ public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; private final GstVideoTimeCodeMetaStruct metaStruct; diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index f056aa75..f2659838 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -57,11 +57,7 @@ public void testVideoWithoutMeta() { TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); - assertFalse("Default video not contains region metadata", buffer.containsMetadata(MetaData.VIDEO_REGION_OF_INTEREST)); - assertFalse("Default video not contains metadata", buffer.containsMetadata(MetaData.VIDEO_META)); - assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(MetaData.VIDEO_GL_TEXTURE_META)); - assertFalse("Default video not contains crop metadata", buffer.containsMetadata(MetaData.VIDEO_CROP_META)); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); }, "videotestsrc do-timestamp=true ! x264enc ! mxfmux ! decodebin ! appsink name=myappsink"); } @@ -74,11 +70,8 @@ public void testVideoMeta() { TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); - assertFalse("Default video not contains region metadata", buffer.containsMetadata(MetaData.VIDEO_REGION_OF_INTEREST)); - assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(MetaData.VIDEO_GL_TEXTURE_META)); - assertFalse("Default video not contains crop metadata", buffer.containsMetadata(MetaData.VIDEO_CROP_META)); - assertTrue(buffer.containsMetadata(MetaData.VIDEO_META)); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); + // assertTrue(buffer.containsMetadata(MetaData.VIDEO_META)); }, "videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! appsink name=myappsink"); } @@ -91,11 +84,7 @@ public void testVideoCropMeta() { TestAssumptions.requireGstVersion(1,14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); - assertFalse("Default video not contains region metadata", buffer.containsMetadata(MetaData.VIDEO_REGION_OF_INTEREST)); - assertFalse("Default video not contains gl texture metadata", buffer.containsMetadata(MetaData.VIDEO_GL_TEXTURE_META)); - assertFalse("Default video not contains crop metadata", buffer.containsMetadata(MetaData.VIDEO_CROP_META)); - assertFalse("Default video not contains metadata", buffer.containsMetadata(MetaData.VIDEO_META)); + assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); }, "videotestsrc ! videoscale !" + " appsink name=myappsink"); } @@ -107,9 +96,9 @@ public void testVideoTimeCodeMetaPal() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } - VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -135,9 +124,9 @@ public void testVideoTimeCodeNTSCDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } - VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -166,9 +155,9 @@ public void testVideoTimeCodeNTSCDropFrame() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } - VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -193,9 +182,9 @@ public void testVideoTimeCodeNTSCNonDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if(Gst.testVersion(1,14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(MetaData.VIDEO_TIME_CODE_META)); + assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } - VideoTimeCodeMeta meta = buffer.getVideoTimeCodeMeta(); + VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); diff --git a/test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java b/test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java new file mode 100644 index 00000000..e8368a1f --- /dev/null +++ b/test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java @@ -0,0 +1,80 @@ +package org.freedesktop.gstreamer.meta; + +import com.sun.jna.Memory; +import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.lowlevel.GType; +import org.freedesktop.gstreamer.util.TestAssumptions; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * @author Petr Lastovka + */ +public class MetaDataFactoryTest { + + + private MetaDataFactory metaDataFactory; + private Pointer mockPointer; + + @BeforeClass + public static void beforeClass() throws Exception { + Gst.init(); + } + + @AfterClass + public static void afterClass() throws Exception { + Gst.deinit(); + } + + @Before + public void setUp() { + metaDataFactory = new MetaDataFactory(); + mockPointer = new Memory(1000000); + } + + @Test + public void testGetGType() { + TestAssumptions.requireGstVersion(1, 10); + GType gType = metaDataFactory.getGType(VideoTimeCodeMeta.class); + assertNotNull("In factory should be videotimecode meta already registered", gType); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetGTypeUnknown() { + Meta tempMeta = new Meta() { + }; + metaDataFactory.getGType(tempMeta.getClass()); + } + + @Test + public void testGetInstance() { + TestAssumptions.requireGstVersion(1, 10); + VideoTimeCodeMeta meta = metaDataFactory.getInstance(VideoTimeCodeMeta.class, mockPointer); + assertNotNull("In factory should be videotimecode meta already registered", meta); + } + + @Test + public void testRegisterMetadata() { + // register some dummy implementation to already existed factory + MetaDataFactory.registerMetadata(DummyMeta.class, new MetaDataFactory.MetaDataCrate(() -> GType.OBJECT, mockPointer -> new DummyMeta())); + + // get GType + GType gType = metaDataFactory.getGType(DummyMeta.class); + assertNotNull("Returned value should not be null", gType); + assertEquals("Registered GType should be GType.Object", GType.OBJECT, gType); + + // get instance + DummyMeta dummyMeta = metaDataFactory.getInstance(DummyMeta.class, null); + assertNotNull("Because DummyMeta is already registered return value should be not null", dummyMeta); + } + + private static class DummyMeta implements Meta { + public DummyMeta() { + } + } +} \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/meta/MetaDataTest.java b/test/org/freedesktop/gstreamer/meta/MetaDataTest.java deleted file mode 100644 index a5a63bb2..00000000 --- a/test/org/freedesktop/gstreamer/meta/MetaDataTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.freedesktop.gstreamer.meta; - -import java.util.Collection; -import java.util.EnumSet; -import java.util.stream.Collectors; -import org.freedesktop.gstreamer.Gst; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import static org.junit.Assert.assertNotNull; - -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - * - */ -@RunWith(Parameterized.class) -public class MetaDataTest { - - @Parameterized.Parameters - public static Collection data() { - return // remove unsupported api for baseline 1.8 - EnumSet.complementOf(EnumSet.of(MetaData.VIDEO_TIME_CODE_META)) - .stream() - .map(metaData -> new Object[]{metaData}) - .collect(Collectors.toList()); - } - - private final MetaData metaData; - - @BeforeClass - public static void beforeClass() { - Gst.init(); - } - - @AfterClass - public static void afterClass() { - Gst.deinit(); - } - - public MetaDataTest(MetaData metaData) { - this.metaData = metaData; - } - - - @Test - public void testGetType() { - assertNotNull(metaData.getType()); - } -} \ No newline at end of file From 411ce57dc75e5f43077a5f932c3d590f15e24369 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Wed, 26 Aug 2020 11:39:36 +0200 Subject: [PATCH 12/17] removed unnecessary class for register meta types --- src/org/freedesktop/gstreamer/Gst.java | 6 +-- .../freedesktop/gstreamer/meta/GstMeta.java | 37 ------------------- .../gstreamer/meta/MetaDataFactory.java | 17 +++++++++ .../gstreamer/timecode/VideoTimeCode.java | 2 +- 4 files changed, 21 insertions(+), 41 deletions(-) delete mode 100644 src/org/freedesktop/gstreamer/meta/GstMeta.java diff --git a/src/org/freedesktop/gstreamer/Gst.java b/src/org/freedesktop/gstreamer/Gst.java index d07e7343..f65267aa 100644 --- a/src/org/freedesktop/gstreamer/Gst.java +++ b/src/org/freedesktop/gstreamer/Gst.java @@ -19,7 +19,7 @@ */ package org.freedesktop.gstreamer; -import org.freedesktop.gstreamer.meta.GstMeta; +import org.freedesktop.gstreamer.meta.MetaDataFactory; import org.freedesktop.gstreamer.query.Query; import org.freedesktop.gstreamer.message.Message; import org.freedesktop.gstreamer.event.Event; @@ -651,8 +651,8 @@ private static synchronized void loadAllClasses() { new Controllers(), new Elements(), new WebRTC.Types(), - new GstMeta(), - new VideoTimeCode.TimeTypes()) + new MetaDataFactory.Types(), + new VideoTimeCode.Types()) .flatMap(NativeObject.TypeProvider::types) .forEachOrdered(GstTypes::register); if (!DISABLE_EXTERNAL) { diff --git a/src/org/freedesktop/gstreamer/meta/GstMeta.java b/src/org/freedesktop/gstreamer/meta/GstMeta.java deleted file mode 100644 index 7c6fd684..00000000 --- a/src/org/freedesktop/gstreamer/meta/GstMeta.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.freedesktop.gstreamer.meta; - -import java.util.stream.Stream; -import org.freedesktop.gstreamer.glib.NativeObject; -import static org.freedesktop.gstreamer.glib.Natives.registration; - -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - * - */ -public class GstMeta implements NativeObject.TypeProvider { - - @Override - public Stream> types() { - return Stream.of( - registration(VideoTimeCodeMeta.class, - VideoTimeCodeMeta.GTYPE_NAME, - VideoTimeCodeMeta::new), - registration(MetaInfo.class, - MetaInfo.GTYPE_NAME, - MetaInfo::new)); - } -} diff --git a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java index c962bb42..0e774baa 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java +++ b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java @@ -5,7 +5,10 @@ import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; +import java.util.stream.Stream; +import org.freedesktop.gstreamer.glib.NativeObject; import org.freedesktop.gstreamer.lowlevel.GType; +import static org.freedesktop.gstreamer.glib.Natives.registration; import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; /* @@ -101,4 +104,18 @@ public static void registerMetadata(Class clazz, MetaDataCrate c metaMapping.put(clazz, crate); } + public static final class Types implements NativeObject.TypeProvider{ + + @Override + public Stream> types() { + return Stream.of( + registration(VideoTimeCodeMeta.class, + VideoTimeCodeMeta.GTYPE_NAME, + VideoTimeCodeMeta::new), + registration(MetaInfo.class, + MetaInfo.GTYPE_NAME, + MetaInfo::new)); + } + } + } diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java index dffe4b89..9add140c 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java @@ -103,7 +103,7 @@ public void disown() { super.disown(); } - public static final class TimeTypes implements NativeObject.TypeProvider { + public static final class Types implements NativeObject.TypeProvider { @Override public Stream> types() { From 3c66be27d1bfbf4aacbdb8a7e43d064fb775f235 Mon Sep 17 00:00:00 2001 From: Jokertwo Date: Wed, 26 Aug 2020 12:43:33 +0200 Subject: [PATCH 13/17] change enum to flags --- .../gstreamer/lowlevel/GstMetaApi.java | 3 +- .../gstreamer/meta/MetaDataFactory.java | 2 +- .../freedesktop/gstreamer/meta/MetaFlags.java | 28 +++++++--- .../gstreamer/meta/VideoTimeCodeMeta.java | 2 +- .../gstreamer/meta/GstTimeCodeMetaTest.java | 52 ++++--------------- 5 files changed, 36 insertions(+), 51 deletions(-) diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java index cf42f687..dc1d111f 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java @@ -4,6 +4,7 @@ import com.sun.jna.Pointer; import com.sun.jna.Structure; import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.meta.MetaFlags; import org.freedesktop.gstreamer.meta.MetaInfo; import org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags; @@ -64,7 +65,7 @@ class GstMetaStruct extends Structure { public static final class ByValue extends GstMetaStruct implements Structure.ByValue { } - public long flags; + public MetaFlags flags; public GstMetaInfoStruct.ByReference info; } diff --git a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java index 0e774baa..a4f513cd 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java +++ b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java @@ -104,7 +104,7 @@ public static void registerMetadata(Class clazz, MetaDataCrate c metaMapping.put(clazz, crate); } - public static final class Types implements NativeObject.TypeProvider{ + public static final class Types implements NativeObject.TypeProvider { @Override public Stream> types() { diff --git a/src/org/freedesktop/gstreamer/meta/MetaFlags.java b/src/org/freedesktop/gstreamer/meta/MetaFlags.java index fea7beb1..2f0defd7 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaFlags.java +++ b/src/org/freedesktop/gstreamer/meta/MetaFlags.java @@ -1,6 +1,7 @@ package org.freedesktop.gstreamer.meta; import org.freedesktop.gstreamer.glib.NativeEnum; +import org.freedesktop.gstreamer.glib.NativeFlags; /* * Copyright (c) 2020 Petr Lastovka @@ -22,13 +23,28 @@ * * @see GstMetaFlags */ -public enum MetaFlags implements NativeEnum { +public enum MetaFlags implements NativeFlags { - GST_META_FLAG_NONE(0), // no flags - GST_META_FLAG_READONLY(1), // metadata should not be modified - GST_META_FLAG_POOLED(2), // metadata is managed by a bufferpool - GST_META_FLAG_LOCKED(4), // metadata should not be removed - GST_META_FLAG_LAST(65536); + /** + * no flags + */ + GST_META_FLAG_NONE(0), + /** + * metadata should not be modified + */ + GST_META_FLAG_READONLY(1 << 0), + /** + * metadata is managed by a bufferpool + */ + GST_META_FLAG_POOLED(1 << 1), + /** + * metadata should not be removed + */ + GST_META_FLAG_LOCKED(1 << 2), + /** + * additional flags can be added starting from this flag. + */ + GST_META_FLAG_LAST(1 << 16); private final int value; diff --git a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java index 40606d24..afb6dfa7 100644 --- a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java @@ -32,7 +32,7 @@ * @see GstVideoTimeCodeMeta */ @Gst.Since(minor = 10) -public class VideoTimeCodeMeta extends NativeObject implements Meta{ +public class VideoTimeCodeMeta extends NativeObject implements Meta { public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; private final GstVideoTimeCodeMetaStruct metaStruct; diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java index f2659838..970e1406 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java @@ -1,13 +1,9 @@ package org.freedesktop.gstreamer.meta; -import java.util.concurrent.TimeUnit; import org.freedesktop.gstreamer.Buffer; -import org.freedesktop.gstreamer.FlowReturn; import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.Pipeline; -import org.freedesktop.gstreamer.Sample; import org.freedesktop.gstreamer.SampleTester; -import org.freedesktop.gstreamer.elements.AppSink; +import org.freedesktop.gstreamer.Version; import org.freedesktop.gstreamer.timecode.VideoTimeCode; import org.freedesktop.gstreamer.timecode.VideoTimeCodeConfig; import org.freedesktop.gstreamer.util.TestAssumptions; @@ -52,50 +48,22 @@ public static void afterClass() { } @Test - public void testVideoWithoutMeta() { + public void testVideoWithoutTimeCodeMeta() { // method containsMetadata is available since 1.14 - TestAssumptions.requireGstVersion(1,14); + TestAssumptions.requireGstVersion(1, 14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); }, "videotestsrc do-timestamp=true ! x264enc ! mxfmux ! decodebin ! appsink name=myappsink"); } - /** - * Contains video meta - */ - @Test - public void testVideoMeta() { - // method containsMetadata is available since 1.14 - TestAssumptions.requireGstVersion(1,14); - SampleTester.test(sample -> { - Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); - // assertTrue(buffer.containsMetadata(MetaData.VIDEO_META)); - }, "videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! appsink name=myappsink"); - } - - /** - * Contains video meta - */ - @Test - public void testVideoCropMeta() { - // method containsMetadata is available since 1.14 - TestAssumptions.requireGstVersion(1,14); - SampleTester.test(sample -> { - Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); - }, "videotestsrc ! videoscale !" + - " appsink name=myappsink"); - } - @Test public void testVideoTimeCodeMetaPal() { // timecodestamper is available since 1.10 TestAssumptions.requireGstVersion(1,10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - if(Gst.testVersion(1,14)) { + if (Gst.testVersion(1, 14)) { assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); @@ -120,10 +88,10 @@ public void testVideoTimeCodeMetaPal() { @Test public void testVideoTimeCodeNTSCDrop() { // timecodestamper is available since 1.10 - TestAssumptions.requireGstVersion(1,10); + TestAssumptions.requireGstVersion(1, 10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - if(Gst.testVersion(1,14)) { + if (Gst.testVersion(1, 14)) { assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); @@ -151,10 +119,10 @@ public void testVideoTimeCodeNTSCDrop() { @Test public void testVideoTimeCodeNTSCDropFrame() { // timecodestamper is available since 1.10 - TestAssumptions.requireGstVersion(1,10); + TestAssumptions.requireGstVersion(1, 10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - if(Gst.testVersion(1,14)) { + if (Gst.testVersion(1, 14)) { assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); @@ -178,10 +146,10 @@ public void testVideoTimeCodeNTSCDropFrame() { @Test public void testVideoTimeCodeNTSCNonDrop() { // timecodestamper is available since 1.10 - TestAssumptions.requireGstVersion(1,10); + TestAssumptions.requireGstVersion(1, 10); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - if(Gst.testVersion(1,14)) { + if (Gst.testVersion(1, 14)) { assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); } VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); From 45dce4e40add45880a700d0a616b8bff23702eec Mon Sep 17 00:00:00 2001 From: Neil C Smith Date: Wed, 23 Sep 2020 15:30:48 +0100 Subject: [PATCH 14/17] Fix up headers and documentation links. --- src/org/freedesktop/gstreamer/Buffer.java | 32 +++++++++++-------- .../gstreamer/lowlevel/GstBufferAPI.java | 6 ++-- .../gstreamer/lowlevel/GstVideoAPI.java | 2 +- src/org/freedesktop/gstreamer/meta/Meta.java | 7 ++-- .../gstreamer/meta/MetaDataFactory.java | 30 +++++++++-------- .../freedesktop/gstreamer/meta/MetaFlags.java | 17 +++++----- .../freedesktop/gstreamer/meta/MetaInfo.java | 20 ++++++------ .../gstreamer/meta/VideoTimeCodeMeta.java | 32 ++++++++++--------- .../gstreamer/timecode/VideoTimeCode.java | 30 +++++++++-------- .../timecode/VideoTimeCodeConfig.java | 29 +++++++++-------- .../timecode/VideoTimeCodeFlags.java | 20 +++++++----- .../freedesktop/gstreamer/SampleTester.java | 9 ++++-- .../lowlevel/LowLevelStructureTest.java | 14 ++++---- .../timecode/VideoTimeCodeConfigTest.java | 14 ++++---- .../timecode/VideoTimeCodeFlagsTest.java | 21 ++++++------ .../gstreamer/timecode/VideoTimeCodeTest.java | 17 +++++----- 16 files changed, 163 insertions(+), 137 deletions(-) diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index eef7b8a7..8af69fd9 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -22,17 +22,20 @@ */ package org.freedesktop.gstreamer; -import com.sun.jna.Pointer; +import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; + import java.nio.ByteBuffer; -import java.util.EnumSet; -import org.freedesktop.gstreamer.glib.NativeFlags; -import org.freedesktop.gstreamer.glib.Natives; + import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; import org.freedesktop.gstreamer.meta.Meta; import org.freedesktop.gstreamer.meta.MetaDataFactory; -import static org.freedesktop.gstreamer.lowlevel.GstBufferAPI.GSTBUFFER_API; + +import com.sun.jna.Pointer; +import java.util.EnumSet; +import org.freedesktop.gstreamer.glib.NativeFlags; +import org.freedesktop.gstreamer.glib.Natives; /** * Buffers are the basic unit of data transfer in GStreamer. They contain the @@ -141,7 +144,7 @@ public long getDecodeTimestamp() { * Set the decode timestamp of the Buffer * * @param val a long representing the timestamp or - * {@link ClockTime#NONE} when the timestamp is not known or relevant. + * {@link ClockTime#NONE} when the timestamp is not known or relevant. */ public void setDecodeTimestamp(long val) { this.struct.writeField("dts", val); @@ -163,7 +166,7 @@ public long getPresentationTimestamp() { * Set the presentation timestamp of the Buffer * * @param val a long representing the timestamp or - * {@link ClockTime#NONE} when the timestamp is not known or relevant. + * {@link ClockTime#NONE} when the timestamp is not known or relevant. */ public void setPresentationTimestamp(long val) { this.struct.writeField("pts", val); @@ -183,7 +186,7 @@ public long getDuration() { * Set the duration of this buffer. * * @param val a long representing the duration or - * {@link ClockTime#NONE} when the timestamp is not known or relevant. + * {@link ClockTime#NONE} when the timestamp is not known or relevant. */ public void setDuration(long val) { this.struct.writeField("duration", val); @@ -205,9 +208,9 @@ public long getOffset() { * Set the offset (media-specific) of this buffer * * @param val a media specific offset for the buffer data. For video frames, - * this is the frame number of this buffer. For audio samples, this is the - * offset of the first sample in this buffer. For file data or compressed - * data this is the byte offset of the first byte in this buffer. + * this is the frame number of this buffer. For audio samples, this is the + * offset of the first sample in this buffer. For file data or compressed + * data this is the byte offset of the first byte in this buffer. */ public void setOffset(long val) { this.struct.writeField("offset", val); @@ -229,9 +232,9 @@ public long getOffsetEnd() { * Set the offset (media-specific) of this buffer * * @param val a media specific offset for the buffer data. For video frames, - * this is the frame number of this buffer. For audio samples, this is the - * offset of the first sample in this buffer. For file data or compressed - * data this is the byte offset of the first byte in this buffer. + * this is the frame number of this buffer. For audio samples, this is the + * offset of the first sample in this buffer. For file data or compressed + * data this is the byte offset of the first byte in this buffer. */ public void setOffsetEnd(long val) { this.struct.writeField("offset_end", val); @@ -321,6 +324,7 @@ public boolean setFlags(EnumSet flags) { * * @param flags an EnumSet of {@link BufferFlags} to be cleared on the buffer. * @return true if flags were successfully cleared on this buffer + * */ @Gst.Since(minor = 10) public boolean unsetFlags(EnumSet flags) { diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java index 42626b25..75d51482 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java @@ -20,13 +20,15 @@ package org.freedesktop.gstreamer.lowlevel; -import com.sun.jna.NativeLong; -import com.sun.jna.Pointer; import java.util.Arrays; import java.util.List; + import org.freedesktop.gstreamer.Buffer; import org.freedesktop.gstreamer.lowlevel.GstMiniObjectAPI.MiniObjectStruct; import org.freedesktop.gstreamer.lowlevel.annotations.CallerOwnsReturn; + +import com.sun.jna.NativeLong; +import com.sun.jna.Pointer; import static org.freedesktop.gstreamer.lowlevel.GstAPI.GST_PADDING; /** diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java index a619e24d..529e701b 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java @@ -28,7 +28,7 @@ public interface GstVideoAPI extends Library { @CallerOwnsReturn Pointer gst_video_time_code_new_empty(); - void gst_video_time_code_free(Pointer gstVideoTimeCode); + void gst_video_time_code_free(Pointer gstVideoTimeCode); GValue gst_video_frame_rate(Pad pad); boolean gst_video_get_size(Pad pad, int [] width, int [] height); diff --git a/src/org/freedesktop/gstreamer/meta/Meta.java b/src/org/freedesktop/gstreamer/meta/Meta.java index c6f46f8f..8820b37b 100644 --- a/src/org/freedesktop/gstreamer/meta/Meta.java +++ b/src/org/freedesktop/gstreamer/meta/Meta.java @@ -1,4 +1,3 @@ -package org.freedesktop.gstreamer.meta; /* * Copyright (c) 2020 Petr Lastovka * @@ -15,8 +14,10 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * - * + */ +package org.freedesktop.gstreamer.meta; + + /** * Default interface for all metadata classes */ public interface Meta { diff --git a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java index a4f513cd..4f2f64fb 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java +++ b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java @@ -1,16 +1,3 @@ -package org.freedesktop.gstreamer.meta; - -import com.sun.jna.Pointer; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Stream; -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.lowlevel.GType; -import static org.freedesktop.gstreamer.glib.Natives.registration; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; - /* * Copyright (c) 2020 Petr Lastovka * @@ -27,7 +14,22 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * + */ +package org.freedesktop.gstreamer.meta; + +import com.sun.jna.Pointer; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Stream; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.lowlevel.GType; +import static org.freedesktop.gstreamer.glib.Natives.registration; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; + + +/** * Factory for creating metadata */ public class MetaDataFactory { diff --git a/src/org/freedesktop/gstreamer/meta/MetaFlags.java b/src/org/freedesktop/gstreamer/meta/MetaFlags.java index 2f0defd7..8d4a3873 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaFlags.java +++ b/src/org/freedesktop/gstreamer/meta/MetaFlags.java @@ -1,8 +1,3 @@ -package org.freedesktop.gstreamer.meta; - -import org.freedesktop.gstreamer.glib.NativeEnum; -import org.freedesktop.gstreamer.glib.NativeFlags; - /* * Copyright (c) 2020 Petr Lastovka * @@ -19,9 +14,15 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * - * - * @see GstMetaFlags + */ +package org.freedesktop.gstreamer.meta; + +import org.freedesktop.gstreamer.glib.NativeFlags; + + /** + * See upstream documentation at + * https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html#GstMetaFlags */ public enum MetaFlags implements NativeFlags { diff --git a/src/org/freedesktop/gstreamer/meta/MetaInfo.java b/src/org/freedesktop/gstreamer/meta/MetaInfo.java index aec5c34d..b3b5ac6d 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaInfo.java +++ b/src/org/freedesktop/gstreamer/meta/MetaInfo.java @@ -1,11 +1,3 @@ -package org.freedesktop.gstreamer.meta; - -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.lowlevel.GType; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfoStruct; - - /* * Copyright (c) 2020 Petr Lastovka * @@ -22,8 +14,16 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * - * + */ +package org.freedesktop.gstreamer.meta; + +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.lowlevel.GType; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfoStruct; + + + /** * The GstMetaInfo provides information about a specific metadata structure. * * @see GstMetaInfo diff --git a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java index afb6dfa7..20f6000e 100644 --- a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java +++ b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java @@ -1,14 +1,3 @@ -package org.freedesktop.gstreamer.meta; - -import com.sun.jna.Pointer; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.glib.Natives; -import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.timecode.VideoTimeCode; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; - /* * Copyright (c) 2020 Petr Lastovka * @@ -25,11 +14,24 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * + */ +package org.freedesktop.gstreamer.meta; + +import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.timecode.VideoTimeCode; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; + + /** * Extra buffer metadata describing the GstVideoTimeCode of the frame. - * - * - * @see GstVideoTimeCodeMeta + *

+ * See upstream documentation at + * https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoTimeCodeMeta */ @Gst.Since(minor = 10) public class VideoTimeCodeMeta extends NativeObject implements Meta { diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java index 9add140c..a884005f 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java @@ -1,15 +1,3 @@ -package org.freedesktop.gstreamer.timecode; - -import com.sun.jna.Pointer; -import java.util.stream.Stream; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.glib.Natives; -import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; -import static org.freedesktop.gstreamer.glib.Natives.registration; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeStruct; - /* * Copyright (c) 2020 Petr Lastovka * @@ -26,10 +14,24 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * + */ +package org.freedesktop.gstreamer.timecode; + +import com.sun.jna.Pointer; +import java.util.stream.Stream; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; +import static org.freedesktop.gstreamer.glib.Natives.registration; +import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeStruct; + +/** * A representation of a SMPTE time code. * - * @see GstVideoTimeCode + * See https://gstreamer.freedesktop.org/documentation/video/gstvideotimecode.html */ @Gst.Since(minor = 10) public class VideoTimeCode extends NativeObject { diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java index 5276a27b..f051abad 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java @@ -1,13 +1,3 @@ -package org.freedesktop.gstreamer.timecode; - -import com.sun.jna.Pointer; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.glib.Natives; -import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.lowlevel.GlibAPI; -import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; - /* * Copyright (c) 2020 Petr Lastovka * @@ -24,10 +14,23 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * + */ +package org.freedesktop.gstreamer.timecode; + +import com.sun.jna.Pointer; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.lowlevel.GlibAPI; +import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; + +/** * The configuration of the time code. - * - * @see GstVideoTimeCodeConfig + *

+ * See upstream documentation at + * + * https://gstreamer.freedesktop.org/documentation/video/gstvideotimecode.html#GstVideoTimeCodeConfig */ @Gst.Since(minor = 10) public class VideoTimeCodeConfig extends NativeObject { diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java index ba24b3c2..2c00655e 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java +++ b/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java @@ -1,7 +1,3 @@ -package org.freedesktop.gstreamer.timecode; - -import org.freedesktop.gstreamer.glib.NativeFlags; - /* * Copyright (c) 2020 Petr Lastovka * @@ -18,10 +14,18 @@ * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . - * - * Flags related to the time code information. For drop frame, only 30000/1001 and 60000/1001 frame rates are supported. - * - * @see GstVideoTimeCodeFlags + */ +package org.freedesktop.gstreamer.timecode; + +import org.freedesktop.gstreamer.glib.NativeFlags; + +/** + * Flags related to the time code information. For drop frame, only 30000/1001 + * and 60000/1001 frame rates are supported. + *

+ * See upstream documentation at + * https://gstreamer.freedesktop.org/documentation/video/gstvideotimecode.html#GstVideoTimeCodeFlags */ public enum VideoTimeCodeFlags implements NativeFlags { /** diff --git a/test/org/freedesktop/gstreamer/SampleTester.java b/test/org/freedesktop/gstreamer/SampleTester.java index a9468bc1..2fd8ac32 100644 --- a/test/org/freedesktop/gstreamer/SampleTester.java +++ b/test/org/freedesktop/gstreamer/SampleTester.java @@ -19,13 +19,16 @@ package org.freedesktop.gstreamer; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + import java.util.ArrayList; import java.util.function.Consumer; + import org.freedesktop.gstreamer.elements.AppSink; import org.freedesktop.gstreamer.glib.GError; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; + /** * Utility class for unit testing API that operates on a Sample. diff --git a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java index 37d6c89c..14837d2a 100644 --- a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java +++ b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java @@ -1,25 +1,25 @@ package org.freedesktop.gstreamer.lowlevel; -import com.sun.jna.Structure; +import static org.junit.Assert.assertTrue; + import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import org.freedesktop.gstreamer.Gst; + import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import static org.junit.Assert.assertTrue; -/** - * @author Neil C Smith - */ +import com.sun.jna.Structure; +import java.util.Arrays; +import org.freedesktop.gstreamer.Gst; + public class LowLevelStructureTest { private final static Logger LOG = Logger.getLogger(LowLevelStructureTest.class.getName()); diff --git a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java index 77d610ef..e344a1ec 100644 --- a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java +++ b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java @@ -1,10 +1,3 @@ -package org.freedesktop.gstreamer.timecode; - -import org.freedesktop.gstreamer.lowlevel.GstMetaApi; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertEquals; - /* * Copyright (c) 2020 Petr Lastovka * @@ -23,6 +16,13 @@ * version 3 along with this work. If not, see . * */ +package org.freedesktop.gstreamer.timecode; + +import org.freedesktop.gstreamer.lowlevel.GstMetaApi; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class VideoTimeCodeConfigTest { private GstMetaApi.GstVideoTimeCodeConfigStruct origStruct; private VideoTimeCodeConfig codeConfig; diff --git a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java index 4586517b..ea376d69 100644 --- a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java +++ b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java @@ -1,13 +1,3 @@ -package org.freedesktop.gstreamer.timecode; - -import java.util.Arrays; -import java.util.Collection; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - /* * Copyright (c) 2020 Petr Lastovka * @@ -26,6 +16,17 @@ * version 3 along with this work. If not, see . * */ +package org.freedesktop.gstreamer.timecode; + +import java.util.Arrays; +import java.util.Collection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + + @RunWith(Parameterized.class) public class VideoTimeCodeFlagsTest { diff --git a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java index c2db4e80..14d36cea 100644 --- a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java +++ b/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java @@ -1,11 +1,3 @@ -package org.freedesktop.gstreamer.timecode; - -import org.freedesktop.gstreamer.lowlevel.GstMetaApi; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - /* * Copyright (c) 2020 Petr Lastovka * @@ -24,6 +16,15 @@ * version 3 along with this work. If not, see . * */ +package org.freedesktop.gstreamer.timecode; + +import org.freedesktop.gstreamer.lowlevel.GstMetaApi; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + + public class VideoTimeCodeTest { From d0fa8ff87d18db6c174510185c8f1f140aa14871 Mon Sep 17 00:00:00 2001 From: Neil C Smith Date: Tue, 13 Oct 2020 19:03:15 +0100 Subject: [PATCH 15/17] Refactor to match upstream structure, and maintain separation between public and lowlevel API. Move Meta to org.freedesktop.gstreamer, and add Meta.API type for mapping API GType / querying buffer. Remove MetaInfo wrapper. Add GstMetaPtr for use in lowlevel bindings. Move VideoTimeCodeMeta and related classes to video package, matching upstream structure. --- src/org/freedesktop/gstreamer/Buffer.java | 55 ++++---- src/org/freedesktop/gstreamer/Gst.java | 11 +- src/org/freedesktop/gstreamer/Meta.java | 126 ++++++++++++++++++ .../gstreamer/{meta => }/MetaFlags.java | 23 ++-- .../gstreamer/glib/NativeObject.java | 6 - .../gstreamer/lowlevel/GstBufferAPI.java | 2 +- .../gstreamer/lowlevel/GstMetaAPI.java | 53 ++++++++ .../gstreamer/lowlevel/GstMetaApi.java | 110 --------------- .../gstreamer/lowlevel/GstMetaPtr.java | 66 +++++++++ .../gstreamer/lowlevel/GstVideoAPI.java | 70 ++++++++++ src/org/freedesktop/gstreamer/meta/Meta.java | 24 ---- .../gstreamer/meta/MetaDataFactory.java | 123 ----------------- .../freedesktop/gstreamer/meta/MetaInfo.java | 79 ----------- .../gstreamer/meta/VideoTimeCodeMeta.java | 96 ------------- .../freedesktop/gstreamer/video/Video.java | 48 +++++++ .../{timecode => video}/VideoTimeCode.java | 72 +++++----- .../VideoTimeCodeConfig.java | 55 ++++---- .../VideoTimeCodeFlags.java | 11 +- .../gstreamer/video/VideoTimeCodeMeta.java | 71 ++++++++++ .../lowlevel/LowLevelStructureTest.java | 10 +- .../gstreamer/meta/MetaDataFactoryTest.java | 80 ----------- .../{meta => video}/GstTimeCodeMetaTest.java | 92 ++++++------- .../VideoTimeCodeConfigTest.java | 21 +-- .../VideoTimeCodeFlagsTest.java | 6 +- .../VideoTimeCodeTest.java | 20 +-- 25 files changed, 631 insertions(+), 699 deletions(-) create mode 100644 src/org/freedesktop/gstreamer/Meta.java rename src/org/freedesktop/gstreamer/{meta => }/MetaFlags.java (82%) create mode 100644 src/org/freedesktop/gstreamer/lowlevel/GstMetaAPI.java delete mode 100644 src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java create mode 100644 src/org/freedesktop/gstreamer/lowlevel/GstMetaPtr.java delete mode 100644 src/org/freedesktop/gstreamer/meta/Meta.java delete mode 100644 src/org/freedesktop/gstreamer/meta/MetaDataFactory.java delete mode 100644 src/org/freedesktop/gstreamer/meta/MetaInfo.java delete mode 100644 src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java create mode 100644 src/org/freedesktop/gstreamer/video/Video.java rename src/org/freedesktop/gstreamer/{timecode => video}/VideoTimeCode.java (61%) rename src/org/freedesktop/gstreamer/{timecode => video}/VideoTimeCodeConfig.java (63%) rename src/org/freedesktop/gstreamer/{timecode => video}/VideoTimeCodeFlags.java (90%) create mode 100644 src/org/freedesktop/gstreamer/video/VideoTimeCodeMeta.java delete mode 100644 test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java rename test/org/freedesktop/gstreamer/{meta => video}/GstTimeCodeMetaTest.java (68%) rename test/org/freedesktop/gstreamer/{timecode => video}/VideoTimeCodeConfigTest.java (68%) rename test/org/freedesktop/gstreamer/{timecode => video}/VideoTimeCodeFlagsTest.java (91%) rename test/org/freedesktop/gstreamer/{timecode => video}/VideoTimeCodeTest.java (75%) diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index 8af69fd9..bb7af373 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -1,6 +1,6 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2019 Christophe Lafolet - * Copyright (c) 2019 Neil C Smith * Copyright (C) 2014 Tom Greenwood * Copyright (C) 2007 Wayne Meissner * Copyright (C) 1999,2000 Erik Walthinsen @@ -29,13 +29,13 @@ import org.freedesktop.gstreamer.lowlevel.GstBufferAPI; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.BufferStruct; import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; -import org.freedesktop.gstreamer.meta.Meta; -import org.freedesktop.gstreamer.meta.MetaDataFactory; import com.sun.jna.Pointer; import java.util.EnumSet; import org.freedesktop.gstreamer.glib.NativeFlags; import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GType; +import org.freedesktop.gstreamer.lowlevel.GstMetaPtr; /** * Buffers are the basic unit of data transfer in GStreamer. They contain the @@ -255,49 +255,58 @@ public EnumSet getFlags() { } /** - * Get metadata from buffer. In case that in buffer is not selected type of metadata return null + * Get the metadata for api on buffer. When there is no such metadata, NULL + * is returned. * - * @param clazz requested type of metadata - * @return return metadata from buffer. Return null if in buffer is not selected metadata type + * @param implementation type of metadata + * @param api api type of metadata + * @return meta or null */ - public M getMetadata(Class clazz) { - MetaDataFactory metaDataFactory = new MetaDataFactory(); - Pointer pointer = GSTBUFFER_API.gst_buffer_get_meta(this, metaDataFactory.getGType(clazz)); + public T getMeta(Meta.API api) { + GType apiType = api.getAPIGType(); + if (apiType == GType.INVALID) { + return null; + } + GstMetaPtr ptr = GSTBUFFER_API.gst_buffer_get_meta(this, apiType); // can not create metadata class from null pointer - if (pointer == null) { + if (ptr == null) { return null; } - return metaDataFactory.getInstance(clazz, pointer); + return Natives.objectFor(ptr, api.getImplClass(), false, false); } - /** - * Check if buffer contains selected type of metadata + * Check if buffer contains metadata for api. *

* Since GStreamer 1.14 * - * @param clazz type of metadata + * @param implementation type of metadata + * @param api type of metadata * @return return true only if buffer contains selected type of metadata */ @Gst.Since(minor = 14) - public boolean containsMetadata(Class clazz) { - Gst.checkVersion(1, 14); - return getNumberOfMeta(clazz) > 0; + public boolean hasMeta(Meta.API api) { + return getMetaCount(api) > 0; } /** - * Check number of metadata for selected type. There can be more metadata in case multiple video/audio layer + * Check number of metadata for api. There can be more than one metadata in + * case of multiple video/audio layer. *

* Since GStreamer 1.14 * - * @param clazz type of metadata - * @return return number of metadata + * @param implementation type of metadata + * @param api type of metadata + * @return count of metadata of provided api type */ @Gst.Since(minor = 14) - public int getNumberOfMeta(Class clazz) { + public int getMetaCount(Meta.API api) { Gst.checkVersion(1, 14); - MetaDataFactory metaDataFactory = new MetaDataFactory(); - return GSTBUFFER_API.gst_buffer_get_n_meta(this, metaDataFactory.getGType(clazz)); + GType apiType = api.getAPIGType(); + if (apiType == GType.INVALID) { + return 0; + } + return GSTBUFFER_API.gst_buffer_get_n_meta(this, apiType); } diff --git a/src/org/freedesktop/gstreamer/Gst.java b/src/org/freedesktop/gstreamer/Gst.java index f65267aa..49ea186a 100644 --- a/src/org/freedesktop/gstreamer/Gst.java +++ b/src/org/freedesktop/gstreamer/Gst.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Neil C Smith + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2018 Antonio Morales * Copyright (c) 2007 Wayne Meissner * @@ -19,11 +19,11 @@ */ package org.freedesktop.gstreamer; -import org.freedesktop.gstreamer.meta.MetaDataFactory; import org.freedesktop.gstreamer.query.Query; import org.freedesktop.gstreamer.message.Message; import org.freedesktop.gstreamer.event.Event; import org.freedesktop.gstreamer.glib.GError; + import static org.freedesktop.gstreamer.lowlevel.GstAPI.GST_API; import java.util.ArrayList; @@ -57,10 +57,12 @@ import org.freedesktop.gstreamer.elements.Elements; import org.freedesktop.gstreamer.glib.GLib; import org.freedesktop.gstreamer.glib.GMainContext; +import org.freedesktop.gstreamer.video.Video; + import static org.freedesktop.gstreamer.lowlevel.GstParseAPI.GSTPARSE_API; import static org.freedesktop.gstreamer.glib.Natives.registration; import static org.freedesktop.gstreamer.lowlevel.GlibAPI.GLIB_API; -import org.freedesktop.gstreamer.timecode.VideoTimeCode; + import org.freedesktop.gstreamer.webrtc.WebRTC; /** @@ -651,8 +653,7 @@ private static synchronized void loadAllClasses() { new Controllers(), new Elements(), new WebRTC.Types(), - new MetaDataFactory.Types(), - new VideoTimeCode.Types()) + new Video.Types()) .flatMap(NativeObject.TypeProvider::types) .forEachOrdered(GstTypes::register); if (!DISABLE_EXTERNAL) { diff --git a/src/org/freedesktop/gstreamer/Meta.java b/src/org/freedesktop/gstreamer/Meta.java new file mode 100644 index 00000000..fa28125e --- /dev/null +++ b/src/org/freedesktop/gstreamer/Meta.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2020 Neil C Smith + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + */ +package org.freedesktop.gstreamer; + +import java.util.Objects; +import org.freedesktop.gstreamer.glib.NativeObject; +import org.freedesktop.gstreamer.lowlevel.GPointer; +import org.freedesktop.gstreamer.lowlevel.GType; +import org.freedesktop.gstreamer.lowlevel.GstMetaPtr; + +/** + * Base for all metadata types added to a Buffer. + *

+ * See upstream documentation at + * https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html + *

+ */ +public abstract class Meta extends NativeObject { + + /** + * Create Meta from Initializer. + * + * @param init initializer. + */ + protected Meta(Initializer init) { + this(new Handle(init.ptr.as(GstMetaPtr.class, GstMetaPtr::new), + init.ownsHandle)); + } + + /** + * Create Meta from Handle. + * + * @param handle native object handle. + */ + protected Meta(Handle handle) { + super(handle); + } + + /** + * NativeObject.Handle implementation. + */ + protected static class Handle extends NativeObject.Handle { + + /** + * Create Handle. + * + * @param ptr pointer to underlying native GstMeta. + * @param ownsHandle + */ + public Handle(GstMetaPtr ptr, boolean ownsHandle) { + super(ptr, ownsHandle); + } + + @Override + protected void disposeNativeHandle(GPointer ptr) { + } + + } + + /** + * API for Meta subclass. Used for querying from Buffer. + *

+ * The relevant API will usually be available as a public static final field + * on the implementation class. + *

+ * The API type reflects two distinct types (api and implementation) used in + * the underlying GStreamer GstMetaInfo. + *

+ * See upstream documentation at + * https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html#GstMetaInfo + *

+ * + * @param implementation type + */ + public static final class API { + + private final Class implClass; + private final String apiTypeName; + + private GType apiType; + + /** + * Create an API for the given implementation type. + * + * @param impl class implementing the API, must be registered to the + * underlying implementation GType + * @param api name of the underlying API GType + */ + public API(Class impl, String api) { + this.implClass = Objects.requireNonNull(impl); + this.apiTypeName = Objects.requireNonNull(api); + apiType = GType.INVALID; + } + + Class getImplClass() { + return implClass; + } + + GType getAPIGType() { + GType type = apiType; + if (type == GType.INVALID) { + type = GType.valueOf(apiTypeName); + apiType = type; + } + return type; + } + + } +} diff --git a/src/org/freedesktop/gstreamer/meta/MetaFlags.java b/src/org/freedesktop/gstreamer/MetaFlags.java similarity index 82% rename from src/org/freedesktop/gstreamer/meta/MetaFlags.java rename to src/org/freedesktop/gstreamer/MetaFlags.java index 8d4a3873..35e0d244 100644 --- a/src/org/freedesktop/gstreamer/meta/MetaFlags.java +++ b/src/org/freedesktop/gstreamer/MetaFlags.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 Petr Lastovka * * This file is part of gstreamer-java. @@ -15,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . */ -package org.freedesktop.gstreamer.meta; +package org.freedesktop.gstreamer; import org.freedesktop.gstreamer.glib.NativeFlags; @@ -24,12 +25,12 @@ * https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html#GstMetaFlags */ -public enum MetaFlags implements NativeFlags { +/*public*/ enum MetaFlags implements NativeFlags { - /** - * no flags - */ - GST_META_FLAG_NONE(0), +// /** +// * no flags +// */ +// GST_META_FLAG_NONE(0), /** * metadata should not be modified */ @@ -42,10 +43,12 @@ public enum MetaFlags implements NativeFlags { * metadata should not be removed */ GST_META_FLAG_LOCKED(1 << 2), - /** - * additional flags can be added starting from this flag. - */ - GST_META_FLAG_LAST(1 << 16); +// /** +// * additional flags can be added starting from this flag. +// */ +// GST_META_FLAG_LAST(1 << 16) +// + ; private final int value; diff --git a/src/org/freedesktop/gstreamer/glib/NativeObject.java b/src/org/freedesktop/gstreamer/glib/NativeObject.java index dd31e222..4b2a873d 100644 --- a/src/org/freedesktop/gstreamer/glib/NativeObject.java +++ b/src/org/freedesktop/gstreamer/glib/NativeObject.java @@ -59,12 +59,6 @@ public abstract class NativeObject implements AutoCloseable { // */ protected NativeObject(Handle handle) { this.handle = Objects.requireNonNull(handle); - // - // Only store this object in the map if we can tell when it has been disposed - // (i.e. must be at least a GObject - MiniObject and other NativeObject subclasses - // don't signal destruction, so it is impossible to know if the instance - // is stale or not - // this.ptr = handle.ptrRef.get().getPointer(); if (handle.isCacheable()) { // need to put all nativeRef in map now so WeakReference doesn't go out of scope diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java index 75d51482..6f23bf72 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java @@ -104,7 +104,7 @@ protected List getFieldOrder() { void gst_buffer_unmap(Buffer buffer, MapInfoStruct info); int gst_buffer_n_memory(Buffer buffer); boolean gst_buffer_map_range(Buffer buffer, int idx, int length, MapInfoStruct info, int flags); - Pointer gst_buffer_get_meta(Buffer buffer, GType gType); + GstMetaPtr gst_buffer_get_meta(Buffer buffer, GType gType); int gst_buffer_get_n_meta(Buffer buffer,GType gType); // re-introduces in gstreamer 1.9 int gst_buffer_get_flags(Buffer buffer); diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaAPI.java new file mode 100644 index 00000000..38c6b3ef --- /dev/null +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaAPI.java @@ -0,0 +1,53 @@ +package org.freedesktop.gstreamer.lowlevel; + +import com.sun.jna.Library; +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + +/** + */ +public interface GstMetaAPI extends Library { + GstMetaAPI GST_META_API = GstNative.load(GstMetaAPI.class); + + + + @Structure.FieldOrder({"flags", "info"}) + class GstMetaStruct extends Structure { + public static final class ByValue extends GstMetaStruct implements Structure.ByValue { + } + + public int flags; + public GstMetaInfoStruct.ByReference info; + + int infoOffset() { + return fieldOffset("info"); + } + + } + + @Structure.FieldOrder({"api", "type", "size"}) + class GstMetaInfoStruct extends Structure { + public static class ByReference extends GstMetaInfoStruct implements Structure.ByReference { + } + + public GstMetaInfoStruct() { + } + + public GstMetaInfoStruct(Pointer p) { + super(p); + read(); + } + + public GType api; + public GType type; + public long size; + + int typeOffset() { + return fieldOffset("type"); + } + + } + + + +} diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java deleted file mode 100644 index dc1d111f..00000000 --- a/src/org/freedesktop/gstreamer/lowlevel/GstMetaApi.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.freedesktop.gstreamer.lowlevel; - -import com.sun.jna.Library; -import com.sun.jna.Pointer; -import com.sun.jna.Structure; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.meta.MetaFlags; -import org.freedesktop.gstreamer.meta.MetaInfo; -import org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags; - -/** - * @author Jokertwo - */ -public interface GstMetaApi extends Library { - GstMetaApi GST_META_API = GstNative.load("gstvideo", GstMetaApi.class); - - GType gst_video_time_code_meta_api_get_type(); - - GType gst_video_crop_meta_api_get_type(); - - GType gst_video_gl_texture_upload_meta_api_get_type(); - - GType gst_video_meta_api_get_type(); - - GType gst_video_region_of_interest_meta_api_get_type(); - - MetaInfo gst_video_time_code_meta_get_info(); - - - @Structure.FieldOrder({"meta", "tc"}) - class GstVideoTimeCodeMetaStruct extends Structure { - public GstMetaStruct.ByValue meta; - public GstVideoTimeCodeStruct.ByValue tc; - - public GstVideoTimeCodeMetaStruct(Pointer p) { - super(p); - read(); - } - } - - @Structure.FieldOrder({"config", "hours", "minutes", "seconds", "frames", "field_count"}) - @Gst.Since(minor = 10) - class GstVideoTimeCodeStruct extends Structure { - public static class ByValue extends GstVideoTimeCodeStruct implements Structure.ByValue { - } - - public GstVideoTimeCodeConfigStruct.ByValue config; - public int hours; - public int minutes; - public int seconds; - public int frames; - public int field_count; - - public GstVideoTimeCodeStruct() { - } - - public GstVideoTimeCodeStruct(Pointer p) { - super(p); - read(); - } - } - - @Structure.FieldOrder({"flags", "info"}) - class GstMetaStruct extends Structure { - public static final class ByValue extends GstMetaStruct implements Structure.ByValue { - } - - public MetaFlags flags; - public GstMetaInfoStruct.ByReference info; - } - - @Structure.FieldOrder({"api", "type", "size"}) - class GstMetaInfoStruct extends Structure { - public static class ByReference extends GstMetaInfoStruct implements Structure.ByReference { - } - - public GstMetaInfoStruct() { - } - - public GstMetaInfoStruct(Pointer p) { - super(p); - read(); - } - - public GType api; - public GType type; - public long size; - } - - @Structure.FieldOrder({"fps_n", "fps_d", "flags", "latest_daily_jam"}) - @Gst.Since(minor = 10) - class GstVideoTimeCodeConfigStruct extends Structure { - public static class ByValue extends GstVideoTimeCodeConfigStruct implements Structure.ByValue { - } - - public int fps_n; - public int fps_d; - public VideoTimeCodeFlags flags; - public Pointer latest_daily_jam; - - public GstVideoTimeCodeConfigStruct() { - } - - public GstVideoTimeCodeConfigStruct(Pointer p) { - super(p); - read(); - } - } - -} diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstMetaPtr.java b/src/org/freedesktop/gstreamer/lowlevel/GstMetaPtr.java new file mode 100644 index 00000000..8a286ca6 --- /dev/null +++ b/src/org/freedesktop/gstreamer/lowlevel/GstMetaPtr.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020 Neil C Smith + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under the terms of the GNU + * Lesser General Public License version 3 only, as published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 along with + * this work. If not, see . + */ +package org.freedesktop.gstreamer.lowlevel; + +import com.sun.jna.Native; +import com.sun.jna.Pointer; + +/** + * Base GstMeta pointer + */ +public class GstMetaPtr extends GTypedPtr { + + private static final int INFO_OFFSET; + private static final int IMPL_TYPE_OFFSET; + + static { + INFO_OFFSET = new GstMetaAPI.GstMetaStruct().infoOffset(); + IMPL_TYPE_OFFSET = new GstMetaAPI.GstMetaInfoStruct().typeOffset(); + } + + public GstMetaPtr() { + } + + public GstMetaPtr(Pointer ptr) { + super(ptr); + } + + @Override + public GType getGType() { + // Quick getter for GType without allocation + Pointer metaInfo = getPointer().getPointer(INFO_OFFSET); + if (Native.SIZE_T_SIZE == 8) { + return GType.valueOf(metaInfo.getLong(IMPL_TYPE_OFFSET)); + } else if (Native.SIZE_T_SIZE == 4) { + return GType.valueOf(((long) metaInfo.getInt(IMPL_TYPE_OFFSET)) & 0xffffffffL); + } else { + throw new IllegalStateException("SIZE_T size not supported: " + Native.SIZE_T_SIZE); + } + } + + public GType getAPIGType() { + // Quick getter for GType without allocation + Pointer metaInfo = getPointer().getPointer(INFO_OFFSET); + if (Native.SIZE_T_SIZE == 8) { + return GType.valueOf(metaInfo.getLong(0)); + } else if (Native.SIZE_T_SIZE == 4) { + return GType.valueOf(((long) metaInfo.getInt(0)) & 0xffffffffL); + } else { + throw new IllegalStateException("SIZE_T size not supported: " + Native.SIZE_T_SIZE); + } + } + +} diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java index 529e701b..f83ced11 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstVideoAPI.java @@ -21,7 +21,10 @@ import com.sun.jna.Library; import com.sun.jna.Pointer; +import com.sun.jna.Structure; +import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.lowlevel.annotations.CallerOwnsReturn; +import org.freedesktop.gstreamer.video.VideoTimeCodeFlags; public interface GstVideoAPI extends Library { public final static GstVideoAPI GSTVIDEO_API = GstNative.load("gstvideo", GstVideoAPI.class); @@ -39,4 +42,71 @@ Pointer ptr_gst_video_event_new_downstream_force_key_unit( Pointer ptr_gst_video_event_new_upstream_force_key_unit( long running_time, boolean all_headers, int count); + + GType gst_video_time_code_meta_api_get_type(); + + GType gst_video_crop_meta_api_get_type(); + + GType gst_video_gl_texture_upload_meta_api_get_type(); + + GType gst_video_meta_api_get_type(); + + GType gst_video_region_of_interest_meta_api_get_type(); + +// MetaInfo gst_video_time_code_meta_get_info(); + + + @Structure.FieldOrder({"meta", "tc"}) + class GstVideoTimeCodeMetaStruct extends Structure { + public GstMetaAPI.GstMetaStruct.ByValue meta; + public GstVideoTimeCodeStruct.ByValue tc; + + public GstVideoTimeCodeMetaStruct(Pointer p) { + super(p); + read(); + } + } + + @Structure.FieldOrder({"config", "hours", "minutes", "seconds", "frames", "field_count"}) + @Gst.Since(minor = 10) + class GstVideoTimeCodeStruct extends Structure { + public static class ByValue extends GstVideoTimeCodeStruct implements Structure.ByValue { + } + + public GstVideoTimeCodeConfigStruct.ByValue config; + public int hours; + public int minutes; + public int seconds; + public int frames; + public int field_count; + + public GstVideoTimeCodeStruct() { + } + + public GstVideoTimeCodeStruct(Pointer p) { + super(p); + read(); + } + } + + @Structure.FieldOrder({"fps_n", "fps_d", "flags", "latest_daily_jam"}) + @Gst.Since(minor = 10) + class GstVideoTimeCodeConfigStruct extends Structure { + + public static class ByValue extends GstVideoTimeCodeConfigStruct implements Structure.ByValue { + } + + public int fps_n; + public int fps_d; + public int flags; + public Pointer latest_daily_jam; + + public GstVideoTimeCodeConfigStruct() { + } + + public GstVideoTimeCodeConfigStruct(Pointer p) { + super(p); + read(); + } + } } diff --git a/src/org/freedesktop/gstreamer/meta/Meta.java b/src/org/freedesktop/gstreamer/meta/Meta.java deleted file mode 100644 index 8820b37b..00000000 --- a/src/org/freedesktop/gstreamer/meta/Meta.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - */ -package org.freedesktop.gstreamer.meta; - - /** - * Default interface for all metadata classes - */ -public interface Meta { -} diff --git a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java b/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java deleted file mode 100644 index 4f2f64fb..00000000 --- a/src/org/freedesktop/gstreamer/meta/MetaDataFactory.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - */ -package org.freedesktop.gstreamer.meta; - -import com.sun.jna.Pointer; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Stream; -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.lowlevel.GType; -import static org.freedesktop.gstreamer.glib.Natives.registration; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; - - -/** - * Factory for creating metadata - */ -public class MetaDataFactory { - private static final Map, MetaDataCrate> metaMapping; - - static { - metaMapping = new HashMap<>(); - metaMapping.put(VideoTimeCodeMeta.class, new MetaDataCrate(GST_META_API::gst_video_time_code_meta_api_get_type, VideoTimeCodeMeta::new)); - //metaMapping.put(video_interest_meta_class,new MetaDataCrate(GST_META_API::gst_video_region_of_interest_meta_api_get_type,ideo_interest_meta_class::new); - //metaMapping.put(video_meta_class,GST_META_API::gst_video_meta_api_get_type,video_meta_class::new); - //metaMapping.put(video_texture_meta_class,GST_META_API::gst_video_gl_texture_upload_meta_api_get_type,video_texture_meta_class::new); - //metaMapping.put(video_crop_meta_class,GST_META_API::gst_video_crop_meta_api_get_type,video_crop_meta_class::new); - } - - /** - * Return GType for selected Metadata class - * - * @param clazz metadata class - * @return Return GStreamer GType related to Java metadata class - * @throws IllegalArgumentException throws exception in case that selected type is not registered in factory - */ - public GType getGType(Class clazz) { - MetaDataCrate crate = metaMapping.get(clazz); - if (crate != null) { - return crate.getGType().get(); - } - throw new IllegalArgumentException("Unknown meta class: " + clazz); - } - - /** - * Create Java class instance of metadata based on type of class - * - * @param clazz selected type of metadata - * @param pointer pointer to memory with gstreamer metadata - * @return return create metadata instance filled with data from gstreamer - * @throws IllegalArgumentException throws exception in case that selected type is not registered in factory - */ - public M getInstance(Class clazz, Pointer pointer) { - MetaDataCrate crate = metaMapping.get(clazz); - if (crate != null) { - return (M) crate.getCreator().apply(pointer); - } - throw new IllegalArgumentException("Unknown meta class: " + clazz); - } - - /** - * Helper class holding function for obtain GType and new instance some implementation of {@link Meta} - */ - public static final class MetaDataCrate { - private final Supplier gTypeSup; - private final Function creator; - - public MetaDataCrate(Supplier gTypeSup, Function creator) { - this.gTypeSup = gTypeSup; - this.creator = creator; - } - - public Supplier getGType() { - return gTypeSup; - } - - public Function getCreator() { - return creator; - } - } - - /** - * Register new metadata. This method enable register new type metadata outside of this library - * - * @param clazz metadata class - * @param crate create with GType and function for creating new metadata instance - */ - public static void registerMetadata(Class clazz, MetaDataCrate crate) { - metaMapping.put(clazz, crate); - } - - public static final class Types implements NativeObject.TypeProvider { - - @Override - public Stream> types() { - return Stream.of( - registration(VideoTimeCodeMeta.class, - VideoTimeCodeMeta.GTYPE_NAME, - VideoTimeCodeMeta::new), - registration(MetaInfo.class, - MetaInfo.GTYPE_NAME, - MetaInfo::new)); - } - } - -} diff --git a/src/org/freedesktop/gstreamer/meta/MetaInfo.java b/src/org/freedesktop/gstreamer/meta/MetaInfo.java deleted file mode 100644 index b3b5ac6d..00000000 --- a/src/org/freedesktop/gstreamer/meta/MetaInfo.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - */ -package org.freedesktop.gstreamer.meta; - -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.lowlevel.GType; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstMetaInfoStruct; - - - /** - * The GstMetaInfo provides information about a specific metadata structure. - * - * @see GstMetaInfo - */ -public class MetaInfo extends NativeObject { - - public static final String GTYPE_NAME = "GstMetaInfo"; - private final GstMetaInfoStruct metaStruct; - - - MetaInfo(Initializer init) { - super(new Handle(init.ptr, init.ownsHandle)); - metaStruct = new GstMetaInfoStruct(getRawPointer()); - } - - /** - * Type identifying the implementor of the api - * - * @return return dynamic GType - */ - public GType getGType() { - return this.metaStruct.type; - } - - /** - * Tag identifying the metadata structure and api - * - * @return return dynamic api type - */ - public GType getApiType() { - return this.metaStruct.api; - } - - - private static final class Handle extends NativeObject.Handle { - - /** - * Construct a Handle for the supplied native reference. - * - * @param ptr native reference - * @param ownsReference whether the Handle owns the native reference and - */ - public Handle(GPointer ptr, boolean ownsReference) { - super(ptr, ownsReference); - } - - @Override - protected void disposeNativeHandle(GPointer ptr) { - // Meta info is destructed by nested function - } - } - -} diff --git a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java deleted file mode 100644 index 20f6000e..00000000 --- a/src/org/freedesktop/gstreamer/meta/VideoTimeCodeMeta.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2020 Petr Lastovka - * - * This file is part of gstreamer-java. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License version 3 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * version 3 for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with this work. If not, see . - */ -package org.freedesktop.gstreamer.meta; - -import com.sun.jna.Pointer; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.glib.Natives; -import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.timecode.VideoTimeCode; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GST_META_API; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeMetaStruct; - - /** - * Extra buffer metadata describing the GstVideoTimeCode of the frame. - *

- * See upstream documentation at - * https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoTimeCodeMeta - */ -@Gst.Since(minor = 10) -public class VideoTimeCodeMeta extends NativeObject implements Meta { - - public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; - private final GstVideoTimeCodeMetaStruct metaStruct; - private final VideoTimeCode timeCode; - - public VideoTimeCodeMeta(Pointer pointer) { - this(Natives.initializer(pointer, false, false)); - } - - VideoTimeCodeMeta(Initializer init) { - super(new Handle(init.ptr, init.ownsHandle)); - metaStruct = new GstVideoTimeCodeMetaStruct(getRawPointer()); - timeCode = new VideoTimeCode(metaStruct.tc.getPointer()); - } - - /** - * Time code attach to frame - * - * @return return time code - */ - public VideoTimeCode getTimeCode() { - return timeCode; - } - - /** - * Information about metadata - * - * @return return structure with information about metadata - */ - public MetaInfo getMetaInfo() { - return GST_META_API.gst_video_time_code_meta_get_info(); - } - - @Override - public void disown() { - timeCode.disown(); - super.disown(); - } - - private static final class Handle extends NativeObject.Handle { - - /** - * Construct a Handle for the supplied native reference. - * - * @param ptr native reference - * @param ownsReference whether the Handle owns the native reference and - */ - public Handle(GPointer ptr, boolean ownsReference) { - super(ptr, ownsReference); - } - - @Override - protected void disposeNativeHandle(GPointer ptr) { - // structure will be released automatically by GStreamer - /** by nested function*/ - } - } - -} diff --git a/src/org/freedesktop/gstreamer/video/Video.java b/src/org/freedesktop/gstreamer/video/Video.java new file mode 100644 index 00000000..149217b3 --- /dev/null +++ b/src/org/freedesktop/gstreamer/video/Video.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Neil C Smith + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + */ +package org.freedesktop.gstreamer.video; + +import java.util.stream.Stream; +import org.freedesktop.gstreamer.glib.NativeObject; + +import static org.freedesktop.gstreamer.glib.Natives.registration; + +/** + * Utility class for GStreamer Video library. + */ +public final class Video { + + private Video() { + } + + /** + * TypeProvider implementation for GStreamer Video library. + */ + public static class Types implements NativeObject.TypeProvider { + + @Override + public Stream> types() { + return Stream.of( + registration(VideoTimeCodeMeta.class, VideoTimeCodeMeta.GTYPE_NAME, + VideoTimeCodeMeta::new) + ); + } + + } + +} diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java b/src/org/freedesktop/gstreamer/video/VideoTimeCode.java similarity index 61% rename from src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java rename to src/org/freedesktop/gstreamer/video/VideoTimeCode.java index a884005f..28b053a5 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCode.java +++ b/src/org/freedesktop/gstreamer/video/VideoTimeCode.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 Petr Lastovka * * This file is part of gstreamer-java. @@ -15,17 +16,14 @@ * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . */ -package org.freedesktop.gstreamer.timecode; +package org.freedesktop.gstreamer.video; -import com.sun.jna.Pointer; -import java.util.stream.Stream; import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GPointer; import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; -import static org.freedesktop.gstreamer.glib.Natives.registration; -import static org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeStruct; +import org.freedesktop.gstreamer.lowlevel.GstVideoAPI.GstVideoTimeCodeStruct; + /** * A representation of a SMPTE time code. @@ -36,59 +34,58 @@ @Gst.Since(minor = 10) public class VideoTimeCode extends NativeObject { - public static final String GTYPE_NAME = "GstVideoTimeCode"; private final GstVideoTimeCodeStruct timeCodeStruct; private final VideoTimeCodeConfig timeCodeConfig; - public VideoTimeCode(){ - this(Natives.initializer(GstVideoAPI.GSTVIDEO_API.gst_video_time_code_new_empty())); - } +// public VideoTimeCode(){ +// this(Natives.initializer(GstVideoAPI.GSTVIDEO_API.gst_video_time_code_new_empty())); +// } - public VideoTimeCode(Pointer pointer) { - this(Natives.initializer(pointer,false,false)); + VideoTimeCode(GstVideoTimeCodeStruct struct) { + this(struct, new Handle(new GPointer(struct.getPointer()), false)); } - - VideoTimeCode(Initializer init) { - super(new Handle(init.ptr,init.ownsHandle)); - timeCodeStruct = new GstVideoTimeCodeStruct(getRawPointer()); - timeCodeConfig = new VideoTimeCodeConfig(timeCodeStruct.config.getPointer()); + + private VideoTimeCode(GstVideoTimeCodeStruct struct, Handle handle) { + super(handle); + this.timeCodeStruct = struct; + timeCodeConfig = new VideoTimeCodeConfig(timeCodeStruct.config); } - public VideoTimeCodeConfig getTCConfig() { + public VideoTimeCodeConfig getConfig() { return timeCodeConfig; } /** - * Hours field, must be less than 24 + * Hours field, must be less than 24. * - * @return return number of hours + * @return number of hours */ public int getHours() { return timeCodeStruct.hours; } /** - * Minutes field, must be less than 60 + * Minutes field, must be less than 60. * - * @return return number of minutes + * @return number of minutes */ public int getMinutes() { return timeCodeStruct.minutes; } /** - * Second field, must be less than 60 + * Second field, must be less than 60. * - * @return return number of seconds + * @return number of seconds */ public int getSeconds() { return timeCodeStruct.seconds; } /** - * Frames field + * Frames field. * - * @return return number of seconds + * @return number of seconds */ public int getFrames() { return timeCodeStruct.frames; @@ -105,21 +102,7 @@ public void disown() { super.disown(); } - public static final class Types implements NativeObject.TypeProvider { - - @Override - public Stream> types() { - return Stream.of( - registration(VideoTimeCode.class, - VideoTimeCode.GTYPE_NAME, - VideoTimeCode::new), - registration(VideoTimeCodeConfig.class, - VideoTimeCodeConfig.GTYPE_NAME, - VideoTimeCodeConfig::new)); - } - } - - public static final class Handle extends NativeObject.Handle{ + private static final class Handle extends NativeObject.Handle{ /** * Construct a Handle for the supplied native reference. @@ -135,5 +118,12 @@ public Handle(GPointer ptr, boolean ownsReference) { protected void disposeNativeHandle(GPointer ptr) { GstVideoAPI.GSTVIDEO_API.gst_video_time_code_free(ptr.getPointer()); } + + @Override + protected GPointer getPointer() { + return super.getPointer(); + } + + } } diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java b/src/org/freedesktop/gstreamer/video/VideoTimeCodeConfig.java similarity index 63% rename from src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java rename to src/org/freedesktop/gstreamer/video/VideoTimeCodeConfig.java index f051abad..3a0cd737 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfig.java +++ b/src/org/freedesktop/gstreamer/video/VideoTimeCodeConfig.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 Petr Lastovka * * This file is part of gstreamer-java. @@ -15,15 +16,14 @@ * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . */ -package org.freedesktop.gstreamer.timecode; +package org.freedesktop.gstreamer.video; -import com.sun.jna.Pointer; +import java.util.EnumSet; import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.glib.NativeFlags; import org.freedesktop.gstreamer.glib.NativeObject; -import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GPointer; -import org.freedesktop.gstreamer.lowlevel.GlibAPI; -import org.freedesktop.gstreamer.lowlevel.GstMetaApi.GstVideoTimeCodeConfigStruct; +import org.freedesktop.gstreamer.lowlevel.GstVideoAPI.GstVideoTimeCodeConfigStruct; /** * The configuration of the time code. @@ -35,51 +35,50 @@ @Gst.Since(minor = 10) public class VideoTimeCodeConfig extends NativeObject { - public static final String GTYPE_NAME = "GstVideoTimeCodeConfig"; private final GstVideoTimeCodeConfigStruct timeCodeConfig; - VideoTimeCodeConfig(Pointer pointer) { - this(Natives.initializer(pointer, false, false)); + VideoTimeCodeConfig(GstVideoTimeCodeConfigStruct struct) { + this(struct, new Handle(new GPointer(struct.getPointer()), false)); } - VideoTimeCodeConfig(NativeObject.Initializer init) { - super(new Handle(init.ptr, init.ownsHandle)); - timeCodeConfig = new GstVideoTimeCodeConfigStruct(getRawPointer()); + private VideoTimeCodeConfig(GstVideoTimeCodeConfigStruct struct, Handle handle) { + super(handle); + timeCodeConfig = struct; } /** - * The corresponding {@link VideoTimeCodeFlags} + * The corresponding {@link VideoTimeCodeFlags}. * - * @return return flag for current timecode + * @return return flags for current timecode */ - public VideoTimeCodeFlags getTimeCodeFlags() { - return timeCodeConfig.flags; + public EnumSet getFlags() { + return NativeFlags.fromInt(VideoTimeCodeFlags.class, timeCodeConfig.flags); } /** - * Numerator of the frame rate + * Numerator of the frame rate. * - * @return return positive number + * @return numerator */ - public int getFramerateNumerator() { + public int getNumerator() { return timeCodeConfig.fps_n; } /** - * Denominator of the frame rate + * Denominator of the frame rate. * - * @return return positive number + * @return denominator */ - public int getFramerateDenominator() { + public int getDenominator() { return timeCodeConfig.fps_d; } @Override public String toString() { final StringBuffer sb = new StringBuffer("GstVideoTimeCodeConfig{"); - sb.append("flags=").append(getTimeCodeFlags()) - .append(", numerator=").append(getFramerateNumerator()) - .append(", denominator=").append(getFramerateDenominator()) + sb.append("flags=").append(getFlags()) + .append(", numerator=").append(getNumerator()) + .append(", denominator=").append(getDenominator()) .append('}'); return sb.toString(); } @@ -99,7 +98,13 @@ public Handle(GPointer ptr, boolean ownsReference) { @Override protected void disposeNativeHandle(GPointer ptr) { // usually video timecode config will be released together with video timecode - GlibAPI.GLIB_API.g_free(ptr.getPointer()); + // GlibAPI.GLIB_API.g_free(ptr.getPointer()); } + + @Override + protected GPointer getPointer() { + return super.getPointer(); + } + } } diff --git a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java b/src/org/freedesktop/gstreamer/video/VideoTimeCodeFlags.java similarity index 90% rename from src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java rename to src/org/freedesktop/gstreamer/video/VideoTimeCodeFlags.java index 2c00655e..804552c4 100644 --- a/src/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlags.java +++ b/src/org/freedesktop/gstreamer/video/VideoTimeCodeFlags.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 Petr Lastovka * * This file is part of gstreamer-java. @@ -15,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see . */ -package org.freedesktop.gstreamer.timecode; +package org.freedesktop.gstreamer.video; import org.freedesktop.gstreamer.glib.NativeFlags; @@ -28,10 +29,10 @@ * >https://gstreamer.freedesktop.org/documentation/video/gstvideotimecode.html#GstVideoTimeCodeFlags */ public enum VideoTimeCodeFlags implements NativeFlags { - /** - * No flags - */ - GST_VIDEO_TIME_CODE_FLAGS_NONE(0), // No flags +// /** +// * No flags +// */ +// GST_VIDEO_TIME_CODE_FLAGS_NONE(0), // No flags /** * Whether we have drop frame rate */ diff --git a/src/org/freedesktop/gstreamer/video/VideoTimeCodeMeta.java b/src/org/freedesktop/gstreamer/video/VideoTimeCodeMeta.java new file mode 100644 index 00000000..ea683655 --- /dev/null +++ b/src/org/freedesktop/gstreamer/video/VideoTimeCodeMeta.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Neil C Smith + * Copyright (c) 2020 Petr Lastovka + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + */ +package org.freedesktop.gstreamer.video; + +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.Meta; + +import static org.freedesktop.gstreamer.lowlevel.GstVideoAPI.GstVideoTimeCodeMetaStruct; + + /** + * Extra buffer metadata describing the GstVideoTimeCode of the frame. + *

+ * See upstream documentation at + * https://gstreamer.freedesktop.org/documentation/video/gstvideometa.html#GstVideoTimeCodeMeta + */ +@Gst.Since(minor = 10) +public class VideoTimeCodeMeta extends Meta { + + /** + * Meta.API for VideoTimeCodeMeta. + */ + public static final API API = + new API(VideoTimeCodeMeta.class, "GstVideoTimeCodeMetaAPI"); + + /** + * Underlying GType name. + */ + public static final String GTYPE_NAME = "GstVideoTimeCodeMeta"; + + private final VideoTimeCode timeCode; + + VideoTimeCodeMeta(Initializer init) { + super(init); + GstVideoTimeCodeMetaStruct metaStruct = + new GstVideoTimeCodeMetaStruct(init.ptr.getPointer()); + timeCode = new VideoTimeCode(metaStruct.tc); + } + + /** + * Retrieve the time code attached to frame. + * + * @return time code + */ + public VideoTimeCode getTimeCode() { + return timeCode; + } + + @Override + public void disown() { + timeCode.disown(); + super.disown(); + } + +} diff --git a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java index 14837d2a..54422e14 100644 --- a/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java +++ b/test/org/freedesktop/gstreamer/lowlevel/LowLevelStructureTest.java @@ -112,7 +112,7 @@ private void testFields(Structure inst, List expectedFields) { } private static void initStructList() { - structs = new ArrayList>(); + structs = new ArrayList<>(); structs.add(BaseSinkAPI.GstBaseSinkStruct.class); structs.add(BaseSinkAPI.GstBaseSinkClass.class); @@ -166,10 +166,10 @@ private static void initStructList() { structs.add(GstElementAPI.GstElementClass.class); structs.add(GstEventAPI.EventStruct.class); - structs.add(GstMetaApi.GstVideoTimeCodeMetaStruct.class); - structs.add(GstMetaApi.GstVideoTimeCodeStruct.class); - structs.add(GstMetaApi.GstMetaInfoStruct.class); - structs.add(GstMetaApi.GstMetaStruct.class); + structs.add(GstVideoAPI.GstVideoTimeCodeMetaStruct.class); + structs.add(GstVideoAPI.GstVideoTimeCodeStruct.class); + structs.add(GstMetaAPI.GstMetaInfoStruct.class); + structs.add(GstMetaAPI.GstMetaStruct.class); // structs.add(GstInterpolationControlSourceAPI.GstInterpolationControlSourceStruct.class); // structs.add(GstInterpolationControlSourceAPI.GstInterpolationControlSourceClass.class); diff --git a/test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java b/test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java deleted file mode 100644 index e8368a1f..00000000 --- a/test/org/freedesktop/gstreamer/meta/MetaDataFactoryTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.freedesktop.gstreamer.meta; - -import com.sun.jna.Memory; -import com.sun.jna.Pointer; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.lowlevel.GType; -import org.freedesktop.gstreamer.util.TestAssumptions; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** - * @author Petr Lastovka - */ -public class MetaDataFactoryTest { - - - private MetaDataFactory metaDataFactory; - private Pointer mockPointer; - - @BeforeClass - public static void beforeClass() throws Exception { - Gst.init(); - } - - @AfterClass - public static void afterClass() throws Exception { - Gst.deinit(); - } - - @Before - public void setUp() { - metaDataFactory = new MetaDataFactory(); - mockPointer = new Memory(1000000); - } - - @Test - public void testGetGType() { - TestAssumptions.requireGstVersion(1, 10); - GType gType = metaDataFactory.getGType(VideoTimeCodeMeta.class); - assertNotNull("In factory should be videotimecode meta already registered", gType); - } - - @Test(expected = IllegalArgumentException.class) - public void testGetGTypeUnknown() { - Meta tempMeta = new Meta() { - }; - metaDataFactory.getGType(tempMeta.getClass()); - } - - @Test - public void testGetInstance() { - TestAssumptions.requireGstVersion(1, 10); - VideoTimeCodeMeta meta = metaDataFactory.getInstance(VideoTimeCodeMeta.class, mockPointer); - assertNotNull("In factory should be videotimecode meta already registered", meta); - } - - @Test - public void testRegisterMetadata() { - // register some dummy implementation to already existed factory - MetaDataFactory.registerMetadata(DummyMeta.class, new MetaDataFactory.MetaDataCrate(() -> GType.OBJECT, mockPointer -> new DummyMeta())); - - // get GType - GType gType = metaDataFactory.getGType(DummyMeta.class); - assertNotNull("Returned value should not be null", gType); - assertEquals("Registered GType should be GType.Object", GType.OBJECT, gType); - - // get instance - DummyMeta dummyMeta = metaDataFactory.getInstance(DummyMeta.class, null); - assertNotNull("Because DummyMeta is already registered return value should be not null", dummyMeta); - } - - private static class DummyMeta implements Meta { - public DummyMeta() { - } - } -} \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/video/GstTimeCodeMetaTest.java similarity index 68% rename from test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java rename to test/org/freedesktop/gstreamer/video/GstTimeCodeMetaTest.java index 970e1406..2f429d66 100644 --- a/test/org/freedesktop/gstreamer/meta/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/video/GstTimeCodeMetaTest.java @@ -1,23 +1,5 @@ -package org.freedesktop.gstreamer.meta; - -import org.freedesktop.gstreamer.Buffer; -import org.freedesktop.gstreamer.Gst; -import org.freedesktop.gstreamer.SampleTester; -import org.freedesktop.gstreamer.Version; -import org.freedesktop.gstreamer.timecode.VideoTimeCode; -import org.freedesktop.gstreamer.timecode.VideoTimeCodeConfig; -import org.freedesktop.gstreamer.util.TestAssumptions; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import static org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; -import static org.freedesktop.gstreamer.timecode.VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 Petr Lastovka * * This file is part of gstreamer-java. @@ -35,11 +17,28 @@ * version 3 along with this work. If not, see . * */ +package org.freedesktop.gstreamer.video; + +import org.freedesktop.gstreamer.Buffer; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.SampleTester; +import org.freedesktop.gstreamer.util.TestAssumptions; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.freedesktop.gstreamer.video.VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + + public class GstTimeCodeMetaTest { @BeforeClass public static void beforeClass() { - Gst.init(); + Gst.init(Gst.getVersion()); } @AfterClass @@ -53,7 +52,7 @@ public void testVideoWithoutTimeCodeMeta() { TestAssumptions.requireGstVersion(1, 14); SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); - assertFalse("Default video not contains timecode metadata", buffer.containsMetadata(VideoTimeCodeMeta.class)); + assertFalse("Default video not contains timecode metadata", buffer.hasMeta(VideoTimeCodeMeta.API)); }, "videotestsrc do-timestamp=true ! x264enc ! mxfmux ! decodebin ! appsink name=myappsink"); } @@ -64,9 +63,9 @@ public void testVideoTimeCodeMetaPal() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if (Gst.testVersion(1, 14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); + assertTrue("Video should contains timecode meta", buffer.hasMeta(VideoTimeCodeMeta.API)); } - VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); + VideoTimeCodeMeta meta = buffer.getMeta(VideoTimeCodeMeta.API); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -76,13 +75,13 @@ public void testVideoTimeCodeMetaPal() { assertEquals(0, timeCode.getSeconds()); assertEquals(0, timeCode.getFrames()); - VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getConfig(); // PAL standard 25/1 - assertEquals(25, timeCodeConfig.getFramerateNumerator()); - assertEquals(1, timeCodeConfig.getFramerateDenominator()); - assertEquals(GST_VIDEO_TIME_CODE_FLAGS_NONE, timeCodeConfig.getTimeCodeFlags()); + assertEquals(25, timeCodeConfig.getNumerator()); + assertEquals(1, timeCodeConfig.getDenominator()); + assertTrue(timeCodeConfig.getFlags().isEmpty()); - }, "videotestsrc ! video/x-raw,framerate=25/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); + }, "videotestsrc do-timestamp=true ! video/x-raw,framerate=25/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); } @Test @@ -92,9 +91,9 @@ public void testVideoTimeCodeNTSCDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if (Gst.testVersion(1, 14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); + assertTrue("Video should contains timecode meta", buffer.hasMeta(VideoTimeCodeMeta.API)); } - VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); + VideoTimeCodeMeta meta = buffer.getMeta(VideoTimeCodeMeta.API); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -104,11 +103,11 @@ public void testVideoTimeCodeNTSCDrop() { assertEquals(0, timeCode.getSeconds()); assertEquals(0, timeCode.getFrames()); - VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getConfig(); // NTSC drop standard 30000/1001 - assertEquals(30000, timeCodeConfig.getFramerateNumerator()); - assertEquals(1001, timeCodeConfig.getFramerateDenominator()); - assertEquals(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, timeCodeConfig.getTimeCodeFlags()); + assertEquals(30000, timeCodeConfig.getNumerator()); + assertEquals(1001, timeCodeConfig.getDenominator()); + assertTrue(timeCodeConfig.getFlags().contains(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME)); }, "videotestsrc ! video/x-raw,framerate=30000/1001 ! timecodestamper drop-frame=true ! videoconvert ! appsink name=myappsink"); } @@ -123,9 +122,9 @@ public void testVideoTimeCodeNTSCDropFrame() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if (Gst.testVersion(1, 14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); + assertTrue("Video should contains timecode meta", buffer.hasMeta(VideoTimeCodeMeta.API)); } - VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); + VideoTimeCodeMeta meta = buffer.getMeta(VideoTimeCodeMeta.API); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -135,11 +134,12 @@ public void testVideoTimeCodeNTSCDropFrame() { assertEquals(0, timeCode.getSeconds()); assertEquals(29, timeCode.getFrames()); - VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getConfig(); // NTSC drop standard 30000/1001 - assertEquals(30000, timeCodeConfig.getFramerateNumerator()); - assertEquals(1001, timeCodeConfig.getFramerateDenominator()); - assertEquals(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, timeCodeConfig.getTimeCodeFlags()); + assertEquals(30000, timeCodeConfig.getNumerator()); + assertEquals(1001, timeCodeConfig.getDenominator()); + assertTrue(timeCodeConfig.getFlags().contains(GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME)); + }, "videotestsrc ! video/x-raw,framerate=30000/1001 ! videoconvert ! timecodestamper drop-frame=true ! videoconvert ! appsink name=myappsink", 29); } @@ -150,9 +150,9 @@ public void testVideoTimeCodeNTSCNonDrop() { SampleTester.test(sample -> { Buffer buffer = sample.getBuffer(); if (Gst.testVersion(1, 14)) { - assertTrue("Video should contains timecode meta", buffer.containsMetadata(VideoTimeCodeMeta.class)); + assertTrue("Video should contains timecode meta", buffer.hasMeta(VideoTimeCodeMeta.API)); } - VideoTimeCodeMeta meta = buffer.getMetadata(VideoTimeCodeMeta.class); + VideoTimeCodeMeta meta = buffer.getMeta(VideoTimeCodeMeta.API); assertNotNull(meta); VideoTimeCode timeCode = meta.getTimeCode(); @@ -162,11 +162,11 @@ public void testVideoTimeCodeNTSCNonDrop() { assertEquals(0, timeCode.getSeconds()); assertEquals(0, timeCode.getFrames()); - VideoTimeCodeConfig timeCodeConfig = timeCode.getTCConfig(); + VideoTimeCodeConfig timeCodeConfig = timeCode.getConfig(); // NTSC drop standard 30/1 - assertEquals(30, timeCodeConfig.getFramerateNumerator()); - assertEquals(1, timeCodeConfig.getFramerateDenominator()); - assertEquals(GST_VIDEO_TIME_CODE_FLAGS_NONE, timeCodeConfig.getTimeCodeFlags()); + assertEquals(30, timeCodeConfig.getNumerator()); + assertEquals(1, timeCodeConfig.getDenominator()); + assertTrue(timeCodeConfig.getFlags().isEmpty()); }, "videotestsrc ! video/x-raw,framerate=30/1 ! timecodestamper ! videoconvert ! appsink name=myappsink"); } diff --git a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java b/test/org/freedesktop/gstreamer/video/VideoTimeCodeConfigTest.java similarity index 68% rename from test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java rename to test/org/freedesktop/gstreamer/video/VideoTimeCodeConfigTest.java index e344a1ec..8a9d9f9a 100644 --- a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeConfigTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoTimeCodeConfigTest.java @@ -16,41 +16,44 @@ * version 3 along with this work. If not, see . * */ -package org.freedesktop.gstreamer.timecode; +package org.freedesktop.gstreamer.video; -import org.freedesktop.gstreamer.lowlevel.GstMetaApi; +import org.freedesktop.gstreamer.glib.NativeFlags; import org.junit.Before; import org.junit.Test; + import static org.junit.Assert.assertEquals; +import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; + public class VideoTimeCodeConfigTest { - private GstMetaApi.GstVideoTimeCodeConfigStruct origStruct; + private GstVideoAPI.GstVideoTimeCodeConfigStruct origStruct; private VideoTimeCodeConfig codeConfig; @Before public void setUp() { - origStruct = new GstMetaApi.GstVideoTimeCodeConfigStruct(); + origStruct = new GstVideoAPI.GstVideoTimeCodeConfigStruct(); origStruct.fps_d = 25; origStruct.fps_n = 1; - origStruct.flags = VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME; + origStruct.flags = VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME.intValue(); origStruct.write(); - codeConfig = new VideoTimeCodeConfig(origStruct.getPointer()); + codeConfig = new VideoTimeCodeConfig(origStruct); } @Test public void testGetTimeCodeFlags() { - assertEquals(origStruct.flags, codeConfig.getTimeCodeFlags()); + assertEquals(origStruct.flags, NativeFlags.toInt(codeConfig.getFlags())); } @Test public void testGetFramerateNumerator() { - assertEquals(origStruct.fps_n, codeConfig.getFramerateNumerator()); + assertEquals(origStruct.fps_n, codeConfig.getNumerator()); } @Test public void testGetFramerateDenominator() { - assertEquals(origStruct.fps_d, codeConfig.getFramerateDenominator()); + assertEquals(origStruct.fps_d, codeConfig.getDenominator()); } } \ No newline at end of file diff --git a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java b/test/org/freedesktop/gstreamer/video/VideoTimeCodeFlagsTest.java similarity index 91% rename from test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java rename to test/org/freedesktop/gstreamer/video/VideoTimeCodeFlagsTest.java index ea376d69..4f3752ad 100644 --- a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeFlagsTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoTimeCodeFlagsTest.java @@ -16,15 +16,15 @@ * version 3 along with this work. If not, see . * */ -package org.freedesktop.gstreamer.timecode; +package org.freedesktop.gstreamer.video; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; + import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; @RunWith(Parameterized.class) @@ -37,7 +37,7 @@ public class VideoTimeCodeFlagsTest { public static Collection data() { return Arrays.asList( new Object[][]{ - {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE, 0}, +// {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_NONE, 0}, {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, 1}, {VideoTimeCodeFlags.GST_VIDEO_TIME_CODE_FLAGS_INTERLACED, 2} }); diff --git a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java b/test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java similarity index 75% rename from test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java rename to test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java index 14d36cea..495609cc 100644 --- a/test/org/freedesktop/gstreamer/timecode/VideoTimeCodeTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 Petr Lastovka * * This file is part of gstreamer-java. @@ -16,27 +17,30 @@ * version 3 along with this work. If not, see . * */ -package org.freedesktop.gstreamer.timecode; +package org.freedesktop.gstreamer.video; -import org.freedesktop.gstreamer.lowlevel.GstMetaApi; import org.junit.Before; import org.junit.Test; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import org.freedesktop.gstreamer.lowlevel.GstMetaAPI; +import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; + public class VideoTimeCodeTest { - private GstMetaApi.GstVideoTimeCodeStruct timeCodeStruct; - private GstMetaApi.GstVideoTimeCodeConfigStruct.ByValue configStruct; + private GstVideoAPI.GstVideoTimeCodeStruct timeCodeStruct; + private GstVideoAPI.GstVideoTimeCodeConfigStruct.ByValue configStruct; private VideoTimeCode timeCode; @Before public void setUp() { - timeCodeStruct = new GstMetaApi.GstVideoTimeCodeStruct(); - configStruct = new GstMetaApi.GstVideoTimeCodeConfigStruct.ByValue(); + timeCodeStruct = new GstVideoAPI.GstVideoTimeCodeStruct(); + configStruct = new GstVideoAPI.GstVideoTimeCodeConfigStruct.ByValue(); // 01:02:03:04 timeCodeStruct.hours = 1; @@ -50,14 +54,14 @@ public void setUp() { timeCodeStruct.config = configStruct; timeCodeStruct.write(); - timeCode = new VideoTimeCode(timeCodeStruct.getPointer()); + timeCode = new VideoTimeCode(timeCodeStruct); } @Test public void testGetTCConfig() { - assertNotNull(timeCode.getTCConfig()); + assertNotNull(timeCode.getConfig()); } @Test From 4e5f3d2f4de35087c75615b42252fde21cd913da Mon Sep 17 00:00:00 2001 From: Neil C Smith Date: Thu, 15 Oct 2020 16:36:57 +0100 Subject: [PATCH 16/17] Add meta iteration; refactor tests and add BufferProbeTester. --- src/org/freedesktop/gstreamer/Buffer.java | 53 ++++++++ src/org/freedesktop/gstreamer/Meta.java | 2 +- .../gstreamer/lowlevel/GstBufferAPI.java | 3 + .../gstreamer/BufferProbeTester.java | 122 ++++++++++++++++++ .../gstreamer/util/TestAssumptions.java | 14 ++ .../gstreamer/video/VideoCropMetaTest.java | 59 +++++++++ ...taTest.java => VideoTimeCodeMetaTest.java} | 3 +- 7 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 test/org/freedesktop/gstreamer/BufferProbeTester.java create mode 100644 test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java rename test/org/freedesktop/gstreamer/video/{GstTimeCodeMetaTest.java => VideoTimeCodeMetaTest.java} (98%) diff --git a/src/org/freedesktop/gstreamer/Buffer.java b/src/org/freedesktop/gstreamer/Buffer.java index bb7af373..3576c8c5 100644 --- a/src/org/freedesktop/gstreamer/Buffer.java +++ b/src/org/freedesktop/gstreamer/Buffer.java @@ -31,7 +31,10 @@ import org.freedesktop.gstreamer.lowlevel.GstBufferAPI.MapInfoStruct; import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; import java.util.EnumSet; +import java.util.Iterator; +import java.util.NoSuchElementException; import org.freedesktop.gstreamer.glib.NativeFlags; import org.freedesktop.gstreamer.glib.Natives; import org.freedesktop.gstreamer.lowlevel.GType; @@ -274,6 +277,15 @@ public T getMeta(Meta.API api) { } return Natives.objectFor(ptr, api.getImplClass(), false, false); } + + /** + * Iterate all Meta on buffer. + * + * @return iterator of meta + */ + public Iterator iterateMeta() { + return new MetaIterator(this); + } /** * Check if buffer contains metadata for api. @@ -341,4 +353,45 @@ public boolean unsetFlags(EnumSet flags) { return GstBufferAPI.GSTBUFFER_API.gst_buffer_unset_flags(this, NativeFlags.toInt(flags)); } + private static class MetaIterator implements Iterator { + + private final PointerByReference state; + private final Buffer buffer; + private Meta next; + + MetaIterator(final Buffer buffer) { + state = new PointerByReference(); + this.buffer = buffer; + } + + @Override + public boolean hasNext() { + if (next == null) { + next = getNext(); + } + return next != null; + } + + @Override + public Meta next() { + if (!hasNext() || next == null) { + throw new NoSuchElementException(); + } + Meta m = next; + next = null; + return m; + } + + private Meta getNext() { + return Natives.objectFor( + GSTBUFFER_API.gst_buffer_iterate_meta(this.buffer, this.state), + Meta.class, + false, + false + ); + } + + + } + } diff --git a/src/org/freedesktop/gstreamer/Meta.java b/src/org/freedesktop/gstreamer/Meta.java index fa28125e..35fa73b8 100644 --- a/src/org/freedesktop/gstreamer/Meta.java +++ b/src/org/freedesktop/gstreamer/Meta.java @@ -31,7 +31,7 @@ * >https://gstreamer.freedesktop.org/documentation/gstreamer/gstmeta.html *

*/ -public abstract class Meta extends NativeObject { +public class Meta extends NativeObject { /** * Create Meta from Initializer. diff --git a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java index 6f23bf72..770bddc7 100644 --- a/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java +++ b/src/org/freedesktop/gstreamer/lowlevel/GstBufferAPI.java @@ -29,6 +29,8 @@ import com.sun.jna.NativeLong; import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; + import static org.freedesktop.gstreamer.lowlevel.GstAPI.GST_PADDING; /** @@ -106,6 +108,7 @@ protected List getFieldOrder() { boolean gst_buffer_map_range(Buffer buffer, int idx, int length, MapInfoStruct info, int flags); GstMetaPtr gst_buffer_get_meta(Buffer buffer, GType gType); int gst_buffer_get_n_meta(Buffer buffer,GType gType); + GstMetaPtr gst_buffer_iterate_meta(Buffer buffer, PointerByReference state); // re-introduces in gstreamer 1.9 int gst_buffer_get_flags(Buffer buffer); boolean gst_buffer_set_flags(Buffer buffer, int flags); diff --git a/test/org/freedesktop/gstreamer/BufferProbeTester.java b/test/org/freedesktop/gstreamer/BufferProbeTester.java new file mode 100644 index 00000000..e1ca8e3d --- /dev/null +++ b/test/org/freedesktop/gstreamer/BufferProbeTester.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2020 John Cortell + * + * This file is part of gstreamer-java. + * + * gstreamer-java is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gstreamer-java is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with gstreamer-java. If not, see . + */ +package org.freedesktop.gstreamer; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.function.Consumer; + +import org.freedesktop.gstreamer.glib.GError; + +/** + * Utility class for unit testing API that operates on a Buffer. + *

+ * Call {@link BufferTester#test(Consumer)} and pass a callback which will + * perform the test on a Buffer it is supplied. The callback runs on the + * AppSink.NEW_SAMPLE thread. The sample is produced by a simple, ephemeral + * pipeline that is fed by a video test source. + */ +public class BufferProbeTester { + + public static void test(Consumer callback) { + test(callback, "videotestsrc ! videoconvert ! fakesink name=sink"); + } + + public static void test(Consumer callback, String pipelineDescription) { + test(callback, pipelineDescription, 0); + } + + public static void test(Consumer callback, String pipelineDescription, int skipFrames) { + assertNotNull("Pipeline description can not be null", pipelineDescription); + assertFalse("Pipeline description can not be empty", pipelineDescription.isEmpty()); + ArrayList errors = new ArrayList<>(); + Bin bin = Gst.parseBinFromDescription(pipelineDescription, false, errors); + assertNotNull("Unable to create Bin from pipeline description: ", bin); + + Element sink = bin.getElementByName("sink"); + Pad pad = sink.getStaticPad("sink"); + BufferProbe probe = new BufferProbe(callback, skipFrames); + pad.addDataProbe(probe); + + bin.play(); + + // Wait for the sample to arrive and for the client supplied test function to + // complete + try { + synchronized (probe) { + probe.wait(); + } + } catch (InterruptedException e) { + fail("Unexpected interruption waiting for sample"); + } + + bin.stop(); + + // If the test threw an exception on the sample listener thread, throw it here + // (on the main thread) + if (probe.exception != null) { + throw new AssertionError(probe.exception); + } + } + + private static class BufferProbe implements Pad.DATA_PROBE { + + private Consumer callback; + private final int skipFrames; + private Throwable exception; + private int counter = 0; + + BufferProbe(Consumer callback) { + this(callback, 0); + } + + BufferProbe(Consumer callback, int skip) { + this.callback = callback; + skipFrames = skip; + } + + @Override + public PadProbeReturn dataReceived(Pad pad, Buffer buffer) { + if (callback != null) { + if (counter < skipFrames) { + counter++; + return PadProbeReturn.OK; + } + try { + // Run the client's test logic on the buffer (only once) + try { + callback.accept(buffer); + } catch (Throwable exc) { + exception = exc; + } + callback = null; + } finally { + synchronized (this) { + notify(); + } + } + } + return PadProbeReturn.OK; + } + } + +} diff --git a/test/org/freedesktop/gstreamer/util/TestAssumptions.java b/test/org/freedesktop/gstreamer/util/TestAssumptions.java index ce3cf163..20c1fffa 100644 --- a/test/org/freedesktop/gstreamer/util/TestAssumptions.java +++ b/test/org/freedesktop/gstreamer/util/TestAssumptions.java @@ -1,5 +1,6 @@ package org.freedesktop.gstreamer.util; +import org.freedesktop.gstreamer.ElementFactory; import org.freedesktop.gstreamer.Gst; import org.junit.Assume; @@ -16,4 +17,17 @@ public class TestAssumptions { public static void requireGstVersion(int major, int minor) { Assume.assumeTrue(Gst.testVersion(major, minor)); } + + /** + * Assume a GStreamer installation has the required element. + * + * @param elementType element type + */ + public static void requireElement(String elementType) { + ElementFactory factory = null; + try { + factory = ElementFactory.find(elementType); + } catch (Exception ex) {} + Assume.assumeNotNull(factory); + } } diff --git a/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java b/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java new file mode 100644 index 00000000..d186e9e9 --- /dev/null +++ b/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Neil C Smith + * + * This file is part of gstreamer-java. + * + * This code is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License version 3 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * version 3 for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with this work. If not, see . + * + */ +package org.freedesktop.gstreamer.video; + +import org.freedesktop.gstreamer.BufferProbeTester; +import org.freedesktop.gstreamer.Gst; +import org.freedesktop.gstreamer.glib.Natives; +import org.freedesktop.gstreamer.lowlevel.GstMetaPtr; +import org.freedesktop.gstreamer.util.TestAssumptions; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + + + +public class VideoCropMetaTest { + + @BeforeClass + public static void beforeClass() { + Gst.init(Gst.getVersion()); + } + + @AfterClass + public static void afterClass() { + Gst.deinit(); + } + + @Test + public void testIterateWithCrop() { + TestAssumptions.requireGstVersion(1, 14); + TestAssumptions.requireElement("fakevideosink"); + BufferProbeTester.test(buffer -> { + buffer.iterateMeta().forEachRemaining(meta -> { + GstMetaPtr ptr = Natives.getPointer(meta).as(GstMetaPtr.class, GstMetaPtr::new); + System.out.println(ptr.getGType().getTypeName()); + System.out.println(ptr.getAPIGType().getTypeName()); + }); + + }, "videotestsrc ! videocrop top=10 left=10 bottom=50 right=50 ! fakevideosink name=sink"); + } + + +} diff --git a/test/org/freedesktop/gstreamer/video/GstTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java similarity index 98% rename from test/org/freedesktop/gstreamer/video/GstTimeCodeMetaTest.java rename to test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java index 2f429d66..a9d294d9 100644 --- a/test/org/freedesktop/gstreamer/video/GstTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java @@ -20,6 +20,7 @@ package org.freedesktop.gstreamer.video; import org.freedesktop.gstreamer.Buffer; +import org.freedesktop.gstreamer.BufferProbeTester; import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.SampleTester; import org.freedesktop.gstreamer.util.TestAssumptions; @@ -34,7 +35,7 @@ import static org.junit.Assert.assertTrue; -public class GstTimeCodeMetaTest { +public class VideoTimeCodeMetaTest { @BeforeClass public static void beforeClass() { From 675f50fc56ac8b7c9b01351baeb9c2b882a0cd97 Mon Sep 17 00:00:00 2001 From: Neil C Smith Date: Tue, 20 Oct 2020 15:23:49 +0100 Subject: [PATCH 17/17] Tidy up meta branch ready for merging. --- .travis.yml | 1 - test/org/freedesktop/gstreamer/BufferProbeTester.java | 1 + test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java | 1 - .../org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java | 1 - test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java | 3 +-- 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2e2a3e3d..2ab1814b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,4 +5,3 @@ addons: apt: packages: - gstreamer1.0-plugins-good - - gstreamer1.0-plugins-bad diff --git a/test/org/freedesktop/gstreamer/BufferProbeTester.java b/test/org/freedesktop/gstreamer/BufferProbeTester.java index e1ca8e3d..7c6d5d5c 100644 --- a/test/org/freedesktop/gstreamer/BufferProbeTester.java +++ b/test/org/freedesktop/gstreamer/BufferProbeTester.java @@ -1,4 +1,5 @@ /* + * Copyright (c) 2020 Neil C Smith * Copyright (c) 2020 John Cortell * * This file is part of gstreamer-java. diff --git a/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java b/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java index d186e9e9..134f0639 100644 --- a/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoCropMetaTest.java @@ -55,5 +55,4 @@ public void testIterateWithCrop() { }, "videotestsrc ! videocrop top=10 left=10 bottom=50 right=50 ! fakevideosink name=sink"); } - } diff --git a/test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java b/test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java index a9d294d9..b748b687 100644 --- a/test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoTimeCodeMetaTest.java @@ -20,7 +20,6 @@ package org.freedesktop.gstreamer.video; import org.freedesktop.gstreamer.Buffer; -import org.freedesktop.gstreamer.BufferProbeTester; import org.freedesktop.gstreamer.Gst; import org.freedesktop.gstreamer.SampleTester; import org.freedesktop.gstreamer.util.TestAssumptions; diff --git a/test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java b/test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java index 495609cc..bca8fa5e 100644 --- a/test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java +++ b/test/org/freedesktop/gstreamer/video/VideoTimeCodeTest.java @@ -25,7 +25,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.freedesktop.gstreamer.lowlevel.GstMetaAPI; import org.freedesktop.gstreamer.lowlevel.GstVideoAPI; @@ -83,4 +82,4 @@ public void testGetSeconds() { public void testGetFrames() { assertEquals(4,timeCode.getFrames()); } -} \ No newline at end of file +}