mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
vdpau: VideoYUV unref buffer in chain so that we don't leak them MpegDecoder parse sequence headers
This commit is contained in:
parent
17a758ec71
commit
74485f6fa2
2 changed files with 30 additions and 4 deletions
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue