mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-04 22:48:54 +00:00
vaapidecode: don't reset decoder if codec type is the same.
Reset, i.e. destroy then create, the decoder in _setcaps() handler only if the underlying codec type actually changed. This makes it possible to be more tolerant with certain MPEG-2 streams that get parsed to form caps that are compatible with the previous state but minor changes to "codec-data".
This commit is contained in:
parent
2b71db3059
commit
5549dbc3c0
3 changed files with 29 additions and 4 deletions
|
@ -361,6 +361,22 @@ gst_vaapi_decoder_init(GstVaapiDecoder *decoder)
|
|||
priv->is_interlaced = FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_get_codec:
|
||||
* @decoder: a #GstVaapiDecoder
|
||||
*
|
||||
* Retrieves the @decoder codec type.
|
||||
*
|
||||
* Return value: the #GstVaapiCodec type for @decoder
|
||||
*/
|
||||
GstVaapiCodec
|
||||
gst_vaapi_decoder_get_codec(GstVaapiDecoder *decoder)
|
||||
{
|
||||
g_return_val_if_fail(GST_VAAPI_IS_DECODER(decoder), (GstVaapiCodec)0);
|
||||
|
||||
return decoder->priv->codec;
|
||||
}
|
||||
|
||||
/**
|
||||
* gst_vaapi_decoder_get_caps:
|
||||
* @decoder: a #GstVaapiDecoder
|
||||
|
|
|
@ -116,6 +116,9 @@ struct _GstVaapiDecoderClass {
|
|||
GType
|
||||
gst_vaapi_decoder_get_type(void) G_GNUC_CONST;
|
||||
|
||||
GstVaapiCodec
|
||||
gst_vaapi_decoder_get_codec(GstVaapiDecoder *decoder);
|
||||
|
||||
GstCaps *
|
||||
gst_vaapi_decoder_get_caps(GstVaapiDecoder *decoder);
|
||||
|
||||
|
|
|
@ -393,10 +393,16 @@ gst_vaapidecode_destroy(GstVaapiDecode *decode)
|
|||
static gboolean
|
||||
gst_vaapidecode_reset(GstVaapiDecode *decode, GstCaps *caps)
|
||||
{
|
||||
if (decode->decoder &&
|
||||
decode->decoder_caps &&
|
||||
gst_caps_is_always_compatible(caps, decode->decoder_caps))
|
||||
return TRUE;
|
||||
GstVaapiCodec codec;
|
||||
|
||||
/* Only reset decoder if codec type changed */
|
||||
if (decode->decoder && decode->decoder_caps) {
|
||||
if (gst_caps_is_always_compatible(caps, decode->decoder_caps))
|
||||
return TRUE;
|
||||
codec = gst_vaapi_codec_from_caps(caps);
|
||||
if (codec == gst_vaapi_decoder_get_codec(decode->decoder))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gst_vaapidecode_destroy(decode);
|
||||
return gst_vaapidecode_create(decode, caps);
|
||||
|
|
Loading…
Reference in a new issue