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:
Gwenole Beauchesne 2012-09-11 17:03:33 +02:00
parent 2b71db3059
commit 5549dbc3c0
3 changed files with 29 additions and 4 deletions

View file

@ -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

View file

@ -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);

View file

@ -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);