vdpaumpegdec: if available use incoming buffer timestamp as output timestamp
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>
Mon, 27 Apr 2009 16:34:53 +0000 (18:34 +0200)
committerJan Schmidt <thaytan@noraisin.net>
Sat, 20 Jun 2009 14:21:32 +0000 (15:21 +0100)
sys/vdpau/gstvdpdecoder.c
sys/vdpau/gstvdpmpegdecoder.c

index 3f71ab40c6ed71bb99ad3f4c6bbe7c3b26bfcf11..b3faf83742966dba4b187a6fdc19c529271f01b0 100644 (file)
@@ -64,15 +64,11 @@ GstFlowReturn
 gst_vdp_decoder_push_video_buffer (GstVdpDecoder * dec,
     GstVdpVideoBuffer * buffer)
 {
-  GST_BUFFER_TIMESTAMP (buffer) =
-      gst_util_uint64_scale_int (GST_SECOND * dec->frame_nr,
-      dec->framerate_denominator, dec->framerate_numerator);
-  GST_BUFFER_DURATION (buffer) =
-      gst_util_uint64_scale_int (GST_SECOND, dec->framerate_denominator,
-      dec->framerate_numerator);
-  GST_BUFFER_OFFSET (buffer) = dec->frame_nr;
-  dec->frame_nr++;
-  GST_BUFFER_OFFSET_END (buffer) = dec->frame_nr;
+  if (GST_BUFFER_TIMESTAMP (buffer) == GST_CLOCK_TIME_NONE) {
+    GST_BUFFER_TIMESTAMP (buffer) =
+        gst_util_uint64_scale_int (GST_SECOND * dec->frame_nr,
+        dec->framerate_denominator, dec->framerate_numerator);
+  }
   gst_buffer_set_caps (GST_BUFFER (buffer), GST_PAD_CAPS (dec->src));
 
   return gst_pad_push (dec->src, GST_BUFFER (buffer));
index 5cc913b00c9cdb55b1697c930be79cb19a3788c9..5b461268634608607ae8468a42ea96a886aa0e28 100644 (file)
@@ -139,7 +139,8 @@ typedef struct
 } GstVdpBFrame;
 
 static GstFlowReturn
-gst_vdp_mpeg_decoder_decode (GstVdpMpegDecoder * mpeg_dec)
+gst_vdp_mpeg_decoder_decode (GstVdpMpegDecoder * mpeg_dec,
+    GstClockTime timestamp)
 {
   GstVdpDecoder *dec;
   GstBuffer *buffer;
@@ -167,6 +168,7 @@ gst_vdp_mpeg_decoder_decode (GstVdpMpegDecoder * mpeg_dec)
 
     b_frame = g_slice_new (GstVdpBFrame);
 
+    GST_BUFFER_TIMESTAMP (buffer) = timestamp;
     b_frame->buffer = buffer;
     memcpy (&b_frame->vdp_info, &mpeg_dec->vdp_info,
         sizeof (VdpPictureInfoMPEG1Or2));
@@ -180,6 +182,7 @@ gst_vdp_mpeg_decoder_decode (GstVdpMpegDecoder * mpeg_dec)
 
   outbuf = gst_vdp_video_buffer_new (dec->device, VDP_CHROMA_TYPE_420,
       dec->width, dec->height);
+  GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
   surface = outbuf->surface;
 
   device = dec->device;
@@ -216,6 +219,7 @@ gst_vdp_mpeg_decoder_decode (GstVdpMpegDecoder * mpeg_dec)
 
       b_outbuf = gst_vdp_video_buffer_new (dec->device, VDP_CHROMA_TYPE_420,
           dec->width, dec->height);
+      GST_BUFFER_TIMESTAMP (b_outbuf) = GST_BUFFER_TIMESTAMP (b_frame->buffer);
 
       b_frame->vdp_info.backward_reference = surface;
       vbit[0].struct_version = VDP_BITSTREAM_BUFFER_VERSION;
@@ -428,8 +432,6 @@ gst_vdp_mpeg_decoder_chain (GstPad * pad, GstBuffer * buffer)
     switch (data[0]) {
       case MPEG_PACKET_PICTURE:
         GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_PICTURE");
-        if (mpeg_dec->vdp_info.slice_count > 0)
-          ret = gst_vdp_mpeg_decoder_decode (mpeg_dec);
 
         gst_vdp_mpeg_decoder_parse_picture (mpeg_dec, packet_start, packet_end);
         break;
@@ -464,6 +466,9 @@ gst_vdp_mpeg_decoder_chain (GstPad * pad, GstBuffer * buffer)
     }
   }
 
+  if (mpeg_dec->vdp_info.slice_count > 0)
+    ret = gst_vdp_mpeg_decoder_decode (mpeg_dec, GST_BUFFER_TIMESTAMP (buffer));
+
   return ret;
 }