ducativc1dec: lie about simple profile videos being main profile
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 8 Nov 2012 17:19:22 +0000 (17:19 +0000)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 9 Nov 2012 11:51:35 +0000 (11:51 +0000)
This fixes playback of at least one video claiming it's simple profile,
but containing frames that use a feature that are unavailable in
simple profile (intensity compensation).

As Ducati supports both main and simple profile, I don't *think* this
should have any adverse effect, but if there happens to be some profile
related issue in the future, this patch may be one to revert to see if
things improve.

src/gstducativc1dec.c

index ab9d08059de9f95ee7dee5f932dce075f3a259e3..13b53ffb1543cfa64b659314d4ddedd2227bb567 100644 (file)
@@ -137,6 +137,19 @@ gst_ducati_vc1dec_push_input (GstDucatiVidDec * vdec, GstBuffer * buf)
     self->first_ts = GST_BUFFER_TIMESTAMP (buf);
 
   if (G_UNLIKELY (vdec->first_in_buffer) && vdec->codec_data) {
+    if (GST_BUFFER_SIZE (vdec->codec_data) > 0) {
+      unsigned char *header = GST_BUFFER_DATA (vdec->codec_data);
+
+      /* There is at least one VC1 stream that claims it is simple profile,
+         but goes on to have frames that use some feature that is unavailable
+         in simple profile(intensity compensation). Since ducati supports
+         both, we frob the header to claim all simple profile videos are
+         main profile. This is a lie, but it should not cause any trouble
+         (I'm sure all liars must say that). */
+      if (!(header[0] & 192))
+        header[0] |= 64;
+    }
+
     if (self->level == 4) {
       /* for VC-1 Advanced Profile, strip off first byte, and
        * send rest of codec_data unmodified;