[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:gst-droid.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -5,4 +5,4 @@
<param name="token"/>
<param name="debian">N</param>
<param name="dumb">N</param>
-</service></services>
+</service></services>
\ No newline at end of file
|
[-]
[+]
|
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
^
|
@@ -23,28 +23,16 @@
#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)
-{
- GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
-
- // if the allocator is set then we should keep the memory
- if (!dpool->allocator) {
- gst_buffer_remove_all_memory (buffer);
- GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_TAG_MEMORY);
- }
-
- 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);
-
- return GST_BUFFER_POOL_CLASS (parent_class)->reset_buffer (pool, buffer);
-}
+static guint gst_droid_buffer_pool_signals[LAST_SIGNAL] = { 0 };
static gboolean
gst_droid_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
@@ -60,6 +48,8 @@
}
// 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)) {
@@ -69,6 +59,8 @@
}
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 ();
@@ -96,99 +88,232 @@
{
GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
GstBuffer *buffer;
- GstMemory *memory;
+
+ if (!dpool->allocator) {
+ return GST_FLOW_ERROR;
+ }
buffer = gst_buffer_new ();
if (!buffer) {
return GST_FLOW_ERROR;
}
- // if the allocator is set then we should create the memory too
- if (dpool->allocator) {
- memory = gst_droid_media_buffer_allocator_alloc_new (dpool->allocator,
- &dpool->video_info, buffer);
+
+ 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);
}
- g_mutex_lock (&dpool->lock);
- ++dpool->num_buffers;
*buf = buffer;
- GST_DEBUG_OBJECT (dpool, "num buffers: %d", dpool->num_buffers);
- g_cond_signal (&dpool->cond);
- g_mutex_unlock (&dpool->lock);
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);
}
- g_mutex_lock (&dpool->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);
+ }
- if (dpool->num_buffers > 0) {
- g_mutex_unlock (&dpool->lock);
- return TRUE;
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (pool, buffer);
}
+}
- g_cond_wait (&dpool->cond, &dpool->lock);
- g_mutex_unlock (&dpool->lock);
+void
+gst_droid_buffer_pool_set_egl_display (GstBufferPool * pool, EGLDisplay display)
+{
+ GstDroidBufferPool *dpool = GST_DROID_BUFFER_POOL (pool);
- if (GST_BUFFER_POOL_IS_FLUSHING (pool)) {
+ if (dpool) {
+ dpool->display = display;
+ }
+}
+
+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 (gst_buffer_pool_acquire_buffer (pool, &gst_buffer, NULL) != GST_FLOW_OK) {
+ return FALSE;
+ }
+
+ dpool = GST_DROID_BUFFER_POOL (pool);
+
+ mem =
+ gst_droid_media_buffer_allocator_alloc_from_buffer (dpool->allocator,
+ buffer);
+
+ if (!mem) {
+ gst_buffer_unref (gst_buffer);
+
+ return FALSE;
+ }
+
+ gst_buffer_insert_memory (gst_buffer, 0, mem);
+
+ g_mutex_lock (&dpool->binding_lock);
+
+ droid_media_buffer_set_user_data (buffer, gst_buffer);
+
+ g_ptr_array_add (dpool->bound_buffers, gst_buffer);
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidbufferpool.h
^
|
@@ -24,12 +24,15 @@
#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))
@@ -38,21 +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
^
|
@@ -49,6 +49,8 @@
GstBuffer * data, DroidMediaData * out);
static gboolean create_aacdec_codec_data_from_frame_data (GstDroidCodec * codec,
GstBuffer * frame_data, DroidMediaData * out);
+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,
@@ -112,10 +114,12 @@
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, NULL, NULL, NULL},
+ "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, NULL, NULL, NULL},
+ "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",
@@ -936,6 +940,15 @@
}
static gboolean
+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)
{
|
[-]
[+]
|
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
@@ -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,12 +250,15 @@
{
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 size)
{
@@ -300,12 +316,11 @@
}
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)) {
@@ -314,17 +329,11 @@
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,
+ 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);
@@ -334,15 +343,13 @@
GstMemory *
gst_droid_media_buffer_allocator_alloc_new (GstAllocator * allocator,
- GstVideoInfo * info, GstBuffer * buffer)
+ GstVideoInfo * info)
{
GstDroidMediaBufferMemory *mem;
DroidMediaBuffer *dbuf;
DroidMediaBufferInfo droid_info;
- DroidMediaBufferCallbacks cb;
- GstVideoMeta *video_meta;
- 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");
@@ -351,7 +358,6 @@
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,
"Unknown GStreamer format %s",
@@ -360,13 +366,9 @@
}
GST_WARNING_OBJECT (allocator,
"GStreamer format %s", gst_video_format_to_string (info->finfo->format));
- cb.ref = (DroidMediaCallback) gst_buffer_ref;
- cb.unref = (DroidMediaCallback) gst_buffer_unref;
- cb.data = buffer;
dbuf =
droid_media_buffer_create (info->width, info->height,
- gst_droid_media_buffer_formats[format_index].hal_format, &cb);
-
+ gst_droid_media_buffer_formats[format_index].hal_format);
if (!dbuf) {
GST_ERROR_OBJECT (allocator, "failed to acquire media buffer");
return NULL;
@@ -374,20 +376,9 @@
droid_media_buffer_get_info (dbuf, &droid_info);
mem =
- gst_droid_media_buffer_allocator_alloc_from_buffer (allocator, dbuf,
+ gst_droid_media_buffer_allocator_alloc (allocator, dbuf,
format_index, info->width, info->height, droid_info.stride, info->size);
-
- gst_buffer_append_memory (buffer, (GstMemory *) mem);
-
- video_meta = gst_buffer_add_video_meta_full (buffer,
- GST_VIDEO_FRAME_FLAG_NONE, mem->video_info.finfo->format,
- mem->video_info.width, mem->video_info.height,
- mem->video_info.finfo->n_planes, mem->video_info.offset,
- mem->video_info.stride);
- GST_META_FLAG_SET ((GstMeta *) video_meta, GST_META_FLAG_POOLED);
-
GST_DEBUG_OBJECT (allocator, "alloc %p", mem);
-
return GST_MEMORY_CAST (mem);
}
@@ -402,13 +393,10 @@
GstMemory * mem)
{
GstDroidMediaBufferMemory *m = (GstDroidMediaBufferMemory *) mem;
-
GST_DEBUG_OBJECT (allocator, "free %p", m);
- droid_media_buffer_release (m->buffer, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR);
-
+ droid_media_buffer_destroy (m->buffer);
m->buffer = NULL;
-
|
[-]
[+]
|
Changed |
_service:tar_git:gstreamer1.0-droid-0.20201104.0.tar.gz/gst-libs/gst/droid/gstdroidmediabuffer.h
^
|
@@ -29,20 +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_new (GstAllocator * allocator,
- GstVideoInfo * info, GstBuffer * buffer);
+ 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 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 void
-gst_droidcamsrc_dev_frame_available (void *user)
+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));
-
- goto acquire_and_release;
- }
+ pool = gst_object_ref (dev->pool);
- 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);
@@ -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);
-
- if (!gst_buffer_pool_set_config (dev->pool, config)) {
- GST_ERROR ("Failed to configure buffer pool");
- return FALSE;
- }
-
/* now the callbacks */
{
DroidMediaCameraCallbacks cb;
@@ -692,6 +684,7 @@
DroidMediaBufferQueueCallbacks cb;
cb.buffers_released = gst_droidcamsrc_dev_buffers_released;
cb.frame_available = gst_droidcamsrc_dev_frame_available;
+ cb.buffer_created = gst_droidcamsrc_dev_buffer_created;
droid_media_buffer_queue_set_callbacks (dev->queue, &cb, dev);
}
|
[-]
[+]
|
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
^
|
@@ -29,16 +29,28 @@
#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",
@@ -47,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_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)));
-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_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)
@@ -128,9 +111,6 @@
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;
@@ -141,12 +121,14 @@
gst_droideglsink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
{
GstDroidEglSink *sink = GST_DROIDEGLSINK (bsink);
- GstBufferPool *pool;
+ GstBufferPool *previous_pool = NULL;
+ gulong previous_pool_signal_id = 0;
GstCaps *caps;
guint size;
gboolean need_pool;
- GstStructure *config;
+ gboolean queue_pool = FALSE;
GstVideoInfo video_info;
+ gboolean ret = FALSE;
gst_query_parse_allocation (query, &caps, &need_pool);
@@ -160,181 +142,161 @@
return FALSE;
}
- if (need_pool) {
- pool = gst_droid_buffer_pool_new ();
- size = video_info.finfo->format == GST_VIDEO_FORMAT_ENCODED
- ? 1 : video_info.size;
+ g_mutex_lock (&sink->lock);
- config = gst_buffer_pool_get_config (pool);
- gst_buffer_pool_config_set_params (config, caps, size, 2, 0);
- if (!gst_buffer_pool_set_config (pool, config)) {
- GST_ERROR_OBJECT (sink, "Failed to set buffer pool configuration");
- gst_object_unref (pool);
- return FALSE;
- }
- gst_query_add_allocation_pool (query, pool, size, 0, 2);
- gst_object_unref (pool);
- }
+ previous_pool = sink->pool;
+ previous_pool_signal_id = sink->invalidated_signal_id;
- gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
+ sink->pool = NULL;
+ sink->invalidated_signal_id = 0;
- GST_DEBUG_OBJECT (sink, "proposed allocation");
+ 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;
+ }
- return TRUE;
-}
+ size = video_info.finfo->format == GST_VIDEO_FORMAT_ENCODED
+ ? 1 : video_info.size;
-static void
-gst_droideglsink_get_times (GstBaseSink * bsink, GstBuffer * buf,
- GstClockTime * start, GstClockTime * end)
-{
- GstDroidEglSink *sink;
+ if (previous_pool) {
+ GstCaps *pool_caps;
- sink = GST_DROIDEGLSINK (bsink);
+ 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)) {
+ gst_buffer_pool_config_set_params (config, caps, size, min, max);
+
+ if (gst_buffer_pool_set_config (previous_pool, config)) {
+ pool = previous_pool;
+ sink->invalidated_signal_id = previous_pool_signal_id;
- 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);
+ previous_pool = NULL;
+ }
}
}
- }
-}
-
-static gboolean
-gst_droideglsink_start (GstBaseSink * bsink)
-{
- GstDroidEglSink *sink;
-
- sink = GST_DROIDEGLSINK (bsink);
-
|
[-]
[+]
|
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);
|