mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-28 04:31:06 +00:00
vdpaumpegdec: add new gst_vdp_mpeg_decoder_flush for flushing the decoder
This commit is contained in:
parent
f80a727957
commit
e2d8cc99b0
1 changed files with 22 additions and 15 deletions
|
@ -522,7 +522,7 @@ gst_vdp_mpeg_decoder_parse_quant_matrix (GstVdpMpegDecoder * mpeg_dec,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_vdp_mpeg_decoder_reset (GstVdpMpegDecoder * mpeg_dec)
|
gst_vdp_mpeg_decoder_flush (GstVdpMpegDecoder * mpeg_dec)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
@ -532,8 +532,22 @@ gst_vdp_mpeg_decoder_reset (GstVdpMpegDecoder * mpeg_dec)
|
||||||
gst_vdp_mpeg_decoder_init_info (&mpeg_dec->vdp_info);
|
gst_vdp_mpeg_decoder_init_info (&mpeg_dec->vdp_info);
|
||||||
|
|
||||||
gst_adapter_clear (mpeg_dec->adapter);
|
gst_adapter_clear (mpeg_dec->adapter);
|
||||||
|
}
|
||||||
|
|
||||||
//mpeg_dec->byterate = -1;
|
static void
|
||||||
|
gst_vdp_mpeg_decoder_reset (GstVdpMpegDecoder * mpeg_dec)
|
||||||
|
{
|
||||||
|
gst_vdp_mpeg_decoder_flush (mpeg_dec);
|
||||||
|
|
||||||
|
if (mpeg_dec->decoder != VDP_INVALID_HANDLE)
|
||||||
|
mpeg_dec->device->vdp_decoder_destroy (mpeg_dec->decoder);
|
||||||
|
mpeg_dec->decoder = VDP_INVALID_HANDLE;
|
||||||
|
if (mpeg_dec->device)
|
||||||
|
g_object_unref (mpeg_dec->device);
|
||||||
|
mpeg_dec->device = NULL;
|
||||||
|
|
||||||
|
mpeg_dec->broken_gop = FALSE;
|
||||||
|
mpeg_dec->next_timestamp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
|
@ -548,7 +562,7 @@ gst_vdp_mpeg_decoder_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
|
|
||||||
if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) {
|
if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) {
|
||||||
GST_DEBUG_OBJECT (mpeg_dec, "Received discont buffer");
|
GST_DEBUG_OBJECT (mpeg_dec, "Received discont buffer");
|
||||||
gst_vdp_mpeg_decoder_reset (mpeg_dec);
|
gst_vdp_mpeg_decoder_flush (mpeg_dec);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_vdp_mpeg_packetizer_init (&packetizer, buffer);
|
gst_vdp_mpeg_packetizer_init (&packetizer, buffer);
|
||||||
|
@ -733,7 +747,7 @@ gst_vdp_mpeg_decoder_sink_event (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (mpeg_dec, "flush stop");
|
GST_DEBUG_OBJECT (mpeg_dec, "flush stop");
|
||||||
|
|
||||||
gst_vdp_mpeg_decoder_reset (mpeg_dec);
|
gst_vdp_mpeg_decoder_flush (mpeg_dec);
|
||||||
res = gst_pad_push_event (mpeg_dec->src, event);
|
res = gst_pad_push_event (mpeg_dec->src, event);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -767,12 +781,6 @@ gst_vdp_mpeg_decoder_change_state (GstElement * element,
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
gst_vdp_mpeg_decoder_reset (mpeg_dec);
|
gst_vdp_mpeg_decoder_reset (mpeg_dec);
|
||||||
|
|
||||||
mpeg_dec->device->vdp_decoder_destroy (mpeg_dec->decoder);
|
|
||||||
mpeg_dec->decoder = VDP_INVALID_HANDLE;
|
|
||||||
|
|
||||||
g_object_unref (mpeg_dec->device);
|
|
||||||
mpeg_dec->device = NULL;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -860,15 +868,14 @@ gst_vdp_mpeg_decoder_init (GstVdpMpegDecoder * mpeg_dec,
|
||||||
gst_element_add_pad (GST_ELEMENT (mpeg_dec), mpeg_dec->sink);
|
gst_element_add_pad (GST_ELEMENT (mpeg_dec), mpeg_dec->sink);
|
||||||
|
|
||||||
mpeg_dec->display_name = NULL;
|
mpeg_dec->display_name = NULL;
|
||||||
mpeg_dec->device = NULL;
|
mpeg_dec->adapter = gst_adapter_new ();
|
||||||
|
|
||||||
mpeg_dec->decoder = VDP_INVALID_HANDLE;
|
|
||||||
gst_vdp_mpeg_decoder_init_info (&mpeg_dec->vdp_info);
|
|
||||||
|
|
||||||
mpeg_dec->broken_gop = FALSE;
|
mpeg_dec->broken_gop = FALSE;
|
||||||
mpeg_dec->next_timestamp = 0;
|
mpeg_dec->next_timestamp = 0;
|
||||||
|
|
||||||
mpeg_dec->adapter = gst_adapter_new ();
|
mpeg_dec->device = NULL;
|
||||||
|
mpeg_dec->decoder = VDP_INVALID_HANDLE;
|
||||||
|
gst_vdp_mpeg_decoder_init_info (&mpeg_dec->vdp_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue