summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorCarl-Anton Ingmarsson <ca.ingmarsson@gmail.com>2009-04-27 18:34:53 +0200
committerJan Schmidt <thaytan@noraisin.net>2009-06-20 15:21:32 +0100
commit2eb479f825c3d1f02f9b91cc3f1964945be5d647 (patch)
tree499763bf6369075e98ef2c7e7e8f09ba492411c7 /sys
parent2d996a3ff49757e299ec6218604f19e499ac0782 (diff)
downloadgst-plugins-bad-2eb479f825c3d1f02f9b91cc3f1964945be5d647.tar.gz
gst-plugins-bad-2eb479f825c3d1f02f9b91cc3f1964945be5d647.tar.bz2
gst-plugins-bad-2eb479f825c3d1f02f9b91cc3f1964945be5d647.zip
vdpaumpegdec: if available use incoming buffer timestamp as output timestamp
Diffstat (limited to 'sys')
-rw-r--r--sys/vdpau/gstvdpdecoder.c14
-rw-r--r--sys/vdpau/gstvdpmpegdecoder.c11
2 files changed, 13 insertions, 12 deletions
diff --git a/sys/vdpau/gstvdpdecoder.c b/sys/vdpau/gstvdpdecoder.c
index 3f71ab40..b3faf837 100644
--- a/sys/vdpau/gstvdpdecoder.c
+++ b/sys/vdpau/gstvdpdecoder.c
@@ -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));
diff --git a/sys/vdpau/gstvdpmpegdecoder.c b/sys/vdpau/gstvdpmpegdecoder.c
index 5cc913b0..5b461268 100644
--- a/sys/vdpau/gstvdpmpegdecoder.c
+++ b/sys/vdpau/gstvdpmpegdecoder.c
@@ -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;
}