diff options
author | Brijesh Singh <brijeshkumar.singh@amd.com> | 2015-02-05 14:05:49 -0600 |
---|---|---|
committer | fedora21 <fedora21@localhost.amd.com> | 2015-02-05 16:49:53 -0500 |
commit | 61714bcdede73b96f77a526062d9518f32ad91b4 (patch) | |
tree | 52cf2bd2eaec9834a4103c52052fad0205b1dad8 | |
parent | ce180b46b089243989e456b6e5e9ceb947456e8a (diff) |
gstomxvideoenc: add fix-timestamp property
The property will force element to calculate the timestamp (dts and pts) based on duration.
Signed-off-by: Brijesh Singh <brijeshkumar.singh@amd.com>
-rw-r--r-- | omx/gstomxvideoenc.c | 28 | ||||
-rw-r--r-- | omx/gstomxvideoenc.h | 3 |
2 files changed, 29 insertions, 2 deletions
diff --git a/omx/gstomxvideoenc.c b/omx/gstomxvideoenc.c index c372a0d..f05897d 100644 --- a/omx/gstomxvideoenc.c +++ b/omx/gstomxvideoenc.c @@ -101,7 +101,8 @@ enum PROP_SCALING_HEIGHT, PROP_CAPTURE, PROP_POS_X, - PROP_POS_Y + PROP_POS_Y, + PROP_FIX_TIMESTAMP }; /* FIXME: Better defaults */ @@ -115,6 +116,7 @@ enum #define GST_OMX_VIDEO_ENC_CAPTURE_DEFAULT (FALSE) #define GST_OMX_VIDEO_ENC_POS_X_DEFAULT (0) #define GST_OMX_VIDEO_ENC_POS_Y_DEFAULT (0) +#define GST_OMX_VIDEO_ENC_FIX_TIMESTAMP_DEFAULT FALSE /* class initialization */ @@ -207,6 +209,11 @@ gst_omx_video_enc_class_init (GstOMXVideoEncClass * klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY)); + g_object_class_install_property (gobject_class, PROP_FIX_TIMESTAMP, + g_param_spec_boolean ("fix-timestamp", "Calculate timestamp", + "Calculate timestamp (dts/pts) based on duration", + 0, G_PARAM_READWRITE)); + element_class->change_state = GST_DEBUG_FUNCPTR (gst_omx_video_enc_change_state); @@ -246,6 +253,8 @@ gst_omx_video_enc_init (GstOMXVideoEnc * self) self->capture = GST_OMX_VIDEO_ENC_CAPTURE_DEFAULT; self->pos_x = GST_OMX_VIDEO_ENC_POS_X_DEFAULT; self->pos_y = GST_OMX_VIDEO_ENC_POS_Y_DEFAULT; + self->prev_timestamp = 0; + self->fix_timestamp = GST_OMX_VIDEO_ENC_FIX_TIMESTAMP_DEFAULT; g_mutex_init (&self->drain_lock); g_cond_init (&self->drain_cond); @@ -623,6 +632,9 @@ gst_omx_video_enc_set_property (GObject * object, guint prop_id, case PROP_POS_Y: self->pos_y = g_value_get_uint (value); break; + case PROP_FIX_TIMESTAMP: + self->fix_timestamp = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -666,6 +678,9 @@ gst_omx_video_enc_get_property (GObject * object, guint prop_id, GValue * value, case PROP_POS_Y: g_value_set_uint (value, self->pos_y); break; + case PROP_FIX_TIMESTAMP: + g_value_set_boolean (value, self->fix_timestamp); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -768,8 +783,14 @@ gst_omx_video_enc_find_nearest_frame (GstOMXVideoEnc * self, GstOMXBuffer * buf) } } - if (best) + if (best) { + if (self->fix_timestamp) { + best->dts = self->prev_timestamp; + best->pts = self->prev_timestamp; + self->prev_timestamp += best->duration; + } gst_video_codec_frame_ref (best); + } g_list_foreach (frames, (GFunc) gst_video_codec_frame_unref, NULL); g_list_free (frames); @@ -998,6 +1019,9 @@ gst_omx_video_enc_loop (GstOMXVideoEnc * self) GST_VIDEO_ENCODER_STREAM_LOCK (self); frame = gst_omx_video_enc_find_nearest_frame (self, buf); + GST_INFO_OBJECT (self, "dts %" GST_TIME_FORMAT " pts %" GST_TIME_FORMAT, + GST_TIME_ARGS(frame->dts), GST_TIME_ARGS(frame->pts)); + g_assert (klass->handle_output_frame); flow_ret = klass->handle_output_frame (self, self->enc_out_port, buf, frame); diff --git a/omx/gstomxvideoenc.h b/omx/gstomxvideoenc.h index 3de563b..064583f 100644 --- a/omx/gstomxvideoenc.h +++ b/omx/gstomxvideoenc.h @@ -60,6 +60,7 @@ struct _GstOMXVideoEnc gboolean started; GstClockTime last_upstream_ts; + GstClockTime prev_timestamp; /* Draining state */ GMutex drain_lock; @@ -77,6 +78,8 @@ struct _GstOMXVideoEnc guint32 quant_p_frames; guint32 quant_b_frames; + gboolean fix_timestamp; + guint32 scaling_width; guint32 scaling_height; |