msdk: enc: set pts and dts, fix inverted sync_point flag
authorScott D Phillips <scott.d.phillips@intel.com>
Thu, 18 May 2017 17:36:50 +0000 (10:36 -0700)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 12 Jun 2017 07:00:56 +0000 (10:00 +0300)
Set the pts and dts on the frame that we receive from the msdk.
Also fix the inverted logic in setting sync points, previously we
were marking all frames as sync points except IDRs.

https://bugzilla.gnome.org/show_bug.cgi?id=782801

sys/msdk/gstmsdkenc.c

index 435cbc5..933eaf9 100644 (file)
@@ -466,8 +466,15 @@ gst_msdkenc_finish_frame (GstMsdkEnc * thiz, MsdkEncTask * task,
     out_buf = gst_buffer_new_allocate (NULL, size, NULL);
     gst_buffer_fill (out_buf, 0, data, size);
     frame->output_buffer = out_buf;
-    if ((task->output_bitstream.FrameType & MFX_FRAMETYPE_IDR) == 0 &&
-        (task->output_bitstream.FrameType & MFX_FRAMETYPE_xIDR) == 0) {
+    frame->pts =
+        gst_util_uint64_scale (task->output_bitstream.TimeStamp, GST_SECOND,
+        90000);
+    frame->dts =
+        gst_util_uint64_scale (task->output_bitstream.DecodeTimeStamp,
+        GST_SECOND, 90000);
+
+    if ((task->output_bitstream.FrameType & MFX_FRAMETYPE_IDR) != 0 ||
+        (task->output_bitstream.FrameType & MFX_FRAMETYPE_xIDR) != 0) {
       GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
     }
 
@@ -686,6 +693,11 @@ invalid_frame:
 static gboolean
 gst_msdkenc_start (GstVideoEncoder * encoder)
 {
+  /* Set the minimum pts to some huge value (1000 hours). This keeps
+     the dts at the start of the stream from needing to be
+     negative. */
+  gst_video_encoder_set_min_pts (encoder, GST_SECOND * 60 * 60 * 1000);
+
   return TRUE;
 }