mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
dvdec: Fix handling of negotiation failures
Return NOT_NEGOTIATED if sending the caps event fails, or FLUSHING if the pad was flushing at that point. https://bugzilla.gnome.org/show_bug.cgi?id=774623
This commit is contained in:
parent
591541d195
commit
f32603bcf8
1 changed files with 14 additions and 4 deletions
|
@ -303,6 +303,7 @@ static gboolean
|
||||||
gst_dvdec_src_negotiate (GstDVDec * dvdec)
|
gst_dvdec_src_negotiate (GstDVDec * dvdec)
|
||||||
{
|
{
|
||||||
GstCaps *othercaps;
|
GstCaps *othercaps;
|
||||||
|
gboolean ret;
|
||||||
|
|
||||||
/* no PAR was specified in input, derive from encoded data */
|
/* no PAR was specified in input, derive from encoded data */
|
||||||
if (dvdec->need_par) {
|
if (dvdec->need_par) {
|
||||||
|
@ -343,14 +344,14 @@ gst_dvdec_src_negotiate (GstDVDec * dvdec)
|
||||||
}
|
}
|
||||||
|
|
||||||
othercaps = gst_video_info_to_caps (&dvdec->vinfo);
|
othercaps = gst_video_info_to_caps (&dvdec->vinfo);
|
||||||
gst_pad_set_caps (dvdec->srcpad, othercaps);
|
ret = gst_pad_set_caps (dvdec->srcpad, othercaps);
|
||||||
|
|
||||||
gst_dvdec_negotiate_pool (dvdec, othercaps, &dvdec->vinfo);
|
gst_dvdec_negotiate_pool (dvdec, othercaps, &dvdec->vinfo);
|
||||||
gst_caps_unref (othercaps);
|
gst_caps_unref (othercaps);
|
||||||
|
|
||||||
dvdec->src_negotiated = TRUE;
|
dvdec->src_negotiated = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -478,7 +479,7 @@ gst_dvdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
|
||||||
|
|
||||||
caps = gst_pad_get_current_caps (dvdec->srcpad);
|
caps = gst_pad_get_current_caps (dvdec->srcpad);
|
||||||
if (!caps)
|
if (!caps)
|
||||||
goto not_negotiated;
|
goto flushing;
|
||||||
|
|
||||||
gst_dvdec_negotiate_pool (dvdec, caps, &dvdec->vinfo);
|
gst_dvdec_negotiate_pool (dvdec, caps, &dvdec->vinfo);
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
@ -556,7 +557,16 @@ parse_header_error:
|
||||||
not_negotiated:
|
not_negotiated:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (dvdec, "could not negotiate output");
|
GST_DEBUG_OBJECT (dvdec, "could not negotiate output");
|
||||||
ret = GST_FLOW_NOT_NEGOTIATED;
|
if (GST_PAD_IS_FLUSHING (dvdec->srcpad))
|
||||||
|
ret = GST_FLOW_FLUSHING;
|
||||||
|
else
|
||||||
|
ret = GST_FLOW_NOT_NEGOTIATED;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
flushing:
|
||||||
|
{
|
||||||
|
GST_DEBUG_OBJECT (dvdec, "have no current caps");
|
||||||
|
ret = GST_FLOW_FLUSHING;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
no_buffer:
|
no_buffer:
|
||||||
|
|
Loading…
Reference in a new issue