diff options
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.patch | 125 |
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 + |