summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2013-09-05 02:23:39 -0600
committerChristian König <christian.koenig@amd.com>2014-02-07 05:50:56 -0700
commit75402afb7acd7bee4fe02ca2c2e524d3d7426d19 (patch)
tree1e317ecfea2f4282c4c9263f9ebf02c88d4c6b89
parent45a91c687ea3a2ce80fcffcdea413b9dcac55242 (diff)
gstomxvideodec: simplify _find_nearest_frame
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>
-rw-r--r--omx/gstomxvideodec.c60
1 files 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