[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:gst-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/.gitmodules
^
|
@@ -1,3 +1,3 @@
[submodule "common"]
path = common
- url = https://git.merproject.org/mirror/gstreamer-common.git
+ url = https://git.sailfishos.org/mirror/gstreamer-common.git
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/Makefile.am
^
|
@@ -5,9 +5,13 @@
libgstdroid_@GST_API_VERSION@_la_includedir = \
$(includedir)/gstreamer-@GST_API_VERSION@/gst/allocators
-libgstdroid_@GST_API_VERSION@_la_CFLAGS = $(GST_CFLAGS) -I/usr/include/droidmedia/
+libgstdroid_@GST_API_VERSION@_la_CFLAGS = $(GST_CFLAGS) \
+ $(EGL_CFLAGS) \
+ -DEGL_NO_X11 \
+ -I/usr/include/droidmedia/
-libgstdroid_@GST_API_VERSION@_la_LIBADD = $(GST_LIBS)
+libgstdroid_@GST_API_VERSION@_la_LIBADD = $(GST_LIBS) \
+ $(EGL_LIBS)
noinst_HEADERS =
@@ -24,4 +28,4 @@
gstdroidmediabuffer.h \
gstdroidbufferpool.h \
gstdroidquery.h \
- gstdroidcodec.h
\ No newline at end of file
+ gstdroidcodec.h
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidbufferpool.c
^
|
@@ -21,124 +21,314 @@
#include <gst/gst.h>
#include "gstdroidbufferpool.h"
+#include "gstdroidmediabuffer.h"
+/* Element signals and args */
+enum
+{
+ BUFFERS_INVALIDATED,
+ LAST_SIGNAL
+};
#define gst_droid_buffer_pool_parent_class parent_class
G_DEFINE_TYPE (GstDroidBufferPool, gst_droid_buffer_pool, GST_TYPE_BUFFER_POOL);
-static void
-gst_droid_buffer_pool_reset_buffer (GstBufferPool * pool, GstBuffer * buffer)
+static guint gst_droid_buffer_pool_signals[LAST_SIGNAL] = { 0 };
+
+static gboolean
+gst_droid_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
{
- GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
+ GstCaps *caps;
+ guint size;
+ GstAllocationParams params = { GST_MEMORY_FLAG_NO_SHARE, 0, 0, 0 };
+ GstDroidBufferPool *pool = GST_DROID_BUFFER_POOL (bpool);
- gst_buffer_remove_all_memory (buffer);
- GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_TAG_MEMORY);
+ if (!gst_buffer_pool_config_get_params (config, &caps, &size, NULL, NULL)) {
+ GST_WARNING_OBJECT (pool, "Invalid pool configuration");
+ return FALSE;
+ }
+ // If we have caps then we can create droid buffers
+ if (caps != NULL) {
+ GstCapsFeatures *features = gst_caps_get_features (caps, 0);
+
+ GST_OBJECT_LOCK (pool);
+
+ if (!gst_video_info_from_caps (&pool->video_info, caps)) {
+ GST_OBJECT_UNLOCK (pool);
+ GST_WARNING_OBJECT (pool, "Invalid video caps %" GST_PTR_FORMAT, caps);
+ return FALSE;
+ }
+
+ pool->video_info.size = size;
+ pool->use_queue_buffers = gst_caps_features_contains
+ (features, GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER);
+
+ GST_DEBUG_OBJECT (pool, "Configured pool. caps: %" GST_PTR_FORMAT, caps);
+ pool->allocator = gst_droid_media_buffer_allocator_new ();
+ gst_object_ref (pool->allocator);
+ gst_buffer_pool_config_set_allocator (config,
+ (GstAllocator *) pool->allocator, ¶ms);
+ GST_OBJECT_UNLOCK (pool);
+ }
+
+ return GST_BUFFER_POOL_CLASS (gst_droid_buffer_pool_parent_class)
+ ->set_config (bpool, config);
+}
- g_mutex_lock (&dpool->lock);
- ++dpool->num_buffers;
- GST_DEBUG_OBJECT (dpool, "num buffers: %d", dpool->num_buffers);
- g_cond_signal (&dpool->cond);
- g_mutex_unlock (&dpool->lock);
+static const gchar **
+gst_droid_buffer_pool_get_options (GstBufferPool * bpool)
+{
+ static const gchar *options[] = { GST_BUFFER_POOL_OPTION_VIDEO_META, NULL };
- return GST_BUFFER_POOL_CLASS (parent_class)->reset_buffer (pool, buffer);
+ return options;
}
static GstFlowReturn
-gst_droid_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
+gst_droid_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buf,
GstBufferPoolAcquireParams * params G_GNUC_UNUSED)
{
GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
+ GstBuffer *buffer;
- *buffer = gst_buffer_new ();
- if (!*buffer) {
+ if (!dpool->allocator) {
return GST_FLOW_ERROR;
}
- g_mutex_lock (&dpool->lock);
- ++dpool->num_buffers;
- GST_DEBUG_OBJECT (dpool, "num buffers: %d", dpool->num_buffers);
- g_cond_signal (&dpool->cond);
- g_mutex_unlock (&dpool->lock);
+ buffer = gst_buffer_new ();
+ if (!buffer) {
+ return GST_FLOW_ERROR;
+ }
+
+ if (!dpool->use_queue_buffers) {
+ GstVideoInfo *video_info;
+ GstMemory *memory =
+ gst_droid_media_buffer_allocator_alloc_new (dpool->allocator,
+ &dpool->video_info);
+ if (!memory) {
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+ }
+
+ gst_buffer_insert_memory (buffer, 0, memory);
+
+ video_info = gst_droid_media_buffer_get_video_info (memory);
+
+ gst_buffer_add_video_meta_full (buffer,
+ GST_VIDEO_FRAME_FLAG_NONE, video_info->finfo->format,
+ video_info->width, video_info->height,
+ video_info->finfo->n_planes, video_info->offset, video_info->stride);
+ }
+
+ *buf = buffer;
return GST_FLOW_OK;
}
-gboolean
-gst_droid_buffer_pool_wait_for_buffer (GstBufferPool * pool)
+static void
+gst_droid_buffer_release_buffer (GstBufferPool * pool, GstBuffer * buffer)
{
GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
+ DroidMediaBuffer *droid_buffer = NULL;
- if (GST_BUFFER_POOL_IS_FLUSHING (pool)) {
- return FALSE;
+ if (dpool->use_queue_buffers) {
+ guint index;
+
+ g_mutex_lock (&dpool->binding_lock);
+
+ if (g_ptr_array_find (dpool->acquired_buffers, buffer, &index)) {
+ g_ptr_array_remove_index_fast (dpool->acquired_buffers, index);
+
+ droid_buffer =
+ gst_droid_media_buffer_memory_get_buffer_from_gst_buffer (buffer);
+
+ if (droid_media_buffer_get_user_data (droid_buffer) == buffer) {
+ g_ptr_array_add (dpool->bound_buffers, buffer);
+ } else {
+ droid_buffer = NULL;
+ }
+ }
+
+ g_mutex_unlock (&dpool->binding_lock);
+ }
+
+ if (droid_buffer) {
+ buffer->pool = gst_object_ref (pool);
+
+ droid_media_buffer_release (droid_buffer, dpool->display, NULL);
+ } else {
+ if (dpool->use_queue_buffers) {
+ gst_buffer_remove_all_memory (buffer);
+ GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_TAG_MEMORY);
+ }
+
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (pool, buffer);
+ }
+}
+
+void
+gst_droid_buffer_pool_set_egl_display (GstBufferPool * pool, EGLDisplay display)
+{
+ GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
+
+ if (dpool) {
+ dpool->display = display;
}
+}
- g_mutex_lock (&dpool->lock);
+gboolean
+gst_droid_buffer_pool_bind_media_buffer (GstBufferPool * pool,
+ DroidMediaBuffer * buffer)
+{
+ GstDroidBufferPool *dpool;
+ GstBuffer *gst_buffer;
+ GstMemory *mem;
+
+ if (!GST_IS_DROID_BUFFER_POOL (pool)) {
+ return FALSE;
+ }
- if (dpool->num_buffers > 0) {
- g_mutex_unlock (&dpool->lock);
- return TRUE;
+ if (gst_buffer_pool_acquire_buffer (pool, &gst_buffer, NULL) != GST_FLOW_OK) {
+ return FALSE;
}
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidbufferpool.h
^
|
@@ -23,12 +23,16 @@
#define __GST_DROID_BUFFER_POOL_H__
#include <gst/gstbufferpool.h>
+#include <gst/video/video-info.h>
+#include <droidmedia/droidmedia.h>
G_BEGIN_DECLS
typedef struct _GstDroidBufferPool GstDroidBufferPool;
typedef struct _GstDroidBufferPoolClass GstDroidBufferPoolClass;
+typedef void *EGLDisplay;
+
#define GST_TYPE_DROID_BUFFER_POOL (gst_droid_buffer_pool_get_type())
#define GST_IS_DROID_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DROID_BUFFER_POOL))
#define GST_DROID_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DROID_BUFFER_POOL, GstDroidBufferPool))
@@ -37,19 +41,31 @@
struct _GstDroidBufferPool
{
GstBufferPool parent;
- GMutex lock;
- GCond cond;
- gint num_buffers;
+ GstAllocator *allocator;
+ GstVideoInfo video_info;
+ GPtrArray *bound_buffers;
+ GPtrArray *acquired_buffers;
+ GMutex binding_lock;
+ EGLDisplay display;
+ gboolean use_queue_buffers;
};
struct _GstDroidBufferPoolClass
{
GstBufferPoolClass parent_class;
+
+ void (*signal_buffers_invalidated) (GstDroidBufferPool *pool);
};
GType gst_droid_buffer_pool_get_type (void);
GstBufferPool * gst_droid_buffer_pool_new (void);
-gboolean gst_droid_buffer_pool_wait_for_buffer (GstBufferPool * pool);
+
+void gst_droid_buffer_pool_set_egl_display (GstBufferPool *pool, EGLDisplay display);
+gboolean gst_droid_buffer_pool_bind_media_buffer (GstBufferPool *pool,
+ DroidMediaBuffer *buffer);
+void gst_droid_buffer_pool_media_buffers_invalidated (GstBufferPool *pool);
+GstBuffer *gst_droid_buffer_pool_acquire_media_buffer (GstBufferPool *pool,
+ DroidMediaBuffer *buffer);
G_END_DECLS
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidcodec.c
^
|
@@ -38,15 +38,20 @@
static GstBuffer *create_h264enc_codec_data (DroidMediaData * data);
static gboolean create_mpeg4vdec_codec_data_from_codec_data (GstDroidCodec *
codec, GstBuffer * data, DroidMediaData * out);
+static gboolean
+create_mpeg2vdec_codec_data_from_codec_data (GstDroidCodec *
+ codec G_GNUC_UNUSED, GstBuffer * data, DroidMediaData * out);
static gboolean create_h264dec_codec_data_from_codec_data (GstDroidCodec *
codec, GstBuffer * data, DroidMediaData * out);
-static gboolean create_vp8vdec_codec_data_from_codec_data (GstDroidCodec *
+static gboolean create_h265dec_codec_data_from_codec_data (GstDroidCodec *
codec, GstBuffer * data, DroidMediaData * out);
static gboolean create_aacdec_codec_data_from_codec_data (GstDroidCodec * codec,
GstBuffer * data, DroidMediaData * out);
static gboolean create_aacdec_codec_data_from_frame_data (GstDroidCodec * codec,
GstBuffer * frame_data, DroidMediaData * out);
-static gboolean process_h264dec_data (GstDroidCodec * codec, GstBuffer * buffer,
+static gboolean ignore_codec_data (GstDroidCodec * codec, GstBuffer * data,
+ DroidMediaData * out);
+static gboolean process_h26xdec_data (GstDroidCodec * codec, GstBuffer * buffer,
DroidMediaData * out);
static gboolean process_aacdec_data (GstDroidCodec * codec, GstBuffer * buffer,
DroidMediaData * out);
@@ -108,6 +113,14 @@
is_mpega, NULL, NULL, NULL, create_aacdec_codec_data_from_codec_data,
create_aacdec_codec_data_from_frame_data, process_aacdec_data},
+ {GST_DROID_CODEC_DECODER_AUDIO, "audio/AMR", "audio/3gpp",
+ "audio/AMR", FALSE, NULL, NULL, NULL, NULL,
+ ignore_codec_data, NULL, NULL},
+
+ {GST_DROID_CODEC_DECODER_AUDIO, "audio/AMR-WB", "audio/amr-wb",
+ "audio/AMR-WB", FALSE, NULL, NULL, NULL, NULL,
+ ignore_codec_data, NULL, NULL},
+
/* video decoders */
{GST_DROID_CODEC_DECODER_VIDEO, "video/mpeg", "video/mp4v-es",
"video/mpeg, mpegversion=4", TRUE,
@@ -117,15 +130,26 @@
{GST_DROID_CODEC_DECODER_VIDEO, "video/x-h264", "video/avc",
"video/x-h264, stream-format=avc,alignment=au", TRUE,
is_h264_dec, NULL, NULL, NULL,
- create_h264dec_codec_data_from_codec_data, NULL, process_h264dec_data},
+ create_h264dec_codec_data_from_codec_data, NULL, process_h26xdec_data},
{GST_DROID_CODEC_DECODER_VIDEO, "video/x-h263", "video/3gpp",
"video/x-h263", TRUE, NULL,
NULL, NULL, NULL, NULL, NULL, NULL},
{GST_DROID_CODEC_DECODER_VIDEO, "video/x-vp8", "video/x-vnd.on2.vp8",
- "video/x-vp8", TRUE, NULL, NULL, NULL, NULL,
- create_vp8vdec_codec_data_from_codec_data, NULL, NULL},
+ "video/x-vp8", TRUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/x-vp9", "video/x-vnd.on2.vp9",
+ "video/x-vp9", TRUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
+
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/mpeg", "video/mpeg2",
+ "video/mpeg, mpegversion=2", TRUE,
+ NULL, NULL, NULL, NULL,
+ create_mpeg2vdec_codec_data_from_codec_data, NULL, NULL},
+
+ {GST_DROID_CODEC_DECODER_VIDEO, "video/x-h265", "video/hevc",
+ "video/x-h265", FALSE, NULL, NULL, NULL, NULL,
+ create_h265dec_codec_data_from_codec_data, NULL, process_h26xdec_data},
/* audio encoders */
{GST_DROID_CODEC_ENCODER_AUDIO, "audio/mpeg", "audio/mp4a-latm",
@@ -217,6 +241,20 @@
continue;
}
+ /* Verify that video codec is supported before enabling it */
+ if (type == GST_DROID_CODEC_DECODER_VIDEO
+ || type == GST_DROID_CODEC_ENCODER_VIDEO) {
+ DroidMediaCodecMetaData md;
+ md.type = codecs[x].droid;
+ md.flags = DROID_MEDIA_CODEC_HW_ONLY;
+ if (!droid_media_codec_is_supported (&md,
+ type == GST_DROID_CODEC_ENCODER_VIDEO)) {
+ GST_INFO ("No hardware support found for %s, disabling codec",
+ codecs[x].droid);
+ continue;
+ }
+ }
+
s = gst_structure_new_from_string (codecs[x].caps);
caps = gst_caps_merge_structure (caps, s);
}
@@ -617,6 +655,16 @@
}
static gboolean
+create_mpeg2vdec_codec_data_from_codec_data (GstDroidCodec *
+ codec G_GNUC_UNUSED, GstBuffer * data G_GNUC_UNUSED, DroidMediaData * out)
+{
+ out->size = 0;
+ out->data = NULL;
+
+ return TRUE;
+}
+
+static gboolean
create_mpeg4vdec_codec_data_from_codec_data (GstDroidCodec *
codec G_GNUC_UNUSED, GstBuffer * data, DroidMediaData * out)
{
@@ -677,7 +725,7 @@
}
static gboolean
-create_vp8vdec_codec_data_from_codec_data (GstDroidCodec * codec,
+create_h264dec_codec_data_from_codec_data (GstDroidCodec * codec,
GstBuffer * data, DroidMediaData * out)
{
GstMapInfo info;
@@ -693,6 +741,10 @@
goto out;
}
+ codec->data->h264_nal = (1 + (info.data[4] & 3));
+
+ GST_INFO ("nal prefix length %d", codec->data->h264_nal);
+
out->size = info.size;
out->data = g_malloc (info.size);
memcpy (out->data, info.data, info.size);
@@ -705,7 +757,7 @@
}
static gboolean
-create_h264dec_codec_data_from_codec_data (GstDroidCodec * codec,
+create_h265dec_codec_data_from_codec_data (GstDroidCodec * codec,
GstBuffer * data, DroidMediaData * out)
{
GstMapInfo info;
@@ -721,7 +773,7 @@
goto out;
}
- codec->data->h264_nal = (1 + (info.data[4] & 3));
+ codec->data->h264_nal = (1 + (info.data[21] & 3));
GST_INFO ("nal prefix length %d", codec->data->h264_nal);
@@ -888,7 +940,16 @@
}
static gboolean
-process_h264dec_data (GstDroidCodec * codec, GstBuffer * buffer,
+ignore_codec_data (GstDroidCodec * codec G_GNUC_UNUSED,
+ GstBuffer * data G_GNUC_UNUSED, DroidMediaData * out G_GNUC_UNUSED)
+{
+ /* Some containers have codec_data which can be ignored */
+ GST_WARNING ("Ignoring codec data");
+ return TRUE;
+}
+
+static gboolean
+process_h26xdec_data (GstDroidCodec * codec, GstBuffer * buffer,
DroidMediaData * out)
{
GstMapInfo info;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidmediabuffer.c
^
|
@@ -25,6 +25,7 @@
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <gst/gst.h>
+#include <gst/interfaces/nemoeglimagememory.h>
#include "gstdroidmediabuffer.h"
#include "droidmediaconstants.h"
@@ -33,13 +34,15 @@
typedef struct
{
- GstAllocator parent;
+ NemoGstEglImageAllocator parent;
} GstDroidMediaBufferAllocator;
typedef struct
{
- GstAllocatorClass parent_class;
+ NemoGstEglImageAllocatorClass parent_class;
+
+ PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr;
} GstDroidMediaBufferAllocatorClass;
@@ -70,10 +73,11 @@
"droid memory allocator");
G_DEFINE_TYPE_WITH_CODE (GstDroidMediaBufferAllocator,
- droid_media_buffer_allocator, GST_TYPE_ALLOCATOR, _do_init);
+ droid_media_buffer_allocator, NEMO_GST_TYPE_EGL_IMAGE_ALLOCATOR, _do_init);
#define GST_TYPE_DROID_MEDIA_BUFFER_ALLOCATOR (droid_media_buffer_allocator_get_type())
#define GST_IS_DROID_MEDIA_BUFFER_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DROID_MEDIA_BUFFER_ALLOCATOR))
+#define GST_DROID_MEDIA_BUFFER_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DROID_MEDIA_BUFFER_ALLOCATOR, GstDroidMediaBufferAllocatorClass))
static void gst_droid_media_buffer_allocator_free (GstAllocator * allocator,
GstMemory * mem);
@@ -81,6 +85,11 @@
static gpointer gst_droid_media_buffer_memory_map (GstMemory * mem,
gsize maxsize, GstMapFlags flags);
static void gst_droid_media_buffer_memory_unmap (GstMemory * mem);
+static GstMemory *gst_droid_media_buffer_memory_copy (GstMemory * mem,
+ gssize offset, gssize size);
+
+static EGLImageKHR gst_droid_media_buffer_create_image (GstMemory * mem,
+ EGLDisplay dpy, EGLContext ctx);
#define GST_DROID_MEDIA_BUFFER_FORMAT_COUNT 11
@@ -135,7 +144,7 @@
constants.HAL_PIXEL_FORMAT_YV12;
gst_droid_media_buffer_formats[5].gst_format = GST_VIDEO_FORMAT_YV12;
gst_droid_media_buffer_formats[5].bytes_per_pixel = 1;
- gst_droid_media_buffer_formats[5].h_align = 1;
+ gst_droid_media_buffer_formats[5].h_align = 16;
gst_droid_media_buffer_formats[5].v_align = 1;
gst_droid_media_buffer_formats[6].hal_format =
@@ -215,6 +224,8 @@
droid_media_buffer_allocator_init (GstDroidMediaBufferAllocator * allocator)
{
GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+ NemoGstEglImageAllocator *egl_alloc =
+ NEMO_GST_EGL_IMAGE_ALLOCATOR_CAST (allocator);
GST_DEBUG_OBJECT (alloc, "init");
@@ -222,10 +233,12 @@
alloc->mem_map = gst_droid_media_buffer_memory_map;
alloc->mem_unmap = gst_droid_media_buffer_memory_unmap;
- alloc->mem_copy = NULL;
+ alloc->mem_copy = gst_droid_media_buffer_memory_copy;
alloc->mem_share = NULL;
alloc->mem_is_span = NULL;
+ egl_alloc->create_image = gst_droid_media_buffer_create_image;
+
GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
}
@@ -237,14 +250,17 @@
{
GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
+ klass->egl_create_image_khr =
+ (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress ("eglCreateImageKHR");
+
allocator_class->alloc = NULL;
allocator_class->free = gst_droid_media_buffer_allocator_free;
}
static GstDroidMediaBufferMemory *
-gst_droid_media_buffer_allocator_alloc_from_buffer (GstAllocator * allocator,
+gst_droid_media_buffer_allocator_alloc (GstAllocator * allocator,
DroidMediaBuffer * buffer, int format_index, gsize width, gsize height,
- gsize stride)
+ gsize stride, gsize size)
{
GstDroidMediaBufferMemory *mem = g_slice_new0 (GstDroidMediaBufferMemory);
GstFormat format;
@@ -261,6 +277,8 @@
} else {
format = gst_droid_media_buffer_formats[format_index].gst_format;
if (gst_droid_media_buffer_formats[format_index].bytes_per_pixel != 0) {
+ stride =
+ stride * gst_droid_media_buffer_formats[format_index].bytes_per_pixel;
padded_width =
ALIGN_SIZE (stride,
gst_droid_media_buffer_formats[format_index].h_align) /
@@ -275,21 +293,34 @@
padded_height);
mem->video_info.width = width;
mem->video_info.height = height;
+ mem->video_info.size = size;
- gst_memory_init (GST_MEMORY_CAST (mem),
- GST_MEMORY_FLAG_NO_SHARE, allocator, NULL, mem->video_info.size, 0, 0,
- mem->video_info.size);
+ // Android YV12 requires alignment of the UV stride too.
+ // So we need to reset the gst UV strides and offsets.
+ if (gst_droid_media_buffer_formats[format_index].gst_format ==
+ GST_VIDEO_FORMAT_YV12) {
+ gsize uvStride = ALIGN_SIZE (stride / 2,
+ gst_droid_media_buffer_formats[format_index].h_align);
+ mem->video_info.stride[1] = uvStride;
+ mem->video_info.stride[2] = uvStride;
+ mem->video_info.offset[1] = stride * padded_height *
+ gst_droid_media_buffer_formats[format_index].bytes_per_pixel;
+ mem->video_info.offset[2] =
+ mem->video_info.offset[1] + uvStride * padded_height / 2;
+ }
+ gst_memory_init (GST_MEMORY_CAST (mem),
+ GST_MEMORY_FLAG_NO_SHARE, GST_ALLOCATOR (allocator), NULL,
+ mem->video_info.size, 0, 0, mem->video_info.size);
return mem;
}
GstMemory *
-gst_droid_media_buffer_allocator_alloc (GstAllocator * allocator,
- DroidMediaBufferQueue * queue, DroidMediaBufferCallbacks * cb)
+gst_droid_media_buffer_allocator_alloc_from_buffer (GstAllocator * allocator,
+ DroidMediaBuffer * buffer)
{
GstDroidMediaBufferMemory *mem;
DroidMediaBufferInfo info;
- DroidMediaBuffer *buffer;
int format_index;
if (!GST_IS_DROID_MEDIA_BUFFER_ALLOCATOR (allocator)) {
@@ -298,18 +329,12 @@
return NULL;
}
- buffer = droid_media_buffer_queue_acquire_buffer (queue, cb);
- if (!buffer) {
- GST_ERROR_OBJECT (allocator, "failed to acquire media buffer");
- return NULL;
- }
-
droid_media_buffer_get_info (buffer, &info);
format_index = gst_droid_media_buffer_index_of_hal_format (info.format);
- mem = gst_droid_media_buffer_allocator_alloc_from_buffer (allocator, buffer,
- format_index, info.width, info.height, info.stride);
+ mem = gst_droid_media_buffer_allocator_alloc (allocator, buffer,
+ format_index, info.width, info.height, info.stride, 1);
GST_DEBUG_OBJECT (allocator, "alloc %p", mem);
@@ -317,14 +342,14 @@
}
GstMemory *
-gst_droid_media_buffer_allocator_alloc_from_data (GstAllocator * allocator,
- GstVideoInfo * info, DroidMediaData * data, DroidMediaBufferCallbacks * cb)
+gst_droid_media_buffer_allocator_alloc_new (GstAllocator * allocator,
+ GstVideoInfo * info)
{
GstDroidMediaBufferMemory *mem;
- DroidMediaBuffer *buffer;
+ DroidMediaBuffer *dbuf;
DroidMediaBufferInfo droid_info;
- int format_index;
+ int format_index;
if (!GST_IS_DROID_MEDIA_BUFFER_ALLOCATOR (allocator)) {
GST_WARNING_OBJECT (allocator,
"allocator is not the correct allocator for droidmediabuffer");
@@ -333,31 +358,27 @@
format_index =
gst_droid_media_buffer_index_of_gst_format (info->finfo->format);
-
if (format_index == GST_DROID_MEDIA_BUFFER_FORMAT_COUNT) {
GST_WARNING_OBJECT (allocator,
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidmediabuffer.h
^
|
@@ -29,22 +29,22 @@
#define GST_ALLOCATOR_DROID_MEDIA_BUFFER "droidmediabuffer"
#define GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER "memory:DroidMediaBuffer"
+#define GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER "memory:DroidMediaQueueBuffer"
#define GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS "{ NV12_64Z32, YV12, NV16, " \
"NV12, NV21, YUY2, RGBA, RGBx, RGB, RGB16, BGRA, ENCODED }"
GstAllocator * gst_droid_media_buffer_allocator_new (void);
-GstMemory * gst_droid_media_buffer_allocator_alloc (GstAllocator * allocator,
- DroidMediaBufferQueue *queue,
- DroidMediaBufferCallbacks *cb);
-GstMemory * gst_droid_media_buffer_allocator_alloc_from_data (GstAllocator * allocator,
- GstVideoInfo * info,
- DroidMediaData * data,
- DroidMediaBufferCallbacks *cb);
+GstMemory * gst_droid_media_buffer_allocator_alloc_new (GstAllocator * allocator,
+ GstVideoInfo * info);
+GstMemory * gst_droid_media_buffer_allocator_alloc_from_buffer (GstAllocator * allocator,
+ DroidMediaBuffer * buffer);
DroidMediaBuffer * gst_droid_media_buffer_memory_get_buffer (GstMemory * mem);
+DroidMediaBuffer * gst_droid_media_buffer_memory_get_buffer_from_gst_buffer (GstBuffer *buffer);
gboolean gst_is_droid_media_buffer_memory (GstMemory * mem);
GstVideoInfo * gst_droid_media_buffer_get_video_info (GstMemory * mem);
+GstVideoInfo * gst_droid_media_buffer_get_video_info_from_gst_buffer (GstBuffer *buffer);
G_END_DECLS
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/Makefile.am
^
|
@@ -6,6 +6,7 @@
libgstdroid_la_CFLAGS = $(GST_CFLAGS) $(NGI_CFLAGS) $(EGL_CFLAGS) \
$(NGM_CFLAGS)\
+ -DEGL_NO_X11 \
-I$(top_builddir)/gst-libs/ \
-I/usr/include/droidmedia/ \
-Idroidcamsrc/ \
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcamsrc/Makefile.am
^
|
@@ -2,6 +2,7 @@
noinst_LTLIBRARIES = libgstdroidcamsrc.la
libgstdroidcamsrc_la_CFLAGS = $(GST_CFLAGS) $(NGI_CFLAGS) \
$(NGM_CFLAGS) $(EXIF_CFLAGS) \
+ -DEGL_NO_X11 \
-I$(top_builddir)/gst/ \
-I$(top_builddir)/gst-libs/ \
-I/usr/include/droidmedia/
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcamsrc/gstdroidcamsrc.c
^
|
@@ -28,6 +28,7 @@
#include "gstdroidcamsrcquirks.h"
#include <gst/video/video.h>
#include "gst/droid/gstdroidmediabuffer.h"
+#include "gst/droid/gstdroidbufferpool.h"
#include "gst/droid/gstwrappedmemory.h"
#include "gst/droid/gstdroidquery.h"
#include "gst/droid/gstdroidcodec.h"
@@ -52,7 +53,7 @@
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER,
GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) ";"
GST_VIDEO_CAPS_MAKE ("{NV21}")));
@@ -1530,6 +1531,8 @@
GstCapsFeatures *features;
gchar *preview;
GstVideoInfo info;
+ gboolean use_raw_data = TRUE;
+ GstBufferPool *pool = NULL;
g_rec_mutex_lock (&src->dev_lock);
@@ -1598,10 +1601,78 @@
features = gst_caps_get_features (our_caps, 0);
- g_rec_mutex_lock (&src->dev_lock);
- src->dev->use_raw_data =
+ use_raw_data =
!gst_caps_features_contains (features,
- GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER);
+ GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER);
+
+ if (!use_raw_data) {
+ /* Negotiate a buffer pool or allocate one now. */
+ gint i;
+ guint min, max;
+ guint size;
+ gint count;
+ GstQuery *query = gst_query_new_allocation (our_caps, TRUE);
+
+ if (!gst_pad_peer_query (data->pad, query)) {
+ GST_DEBUG_OBJECT (src, "didn't get downstream ALLOCATION hints");
+ }
+
+ count = gst_query_get_n_allocation_pools (query);
+
+ for (i = 0; i < count; ++i) {
+ GstAllocator *allocator;
+ GstStructure *config;
+
+ gst_query_parse_nth_allocation_pool (query, i, &pool, &size, &min, &max);
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_allocator (config, &allocator, NULL);
+ if (allocator
+ && g_strcmp0 (allocator->mem_type,
+ GST_ALLOCATOR_DROID_MEDIA_BUFFER) == 0) {
+ break;
+ } else {
+ gst_object_unref (pool);
+ pool = NULL;
+ }
+ }
+
+ /* The downstream may have other ideas about what the pool size should be but the
+ * queue we're working with has a fixed size so that's the number of buffers we'll
+ * go with. */
+ min = 0;
+ max = droid_media_buffer_queue_length ();
+
+ if (!pool) {
+ /* A downstream which understands the queue buffers should also have provided a pool
+ * but for completeness add this a fallback. */
+ GstStructure *config;
+ GstVideoInfo video_info;
+ gst_video_info_from_caps (&video_info, our_caps);
+
+ pool = gst_droid_buffer_pool_new ();
+ size = video_info.finfo->format == GST_VIDEO_FORMAT_ENCODED
+ ? 1 : video_info.size;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, our_caps, size, min, max);
+
+ if (!gst_buffer_pool_set_config (pool, config)) {
+ GST_ERROR_OBJECT (src, "Failed to set buffer pool configuration");
+ gst_object_unref (pool);
+ pool = NULL;
+ ret = FALSE;
+ }
+ }
+ }
+
+ g_rec_mutex_lock (&src->dev_lock);
+ src->dev->use_raw_data = use_raw_data;
+
+ if (src->dev->pool) {
+ gst_object_unref (src->dev->pool);
+ }
+ src->dev->pool = pool;
+
g_rec_mutex_unlock (&src->dev_lock);
ret = TRUE;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcdev.c
^
|
@@ -422,30 +422,55 @@
gst_droidcamsrc_dev_buffers_released (G_GNUC_UNUSED void *user)
{
GstDroidCamSrcDev *dev = (GstDroidCamSrcDev *) user;
+ GstBufferPool *pool = gst_object_ref (dev->pool);
- GST_FIXME_OBJECT (dev, "Not sure what to do here really");
+ if (pool) {
+ gst_droid_buffer_pool_media_buffers_invalidated (pool);
+ gst_object_unref (pool);
+ }
}
-static void
-gst_droidcamsrc_dev_frame_available (void *user)
+static bool
+gst_droidcamsrc_dev_buffer_created (void *user, DroidMediaBuffer * buffer)
+{
+ GstDroidCamSrcDev *dev = (GstDroidCamSrcDev *) user;
+ bool ret = false;
+ GstBufferPool *pool = gst_object_ref (dev->pool);
+
+ if (pool) {
+ ret = gst_droid_buffer_pool_bind_media_buffer (pool, buffer);
+
+ gst_object_unref (pool);
+ }
+
+ return ret;
+}
+
+static bool
+gst_droidcamsrc_dev_frame_available (void *user, DroidMediaBuffer * buffer)
{
GstDroidCamSrcDev *dev = (GstDroidCamSrcDev *) user;
GstDroidCamSrc *src = GST_DROIDCAMSRC (GST_PAD_PARENT (dev->imgsrc->pad));
GstDroidCamSrcPad *pad = dev->vfsrc;
- DroidMediaBuffer *buffer;
- GstMemory *mem;
DroidMediaRect rect;
- GstBuffer *buff;
- DroidMediaBufferCallbacks cb;
- GstFlowReturn flow_ret;
+ GstBuffer *buff = NULL;
+ GstBufferPool *pool;
DroidMediaBufferInfo info;
GST_DEBUG_OBJECT (src, "frame available");
+ droid_media_buffer_get_info (buffer, &info);
+
+ rect = droid_media_buffer_get_crop_rect (buffer);
+
+ GST_OBJECT_LOCK (src);
+ src->crop_rect = rect;
+ GST_OBJECT_UNLOCK (src);
+
if (!pad->running) {
GST_DEBUG_OBJECT (src, "vfsrc pad task is not running");
- goto acquire_and_release;
+ return false;
}
/* We are accessing this without a lock because:
@@ -453,56 +478,34 @@
* 2) We can get called when we start the preview and we will deadlock because the lock is already held
*/
if (dev->use_raw_data) {
- goto acquire_and_release;
+ return false;
}
- flow_ret = gst_buffer_pool_acquire_buffer (dev->pool, &buff, NULL);
- if (flow_ret != GST_FLOW_OK) {
- GST_WARNING_OBJECT (src, "failed to acquire buffer from pool: %s",
- gst_flow_get_name (flow_ret));
+ pool = gst_object_ref (dev->pool);
- goto acquire_and_release;
- }
-
- cb.ref = (DroidMediaCallback) gst_buffer_ref;
- cb.unref = (DroidMediaCallback) gst_buffer_unref;
- cb.data = buff;
+ if (G_UNLIKELY (!pool)) {
+ GST_WARNING_OBJECT (src, "camera source doesn't have a buffer pool");
+ } else {
+ buff = gst_droid_buffer_pool_acquire_media_buffer (pool, buffer);
- mem =
- gst_droid_media_buffer_allocator_alloc (dev->media_allocator, dev->queue,
- &cb);
- if (!mem) {
- GST_ERROR_OBJECT (src, "failed to acquire buffer from droidmedia");
- gst_buffer_unref (buff);
- return;
+ gst_object_unref (pool);
}
- buffer = gst_droid_media_buffer_memory_get_buffer (mem);
-
- gst_buffer_insert_memory (buff, 0, mem);
- gst_droidcamsrc_timestamp (src, buff);
-
- rect = droid_media_buffer_get_crop_rect (buffer);
+ if (G_UNLIKELY (!buff)) {
+ GST_WARNING_OBJECT (src,
+ "unable to acquire a gstreamer buffer for a droid media buffer");
+ return false;
+ }
gst_droidcamsrc_dev_prepare_buffer (dev, buff, rect,
- gst_droid_media_buffer_get_video_info (mem));
+ gst_droid_media_buffer_get_video_info_from_gst_buffer (buff));
g_mutex_lock (&pad->lock);
g_queue_push_tail (pad->queue, buff);
g_cond_signal (&pad->cond);
g_mutex_unlock (&pad->lock);
- GST_OBJECT_LOCK (src);
- src->crop_rect = rect;
- GST_OBJECT_UNLOCK (src);
- return;
-
-acquire_and_release:
- if (droid_media_buffer_queue_acquire_and_release (dev->queue, &info)) {
- GST_OBJECT_LOCK (src);
- src->crop_rect = info.crop_rect;
- GST_OBJECT_UNLOCK (src);
- }
+ return true;
}
GstDroidCamSrcDev *
@@ -533,8 +536,7 @@
dev->lock = lock;
- dev->pool = gst_droid_buffer_pool_new ();
-
+ dev->pool = NULL;
dev->use_recorder = FALSE;
dev->recorder = gst_droidcamsrc_recorder_create (vidsrc);
@@ -563,6 +565,13 @@
dev->info = info;
dev->cam = droid_media_camera_connect (dev->info->num);
+ if (!dev->cam) {
+ g_rec_mutex_unlock (dev->lock);
+
+ GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("error opening camera"));
+ return FALSE;
+ }
+
hal_format = droid_media_camera_get_video_color_format (dev->cam);
if (hal_format == constants.OMX_COLOR_FormatYUV420Planar) {
@@ -580,13 +589,6 @@
dev->viewfinder_format = GST_VIDEO_FORMAT_ENCODED;
}
- if (!dev->cam) {
- g_rec_mutex_unlock (dev->lock);
-
- GST_ELEMENT_ERROR (src, LIBRARY, INIT, (NULL), ("error opening camera"));
- return FALSE;
- }
-
dev->queue = droid_media_camera_get_buffer_queue (dev->cam);
if (!droid_media_camera_lock (dev->cam)) {
@@ -640,7 +642,9 @@
g_mutex_clear (&dev->vid->lock);
g_cond_clear (&dev->vid->cond);
- gst_object_unref (dev->pool);
+ if (dev->pool) {
+ gst_object_unref (dev->pool);
+ }
gst_droidcamsrc_recorder_destroy (dev->recorder);
@@ -653,22 +657,10 @@
gboolean
gst_droidcamsrc_dev_init (GstDroidCamSrcDev * dev)
{
- GstStructure *config;
-
GST_DEBUG ("dev init");
g_rec_mutex_lock (dev->lock);
- /* first the buffer pool */
- config = gst_buffer_pool_get_config (dev->pool);
- gst_buffer_pool_config_set_params (config, NULL, 0,
- GST_DROIDCAMSRC_NUM_BUFFERS, GST_DROIDCAMSRC_NUM_BUFFERS);
-
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcexif.c
^
|
@@ -160,11 +160,7 @@
EXIF_TAG_ISO_SPEED_RATINGS);
if (iso) {
-#ifdef __arm__
- guint16 val = exif_get_short (iso->data, EXIF_BYTE_ORDER_MOTOROLA);
-#else
- guint16 val = exif_get_short (iso->data, EXIF_BYTE_ORDER_INTEL);
-#endif
+ guint16 val = exif_get_short (iso->data, exif_data_get_byte_order(exif));
gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE,
GST_TAG_CAPTURING_ISO_SPEED, val, NULL);
}
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcparams.c
^
|
@@ -126,7 +126,7 @@
return;
}
- if (!range[0] == '(') {
+ if (range[0] != '(') {
GST_ERROR ("invalid preview-fps-range-values");
return;
}
@@ -384,7 +384,7 @@
caps =
gst_caps_merge (gst_droidcamsrc_params_get_caps_locked (params,
"preview-size-values", "video/x-raw",
- GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER,
gst_video_format_to_string (format)),
gst_droidcamsrc_params_get_caps_locked (params, "preview-size-values",
"video/x-raw", NULL, "NV21"));
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcamsrc/gstdroidcamsrcrecorder.c
^
|
@@ -46,6 +46,10 @@
void
gst_droidcamsrc_recorder_destroy (GstDroidCamSrcRecorder * recorder)
{
+ if (recorder->recorder) {
+ droid_media_recorder_destroy (recorder->recorder);
+ }
+
if (recorder->codec) {
gst_droid_codec_unref (recorder->codec);
}
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcodec/gstdroidvdec.c
^
|
@@ -45,6 +45,12 @@
GST_DEBUG_CATEGORY_EXTERN (gst_droid_vdec_debug);
#define GST_CAT_DEFAULT gst_droid_vdec_debug
+#define GST_DROIDVDEC_STATE_LOCK(decoder) \
+ g_mutex_lock (&(decoder)->state_lock)
+
+#define GST_DROIDVDEC_STATE_UNLOCK(decoder) \
+ g_mutex_unlock (&(decoder)->state_lock)
+
typedef struct
{
int *hal_format;
@@ -61,7 +67,7 @@
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
- (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
+ (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER,
GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) ";"
GST_VIDEO_CAPS_MAKE ("I420")));
@@ -72,7 +78,10 @@
int32_t height);
static void gst_droidvdec_signal_eos (void *data);
static void gst_droidvdec_buffers_released (void *user);
-static void gst_droidvdec_frame_available (void *user);
+static bool gst_droidvdec_buffer_created (void *user,
+ DroidMediaBuffer * buffer);
+static bool gst_droidvdec_frame_available (void *user,
+ DroidMediaBuffer * buffer);
static void gst_droidvdec_data_available (void *data,
DroidMediaCodecData * encoded);
static gboolean gst_droidvdec_convert_buffer (GstDroidVDec * dec,
@@ -86,22 +95,14 @@
{
GST_LOG_OBJECT (dec, "loop");
- if (!gst_droid_buffer_pool_wait_for_buffer (dec->pool)) {
- goto out;
- }
-
- while (droid_media_codec_loop (dec->codec)
- == DROID_MEDIA_CODEC_LOOP_OK) {
+ if (droid_media_codec_loop (dec->codec) == DROID_MEDIA_CODEC_LOOP_OK) {
GST_LOG_OBJECT (dec, "tick");
- return;
+ } else {
+ GST_INFO_OBJECT (dec, "pausing task");
+ gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (GST_VIDEO_DECODER (dec)));
}
-
-out:
- GST_INFO_OBJECT (dec, "pausing task");
- gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (GST_VIDEO_DECODER (dec)));
}
-
static void
gst_droidvec_copy_plane (guint8 * out, gint stride_out, guint8 * in,
gint stride_in, gint width, gint height)
@@ -278,6 +279,7 @@
gst_droidvdec_create_codec (GstDroidVDec * dec, GstBuffer * input)
{
DroidMediaCodecDecoderMetaData md;
+ DroidMediaBufferQueue *queue;
const gchar *droid = gst_droid_codec_get_droid_type (dec->codec_type);
GST_INFO_OBJECT (dec, "create codec of type %s: %dx%d",
@@ -285,31 +287,6 @@
memset (&md, 0x0, sizeof (md));
- /* Let's take care of the buffer pool first */
- if (!dec->pool) {
- GstStructure *config;
-
- dec->pool = gst_droid_buffer_pool_new ();
- config = gst_buffer_pool_get_config (dec->pool);
- /* pass NULL for the caps. We don't have it yet */
- gst_buffer_pool_config_set_params (config, NULL, 0,
- GST_DROID_DEC_NUM_BUFFERS, GST_DROID_DEC_NUM_BUFFERS);
-
- if (!gst_buffer_pool_set_config (dec->pool, config)) {
- GST_ELEMENT_ERROR (dec, STREAM, FAILED, (NULL),
- ("Failed to configure buffer pool"));
- return FALSE;
- }
-
- if (!gst_buffer_pool_set_active (dec->pool, TRUE)) {
- GST_ELEMENT_ERROR (dec, STREAM, FAILED, (NULL),
- ("Failed to activate buffer pool"));
- return FALSE;
- }
- } else {
- gst_buffer_pool_set_flushing (dec->pool, FALSE);
- }
-
md.parent.type = droid;
md.parent.width = dec->in_state->info.width;
md.parent.height = dec->in_state->info.height;
@@ -350,7 +327,7 @@
goto error;
}
- dec->queue = droid_media_codec_get_buffer_queue (dec->codec);
+ queue = droid_media_codec_get_buffer_queue (dec->codec);
{
DroidMediaCodecCallbacks cb;
@@ -360,11 +337,12 @@
droid_media_codec_set_callbacks (dec->codec, &cb, dec);
}
- if (dec->queue) {
+ if (queue) {
DroidMediaBufferQueueCallbacks cb;
cb.buffers_released = gst_droidvdec_buffers_released;
+ cb.buffer_created = gst_droidvdec_buffer_created;
cb.frame_available = gst_droidvdec_frame_available;
- droid_media_buffer_queue_set_callbacks (dec->queue, &cb, dec);
+ droid_media_buffer_queue_set_callbacks (queue, &cb, dec);
} else {
DroidMediaCodecDataCallbacks cb;
cb.data_available = gst_droidvdec_data_available;
@@ -377,7 +355,6 @@
droid_media_codec_destroy (dec->codec);
dec->codec = NULL;
- dec->queue = NULL;
goto error;
}
@@ -391,14 +368,62 @@
return TRUE;
error:
- gst_buffer_pool_set_active (dec->pool, FALSE);
return FALSE;
}
static void
-gst_droidvdec_buffers_released (G_GNUC_UNUSED void *user)
+gst_droidvdec_buffers_released (void *user)
{
- GST_FIXME ("Not sure what to do here really");
+ GstVideoDecoder *dec = (GstVideoDecoder *) user;
+
+ GstBufferPool *pool = gst_video_decoder_get_buffer_pool (dec);
+
+ if (pool) {
+ gst_droid_buffer_pool_media_buffers_invalidated (pool);
+ gst_object_unref (pool);
+ }
+}
+
+static bool
+gst_droidvdec_buffer_created (void *user, DroidMediaBuffer * buffer)
+{
+ GstDroidVDec *dec = (GstDroidVDec *) user;
+ GstVideoDecoder *decoder = GST_VIDEO_DECODER (dec);
+ bool ret = false;
+ GstBufferPool *pool = NULL;
+
+ GST_VIDEO_DECODER_STREAM_LOCK (decoder);
+
+ if (dec->dirty) {
+ GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
+ return false;
+ }
+
+ /* Now we can configure the state */
+ if (G_UNLIKELY (!dec->out_state)) {
+ DroidMediaBufferInfo droid_info;
+
+ droid_media_buffer_get_info (buffer, &droid_info);
+
+ if (!gst_droidvdec_configure_state (decoder, droid_info.width,
+ droid_info.height)) {
+ dec->downstream_flow_ret = GST_FLOW_ERROR;
+ GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
+ return false;
+ }
+ }
+
+ pool = gst_video_decoder_get_buffer_pool (decoder);
+
+ GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
+
+ if (pool) {
+ ret = gst_droid_buffer_pool_bind_media_buffer (pool, buffer);
+
+ gst_object_unref (pool);
+ }
+
+ return ret;
}
static gboolean
@@ -437,78 +462,51 @@
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droidcodec/gstdroidvdec.h
^
|
@@ -60,7 +60,6 @@
{
GstVideoDecoder parent;
DroidMediaCodec *codec;
- DroidMediaBufferQueue *queue;
GstAllocator *allocator;
GstDroidCodec *codec_type;
@@ -69,8 +68,6 @@
GMutex state_lock;
GCond state_cond;
- GstBufferPool *pool;
-
/* protected by decoder stream lock */
GstFlowReturn downstream_flow_ret;
GstBuffer *codec_data;
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droideglsink/Makefile.am
^
|
@@ -5,5 +5,5 @@
libgstdroideglsink_la_LIBADD = $(GST_LIBS) $(NGI_LIBS) $(EGL_LIBS)
-libgstdroideglsink_la_SOURCES = gstdroideglsink.c
-noinst_HEADERS = gstdroideglsink.h
+libgstdroideglsink_la_SOURCES = gstdroideglsink.c gstdroidvideotexturesink.c
+noinst_HEADERS = gstdroideglsink.h gstdroidvideotexturesink.h
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droideglsink/gstdroideglsink.c
^
|
@@ -27,17 +27,30 @@
#include <gst/video/video.h>
#include <gst/interfaces/nemovideotexture.h>
#include "gst/droid/gstdroidmediabuffer.h"
+#include "gst/droid/gstdroidbufferpool.h"
+
+/* Element signals and args */
+enum
+{
+ SHOW_FRAME,
+ FLUSH,
+ BUFFERS_INVALIDATED,
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_EGL_DISPLAY
+};
GST_DEBUG_CATEGORY_EXTERN (gst_droid_eglsink_debug);
#define GST_CAT_DEFAULT gst_droid_eglsink_debug
-static void gst_droideglsink_video_texture_init (NemoGstVideoTextureClass *
- iface);
-
#define gst_droideglsink_parent_class parent_class
-G_DEFINE_TYPE_WITH_CODE (GstDroidEglSink, gst_droideglsink, GST_TYPE_VIDEO_SINK,
- G_IMPLEMENT_INTERFACE (NEMO_GST_TYPE_VIDEO_TEXTURE,
- gst_droideglsink_video_texture_init));
+G_DEFINE_TYPE (GstDroidEglSink, gst_droideglsink, GST_TYPE_VIDEO_SINK);
+
+static guint gst_droideglsink_signals[LAST_SIGNAL] = { 0 };
static GstStaticPadTemplate gst_droideglsink_sink_template_factory =
GST_STATIC_PAD_TEMPLATE ("sink",
@@ -46,43 +59,14 @@
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
(GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_BUFFER,
GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) "; "
- GST_VIDEO_CAPS_MAKE ("{YV12, NV21}")));
-
-enum
-{
- PROP_0,
- PROP_EGL_DISPLAY
-};
-
-static void
-gst_droideglsink_destroy_sync (GstDroidEglSink * sink)
-{
- GST_DEBUG_OBJECT (sink, "destroy sync %p", sink->sync);
-
- if (sink->sync) {
- sink->eglDestroySyncKHR (sink->dpy, sink->sync);
- sink->sync = NULL;
- }
-}
-
-static void
-gst_droideglsink_wait_sync (GstDroidEglSink * sink)
-{
- GST_DEBUG_OBJECT (sink, "wait sync %p", sink->sync);
-
- if (sink->sync) {
- /* We will behave like Android does */
- EGLint result =
- sink->eglClientWaitSyncKHR (sink->dpy, sink->sync, 0, EGL_FOREVER_KHR);
- if (result == EGL_FALSE) {
- GST_WARNING_OBJECT (sink, "error 0x%x waiting for fence", eglGetError ());
- } else if (result == EGL_TIMEOUT_EXPIRED_KHR) {
- GST_WARNING_OBJECT (sink, "timeout waiting for fence");
- }
+ GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+ (GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER,
+ GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS) "; "
+ GST_VIDEO_CAPS_MAKE (GST_DROID_MEDIA_BUFFER_MEMORY_VIDEO_FORMATS)));
- gst_droideglsink_destroy_sync (sink);
- }
-}
+static void gst_droideglsink_buffer_pool_invalidated (GstBufferPool * pool,
+ GstDroidEglSink * sink);
+static void gst_droideglsink_buffers_invalidated (GstDroidEglSink * sink);
static GstCaps *
gst_droideglsink_get_caps (GstBaseSink * bsink, GstCaps * filter)
@@ -123,171 +107,196 @@
if (!gst_video_info_from_caps (&info, caps)) {
GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL),
- ("ould not locate image format from caps %" GST_PTR_FORMAT, caps));
+ ("Could not locate image format from caps %" GST_PTR_FORMAT, caps));
return FALSE;
}
- sink->fps_n = info.fps_n;
- sink->fps_d = info.fps_d;
-
GST_VIDEO_SINK_WIDTH (vsink) = info.width;
GST_VIDEO_SINK_HEIGHT (vsink) = info.height;
return TRUE;
}
-static void
-gst_droideglsink_get_times (GstBaseSink * bsink, GstBuffer * buf,
- GstClockTime * start, GstClockTime * end)
+static gboolean
+gst_droideglsink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
{
- GstDroidEglSink *sink;
+ GstDroidEglSink *sink = GST_DROIDEGLSINK (bsink);
+ GstBufferPool *previous_pool = NULL;
+ gulong previous_pool_signal_id = 0;
+ GstCaps *caps;
+ guint size;
+ gboolean need_pool;
+ gboolean queue_pool = FALSE;
+ GstVideoInfo video_info;
+ gboolean ret = FALSE;
- sink = GST_DROIDEGLSINK (bsink);
+ gst_query_parse_allocation (query, &caps, &need_pool);
- if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
- *start = GST_BUFFER_TIMESTAMP (buf);
- if (GST_BUFFER_DURATION_IS_VALID (buf)) {
- *end = *start + GST_BUFFER_DURATION (buf);
- } else {
- if (sink->fps_n > 0) {
- *end = *start +
- gst_util_uint64_scale_int (GST_SECOND, sink->fps_d, sink->fps_n);
- }
- }
+ if (!caps) {
+ GST_ERROR_OBJECT (sink, "No query caps");
+ return FALSE;
}
-}
-static gboolean
-gst_droideglsink_start (GstBaseSink * bsink)
-{
- GstDroidEglSink *sink;
+ if (!gst_video_info_from_caps (&video_info, caps)) {
+ GST_ERROR_OBJECT (sink, "Unable to get video caps");
+ return FALSE;
+ }
- sink = GST_DROIDEGLSINK (bsink);
+ g_mutex_lock (&sink->lock);
- GST_DEBUG_OBJECT (sink, "start");
+ previous_pool = sink->pool;
+ previous_pool_signal_id = sink->invalidated_signal_id;
- sink->fps_n = 0;
- sink->fps_d = 1;
+ sink->pool = NULL;
+ sink->invalidated_signal_id = 0;
- sink->image = EGL_NO_IMAGE_KHR;
- sink->sync = NULL;
- sink->eglCreateImageKHR = NULL;
- sink->eglDestroyImageKHR = NULL;
- sink->eglClientWaitSyncKHR = NULL;
- sink->eglDestroySyncKHR = NULL;
+ if (need_pool) {
+ GstBufferPool *pool = NULL;
+ GstStructure *config;
+ guint min = 2;
+ guint max = 0;
+ GstCapsFeatures *features = gst_caps_get_features (caps, 0);
+
+ if (gst_caps_features_contains
+ (features, GST_CAPS_FEATURE_MEMORY_DROID_MEDIA_QUEUE_BUFFER)) {
+ min = 0;
+ max = droid_media_buffer_queue_length ();
+ queue_pool = true;
+ }
- sink->allocator = gst_droid_media_buffer_allocator_new ();
+ size = video_info.finfo->format == GST_VIDEO_FORMAT_ENCODED
+ ? 1 : video_info.size;
- return TRUE;
-}
+ if (previous_pool) {
+ GstCaps *pool_caps;
-static gboolean
-gst_droideglsink_stop (GstBaseSink * bsink)
-{
- GstDroidEglSink *sink;
+ config = gst_buffer_pool_get_config (previous_pool);
+ if (config
+ && gst_buffer_pool_config_get_params (config, &pool_caps, NULL, NULL,
+ NULL) && gst_caps_is_equal (caps, pool_caps)) {
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droideglsink/gstdroideglsink.h
^
|
@@ -39,6 +39,8 @@
(G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DROIDEGLSINK))
#define GST_IS_DROIDEGLSINK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DROIDEGLSINK))
+#define GST_DROIDEGLSINK_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DROIDEGLSINK, GstDroidEglSinkClass))
typedef struct _GstDroidEglSink GstDroidEglSink;
typedef struct _GstDroidEglSinkClass GstDroidEglSinkClass;
@@ -47,27 +49,20 @@
{
GstVideoSink parent;
- gint fps_n;
- gint fps_d;
-
- GstBuffer *acquired_buffer;
- GstBuffer *last_buffer;
+ GstBufferPool *pool;
+ gulong invalidated_signal_id;
EGLDisplay dpy;
- EGLImageKHR image;
- EGLSyncKHR sync;
GMutex lock;
-
- GstAllocator *allocator;
-
- PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
- PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
- PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR;
- PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR;
};
struct _GstDroidEglSinkClass
{
GstVideoSinkClass parent_class;
+
+ void (*signal_show_frame) (GstVideoSink *sink, GstBuffer *buffer);
+ void (*signal_buffers_invalidated) (GstVideoSink *sink);
+
+ void (* buffers_invalidated) (GstDroidEglSink *sink);
};
GType gst_droideglsink_get_type (void);
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droideglsink/gstdroidvideotexturesink.c
^
|
@@ -0,0 +1,648 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "gstdroidvideotexturesink.h"
+#include <gst/video/video.h>
+#include <gst/interfaces/nemoeglimagememory.h>
+#include <gst/interfaces/nemovideotexture.h>
+#include "gst/droid/gstdroidmediabuffer.h"
+#include "gst/droid/gstdroidbufferpool.h"
+
+GST_DEBUG_CATEGORY_EXTERN (gst_droid_videotexturesink_debug);
+#define GST_CAT_DEFAULT gst_droid_videotexturesink_debug
+
+static void
+gst_droidvideotexturesink_video_texture_init (NemoGstVideoTextureClass * iface);
+
+#define gst_droidvideotexturesink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstDroidVideoTextureSink, gst_droidvideotexturesink,
+ GST_TYPE_DROIDEGLSINK, G_IMPLEMENT_INTERFACE (NEMO_GST_TYPE_VIDEO_TEXTURE,
+ gst_droidvideotexturesink_video_texture_init));
+
+enum
+{
+ PROP_0,
+ PROP_EGL_DISPLAY
+};
+
+static void
+gst_droidvideotexturesink_destroy_sync (GstDroidVideoTextureSink * sink)
+{
+ GST_DEBUG_OBJECT (sink, "destroy sync %p", sink->sync);
+
+ if (sink->sync) {
+ sink->eglDestroySyncKHR (sink->dpy, sink->sync);
+ sink->sync = NULL;
+ }
+}
+
+static void
+gst_droidvideotexturesink_wait_sync (GstDroidVideoTextureSink * sink)
+{
+ GST_DEBUG_OBJECT (sink, "wait sync %p", sink->sync);
+
+ if (sink->sync) {
+ /* We will behave like Android does */
+ EGLint result =
+ sink->eglClientWaitSyncKHR (sink->dpy, sink->sync, 0, EGL_FOREVER_KHR);
+ if (result == EGL_FALSE) {
+ GST_WARNING_OBJECT (sink, "error 0x%x waiting for fence", eglGetError ());
+ } else if (result == EGL_TIMEOUT_EXPIRED_KHR) {
+ GST_WARNING_OBJECT (sink, "timeout waiting for fence");
+ }
+
+ gst_droidvideotexturesink_destroy_sync (sink);
+ }
+}
+
+static gboolean
+gst_droidvideotexturesink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+{
+ GstDroidVideoTextureSink *sink;
+ GstVideoSink *vsink;
+ GstVideoInfo info;
+
+ sink = GST_DROIDVIDEOTEXTURESINK (bsink);
+ vsink = GST_VIDEO_SINK (bsink);
+
+ GST_DEBUG_OBJECT (sink, "set caps with %" GST_PTR_FORMAT, caps);
+
+ if (!gst_video_info_from_caps (&info, caps)) {
+ GST_ELEMENT_ERROR (sink, STREAM, FORMAT, (NULL),
+ ("Could not locate image format from caps %" GST_PTR_FORMAT, caps));
+ return FALSE;
+ }
+
+ sink->fps_n = info.fps_n;
+ sink->fps_d = info.fps_d;
+
+ GST_VIDEO_SINK_WIDTH (vsink) = info.width;
+ GST_VIDEO_SINK_HEIGHT (vsink) = info.height;
+
+ return TRUE;
+}
+
+static void
+gst_droidvideotexturesink_get_times (GstBaseSink * bsink, GstBuffer * buf,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstDroidVideoTextureSink *sink;
+
+ sink = GST_DROIDVIDEOTEXTURESINK (bsink);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ *start = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_BUFFER_DURATION_IS_VALID (buf)) {
+ *end = *start + GST_BUFFER_DURATION (buf);
+ } else {
+ if (sink->fps_n > 0) {
+ *end = *start +
+ gst_util_uint64_scale_int (GST_SECOND, sink->fps_d, sink->fps_n);
+ }
+ }
+ }
+}
+
+static gboolean
+gst_droidvideotexturesink_start (GstBaseSink * bsink)
+{
+ GstDroidVideoTextureSink *sink;
+
+ sink = GST_DROIDVIDEOTEXTURESINK (bsink);
+
+ GST_DEBUG_OBJECT (sink, "start");
+
+ sink->fps_n = 0;
+ sink->fps_d = 1;
+
+ sink->image = EGL_NO_IMAGE_KHR;
+ sink->sync = NULL;
+ sink->eglDestroyImageKHR = NULL;
+ sink->eglClientWaitSyncKHR = NULL;
+ sink->eglDestroySyncKHR = NULL;
+
+ return TRUE;
+}
+
+static gboolean
+gst_droidvideotexturesink_stop (GstBaseSink * bsink)
+{
+ GstDroidVideoTextureSink *sink;
+
+ sink = GST_DROIDVIDEOTEXTURESINK (bsink);
+
+ GST_DEBUG_OBJECT (sink, "stop");
+
+ if (sink->sync) {
+ gst_droidvideotexturesink_destroy_sync (sink);
+ }
+
+ g_mutex_lock (&sink->lock);
+
+ if (sink->image) {
+ GST_WARNING_OBJECT (sink, "destroying leftover EGLImageKHR");
+ sink->eglDestroyImageKHR (sink->dpy, sink->image);
+ sink->image = EGL_NO_IMAGE_KHR;
+ }
+
+ if (sink->acquired_buffer) {
+ GST_WARNING_OBJECT (sink, "freeing leftover acquired buffer");
+ gst_buffer_unref (sink->acquired_buffer);
+ sink->acquired_buffer = NULL;
+ }
+
+ g_mutex_unlock (&sink->lock);
+
+ if (sink->last_buffer) {
+ GST_INFO_OBJECT (sink, "freeing leftover last buffer");
+ gst_buffer_unref (sink->last_buffer);
+ sink->last_buffer = NULL;
+ }
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_droidvideotexturesink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
+{
+ GstDroidVideoTextureSink *sink;
+ gint n_memory;
+
+ sink = GST_DROIDVIDEOTEXTURESINK (vsink);
+
+ GST_DEBUG_OBJECT (sink, "show frame");
+
+ n_memory = gst_buffer_n_memory (buf);
+
+ if (G_UNLIKELY (n_memory == 0)) {
|
[-]
[+]
|
Added |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/droideglsink/gstdroidvideotexturesink.h
^
|
@@ -0,0 +1,71 @@
+/*
+ * gst-droid
+ *
+ * Copyright (C) 2014 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2015 Jolla LTD.
+ *
+ * This library 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __GST_DROID_VIDEO_TEXTURE_SINK_H__
+#define __GST_DROID_VIDEO_TEXTURE_SINK_H__
+
+#include "gstdroideglsink.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_DROIDVIDEOTEXTURESINK \
+ (gst_droidvideotexturesink_get_type())
+#define GST_DROIDVIDEOTEXTURESINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_DROIDVIDEOTEXTURESINK, GstDroidVideoTextureSink))
+#define GST_DROIDVIDEOTEXTURESINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_DROIDVIDEOTEXTURESINK, GstDroidVideoTextureSinkClass))
+#define GST_IS_DROIDVIDEOTEXTURESINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_DROIDVIDEOTEXTURESINK))
+#define GST_IS_DROIDVIDEOTEXTURESINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_DROIDVIDEOTEXTURESINK))
+
+typedef struct _GstDroidVideoTextureSink GstDroidVideoTextureSink;
+typedef struct _GstDroidVideoTextureSinkClass GstDroidVideoTextureSinkClass;
+
+struct _GstDroidVideoTextureSink
+{
+ GstDroidEglSink parent;
+
+ gint fps_n;
+ gint fps_d;
+
+ GstBuffer *acquired_buffer;
+ GstBuffer *last_buffer;
+ EGLDisplay dpy;
+ EGLImageKHR image;
+ EGLSyncKHR sync;
+ GMutex lock;
+
+ PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
+ PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR;
+ PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR;
+};
+
+struct _GstDroidVideoTextureSinkClass
+{
+ GstDroidEglSinkClass parent_class;
+};
+
+GType gst_droidvideotexturesink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DROID_EGL_SINK_H__ */
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst/plugin.c
^
|
@@ -26,6 +26,7 @@
#include "plugin.h"
#include "gstdroidcamsrc.h"
#include "gstdroideglsink.h"
+#include "gstdroidvideotexturesink.h"
#include "gstdroidvdec.h"
#include "gstdroidvenc.h"
#include "gstdroidadec.h"
@@ -39,6 +40,7 @@
GST_DEBUG_CATEGORY (gst_droid_venc_debug);
GST_DEBUG_CATEGORY (gst_droid_codec_debug);
GST_DEBUG_CATEGORY (gst_droid_eglsink_debug);
+GST_DEBUG_CATEGORY (gst_droid_videotexturesink_debug);
static gboolean
plugin_init (GstPlugin * plugin)
@@ -51,6 +53,9 @@
GST_DEBUG_CATEGORY_INIT (gst_droid_eglsink_debug, "droideglsink",
0, "Android EGL sink");
+ GST_DEBUG_CATEGORY_INIT (gst_droid_videotexturesink_debug,
+ "droidvideotexturesink", 0, "Android EGL sink");
+
GST_DEBUG_CATEGORY_INIT (gst_droid_adec_debug, "droidadec",
0, "Android HAL audio decoder");
@@ -70,6 +75,8 @@
GST_TYPE_DROIDCAMSRC);
ok &= gst_element_register (plugin, "droideglsink", GST_RANK_PRIMARY,
GST_TYPE_DROIDEGLSINK);
+ ok &= gst_element_register (plugin, "droidvideotexturesink", GST_RANK_PRIMARY,
+ GST_TYPE_DROIDVIDEOTEXTURESINK);
ok &= gst_element_register (plugin, "droidvdec", GST_RANK_PRIMARY + 1,
GST_TYPE_DROIDVDEC);
|