vdpau: VideoYUV unref buffer in chain so that we don't leak them MpegDecoder parse sequence headers

This commit is contained in:
Carl-Anton Ingmarsson 2009-04-04 22:45:09 +02:00 committed by Jan Schmidt
parent 17a758ec71
commit 74485f6fa2
2 changed files with 30 additions and 4 deletions

View file

@ -141,6 +141,7 @@ gst_vdpau_mpeg_decoder_decode (GstVdpauMpegDecoder * mpeg_dec)
GstVdpauDevice *device; GstVdpauDevice *device;
VdpBitstreamBuffer vbit[1]; VdpBitstreamBuffer vbit[1];
VdpStatus status; VdpStatus status;
GstFlowReturn ret;
dec = GST_VDPAU_DECODER (mpeg_dec); dec = GST_VDPAU_DECODER (mpeg_dec);
@ -178,14 +179,16 @@ gst_vdpau_mpeg_decoder_decode (GstVdpauMpegDecoder * mpeg_dec)
gst_buffer_ref (GST_BUFFER (outbuf)); 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) if (mpeg_dec->vdp_info.forward_reference != VDP_INVALID_HANDLE)
gst_buffer_unref (mpeg_dec->f_buffer); gst_buffer_unref (mpeg_dec->f_buffer);
mpeg_dec->vdp_info.forward_reference = surface; mpeg_dec->vdp_info.forward_reference = surface;
mpeg_dec->f_buffer = GST_BUFFER (outbuf); mpeg_dec->f_buffer = GST_BUFFER (outbuf);
return gst_vdpau_decoder_push_video_buffer (GST_VDPAU_DECODER (mpeg_dec), return ret;
outbuf);
} }
static gboolean static gboolean
@ -215,6 +218,26 @@ gst_vdpau_mpeg_decoder_parse_picture_coding (GstVdpauMpegDecoder * mpeg_dec,
return TRUE; 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 static gboolean
gst_vdpau_mpeg_decoder_parse_picture (GstVdpauMpegDecoder * mpeg_dec, gst_vdpau_mpeg_decoder_parse_picture (GstVdpauMpegDecoder * mpeg_dec,
guint8 * data, guint8 * end) guint8 * data, guint8 * end)
@ -320,6 +343,7 @@ gst_vdpau_mpeg_decoder_chain (GstPad * pad, GstBuffer * buffer)
break; break;
case MPEG_PACKET_SEQUENCE: case MPEG_PACKET_SEQUENCE:
GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_SEQUENCE"); GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_SEQUENCE");
gst_vdpau_mpeg_decoder_parse_sequence (mpeg_dec, data, end);
break; break;
case MPEG_PACKET_EXTENSION: case MPEG_PACKET_EXTENSION:
GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_EXTENSION"); GST_DEBUG_OBJECT (mpeg_dec, "MPEG_PACKET_EXTENSION");

View file

@ -123,7 +123,7 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer)
("Couldn't get data from vdpau"), ("Couldn't get data from vdpau"),
("Error returned from vdpau was: %s", ("Error returned from vdpau was: %s",
device->vdp_get_error_string (status))); device->vdp_get_error_string (status)));
return GST_FLOW_ERROR; break;
} }
break; break;
} }
@ -159,7 +159,7 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer)
("Couldn't get data from vdpau"), ("Couldn't get data from vdpau"),
("Error returned from vdpau was: %s", ("Error returned from vdpau was: %s",
device->vdp_get_error_string (status))); device->vdp_get_error_string (status)));
return GST_FLOW_ERROR; break;
} }
break; break;
} }
@ -167,6 +167,8 @@ gst_vdpau_video_yuv_chain (GstPad * pad, GstBuffer * buffer)
break; break;
} }
gst_buffer_unref (buffer);
if (outbuf) { if (outbuf) {
gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_TIMESTAMPS); gst_buffer_copy_metadata (outbuf, buffer, GST_BUFFER_COPY_TIMESTAMPS);