From 74485f6fa28ac3413ca5533f7bee695ab7670b47 Mon Sep 17 00:00:00 2001 From: Carl-Anton Ingmarsson Date: Sat, 4 Apr 2009 22:45:09 +0200 Subject: [PATCH] vdpau: VideoYUV unref buffer in chain so that we don't leak them MpegDecoder parse sequence headers --- sys/vdpau/gstvdpaumpegdecoder.c | 28 ++++++++++++++++++++++++++-- sys/vdpau/gstvdpauvideoyuv.c | 6 ++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/sys/vdpau/gstvdpaumpegdecoder.c b/sys/vdpau/gstvdpaumpegdecoder.c index 36b546acc5..1910652c0d 100644 --- a/sys/vdpau/gstvdpaumpegdecoder.c +++ b/sys/vdpau/gstvdpaumpegdecoder.c @@ -141,6 +141,7 @@ gst_vdpau_mpeg_decoder_decode (GstVdpauMpegDecoder * mpeg_dec) GstVdpauDevice *device; VdpBitstreamBuffer vbit[1]; VdpStatus status; + GstFlowReturn ret; dec = GST_VDPAU_DECODER (mpeg_dec); @@ -178,14 +179,16 @@ gst_vdpau_mpeg_decoder_decode (GstVdpauMpegDecoder * mpeg_dec) gst_buffer_ref (GST_BUFFER (outbuf)); + ret = gst_vdpau_decoder_push_video_buffer (GST_VDPAU_DECODER (mpeg_dec), + outbuf); + if (mpeg_dec->vdp_info.forward_reference != VDP_INVALID_HANDLE) gst_buffer_unref (mpeg_dec->f_buffer); mpeg_dec->vdp_info.forward_reference = surface; mpeg_dec->f_buffer = GST_BUFFER (outbuf); - return gst_vdpau_decoder_push_video_buffer (GST_VDPAU_DECODER (mpeg_dec), - outbuf); + return ret; } static gboolean @@ -215,6 +218,26 @@ gst_vdpau_mpeg_decoder_parse_picture_coding (GstVdpauMpegDecoder * mpeg_dec, return TRUE; } +static gboolean +gst_vdpau_mpeg_decoder_parse_sequence (GstVdpauMpegDecoder * mpeg_dec, + guint8 * data, guint8 * end) +{ + GstVdpauDecoder *dec; + MPEGSeqHdr hdr; + + dec = GST_VDPAU_DECODER (mpeg_dec); + + if (!mpeg_util_parse_sequence_hdr (&hdr, data, end)) + return FALSE; + + memcpy (&mpeg_dec->vdp_info.intra_quantizer_matrix, + &hdr.intra_quantizer_matrix, 64); + memcpy (&mpeg_dec->vdp_info.non_intra_quantizer_matrix, + &hdr.non_intra_quantizer_matrix, 64); + + return TRUE; +} + static gboolean gst_vdpau_mpeg_decoder_parse_picture (GstVdpauMpegDecoder * mpeg_dec, guint8 * data, guint8 * end) @@ -320,6 +343,7 @@ gst_vdpau_mpeg_decoder_chain (GstPad * pad, GstBuffer * buffer) break; case MPEG_PACKET_SEQUENCE: GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_SEQUENCE"); + gst_vdpau_mpeg_decoder_parse_sequence (mpeg_dec, data, end); break; case MPEG_PACKET_EXTENSION: GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_EXTENSION"); diff --git a/sys/vdpau/gstvdpauvideoyuv.c b/sys/vdpau/gstvdpauvideoyuv.c index b9be10c1e8..ca1ec803e9 100644 --- a/sys/vdpau/gstvdpauvideoyuv.c +++ b/sys/vdpau/gstvdpauvideoyuv.c @@ -123,7 +123,7 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer) ("Couldn't get data from vdpau"), ("Error returned from vdpau was: %s", device->vdp_get_error_string (status))); - return GST_FLOW_ERROR; + break; } break; } @@ -159,7 +159,7 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer) ("Couldn't get data from vdpau"), ("Error returned from vdpau was: %s", device->vdp_get_error_string (status))); - return GST_FLOW_ERROR; + break; } break; } @@ -167,6 +167,8 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer) break; } + gst_buffer_unref (buffer); + if (outbuf) { gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_TIMESTAMPS);