summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrijesh Singh <brijeshkumar.singh@amd.com>2015-02-05 14:05:49 -0600
committerfedora21 <fedora21@localhost.amd.com>2015-02-05 16:49:53 -0500
commit61714bcdede73b96f77a526062d9518f32ad91b4 (patch)
tree52cf2bd2eaec9834a4103c52052fad0205b1dad8
parentce180b46b089243989e456b6e5e9ceb947456e8a (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.c28
-rw-r--r--omx/gstomxvideoenc.h3
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;