]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/mpeg12dec: add support for MPEG1 blocks in IPU codec
authorPaul B Mahol <onemda@gmail.com>
Fri, 25 Sep 2020 20:05:03 +0000 (22:05 +0200)
committerPaul B Mahol <onemda@gmail.com>
Fri, 25 Sep 2020 20:07:29 +0000 (22:07 +0200)
libavcodec/mpeg12dec.c

index 1dd12196b9f0383b064d8b4f62b22b7c6696f8de..a771add4dcbd2ec8b75122f13a8e8c74757dde25 100644 (file)
@@ -3010,22 +3010,20 @@ static int ipu_decode_frame(AVCodecContext *avctx, void *data,
         return ret;
 
     s->flags = get_bits(gb, 8);
-    if (!(s->flags & 0x80)) {
-        m->intra_dc_precision = s->flags & 3;
-        m->q_scale_type = !!(s->flags & 0x40);
-        m->intra_vlc_format = !!(s->flags & 0x20);
-        m->alternate_scan = !!(s->flags & 0x10);
-
-        if (s->flags & 0x10) {
-            ff_init_scantable(m->idsp.idct_permutation, &m->inter_scantable, ff_alternate_vertical_scan);
-            ff_init_scantable(m->idsp.idct_permutation, &m->intra_scantable, ff_alternate_vertical_scan);
-        } else {
-            ff_init_scantable(m->idsp.idct_permutation, &m->inter_scantable, ff_zigzag_direct);
-            ff_init_scantable(m->idsp.idct_permutation, &m->intra_scantable, ff_zigzag_direct);
-        }
-
-        m->last_dc[0] = m->last_dc[1] = m->last_dc[2] = 1 << (7 + (s->flags & 3));
+    m->intra_dc_precision = s->flags & 3;
+    m->q_scale_type = !!(s->flags & 0x40);
+    m->intra_vlc_format = !!(s->flags & 0x20);
+    m->alternate_scan = !!(s->flags & 0x10);
+
+    if (s->flags & 0x10) {
+        ff_init_scantable(m->idsp.idct_permutation, &m->inter_scantable, ff_alternate_vertical_scan);
+        ff_init_scantable(m->idsp.idct_permutation, &m->intra_scantable, ff_alternate_vertical_scan);
+    } else {
+        ff_init_scantable(m->idsp.idct_permutation, &m->inter_scantable, ff_zigzag_direct);
+        ff_init_scantable(m->idsp.idct_permutation, &m->intra_scantable, ff_zigzag_direct);
     }
+
+    m->last_dc[0] = m->last_dc[1] = m->last_dc[2] = 1 << (7 + (s->flags & 3));
     m->qscale = 1;
 
     for (int y = 0; y < avctx->height; y += 16) {
@@ -3053,10 +3051,24 @@ static int ipu_decode_frame(AVCodecContext *avctx, void *data,
             memset(s->block, 0, sizeof(s->block));
 
             for (int n = 0; n < 6; n++) {
-                if (s->flags & 0x20)
-                    ret = mpeg2_decode_block_intra(m, s->block[n], n);
-                else
-                    ret = mpeg2_decode_block_non_intra(m, s->block[n], n);
+                if (s->flags & 0x80) {
+                    if (s->flags & 0x20)
+                        ret = mpeg1_decode_block_inter(m, s->block[n], n);
+                    else
+                        ret = ff_mpeg1_decode_block_intra(&m->gb,
+                                                          m->intra_matrix,
+                                                          m->intra_scantable.permutated,
+                                                          m->last_dc, s->block[n],
+                                                          n, m->qscale);
+                    if (ret >= 0)
+                        m->block_last_index[n] = ret;
+                } else {
+                    if (s->flags & 0x20)
+                        ret = mpeg2_decode_block_intra(m, s->block[n], n);
+                    else
+                        ret = mpeg2_decode_block_non_intra(m, s->block[n], n);
+                }
+
                 if (ret < 0)
                     return ret;
             }