diff options
author | Alessandro Decina <alessandro.d@gmail.com> | 2014-12-10 19:44:01 +1100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-12-16 15:08:57 +0100 |
commit | 18acaa58c7a22b9963f20e7d3d1107037ec89f97 (patch) | |
tree | 3505d1bb9dcc8fe071286d1a267404918b12e3ac | |
parent | 98ce21e4c39fe8d5bf7f3d68bcb266f124cab86f (diff) | |
download | gstreamer-plugins-bad-18acaa58c7a22b9963f20e7d3d1107037ec89f97.tar.gz |
vtenc: report latency
-rw-r--r-- | sys/applemedia/vtenc.c | 36 | ||||
-rw-r--r-- | sys/applemedia/vtenc.h | 1 |
2 files changed, 36 insertions, 1 deletions
diff --git a/sys/applemedia/vtenc.c b/sys/applemedia/vtenc.c index 2207687a0..1a9912d5a 100644 --- a/sys/applemedia/vtenc.c +++ b/sys/applemedia/vtenc.c @@ -249,7 +249,7 @@ gst_vtenc_init (GstVTEnc * self) /* These could be controlled by properties later */ self->dump_properties = FALSE; self->dump_attributes = FALSE; - + self->latency_frames = -1; self->session = NULL; } @@ -342,6 +342,7 @@ gst_vtenc_set_quality (GstVTEnc * self, gdouble quality) { GST_OBJECT_LOCK (self); self->quality = quality; + GST_INFO_OBJECT (self, "setting quality %f", quality); if (self->session != NULL) { gst_vtenc_session_configure_property_double (self, self->session, kVTCompressionPropertyKey_Quality, quality); @@ -897,6 +898,37 @@ gst_vtenc_session_configure_property_double (GstVTEnc * self, return status; } +static void +gst_vtenc_update_latency (GstVTEnc * self) +{ + OSStatus status; + CFNumberRef value; + int frames = 0; + GstClockTime frame_duration; + GstClockTime latency; + + if (self->video_info.fps_d == 0) { + GST_INFO_OBJECT (self, "framerate not known, can't set latency"); + return; + } + + status = VTSessionCopyProperty (self->session, + kVTCompressionPropertyKey_NumberOfPendingFrames, NULL, &value); + CFNumberGetValue (value, kCFNumberSInt32Type, &frames); + if (self->latency_frames == -1 || self->latency_frames != frames) { + self->latency_frames = frames; + frame_duration = gst_util_uint64_scale (GST_SECOND, + self->video_info.fps_d, self->video_info.fps_n); + latency = frame_duration * frames; + GST_INFO_OBJECT (self, + "latency status %d frames %d fps %d/%d time %" GST_TIME_FORMAT, status, + frames, self->video_info.fps_n, self->video_info.fps_d, + GST_TIME_ARGS (latency)); + gst_video_encoder_set_latency (GST_VIDEO_ENCODER (self), latency, latency); + } + CFRelease (value); +} + static GstFlowReturn gst_vtenc_encode_frame (GstVTEnc * self, GstVideoCodecFrame * frame) { @@ -1082,6 +1114,8 @@ gst_vtenc_encode_frame (GstVTEnc * self, GstVideoCodecFrame * frame) gst_video_codec_frame_unref (outframe); break; } + + gst_vtenc_update_latency (self); } ret = diff --git a/sys/applemedia/vtenc.h b/sys/applemedia/vtenc.h index 01f89e6bc..f2873cdf6 100644 --- a/sys/applemedia/vtenc.h +++ b/sys/applemedia/vtenc.h @@ -63,6 +63,7 @@ struct _GstVTEnc gdouble quality; gint max_keyframe_interval; GstClockTime max_keyframe_interval_duration; + gint latency_frames; gboolean dump_properties; gboolean dump_attributes; |