vaapidecode: don't reset decoder if codec type is the same.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 11 Sep 2012 15:03:33 +0000 (17:03 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 11 Sep 2012 15:08:47 +0000 (17:08 +0200)
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".

gst-libs/gst/vaapi/gstvaapidecoder.c
gst-libs/gst/vaapi/gstvaapidecoder.h
gst/vaapi/gstvaapidecode.c

index c63bb14..d2ee86c 100644 (file)
@@ -362,6 +362,22 @@ gst_vaapi_decoder_init(GstVaapiDecoder *decoder)
 }
 
 /**
+ * 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
  *
index deeb692..b5a397b 100644 (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);
 
index d79eaa1..1cc94c7 100644 (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);