aboutsummaryrefslogtreecommitdiffstats
path: root/meta-steppeeagle/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-gstomxvideodec-simplify-_find_nearest_frame.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-steppeeagle/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-gstomxvideodec-simplify-_find_nearest_frame.patch')
-rw-r--r--meta-steppeeagle/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-gstomxvideodec-simplify-_find_nearest_frame.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/meta-steppeeagle/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-gstomxvideodec-simplify-_find_nearest_frame.patch b/meta-steppeeagle/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-gstomxvideodec-simplify-_find_nearest_frame.patch
new file mode 100644
index 00000000..f2c9a912
--- /dev/null
+++ b/meta-steppeeagle/recipes-multimedia/gstreamer/gstreamer1.0-omx/0003-gstomxvideodec-simplify-_find_nearest_frame.patch
@@ -0,0 +1,125 @@
+From 75402afb7acd7bee4fe02ca2c2e524d3d7426d19 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Thu, 5 Sep 2013 02:23:39 -0600
+Subject: [PATCH 03/11] gstomxvideodec: simplify _find_nearest_frame
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+No need to make it more complicated and error prone than
+necessary. Also give the function a gst_omx_video_dec prefix
+to distinct it from the encoder function.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+---
+ omx/gstomxvideodec.c | 60 ++++++++++++++------------------------------------
+ 1 file changed, 16 insertions(+), 44 deletions(-)
+
+diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
+index 6b5cbe3..020b7d3 100644
+--- a/omx/gstomxvideodec.c
++++ b/omx/gstomxvideodec.c
+@@ -646,18 +646,6 @@ gst_omx_buffer_pool_new (GstElement * element, GstOMXComponent * component,
+ return GST_BUFFER_POOL (pool);
+ }
+
+-typedef struct _BufferIdentification BufferIdentification;
+-struct _BufferIdentification
+-{
+- guint64 timestamp;
+-};
+-
+-static void
+-buffer_identification_free (BufferIdentification * id)
+-{
+- g_slice_free (BufferIdentification, id);
+-}
+-
+ /* prototypes */
+ static void gst_omx_video_dec_finalize (GObject * object);
+
+@@ -1009,40 +997,32 @@ gst_omx_video_dec_change_state (GstElement * element, GstStateChange transition)
+ }
+
+ static GstVideoCodecFrame *
+-_find_nearest_frame (GstOMXVideoDec * self, GstOMXBuffer * buf)
++gst_omx_video_dec_find_nearest_frame (GstOMXVideoDec * self, GstOMXBuffer * buf)
+ {
+ GstVideoCodecFrame *best = NULL;
+- guint64 best_diff = G_MAXUINT64;
++ GstClockTimeDiff best_diff = G_MAXINT64;
++ GstClockTime timestamp;
+ GList *frames;
+ GList *l;
+
++ if (buf->omx_buf->nTimeStamp)
++ timestamp =
++ gst_util_uint64_scale (buf->omx_buf->nTimeStamp, GST_SECOND,
++ OMX_TICKS_PER_SECOND);
++ else
++ timestamp = GST_CLOCK_TIME_NONE;
++
+ frames = gst_video_decoder_get_frames (GST_VIDEO_DECODER (self));
+
+ for (l = frames; l; l = l->next) {
+ GstVideoCodecFrame *tmp = l->data;
+- BufferIdentification *id = gst_video_codec_frame_get_user_data (tmp);
+- guint64 timestamp, diff;
++ GstClockTimeDiff diff = ABS (GST_CLOCK_DIFF (timestamp, tmp->pts));
+
+- /* This happens for frames that were just added but
+- * which were not passed to the component yet. Ignore
+- * them here!
+- */
+- if (!id)
+- continue;
+-
+- timestamp = id->timestamp;
+-
+- if (timestamp > buf->omx_buf->nTimeStamp)
+- diff = timestamp - buf->omx_buf->nTimeStamp;
+- else
+- diff = buf->omx_buf->nTimeStamp - timestamp;
+-
+- if (best == NULL || diff < best_diff) {
++ if (diff < best_diff) {
+ best = tmp;
+ best_diff = diff;
+
+- /* For frames without timestamp we simply take the first frame */
+- if ((buf->omx_buf->nTimeStamp == 0 && timestamp == 0) || diff == 0)
++ if (diff == 0)
+ break;
+ }
+ }
+@@ -1947,7 +1927,7 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
+ (guint) buf->omx_buf->nFlags, (guint64) buf->omx_buf->nTimeStamp);
+
+ GST_VIDEO_DECODER_STREAM_LOCK (self);
+- frame = _find_nearest_frame (self, buf);
++ frame = gst_omx_video_dec_find_nearest_frame (self, buf);
+
+ if (frame
+ && (deadline = gst_video_decoder_get_max_decode_time
+@@ -2926,16 +2906,8 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
+ buf->omx_buf->nTickCount = 0;
+ }
+
+- if (offset == 0) {
+- BufferIdentification *id = g_slice_new0 (BufferIdentification);
+-
+- if (GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame))
+- buf->omx_buf->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
+-
+- id->timestamp = buf->omx_buf->nTimeStamp;
+- gst_video_codec_frame_set_user_data (frame, id,
+- (GDestroyNotify) buffer_identification_free);
+- }
++ if (offset == 0 && GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame))
++ buf->omx_buf->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
+
+ /* TODO: Set flags
+ * - OMX_BUFFERFLAG_DECODEONLY for buffers that are outside
+--
+1.7.9.5
+