mjpegdec: support AVRn interlaced
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 10 Aug 2012 13:47:07 +0000 (15:47 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Wed, 22 Aug 2012 15:44:43 +0000 (17:44 +0200)
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
libavcodec/mjpegdec.c

index 81aa36a..f79eabe 100644 (file)
@@ -1051,9 +1051,6 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
     prev_shift      = get_bits(&s->gb, 4); /* Ah */
     point_transform = get_bits(&s->gb, 4); /* Al */
 
-    for (i = 0; i < nb_components; i++)
-        s->last_dc[i] = 1024;
-
     if (nb_components > 1) {
         /* interleaved stream */
         s->mb_width  = (s->width  + s->h_max * block_size - 1) / (s->h_max * block_size);
@@ -1079,6 +1076,10 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
     for (i = s->mjpb_skiptosod; i > 0; i--)
         skip_bits(&s->gb, 8);
 
+next_field:
+    for (i = 0; i < nb_components; i++)
+        s->last_dc[i] = 1024;
+
     if (s->lossless) {
         if (CONFIG_JPEGLS_DECODER && s->ls) {
 //            for () {
@@ -1113,6 +1114,22 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
                 return ret;
         }
     }
+
+    if (s->interlaced &&
+        get_bits_left(&s->gb) > 32 &&
+        show_bits(&s->gb, 8) == 0xFF) {
+        GetBitContext bak = s->gb;
+        align_get_bits(&bak);
+        if (show_bits(&bak, 16) == 0xFFD1) {
+            av_dlog(s->avctx, "AVRn interlaced picture marker found\n");
+            s->gb = bak;
+            skip_bits(&s->gb, 16);
+            s->bottom_field ^= 1;
+
+            goto next_field;
+        }
+    }
+
     emms_c();
     return 0;
  out_of_range: