libavcodec/mpeg12dec.c
1b6d6674
 /*
  * MPEG-1/2 decoder
  * Copyright (c) 2000, 2001 Fabrice Bellard
016c00cf
  * Copyright (c) 2002-2013 Michael Niedermayer <michaelni@gmx.at>
1b6d6674
  *
016c00cf
  * This file is part of FFmpeg.
1b6d6674
  *
016c00cf
  * FFmpeg is free software; you can redistribute it and/or
1b6d6674
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
016c00cf
  * FFmpeg is distributed in the hope that it will be useful,
1b6d6674
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
016c00cf
  * License along with FFmpeg; if not, write to the Free Software
1b6d6674
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /**
  * @file
  * MPEG-1/2 decoder
  */
 
5f54756f
 #define UNCHECKED_BITSTREAM_READER 1
bd8ac882
 #include "libavutil/attributes.h"
1b6d6674
 #include "libavutil/internal.h"
bacc2869
 #include "libavutil/stereo3d.h"
a91d3658
 
1b6d6674
 #include "avcodec.h"
a91d3658
 #include "bytestream.h"
1b6d6674
 #include "dsputil.h"
 #include "error_resilience.h"
a91d3658
 #include "internal.h"
1b6d6674
 #include "mpeg12.h"
 #include "mpeg12data.h"
a91d3658
 #include "mpegvideo.h"
1b6d6674
 #include "thread.h"
19e30a58
 #include "version.h"
acd75053
 #include "vdpau_internal.h"
a91d3658
 #include "xvmc_internal.h"
1b6d6674
 
e557584a
 typedef struct Mpeg1Context {
     MpegEncContext mpeg_enc_ctx;
     int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
a91d3658
     int repeat_field;           /* true if we must repeat the field */
     AVPanScan pan_scan;         /* some temporary storage for the panscan */
73eca738
     AVStereo3D stereo3d;
     int has_stereo3d;
1eaac1d6
     uint8_t *a53_caption;
     int a53_caption_size;
e557584a
     int slice_count;
     int save_aspect_info;
     int save_width, save_height, save_progressive_seq;
a91d3658
     AVRational frame_rate_ext;  /* MPEG-2 specific framerate modificator */
     int sync;                   /* Did we reach a sync point like a GOP/SEQ/KEYFrame? */
2bfcd74a
     int tmpgexs;
a097f004
     int first_slice;
e557584a
     int extradata_decoded;
 } Mpeg1Context;
 
38f64c03
 #define MB_TYPE_ZERO_MV   0x20000000
 
 static const uint32_t ptype2mb_type[7] = {
                     MB_TYPE_INTRA,
                     MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_ZERO_MV | MB_TYPE_16x16,
                     MB_TYPE_L0,
                     MB_TYPE_L0 | MB_TYPE_CBP,
     MB_TYPE_QUANT | MB_TYPE_INTRA,
     MB_TYPE_QUANT | MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_ZERO_MV | MB_TYPE_16x16,
     MB_TYPE_QUANT | MB_TYPE_L0 | MB_TYPE_CBP,
 };
 
 static const uint32_t btype2mb_type[11] = {
                     MB_TYPE_INTRA,
                     MB_TYPE_L1,
                     MB_TYPE_L1   | MB_TYPE_CBP,
                     MB_TYPE_L0,
                     MB_TYPE_L0   | MB_TYPE_CBP,
                     MB_TYPE_L0L1,
                     MB_TYPE_L0L1 | MB_TYPE_CBP,
     MB_TYPE_QUANT | MB_TYPE_INTRA,
     MB_TYPE_QUANT | MB_TYPE_L1   | MB_TYPE_CBP,
     MB_TYPE_QUANT | MB_TYPE_L0   | MB_TYPE_CBP,
     MB_TYPE_QUANT | MB_TYPE_L0L1 | MB_TYPE_CBP,
 };
 
 static const uint8_t non_linear_qscale[32] = {
a91d3658
      0,  1,  2,  3,  4,  5,   6,   7,
      8, 10, 12, 14, 16, 18,  20,  22,
     24, 28, 32, 36, 40, 44,  48,  52,
     56, 64, 72, 80, 88, 96, 104, 112,
38f64c03
 };
 
1b6d6674
 /* as H.263, but only 17 codes */
 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
 {
     int code, sign, val, shift;
 
     code = get_vlc2(&s->gb, ff_mv_vlc.table, MV_VLC_BITS, 2);
a91d3658
     if (code == 0)
1b6d6674
         return pred;
a91d3658
     if (code < 0)
1b6d6674
         return 0xffff;
 
     sign  = get_bits1(&s->gb);
     shift = fcode - 1;
     val   = code;
     if (shift) {
         val  = (val - 1) << shift;
         val |= get_bits(&s->gb, shift);
         val++;
     }
     if (sign)
         val = -val;
     val += pred;
 
     /* modulo decoding */
     return sign_extend(val, 5 + shift);
 }
 
a91d3658
 #define check_scantable_index(ctx, x)                                         \
     do {                                                                      \
         if ((x) > 63) {                                                       \
             av_log(ctx->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n",     \
                    ctx->mb_x, ctx->mb_y);                                     \
             return AVERROR_INVALIDDATA;                                       \
         }                                                                     \
     } while (0)
 
 static inline int mpeg1_decode_block_intra(MpegEncContext *s,
                                            int16_t *block, int n)
1b6d6674
 {
     int level, dc, diff, i, j, run;
     int component;
a91d3658
     RLTable *rl                  = &ff_rl_mpeg1;
     uint8_t *const scantable     = s->intra_scantable.permutated;
1b6d6674
     const uint16_t *quant_matrix = s->intra_matrix;
     const int qscale             = s->qscale;
 
     /* DC coefficient */
     component = (n <= 3 ? 0 : n - 4 + 1);
     diff = decode_dc(&s->gb, component);
     if (diff >= 0xffff)
         return -1;
     dc  = s->last_dc[component];
     dc += diff;
     s->last_dc[component] = dc;
     block[0] = dc * quant_matrix[0];
     av_dlog(s->avctx, "dc=%d diff=%d\n", dc, diff);
     i = 0;
     {
         OPEN_READER(re, &s->gb);
0c8e5fb2
         UPDATE_CACHE(re, &s->gb);
         if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
             goto end;
 
1b6d6674
         /* now quantify & encode AC coefficients */
         for (;;) {
a91d3658
             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
                        TEX_VLC_BITS, 2, 0);
1b6d6674
 
0c8e5fb2
             if (level != 0) {
1b6d6674
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 level = (level * qscale * quant_matrix[j]) >> 4;
                 level = (level - 1) | 1;
a91d3658
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                         SHOW_SBITS(re, &s->gb, 1);
0c8e5fb2
                 SKIP_BITS(re, &s->gb, 1);
1b6d6674
             } else {
                 /* escape */
a91d3658
                 run = SHOW_UBITS(re, &s->gb, 6) + 1;
                 LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
                 UPDATE_CACHE(re, &s->gb);
a91d3658
                 level = SHOW_SBITS(re, &s->gb, 8);
                 SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 if (level == -128) {
a91d3658
                     level = SHOW_UBITS(re, &s->gb, 8) - 256;
acd75053
                     SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 } else if (level == 0) {
a91d3658
                     level = SHOW_UBITS(re, &s->gb, 8);
acd75053
                     SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 }
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 if (level < 0) {
                     level = -level;
                     level = (level * qscale * quant_matrix[j]) >> 4;
                     level = (level - 1) | 1;
                     level = -level;
                 } else {
                     level = (level * qscale * quant_matrix[j]) >> 4;
                     level = (level - 1) | 1;
                 }
             }
 
             block[j] = level;
0c8e5fb2
             if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
                break;
 
             UPDATE_CACHE(re, &s->gb);
1b6d6674
         }
0c8e5fb2
 end:
         LAST_SKIP_BITS(re, &s->gb, 2);
1b6d6674
         CLOSE_READER(re, &s->gb);
     }
     s->block_last_index[n] = i;
934bb11a
     return 0;
1b6d6674
 }
 
 int ff_mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
 {
     return mpeg1_decode_block_intra(s, block, n);
 }
 
a91d3658
 static inline int mpeg1_decode_block_inter(MpegEncContext *s,
                                            int16_t *block, int n)
1b6d6674
 {
     int level, i, j, run;
a91d3658
     RLTable *rl                  = &ff_rl_mpeg1;
     uint8_t *const scantable     = s->intra_scantable.permutated;
1b6d6674
     const uint16_t *quant_matrix = s->inter_matrix;
     const int qscale             = s->qscale;
 
     {
         OPEN_READER(re, &s->gb);
         i = -1;
         // special case for first coefficient, no need to add second VLC table
         UPDATE_CACHE(re, &s->gb);
a91d3658
         if (((int32_t) GET_CACHE(re, &s->gb)) < 0) {
1b6d6674
             level = (3 * qscale * quant_matrix[0]) >> 5;
             level = (level - 1) | 1;
             if (GET_CACHE(re, &s->gb) & 0x40000000)
                 level = -level;
             block[0] = level;
             i++;
             SKIP_BITS(re, &s->gb, 2);
a91d3658
             if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
                 goto end;
         }
         /* now quantify & encode AC coefficients */
         for (;;) {
a91d3658
             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
                        TEX_VLC_BITS, 2, 0);
1b6d6674
 
             if (level != 0) {
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
                 level = (level - 1) | 1;
a91d3658
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                         SHOW_SBITS(re, &s->gb, 1);
1b6d6674
                 SKIP_BITS(re, &s->gb, 1);
             } else {
                 /* escape */
a91d3658
                 run = SHOW_UBITS(re, &s->gb, 6) + 1;
                 LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
                 UPDATE_CACHE(re, &s->gb);
a91d3658
                 level = SHOW_SBITS(re, &s->gb, 8);
                 SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 if (level == -128) {
a91d3658
                     level = SHOW_UBITS(re, &s->gb, 8) - 256;
                     SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 } else if (level == 0) {
a91d3658
                     level = SHOW_UBITS(re, &s->gb, 8);
                     SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 }
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 if (level < 0) {
                     level = -level;
                     level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
                     level = (level - 1) | 1;
                     level = -level;
                 } else {
                     level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
                     level = (level - 1) | 1;
                 }
             }
 
             block[j] = level;
a91d3658
             if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
                 break;
             UPDATE_CACHE(re, &s->gb);
         }
 end:
         LAST_SKIP_BITS(re, &s->gb, 2);
         CLOSE_READER(re, &s->gb);
     }
     s->block_last_index[n] = i;
     return 0;
 }
 
016c00cf
 /**
  * Note: this function can read out of range and crash for corrupt streams.
  * Changing this would eat up any speed benefits it has.
  * Do not use "fast" flag if you need the code to be robust.
  */
a91d3658
 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s,
                                                 int16_t *block, int n)
1b6d6674
 {
     int level, i, j, run;
a91d3658
     RLTable *rl              = &ff_rl_mpeg1;
     uint8_t *const scantable = s->intra_scantable.permutated;
     const int qscale         = s->qscale;
1b6d6674
 
     {
         OPEN_READER(re, &s->gb);
         i = -1;
a91d3658
         // Special case for first coefficient, no need to add second VLC table.
1b6d6674
         UPDATE_CACHE(re, &s->gb);
a91d3658
         if (((int32_t) GET_CACHE(re, &s->gb)) < 0) {
1b6d6674
             level = (3 * qscale) >> 1;
             level = (level - 1) | 1;
             if (GET_CACHE(re, &s->gb) & 0x40000000)
                 level = -level;
             block[0] = level;
             i++;
             SKIP_BITS(re, &s->gb, 2);
a91d3658
             if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
                 goto end;
         }
 
         /* now quantify & encode AC coefficients */
         for (;;) {
a91d3658
             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
                        TEX_VLC_BITS, 2, 0);
1b6d6674
 
             if (level != 0) {
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 level = ((level * 2 + 1) * qscale) >> 1;
                 level = (level - 1) | 1;
a91d3658
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                         SHOW_SBITS(re, &s->gb, 1);
1b6d6674
                 SKIP_BITS(re, &s->gb, 1);
             } else {
                 /* escape */
a91d3658
                 run = SHOW_UBITS(re, &s->gb, 6) + 1;
                 LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
                 UPDATE_CACHE(re, &s->gb);
a91d3658
                 level = SHOW_SBITS(re, &s->gb, 8);
                 SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 if (level == -128) {
a91d3658
                     level = SHOW_UBITS(re, &s->gb, 8) - 256;
                     SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 } else if (level == 0) {
a91d3658
                     level = SHOW_UBITS(re, &s->gb, 8);
                     SKIP_BITS(re, &s->gb, 8);
1b6d6674
                 }
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 if (level < 0) {
                     level = -level;
                     level = ((level * 2 + 1) * qscale) >> 1;
                     level = (level - 1) | 1;
                     level = -level;
                 } else {
                     level = ((level * 2 + 1) * qscale) >> 1;
                     level = (level - 1) | 1;
                 }
             }
 
             block[j] = level;
a91d3658
             if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
                 break;
             UPDATE_CACHE(re, &s->gb);
         }
 end:
         LAST_SKIP_BITS(re, &s->gb, 2);
         CLOSE_READER(re, &s->gb);
     }
     s->block_last_index[n] = i;
     return 0;
 }
 
a91d3658
 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s,
                                                int16_t *block, int n)
1b6d6674
 {
     int level, i, j, run;
     RLTable *rl = &ff_rl_mpeg1;
a91d3658
     uint8_t *const scantable = s->intra_scantable.permutated;
1b6d6674
     const uint16_t *quant_matrix;
     const int qscale = s->qscale;
     int mismatch;
 
     mismatch = 1;
 
     {
         OPEN_READER(re, &s->gb);
         i = -1;
         if (n < 4)
             quant_matrix = s->inter_matrix;
         else
             quant_matrix = s->chroma_inter_matrix;
 
a91d3658
         // Special case for first coefficient, no need to add second VLC table.
1b6d6674
         UPDATE_CACHE(re, &s->gb);
a91d3658
         if (((int32_t) GET_CACHE(re, &s->gb)) < 0) {
             level = (3 * qscale * quant_matrix[0]) >> 5;
1b6d6674
             if (GET_CACHE(re, &s->gb) & 0x40000000)
                 level = -level;
             block[0]  = level;
             mismatch ^= level;
             i++;
             SKIP_BITS(re, &s->gb, 2);
a91d3658
             if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
                 goto end;
         }
 
         /* now quantify & encode AC coefficients */
         for (;;) {
a91d3658
             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
                        TEX_VLC_BITS, 2, 0);
1b6d6674
 
             if (level != 0) {
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
a91d3658
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                         SHOW_SBITS(re, &s->gb, 1);
1b6d6674
                 SKIP_BITS(re, &s->gb, 1);
             } else {
                 /* escape */
a91d3658
                 run = SHOW_UBITS(re, &s->gb, 6) + 1;
                 LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
                 UPDATE_CACHE(re, &s->gb);
a91d3658
                 level = SHOW_SBITS(re, &s->gb, 12);
                 SKIP_BITS(re, &s->gb, 12);
1b6d6674
 
                 i += run;
6d93307f
                 check_scantable_index(s, i);
1b6d6674
                 j = scantable[i];
                 if (level < 0) {
                     level = ((-level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
                     level = -level;
                 } else {
                     level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
                 }
             }
 
             mismatch ^= level;
             block[j]  = level;
a91d3658
             if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
                 break;
             UPDATE_CACHE(re, &s->gb);
         }
 end:
         LAST_SKIP_BITS(re, &s->gb, 2);
         CLOSE_READER(re, &s->gb);
     }
     block[63] ^= (mismatch & 1);
 
     s->block_last_index[n] = i;
     return 0;
 }
 
016c00cf
 /**
  * Note: this function can read out of range and crash for corrupt streams.
  * Changing this would eat up any speed benefits it has.
  * Do not use "fast" flag if you need the code to be robust.
  */
1b6d6674
 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s,
                                                     int16_t *block, int n)
 {
     int level, i, j, run;
a91d3658
     RLTable *rl              = &ff_rl_mpeg1;
     uint8_t *const scantable = s->intra_scantable.permutated;
     const int qscale         = s->qscale;
1b6d6674
     OPEN_READER(re, &s->gb);
     i = -1;
 
     // special case for first coefficient, no need to add second VLC table
     UPDATE_CACHE(re, &s->gb);
a91d3658
     if (((int32_t) GET_CACHE(re, &s->gb)) < 0) {
1b6d6674
         level = (3 * qscale) >> 1;
         if (GET_CACHE(re, &s->gb) & 0x40000000)
             level = -level;
         block[0] = level;
         i++;
         SKIP_BITS(re, &s->gb, 2);
a91d3658
         if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF)
1b6d6674
             goto end;
     }
 
     /* now quantify & encode AC coefficients */
     for (;;) {
         GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
 
         if (level != 0) {
             i += run;
a91d3658
             j = scantable[i];
1b6d6674
             level = ((level * 2 + 1) * qscale) >> 1;
a91d3658
             level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                     SHOW_SBITS(re, &s->gb, 1);
1b6d6674
             SKIP_BITS(re, &s->gb, 1);
         } else {
             /* escape */
a91d3658
             run = SHOW_UBITS(re, &s->gb, 6) + 1;
             LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
             UPDATE_CACHE(re, &s->gb);
a91d3658
             level = SHOW_SBITS(re, &s->gb, 12);
             SKIP_BITS(re, &s->gb, 12);
1b6d6674
 
             i += run;
a91d3658
             j = scantable[i];
1b6d6674
             if (level < 0) {
                 level = ((-level * 2 + 1) * qscale) >> 1;
                 level = -level;
             } else {
                 level = ((level * 2 + 1) * qscale) >> 1;
             }
         }
 
         block[j] = level;
acd75053
         if (((int32_t) GET_CACHE(re, &s->gb)) <= (int32_t) 0xBFFFFFFF || i > 63)
1b6d6674
             break;
d82eccea
 
1b6d6674
         UPDATE_CACHE(re, &s->gb);
     }
 end:
     LAST_SKIP_BITS(re, &s->gb, 2);
     CLOSE_READER(re, &s->gb);
     s->block_last_index[n] = i;
     return 0;
 }
 
a91d3658
 static inline int mpeg2_decode_block_intra(MpegEncContext *s,
                                            int16_t *block, int n)
1b6d6674
 {
     int level, dc, diff, i, j, run;
     int component;
     RLTable *rl;
a91d3658
     uint8_t *const scantable = s->intra_scantable.permutated;
1b6d6674
     const uint16_t *quant_matrix;
     const int qscale = s->qscale;
     int mismatch;
 
     /* DC coefficient */
     if (n < 4) {
         quant_matrix = s->intra_matrix;
a91d3658
         component    = 0;
1b6d6674
     } else {
         quant_matrix = s->chroma_intra_matrix;
a91d3658
         component    = (n & 1) + 1;
1b6d6674
     }
     diff = decode_dc(&s->gb, component);
     if (diff >= 0xffff)
         return -1;
     dc  = s->last_dc[component];
     dc += diff;
     s->last_dc[component] = dc;
     block[0] = dc << (3 - s->intra_dc_precision);
     av_dlog(s->avctx, "dc=%d\n", block[0]);
     mismatch = block[0] ^ 1;
     i = 0;
     if (s->intra_vlc_format)
         rl = &ff_rl_mpeg2;
     else
         rl = &ff_rl_mpeg1;
 
     {
         OPEN_READER(re, &s->gb);
         /* now quantify & encode AC coefficients */
         for (;;) {
             UPDATE_CACHE(re, &s->gb);
a91d3658
             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
                        TEX_VLC_BITS, 2, 0);
1b6d6674
 
             if (level == 127) {
                 break;
             } else if (level != 0) {
                 i += run;
6d93307f
                 check_scantable_index(s, i);
a91d3658
                 j = scantable[i];
1b6d6674
                 level = (level * qscale * quant_matrix[j]) >> 4;
a91d3658
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                         SHOW_SBITS(re, &s->gb, 1);
1b6d6674
                 LAST_SKIP_BITS(re, &s->gb, 1);
             } else {
                 /* escape */
a91d3658
                 run = SHOW_UBITS(re, &s->gb, 6) + 1;
                 LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
                 UPDATE_CACHE(re, &s->gb);
a91d3658
                 level = SHOW_SBITS(re, &s->gb, 12);
                 SKIP_BITS(re, &s->gb, 12);
1b6d6674
                 i += run;
6d93307f
                 check_scantable_index(s, i);
a91d3658
                 j = scantable[i];
1b6d6674
                 if (level < 0) {
                     level = (-level * qscale * quant_matrix[j]) >> 4;
                     level = -level;
                 } else {
                     level = (level * qscale * quant_matrix[j]) >> 4;
                 }
             }
 
             mismatch ^= level;
             block[j]  = level;
         }
         CLOSE_READER(re, &s->gb);
     }
     block[63] ^= mismatch & 1;
 
     s->block_last_index[n] = i;
     return 0;
 }
 
016c00cf
 /**
  * Note: this function can read out of range and crash for corrupt streams.
  * Changing this would eat up any speed benefits it has.
  * Do not use "fast" flag if you need the code to be robust.
  */
a91d3658
 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s,
                                                 int16_t *block, int n)
1b6d6674
 {
6d93307f
     int level, dc, diff, i, j, run;
1b6d6674
     int component;
     RLTable *rl;
a91d3658
     uint8_t *const scantable = s->intra_scantable.permutated;
1b6d6674
     const uint16_t *quant_matrix;
     const int qscale = s->qscale;
 
     /* DC coefficient */
     if (n < 4) {
         quant_matrix = s->intra_matrix;
a91d3658
         component    = 0;
1b6d6674
     } else {
         quant_matrix = s->chroma_intra_matrix;
a91d3658
         component    = (n & 1) + 1;
1b6d6674
     }
     diff = decode_dc(&s->gb, component);
     if (diff >= 0xffff)
         return -1;
     dc = s->last_dc[component];
     dc += diff;
     s->last_dc[component] = dc;
     block[0] = dc << (3 - s->intra_dc_precision);
6d93307f
     i = 0;
1b6d6674
     if (s->intra_vlc_format)
         rl = &ff_rl_mpeg2;
     else
         rl = &ff_rl_mpeg1;
 
     {
         OPEN_READER(re, &s->gb);
         /* now quantify & encode AC coefficients */
         for (;;) {
             UPDATE_CACHE(re, &s->gb);
a91d3658
             GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0],
                        TEX_VLC_BITS, 2, 0);
1b6d6674
 
6a92598e
             if (level >= 64 || i > 63) {
1b6d6674
                 break;
             } else if (level != 0) {
6d93307f
                 i += run;
a91d3658
                 j = scantable[i];
1b6d6674
                 level = (level * qscale * quant_matrix[j]) >> 4;
a91d3658
                 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) -
                         SHOW_SBITS(re, &s->gb, 1);
1b6d6674
                 LAST_SKIP_BITS(re, &s->gb, 1);
             } else {
                 /* escape */
a91d3658
                 run = SHOW_UBITS(re, &s->gb, 6) + 1;
                 LAST_SKIP_BITS(re, &s->gb, 6);
1b6d6674
                 UPDATE_CACHE(re, &s->gb);
a91d3658
                 level = SHOW_SBITS(re, &s->gb, 12);
                 SKIP_BITS(re, &s->gb, 12);
6d93307f
                 i += run;
a91d3658
                 j = scantable[i];
1b6d6674
                 if (level < 0) {
                     level = (-level * qscale * quant_matrix[j]) >> 4;
                     level = -level;
                 } else {
                     level = (level * qscale * quant_matrix[j]) >> 4;
                 }
             }
 
             block[j] = level;
         }
         CLOSE_READER(re, &s->gb);
     }
 
6d93307f
     s->block_last_index[n] = i;
1b6d6674
     return 0;
 }
 
 /******************************************/
 /* decoding */
 
 static inline int get_dmv(MpegEncContext *s)
 {
     if (get_bits1(&s->gb))
         return 1 - (get_bits1(&s->gb) << 1);
     else
         return 0;
 }
 
 static inline int get_qscale(MpegEncContext *s)
 {
     int qscale = get_bits(&s->gb, 5);
a91d3658
     if (s->q_scale_type)
1b6d6674
         return non_linear_qscale[qscale];
a91d3658
     else
1b6d6674
         return qscale << 1;
 }
 
 
 /* motion type (for MPEG-2) */
 #define MT_FIELD 1
 #define MT_FRAME 2
 #define MT_16X8  2
 #define MT_DMV   3
 
 static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
 {
     int i, j, k, cbp, val, mb_type, motion_type;
     const int mb_block_count = 4 + (1 << s->chroma_format);
 
     av_dlog(s->avctx, "decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y);
 
016c00cf
     av_assert2(s->mb_skipped == 0);
1b6d6674
 
     if (s->mb_skip_run-- != 0) {
         if (s->pict_type == AV_PICTURE_TYPE_P) {
             s->mb_skipped = 1;
a91d3658
             s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride] =
                 MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
1b6d6674
         } else {
             int mb_type;
 
             if (s->mb_x)
                 mb_type = s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride - 1];
             else
a91d3658
                 // FIXME not sure if this is allowed in MPEG at all
                 mb_type = s->current_picture.mb_type[s->mb_width + (s->mb_y - 1) * s->mb_stride - 1];
016c00cf
             if (IS_INTRA(mb_type)) {
                 av_log(s->avctx, AV_LOG_ERROR, "skip with previntra\n");
1b6d6674
                 return -1;
016c00cf
             }
a91d3658
             s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1b6d6674
                 mb_type | MB_TYPE_SKIP;
016c00cf
 
1b6d6674
             if ((s->mv[0][0][0] | s->mv[0][0][1] | s->mv[1][0][0] | s->mv[1][0][1]) == 0)
                 s->mb_skipped = 1;
         }
 
         return 0;
     }
 
     switch (s->pict_type) {
     default:
     case AV_PICTURE_TYPE_I:
         if (get_bits1(&s->gb) == 0) {
             if (get_bits1(&s->gb) == 0) {
a91d3658
                 av_log(s->avctx, AV_LOG_ERROR,
                        "invalid mb type in I Frame at %d %d\n",
                        s->mb_x, s->mb_y);
1b6d6674
                 return -1;
             }
             mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA;
         } else {
             mb_type = MB_TYPE_INTRA;
         }
         break;
     case AV_PICTURE_TYPE_P:
         mb_type = get_vlc2(&s->gb, ff_mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1);
         if (mb_type < 0) {
a91d3658
             av_log(s->avctx, AV_LOG_ERROR,
                    "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y);
1b6d6674
             return -1;
         }
         mb_type = ptype2mb_type[mb_type];
         break;
     case AV_PICTURE_TYPE_B:
         mb_type = get_vlc2(&s->gb, ff_mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1);
         if (mb_type < 0) {
a91d3658
             av_log(s->avctx, AV_LOG_ERROR,
                    "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y);
1b6d6674
             return -1;
         }
         mb_type = btype2mb_type[mb_type];
         break;
     }
     av_dlog(s->avctx, "mb_type=%x\n", mb_type);
 //    motion_type = 0; /* avoid warning */
     if (IS_INTRA(mb_type)) {
         s->dsp.clear_blocks(s->block[0]);
 
a91d3658
         if (!s->chroma_y_shift)
1b6d6674
             s->dsp.clear_blocks(s->block[6]);
 
         /* compute DCT type */
a91d3658
         // FIXME: add an interlaced_dct coded var?
         if (s->picture_structure == PICT_FRAME &&
             !s->frame_pred_frame_dct)
1b6d6674
             s->interlaced_dct = get_bits1(&s->gb);
 
         if (IS_QUANT(mb_type))
             s->qscale = get_qscale(s);
 
         if (s->concealment_motion_vectors) {
             /* just parse them */
             if (s->picture_structure != PICT_FRAME)
a91d3658
                 skip_bits1(&s->gb);  /* field select */
1b6d6674
 
a91d3658
             s->mv[0][0][0]      =
             s->last_mv[0][0][0] =
             s->last_mv[0][1][0] = mpeg_decode_motion(s, s->mpeg_f_code[0][0],
                                                      s->last_mv[0][0][0]);
             s->mv[0][0][1]      =
             s->last_mv[0][0][1] =
             s->last_mv[0][1][1] = mpeg_decode_motion(s, s->mpeg_f_code[0][1],
                                                      s->last_mv[0][0][1]);
1b6d6674
 
             skip_bits1(&s->gb); /* marker */
a91d3658
         } else {
             /* reset mv prediction */
             memset(s->last_mv, 0, sizeof(s->last_mv));
         }
1b6d6674
         s->mb_intra = 1;
         // if 1, we memcpy blocks in xvmcvideo
acd75053
         if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
1b6d6674
             ff_xvmc_pack_pblocks(s, -1); // inter are always full blocks
 
         if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
             if (s->flags2 & CODEC_FLAG2_FAST) {
a91d3658
                 for (i = 0; i < 6; i++)
1b6d6674
                     mpeg2_fast_decode_block_intra(s, *s->pblocks[i], i);
             } else {
a91d3658
                 for (i = 0; i < mb_block_count; i++)
1b6d6674
                     if (mpeg2_decode_block_intra(s, *s->pblocks[i], i) < 0)
                         return -1;
             }
         } else {
a91d3658
             for (i = 0; i < 6; i++)
1b6d6674
                 if (mpeg1_decode_block_intra(s, *s->pblocks[i], i) < 0)
                     return -1;
         }
     } else {
         if (mb_type & MB_TYPE_ZERO_MV) {
016c00cf
             av_assert2(mb_type & MB_TYPE_CBP);
1b6d6674
 
             s->mv_dir = MV_DIR_FORWARD;
             if (s->picture_structure == PICT_FRAME) {
016c00cf
                 if (s->picture_structure == PICT_FRAME
                     && !s->frame_pred_frame_dct)
1b6d6674
                     s->interlaced_dct = get_bits1(&s->gb);
                 s->mv_type = MV_TYPE_16X16;
             } else {
a91d3658
                 s->mv_type            = MV_TYPE_FIELD;
                 mb_type              |= MB_TYPE_INTERLACED;
1b6d6674
                 s->field_select[0][0] = s->picture_structure - 1;
             }
 
             if (IS_QUANT(mb_type))
                 s->qscale = get_qscale(s);
 
             s->last_mv[0][0][0] = 0;
             s->last_mv[0][0][1] = 0;
             s->last_mv[0][1][0] = 0;
             s->last_mv[0][1][1] = 0;
a91d3658
             s->mv[0][0][0]      = 0;
             s->mv[0][0][1]      = 0;
1b6d6674
         } else {
016c00cf
             av_assert2(mb_type & MB_TYPE_L0L1);
1b6d6674
             // FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
             /* get additional motion vector type */
acd75053
             if (s->picture_structure == PICT_FRAME && s->frame_pred_frame_dct) {
1b6d6674
                 motion_type = MT_FRAME;
a91d3658
             } else {
1b6d6674
                 motion_type = get_bits(&s->gb, 2);
                 if (s->picture_structure == PICT_FRAME && HAS_CBP(mb_type))
                     s->interlaced_dct = get_bits1(&s->gb);
             }
 
             if (IS_QUANT(mb_type))
                 s->qscale = get_qscale(s);
 
             /* motion vectors */
             s->mv_dir = (mb_type >> 13) & 3;
             av_dlog(s->avctx, "motion_type=%d\n", motion_type);
             switch (motion_type) {
             case MT_FRAME: /* or MT_16X8 */
                 if (s->picture_structure == PICT_FRAME) {
a91d3658
                     mb_type   |= MB_TYPE_16x16;
1b6d6674
                     s->mv_type = MV_TYPE_16X16;
                     for (i = 0; i < 2; i++) {
                         if (USES_LIST(mb_type, i)) {
                             /* MT_FRAME */
a91d3658
                             s->mv[i][0][0]      =
                             s->last_mv[i][0][0] =
                             s->last_mv[i][1][0] =
                                 mpeg_decode_motion(s, s->mpeg_f_code[i][0],
                                                    s->last_mv[i][0][0]);
                             s->mv[i][0][1]      =
                             s->last_mv[i][0][1] =
                             s->last_mv[i][1][1] =
                                 mpeg_decode_motion(s, s->mpeg_f_code[i][1],
                                                    s->last_mv[i][0][1]);
1b6d6674
                             /* full_pel: only for MPEG-1 */
                             if (s->full_pel[i]) {
                                 s->mv[i][0][0] <<= 1;
                                 s->mv[i][0][1] <<= 1;
                             }
                         }
                     }
                 } else {
a91d3658
                     mb_type   |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
1b6d6674
                     s->mv_type = MV_TYPE_16X8;
                     for (i = 0; i < 2; i++) {
                         if (USES_LIST(mb_type, i)) {
                             /* MT_16X8 */
                             for (j = 0; j < 2; j++) {
                                 s->field_select[i][j] = get_bits1(&s->gb);
                                 for (k = 0; k < 2; k++) {
                                     val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
                                                              s->last_mv[i][j][k]);
                                     s->last_mv[i][j][k] = val;
                                     s->mv[i][j][k]      = val;
                                 }
                             }
                         }
                     }
                 }
                 break;
             case MT_FIELD:
                 s->mv_type = MV_TYPE_FIELD;
                 if (s->picture_structure == PICT_FRAME) {
                     mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
                     for (i = 0; i < 2; i++) {
                         if (USES_LIST(mb_type, i)) {
                             for (j = 0; j < 2; j++) {
                                 s->field_select[i][j] = get_bits1(&s->gb);
                                 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
                                                          s->last_mv[i][j][0]);
                                 s->last_mv[i][j][0] = val;
                                 s->mv[i][j][0]      = val;
                                 av_dlog(s->avctx, "fmx=%d\n", val);
                                 val = mpeg_decode_motion(s, s->mpeg_f_code[i][1],
                                                          s->last_mv[i][j][1] >> 1);
                                 s->last_mv[i][j][1] = val << 1;
                                 s->mv[i][j][1]      = val;
                                 av_dlog(s->avctx, "fmy=%d\n", val);
                             }
                         }
                     }
                 } else {
016c00cf
                     av_assert0(!s->progressive_sequence);
1b6d6674
                     mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
                     for (i = 0; i < 2; i++) {
                         if (USES_LIST(mb_type, i)) {
                             s->field_select[i][0] = get_bits1(&s->gb);
                             for (k = 0; k < 2; k++) {
                                 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
                                                          s->last_mv[i][0][k]);
                                 s->last_mv[i][0][k] = val;
                                 s->last_mv[i][1][k] = val;
                                 s->mv[i][0][k]      = val;
                             }
                         }
                     }
                 }
                 break;
             case MT_DMV:
acd75053
                 if (s->progressive_sequence){
016c00cf
                     av_log(s->avctx, AV_LOG_ERROR, "MT_DMV in progressive_sequence\n");
                     return -1;
                 }
1b6d6674
                 s->mv_type = MV_TYPE_DMV;
                 for (i = 0; i < 2; i++) {
                     if (USES_LIST(mb_type, i)) {
                         int dmx, dmy, mx, my, m;
                         const int my_shift = s->picture_structure == PICT_FRAME;
 
                         mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
                                                 s->last_mv[i][0][0]);
                         s->last_mv[i][0][0] = mx;
                         s->last_mv[i][1][0] = mx;
                         dmx = get_dmv(s);
                         my  = mpeg_decode_motion(s, s->mpeg_f_code[i][1],
                                                  s->last_mv[i][0][1] >> my_shift);
                         dmy = get_dmv(s);
 
 
                         s->last_mv[i][0][1] = my << my_shift;
                         s->last_mv[i][1][1] = my << my_shift;
 
                         s->mv[i][0][0] = mx;
                         s->mv[i][0][1] = my;
                         s->mv[i][1][0] = mx; // not used
                         s->mv[i][1][1] = my; // not used
 
                         if (s->picture_structure == PICT_FRAME) {
                             mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
 
                             // m = 1 + 2 * s->top_field_first;
                             m = s->top_field_first ? 1 : 3;
 
                             /* top -> top pred */
                             s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
                             s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1;
                             m = 4 - m;
                             s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
                             s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1;
                         } else {
                             mb_type |= MB_TYPE_16x16;
 
                             s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx;
                             s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy;
                             if (s->picture_structure == PICT_TOP_FIELD)
                                 s->mv[i][2][1]--;
                             else
                                 s->mv[i][2][1]++;
                         }
                     }
                 }
                 break;
             default:
a91d3658
                 av_log(s->avctx, AV_LOG_ERROR,
                        "00 motion_type at %d %d\n", s->mb_x, s->mb_y);
1b6d6674
                 return -1;
             }
         }
 
         s->mb_intra = 0;
         if (HAS_CBP(mb_type)) {
             s->dsp.clear_blocks(s->block[0]);
 
             cbp = get_vlc2(&s->gb, ff_mb_pat_vlc.table, MB_PAT_VLC_BITS, 1);
             if (mb_block_count > 6) {
a91d3658
                 cbp <<= mb_block_count - 6;
                 cbp  |= get_bits(&s->gb, mb_block_count - 6);
                 s->dsp.clear_blocks(s->block[6]);
1b6d6674
             }
             if (cbp <= 0) {
a91d3658
                 av_log(s->avctx, AV_LOG_ERROR,
acd75053
                        "invalid cbp %d at %d %d\n", cbp, s->mb_x, s->mb_y);
1b6d6674
                 return -1;
             }
 
a91d3658
             // if 1, we memcpy blocks in xvmcvideo
acd75053
             if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
1b6d6674
                 ff_xvmc_pack_pblocks(s, cbp);
 
             if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
                 if (s->flags2 & CODEC_FLAG2_FAST) {
                     for (i = 0; i < 6; i++) {
a91d3658
                         if (cbp & 32)
1b6d6674
                             mpeg2_fast_decode_block_non_intra(s, *s->pblocks[i], i);
a91d3658
                         else
1b6d6674
                             s->block_last_index[i] = -1;
                         cbp += cbp;
                     }
                 } else {
a91d3658
                     cbp <<= 12 - mb_block_count;
1b6d6674
 
                     for (i = 0; i < mb_block_count; i++) {
                         if (cbp & (1 << 11)) {
                             if (mpeg2_decode_block_non_intra(s, *s->pblocks[i], i) < 0)
                                 return -1;
                         } else {
                             s->block_last_index[i] = -1;
                         }
                         cbp += cbp;
                     }
                 }
             } else {
                 if (s->flags2 & CODEC_FLAG2_FAST) {
                     for (i = 0; i < 6; i++) {
a91d3658
                         if (cbp & 32)
1b6d6674
                             mpeg1_fast_decode_block_inter(s, *s->pblocks[i], i);
a91d3658
                         else
1b6d6674
                             s->block_last_index[i] = -1;
                         cbp += cbp;
                     }
                 } else {
                     for (i = 0; i < 6; i++) {
                         if (cbp & 32) {
                             if (mpeg1_decode_block_inter(s, *s->pblocks[i], i) < 0)
                                 return -1;
                         } else {
                             s->block_last_index[i] = -1;
                         }
                         cbp += cbp;
                     }
                 }
             }
         } else {
             for (i = 0; i < 12; i++)
                 s->block_last_index[i] = -1;
         }
     }
 
     s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride] = mb_type;
 
     return 0;
 }
 
 static av_cold int mpeg_decode_init(AVCodecContext *avctx)
 {
a91d3658
     Mpeg1Context *s    = avctx->priv_data;
1b6d6674
     MpegEncContext *s2 = &s->mpeg_enc_ctx;
     int i;
 
     /* we need some permutation to store matrices,
      * until MPV_common_init() sets the real permutation. */
     for (i = 0; i < 64; i++)
a91d3658
         s2->dsp.idct_permutation[i] = i;
1b6d6674
 
     ff_MPV_decode_defaults(s2);
 
     s->mpeg_enc_ctx.avctx  = avctx;
     s->mpeg_enc_ctx.flags  = avctx->flags;
     s->mpeg_enc_ctx.flags2 = avctx->flags2;
     ff_mpeg12_common_init(&s->mpeg_enc_ctx);
     ff_mpeg12_init_vlcs();
 
     s->mpeg_enc_ctx_allocated      = 0;
     s->mpeg_enc_ctx.picture_number = 0;
     s->repeat_field                = 0;
     s->mpeg_enc_ctx.codec_id       = avctx->codec->id;
a91d3658
     avctx->color_range             = AVCOL_RANGE_MPEG;
1b6d6674
     if (avctx->codec->id == AV_CODEC_ID_MPEG1VIDEO)
         avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
     else
         avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
     return 0;
 }
 
a91d3658
 static int mpeg_decode_update_thread_context(AVCodecContext *avctx,
                                              const AVCodecContext *avctx_from)
1b6d6674
 {
     Mpeg1Context *ctx = avctx->priv_data, *ctx_from = avctx_from->priv_data;
     MpegEncContext *s = &ctx->mpeg_enc_ctx, *s1 = &ctx_from->mpeg_enc_ctx;
     int err;
 
a91d3658
     if (avctx == avctx_from               ||
         !ctx_from->mpeg_enc_ctx_allocated ||
         !s1->context_initialized)
1b6d6674
         return 0;
 
     err = ff_mpeg_update_thread_context(avctx, avctx_from);
a91d3658
     if (err)
         return err;
1b6d6674
 
     if (!ctx->mpeg_enc_ctx_allocated)
         memcpy(s + 1, s1 + 1, sizeof(Mpeg1Context) - sizeof(MpegEncContext));
 
     if (!(s->pict_type == AV_PICTURE_TYPE_B || s->low_delay))
         s->picture_number++;
 
     return 0;
 }
 
 static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm,
                                  const uint8_t *new_perm)
 {
     uint16_t temp_matrix[64];
     int i;
 
     memcpy(temp_matrix, matrix, 64 * sizeof(uint16_t));
 
a91d3658
     for (i = 0; i < 64; i++)
1b6d6674
         matrix[new_perm[i]] = temp_matrix[old_perm[i]];
 }
 
016c00cf
 static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = {
1c63aed2
 #if CONFIG_MPEG1_XVMC_HWACCEL
     AV_PIX_FMT_XVMC,
016c00cf
 #endif
 #if CONFIG_MPEG1_VDPAU_HWACCEL
     AV_PIX_FMT_VDPAU_MPEG1,
fe1f3654
     AV_PIX_FMT_VDPAU,
016c00cf
 #endif
     AV_PIX_FMT_YUV420P,
     AV_PIX_FMT_NONE
 };
1b6d6674
 
016c00cf
 static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = {
1c63aed2
 #if CONFIG_MPEG2_XVMC_HWACCEL
     AV_PIX_FMT_XVMC,
016c00cf
 #endif
 #if CONFIG_MPEG2_VDPAU_HWACCEL
     AV_PIX_FMT_VDPAU_MPEG2,
fe1f3654
     AV_PIX_FMT_VDPAU,
016c00cf
 #endif
1b6d6674
 #if CONFIG_MPEG2_DXVA2_HWACCEL
     AV_PIX_FMT_DXVA2_VLD,
 #endif
 #if CONFIG_MPEG2_VAAPI_HWACCEL
     AV_PIX_FMT_VAAPI_VLD,
 #endif
     AV_PIX_FMT_YUV420P,
     AV_PIX_FMT_NONE
 };
 
a0c6c8e5
 static inline int uses_vdpau(AVCodecContext *avctx) {
     return avctx->pix_fmt == AV_PIX_FMT_VDPAU_MPEG1 || avctx->pix_fmt == AV_PIX_FMT_VDPAU_MPEG2;
 }
 
1b6d6674
 static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
 {
a91d3658
     Mpeg1Context *s1  = avctx->priv_data;
1b6d6674
     MpegEncContext *s = &s1->mpeg_enc_ctx;
 
a91d3658
     if (s->chroma_format < 2)
c10d498b
         return ff_thread_get_format(avctx,
016c00cf
                                 avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO ?
                                 mpeg1_hwaccel_pixfmt_list_420 :
                                 mpeg2_hwaccel_pixfmt_list_420);
19e30a58
     else if (s->chroma_format == 2)
016c00cf
         return AV_PIX_FMT_YUV422P;
     else
         return AV_PIX_FMT_YUV444P;
 }
 
 static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
 {
78e150c5
     avctx->hwaccel = ff_find_hwaccel(avctx);
016c00cf
     // until then pix_fmt may be changed right after codec init
1c63aed2
     if (avctx->hwaccel || uses_vdpau(avctx))
016c00cf
         if (avctx->idct_algo == FF_IDCT_AUTO)
             avctx->idct_algo = FF_IDCT_SIMPLE;
1c63aed2
 
     if (avctx->hwaccel && avctx->pix_fmt == AV_PIX_FMT_XVMC) {
         Mpeg1Context *s1 = avctx->priv_data;
         MpegEncContext *s = &s1->mpeg_enc_ctx;
 
         s->pack_pblocks = 1;
 #if FF_API_XVMC
         avctx->xvmc_acceleration = 2;
 #endif /* FF_API_XVMC */
     }
1b6d6674
 }
 
 /* Call this function when we know all parameters.
  * It may be called in different places for MPEG-1 and MPEG-2. */
 static int mpeg_decode_postinit(AVCodecContext *avctx)
 {
a91d3658
     Mpeg1Context *s1  = avctx->priv_data;
1b6d6674
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     uint8_t old_permutation[64];
6c725472
     int ret;
1b6d6674
 
a91d3658
     if ((s1->mpeg_enc_ctx_allocated == 0)                   ||
         avctx->coded_width       != s->width                ||
         avctx->coded_height      != s->height               ||
1b6d6674
         s1->save_width           != s->width                ||
         s1->save_height          != s->height               ||
         s1->save_aspect_info     != s->aspect_ratio_info    ||
970c8df7
         (s1->save_progressive_seq != s->progressive_sequence && (s->height&31)) ||
a91d3658
         0) {
1b6d6674
         if (s1->mpeg_enc_ctx_allocated) {
             ParseContext pc = s->parse_context;
             s->parse_context.buffer = 0;
             ff_MPV_common_end(s);
             s->parse_context = pc;
108b91c3
             s1->mpeg_enc_ctx_allocated = 0;
1b6d6674
         }
 
         if ((s->width == 0) || (s->height == 0))
             return -2;
 
6c725472
         ret = ff_set_dimensions(avctx, s->width, s->height);
         if (ret < 0)
             return ret;
 
016c00cf
         if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->bit_rate) {
             avctx->rc_max_rate = s->bit_rate;
         } else if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO && s->bit_rate &&
                    (s->bit_rate != 0x3FFFF*400 || s->vbv_delay != 0xFFFF)) {
             avctx->bit_rate = s->bit_rate;
         }
1b6d6674
         s1->save_aspect_info     = s->aspect_ratio_info;
         s1->save_width           = s->width;
         s1->save_height          = s->height;
         s1->save_progressive_seq = s->progressive_sequence;
 
         /* low_delay may be forced, in this case we will have B-frames
          * that behave like P-frames. */
         avctx->has_b_frames = !s->low_delay;
 
         if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
a91d3658
             // MPEG-1 fps
1b6d6674
             avctx->time_base.den = ff_mpeg12_frame_rate_tab[s->frame_rate_index].num;
             avctx->time_base.num = ff_mpeg12_frame_rate_tab[s->frame_rate_index].den;
a91d3658
             // MPEG-1 aspect
             avctx->sample_aspect_ratio = av_d2q(1.0 / ff_mpeg1_aspect[s->aspect_ratio_info], 255);
             avctx->ticks_per_frame     = 1;
         } else { // MPEG-2
             // MPEG-2 fps
1b6d6674
             av_reduce(&s->avctx->time_base.den,
                       &s->avctx->time_base.num,
a91d3658
                       ff_mpeg12_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num * 2,
1b6d6674
                       ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
                       1 << 30);
             avctx->ticks_per_frame = 2;
a91d3658
             // MPEG-2 aspect
1b6d6674
             if (s->aspect_ratio_info > 1) {
                 AVRational dar =
                     av_mul_q(av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
a91d3658
                                       (AVRational) { s1->pan_scan.width,
                                                      s1->pan_scan.height }),
                              (AVRational) { s->width, s->height });
 
                 /* We ignore the spec here and guess a bit as reality does not
                  * match the spec, see for example res_change_ffmpeg_aspect.ts
                  * and sequence-display-aspect.mpg.
                  * issue1613, 621, 562 */
1b6d6674
                 if ((s1->pan_scan.width == 0) || (s1->pan_scan.height == 0) ||
a91d3658
                     (av_cmp_q(dar, (AVRational) { 4, 3 }) &&
                      av_cmp_q(dar, (AVRational) { 16, 9 }))) {
1b6d6674
                     s->avctx->sample_aspect_ratio =
                         av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
a91d3658
                                  (AVRational) { s->width, s->height });
1b6d6674
                 } else {
                     s->avctx->sample_aspect_ratio =
                         av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
a91d3658
                                  (AVRational) { s1->pan_scan.width, s1->pan_scan.height });
 // issue1613 4/3 16/9 -> 16/9
 // res_change_ffmpeg_aspect.ts 4/3 225/44 ->4/3
 // widescreen-issue562.mpg 4/3 16/9 -> 16/9
1b6d6674
 //                    s->avctx->sample_aspect_ratio = av_mul_q(s->avctx->sample_aspect_ratio, (AVRational) {s->width, s->height});
                     av_dlog(avctx, "A %d/%d\n",
a91d3658
                             ff_mpeg2_aspect[s->aspect_ratio_info].num,
                             ff_mpeg2_aspect[s->aspect_ratio_info].den);
1b6d6674
                     av_dlog(avctx, "B %d/%d\n", s->avctx->sample_aspect_ratio.num,
                             s->avctx->sample_aspect_ratio.den);
                 }
             } else {
                 s->avctx->sample_aspect_ratio =
                     ff_mpeg2_aspect[s->aspect_ratio_info];
             }
         } // MPEG-2
 
         avctx->pix_fmt = mpeg_get_pixelformat(avctx);
016c00cf
         setup_hwaccel_for_pixfmt(avctx);
1b6d6674
 
         /* Quantization matrices may need reordering
          * if DCT permutation is changed. */
         memcpy(old_permutation, s->dsp.idct_permutation, 64 * sizeof(uint8_t));
 
         if (ff_MPV_common_init(s) < 0)
             return -2;
 
         quant_matrix_rebuild(s->intra_matrix,        old_permutation, s->dsp.idct_permutation);
         quant_matrix_rebuild(s->inter_matrix,        old_permutation, s->dsp.idct_permutation);
         quant_matrix_rebuild(s->chroma_intra_matrix, old_permutation, s->dsp.idct_permutation);
         quant_matrix_rebuild(s->chroma_inter_matrix, old_permutation, s->dsp.idct_permutation);
 
         s1->mpeg_enc_ctx_allocated = 1;
     }
     return 0;
 }
 
a91d3658
 static int mpeg1_decode_picture(AVCodecContext *avctx, const uint8_t *buf,
                                 int buf_size)
1b6d6674
 {
a91d3658
     Mpeg1Context *s1  = avctx->priv_data;
1b6d6674
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int ref, f_code, vbv_delay;
 
a91d3658
     init_get_bits(&s->gb, buf, buf_size * 8);
1b6d6674
 
     ref = get_bits(&s->gb, 10); /* temporal ref */
     s->pict_type = get_bits(&s->gb, 3);
     if (s->pict_type == 0 || s->pict_type > 3)
         return -1;
 
     vbv_delay = get_bits(&s->gb, 16);
016c00cf
     s->vbv_delay = vbv_delay;
a91d3658
     if (s->pict_type == AV_PICTURE_TYPE_P ||
         s->pict_type == AV_PICTURE_TYPE_B) {
1b6d6674
         s->full_pel[0] = get_bits1(&s->gb);
         f_code = get_bits(&s->gb, 3);
016c00cf
         if (f_code == 0 && (avctx->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)))
1b6d6674
             return -1;
016c00cf
         f_code += !f_code;
1b6d6674
         s->mpeg_f_code[0][0] = f_code;
         s->mpeg_f_code[0][1] = f_code;
     }
     if (s->pict_type == AV_PICTURE_TYPE_B) {
         s->full_pel[1] = get_bits1(&s->gb);
         f_code = get_bits(&s->gb, 3);
016c00cf
         if (f_code == 0 && (avctx->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)))
1b6d6674
             return -1;
016c00cf
         f_code += !f_code;
1b6d6674
         s->mpeg_f_code[1][0] = f_code;
         s->mpeg_f_code[1][1] = f_code;
     }
     s->current_picture.f.pict_type = s->pict_type;
     s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
 
     if (avctx->debug & FF_DEBUG_PICT_INFO)
a91d3658
         av_log(avctx, AV_LOG_DEBUG,
                "vbv_delay %d, ref %d type:%d\n", vbv_delay, ref, s->pict_type);
1b6d6674
 
     s->y_dc_scale = 8;
     s->c_dc_scale = 8;
     return 0;
 }
 
 static void mpeg_decode_sequence_extension(Mpeg1Context *s1)
 {
a91d3658
     MpegEncContext *s = &s1->mpeg_enc_ctx;
1b6d6674
     int horiz_size_ext, vert_size_ext;
     int bit_rate_ext;
 
     skip_bits(&s->gb, 1); /* profile and level esc*/
     s->avctx->profile       = get_bits(&s->gb, 3);
     s->avctx->level         = get_bits(&s->gb, 4);
a91d3658
     s->progressive_sequence = get_bits1(&s->gb);   /* progressive_sequence */
1b6d6674
     s->chroma_format        = get_bits(&s->gb, 2); /* chroma_format 1=420, 2=422, 3=444 */
     horiz_size_ext          = get_bits(&s->gb, 2);
     vert_size_ext           = get_bits(&s->gb, 2);
     s->width  |= (horiz_size_ext << 12);
     s->height |= (vert_size_ext  << 12);
     bit_rate_ext = get_bits(&s->gb, 12);  /* XXX: handle it */
     s->bit_rate += (bit_rate_ext << 18) * 400;
     skip_bits1(&s->gb); /* marker */
     s->avctx->rc_buffer_size += get_bits(&s->gb, 8) * 1024 * 16 << 10;
 
     s->low_delay = get_bits1(&s->gb);
     if (s->flags & CODEC_FLAG_LOW_DELAY)
         s->low_delay = 1;
 
     s1->frame_rate_ext.num = get_bits(&s->gb, 2) + 1;
     s1->frame_rate_ext.den = get_bits(&s->gb, 5) + 1;
 
     av_dlog(s->avctx, "sequence extension\n");
a91d3658
     s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
1b6d6674
 
     if (s->avctx->debug & FF_DEBUG_PICT_INFO)
a91d3658
         av_log(s->avctx, AV_LOG_DEBUG,
acd75053
                "profile: %d, level: %d ps: %d cf:%d vbv buffer: %d, bitrate:%d\n",
                s->avctx->profile, s->avctx->level, s->progressive_sequence, s->chroma_format,
a91d3658
                s->avctx->rc_buffer_size, s->bit_rate);
1b6d6674
 }
 
 static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1)
 {
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int color_description, w, h;
 
     skip_bits(&s->gb, 3); /* video format */
     color_description = get_bits1(&s->gb);
     if (color_description) {
         s->avctx->color_primaries = get_bits(&s->gb, 8);
         s->avctx->color_trc       = get_bits(&s->gb, 8);
         s->avctx->colorspace      = get_bits(&s->gb, 8);
     }
     w = get_bits(&s->gb, 14);
a91d3658
     skip_bits(&s->gb, 1); // marker
1b6d6674
     h = get_bits(&s->gb, 14);
     // remaining 3 bits are zero padding
 
     s1->pan_scan.width  = 16 * w;
     s1->pan_scan.height = 16 * h;
 
     if (s->avctx->debug & FF_DEBUG_PICT_INFO)
         av_log(s->avctx, AV_LOG_DEBUG, "sde w:%d, h:%d\n", w, h);
 }
 
 static void mpeg_decode_picture_display_extension(Mpeg1Context *s1)
 {
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int i, nofco;
 
     nofco = 1;
     if (s->progressive_sequence) {
         if (s->repeat_first_field) {
             nofco++;
             if (s->top_field_first)
                 nofco++;
         }
     } else {
         if (s->picture_structure == PICT_FRAME) {
             nofco++;
             if (s->repeat_first_field)
                 nofco++;
         }
     }
     for (i = 0; i < nofco; i++) {
         s1->pan_scan.position[i][0] = get_sbits(&s->gb, 16);
         skip_bits(&s->gb, 1); // marker
         s1->pan_scan.position[i][1] = get_sbits(&s->gb, 16);
         skip_bits(&s->gb, 1); // marker
     }
 
     if (s->avctx->debug & FF_DEBUG_PICT_INFO)
         av_log(s->avctx, AV_LOG_DEBUG, "pde (%d,%d) (%d,%d) (%d,%d)\n",
                s1->pan_scan.position[0][0], s1->pan_scan.position[0][1],
                s1->pan_scan.position[1][0], s1->pan_scan.position[1][1],
                s1->pan_scan.position[2][0], s1->pan_scan.position[2][1]);
 }
 
a91d3658
 static int load_matrix(MpegEncContext *s, uint16_t matrix0[64],
                        uint16_t matrix1[64], int intra)
1b6d6674
 {
     int i;
 
     for (i = 0; i < 64; i++) {
         int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
         int v = get_bits(&s->gb, 8);
         if (v == 0) {
             av_log(s->avctx, AV_LOG_ERROR, "matrix damaged\n");
             return -1;
         }
         if (intra && i == 0 && v != 8) {
016c00cf
             av_log(s->avctx, AV_LOG_DEBUG, "intra matrix specifies invalid DC quantizer %d, ignoring\n", v);
1b6d6674
             v = 8; // needed by pink.mpg / issue1046
         }
         matrix0[j] = v;
         if (matrix1)
             matrix1[j] = v;
     }
     return 0;
 }
 
 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
 {
     av_dlog(s->avctx, "matrix extension\n");
 
a91d3658
     if (get_bits1(&s->gb))
         load_matrix(s, s->chroma_intra_matrix, s->intra_matrix, 1);
     if (get_bits1(&s->gb))
         load_matrix(s, s->chroma_inter_matrix, s->inter_matrix, 0);
     if (get_bits1(&s->gb))
         load_matrix(s, s->chroma_intra_matrix, NULL, 1);
     if (get_bits1(&s->gb))
         load_matrix(s, s->chroma_inter_matrix, NULL, 0);
1b6d6674
 }
 
 static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
 {
     MpegEncContext *s = &s1->mpeg_enc_ctx;
 
a91d3658
     s->full_pel[0]       = s->full_pel[1] = 0;
1b6d6674
     s->mpeg_f_code[0][0] = get_bits(&s->gb, 4);
     s->mpeg_f_code[0][1] = get_bits(&s->gb, 4);
     s->mpeg_f_code[1][0] = get_bits(&s->gb, 4);
     s->mpeg_f_code[1][1] = get_bits(&s->gb, 4);
     if (!s->pict_type && s1->mpeg_enc_ctx_allocated) {
a91d3658
         av_log(s->avctx, AV_LOG_ERROR,
                "Missing picture start code, guessing missing values\n");
1b6d6674
         if (s->mpeg_f_code[1][0] == 15 && s->mpeg_f_code[1][1] == 15) {
             if (s->mpeg_f_code[0][0] == 15 && s->mpeg_f_code[0][1] == 15)
                 s->pict_type = AV_PICTURE_TYPE_I;
             else
                 s->pict_type = AV_PICTURE_TYPE_P;
         } else
             s->pict_type = AV_PICTURE_TYPE_B;
         s->current_picture.f.pict_type = s->pict_type;
         s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
     }
016c00cf
     s->mpeg_f_code[0][0] += !s->mpeg_f_code[0][0];
     s->mpeg_f_code[0][1] += !s->mpeg_f_code[0][1];
     s->mpeg_f_code[1][0] += !s->mpeg_f_code[1][0];
     s->mpeg_f_code[1][1] += !s->mpeg_f_code[1][1];
 
1b6d6674
     s->intra_dc_precision         = get_bits(&s->gb, 2);
     s->picture_structure          = get_bits(&s->gb, 2);
     s->top_field_first            = get_bits1(&s->gb);
     s->frame_pred_frame_dct       = get_bits1(&s->gb);
     s->concealment_motion_vectors = get_bits1(&s->gb);
     s->q_scale_type               = get_bits1(&s->gb);
     s->intra_vlc_format           = get_bits1(&s->gb);
     s->alternate_scan             = get_bits1(&s->gb);
     s->repeat_first_field         = get_bits1(&s->gb);
     s->chroma_420_type            = get_bits1(&s->gb);
     s->progressive_frame          = get_bits1(&s->gb);
 
     if (s->alternate_scan) {
         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
     } else {
         ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
         ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
     }
 
     /* composite display not parsed */
     av_dlog(s->avctx, "intra_dc_precision=%d\n", s->intra_dc_precision);
     av_dlog(s->avctx, "picture_structure=%d\n", s->picture_structure);
     av_dlog(s->avctx, "top field first=%d\n", s->top_field_first);
     av_dlog(s->avctx, "repeat first field=%d\n", s->repeat_first_field);
     av_dlog(s->avctx, "conceal=%d\n", s->concealment_motion_vectors);
     av_dlog(s->avctx, "intra_vlc_format=%d\n", s->intra_vlc_format);
     av_dlog(s->avctx, "alternate_scan=%d\n", s->alternate_scan);
     av_dlog(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
     av_dlog(s->avctx, "progressive_frame=%d\n", s->progressive_frame);
 }
 
 static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
 {
     AVCodecContext *avctx = s->avctx;
a91d3658
     Mpeg1Context *s1      = (Mpeg1Context *) s;
1b6d6674
 
     /* start frame decoding */
     if (s->first_field || s->picture_structure == PICT_FRAME) {
         AVFrameSideData *pan_scan;
 
         if (ff_MPV_frame_start(s, avctx) < 0)
             return -1;
 
         ff_mpeg_er_frame_start(s);
 
         /* first check if we must repeat the frame */
         s->current_picture_ptr->f.repeat_pict = 0;
         if (s->repeat_first_field) {
             if (s->progressive_sequence) {
                 if (s->top_field_first)
                     s->current_picture_ptr->f.repeat_pict = 4;
                 else
                     s->current_picture_ptr->f.repeat_pict = 2;
             } else if (s->progressive_frame) {
                 s->current_picture_ptr->f.repeat_pict = 1;
             }
         }
 
         pan_scan = av_frame_new_side_data(&s->current_picture_ptr->f,
                                           AV_FRAME_DATA_PANSCAN,
                                           sizeof(s1->pan_scan));
         if (!pan_scan)
             return AVERROR(ENOMEM);
         memcpy(pan_scan->data, &s1->pan_scan, sizeof(s1->pan_scan));
 
1eaac1d6
         if (s1->a53_caption) {
             AVFrameSideData *sd = av_frame_new_side_data(
                 &s->current_picture_ptr->f, AV_FRAME_DATA_A53_CC,
                 s1->a53_caption_size);
             if (sd)
                 memcpy(sd->data, s1->a53_caption, s1->a53_caption_size);
             av_freep(&s1->a53_caption);
         }
73eca738
 
         if (s1->has_stereo3d) {
             AVStereo3D *stereo = av_stereo3d_create_side_data(&s->current_picture_ptr->f);
             if (!stereo)
                 return AVERROR(ENOMEM);
 
             *stereo = s1->stereo3d;
             s1->has_stereo3d = 0;
         }
1b6d6674
         if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME))
             ff_thread_finish_setup(avctx);
     } else { // second field
         int i;
 
         if (!s->current_picture_ptr) {
             av_log(s->avctx, AV_LOG_ERROR, "first field missing\n");
             return -1;
         }
 
         if (s->avctx->hwaccel &&
             (s->avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) {
             if (s->avctx->hwaccel->end_frame(s->avctx) < 0)
a91d3658
                 av_log(avctx, AV_LOG_ERROR,
                        "hardware accelerator failed to decode first field\n");
1b6d6674
         }
 
         for (i = 0; i < 4; i++) {
             s->current_picture.f.data[i] = s->current_picture_ptr->f.data[i];
a91d3658
             if (s->picture_structure == PICT_BOTTOM_FIELD)
                 s->current_picture.f.data[i] +=
                     s->current_picture_ptr->f.linesize[i];
1b6d6674
         }
     }
 
     if (avctx->hwaccel) {
         if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
             return -1;
     }
 
     return 0;
 }
 
 #define DECODE_SLICE_ERROR -1
 #define DECODE_SLICE_OK     0
 
 /**
  * Decode a slice.
  * MpegEncContext.mb_y must be set to the MB row from the startcode.
  * @return DECODE_SLICE_ERROR if the slice is damaged,
  *         DECODE_SLICE_OK if this slice is OK
  */
 static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
                              const uint8_t **buf, int buf_size)
 {
     AVCodecContext *avctx = s->avctx;
016c00cf
     const int lowres      = s->avctx->lowres;
1b6d6674
     const int field_pic   = s->picture_structure != PICT_FRAME;
 
     s->resync_mb_x =
     s->resync_mb_y = -1;
 
016c00cf
     av_assert0(mb_y < s->mb_height);
1b6d6674
 
     init_get_bits(&s->gb, *buf, buf_size * 8);
acd75053
     if (s->codec_id != AV_CODEC_ID_MPEG1VIDEO && s->mb_height > 2800/16)
016c00cf
         skip_bits(&s->gb, 3);
1b6d6674
 
     ff_mpeg1_clean_buffers(s);
     s->interlaced_dct = 0;
 
     s->qscale = get_qscale(s);
 
     if (s->qscale == 0) {
         av_log(s->avctx, AV_LOG_ERROR, "qscale == 0\n");
         return -1;
     }
 
     /* extra slice info */
18802942
     if (skip_1stop_8data_bits(&s->gb) < 0)
         return AVERROR_INVALIDDATA;
1b6d6674
 
     s->mb_x = 0;
 
     if (mb_y == 0 && s->codec_tag == AV_RL32("SLIF")) {
         skip_bits1(&s->gb);
     } else {
         while (get_bits_left(&s->gb) > 0) {
             int code = get_vlc2(&s->gb, ff_mbincr_vlc.table,
                                 MBINCR_VLC_BITS, 2);
             if (code < 0) {
                 av_log(s->avctx, AV_LOG_ERROR, "first mb_incr damaged\n");
                 return -1;
             }
             if (code >= 33) {
a91d3658
                 if (code == 33)
1b6d6674
                     s->mb_x += 33;
                 /* otherwise, stuffing, nothing to do */
             } else {
                 s->mb_x += code;
                 break;
             }
         }
     }
 
a91d3658
     if (s->mb_x >= (unsigned) s->mb_width) {
1b6d6674
         av_log(s->avctx, AV_LOG_ERROR, "initial skip overflow\n");
         return -1;
     }
 
1c63aed2
     if (avctx->hwaccel && avctx->hwaccel->decode_slice) {
1b6d6674
         const uint8_t *buf_end, *buf_start = *buf - 4; /* include start_code */
         int start_code = -1;
         buf_end = avpriv_find_start_code(buf_start + 2, *buf + buf_size, &start_code);
         if (buf_end < *buf + buf_size)
             buf_end -= 4;
         s->mb_y = mb_y;
         if (avctx->hwaccel->decode_slice(avctx, buf_start, buf_end - buf_start) < 0)
             return DECODE_SLICE_ERROR;
         *buf = buf_end;
         return DECODE_SLICE_OK;
     }
 
     s->resync_mb_x = s->mb_x;
     s->resync_mb_y = s->mb_y = mb_y;
     s->mb_skip_run = 0;
     ff_init_block_index(s);
 
     if (s->mb_y == 0 && s->mb_x == 0 && (s->first_field || s->picture_structure == PICT_FRAME)) {
         if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
a91d3658
             av_log(s->avctx, AV_LOG_DEBUG,
                    "qp:%d fc:%2d%2d%2d%2d %s %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n",
                    s->qscale,
                    s->mpeg_f_code[0][0], s->mpeg_f_code[0][1],
                    s->mpeg_f_code[1][0], s->mpeg_f_code[1][1],
                    s->pict_type  == AV_PICTURE_TYPE_I ? "I" :
                    (s->pict_type == AV_PICTURE_TYPE_P ? "P" :
                    (s->pict_type == AV_PICTURE_TYPE_B ? "B" : "S")),
                    s->progressive_sequence ? "ps"  : "",
                    s->progressive_frame    ? "pf"  : "",
                    s->alternate_scan       ? "alt" : "",
                    s->top_field_first      ? "top" : "",
                    s->intra_dc_precision, s->picture_structure,
                    s->frame_pred_frame_dct, s->concealment_motion_vectors,
                    s->q_scale_type, s->intra_vlc_format,
                    s->repeat_first_field, s->chroma_420_type ? "420" : "");
1b6d6674
         }
     }
 
     for (;;) {
         // If 1, we memcpy blocks in xvmcvideo.
c8926215
         if ((CONFIG_MPEG1_XVMC_HWACCEL || CONFIG_MPEG2_XVMC_HWACCEL) && s->pack_pblocks)
1b6d6674
             ff_xvmc_init_block(s); // set s->block
 
         if (mpeg_decode_mb(s, s->block) < 0)
             return -1;
 
a91d3658
         // Note motion_val is normally NULL unless we want to extract the MVs.
         if (s->current_picture.motion_val[0] && !s->encoding) {
1b6d6674
             const int wrap = s->b8_stride;
             int xy         = s->mb_x * 2 + s->mb_y * 2 * wrap;
             int b8_xy      = 4 * (s->mb_x + s->mb_y * s->mb_stride);
             int motion_x, motion_y, dir, i;
 
             for (i = 0; i < 2; i++) {
                 for (dir = 0; dir < 2; dir++) {
a91d3658
                     if (s->mb_intra ||
                         (dir == 1 && s->pict_type != AV_PICTURE_TYPE_B)) {
1b6d6674
                         motion_x = motion_y = 0;
a91d3658
                     } else if (s->mv_type == MV_TYPE_16X16 ||
                                (s->mv_type == MV_TYPE_FIELD && field_pic)) {
1b6d6674
                         motion_x = s->mv[dir][0][0];
                         motion_y = s->mv[dir][0][1];
a91d3658
                     } else { /* if ((s->mv_type == MV_TYPE_FIELD) || (s->mv_type == MV_TYPE_16X8)) */
1b6d6674
                         motion_x = s->mv[dir][i][0];
                         motion_y = s->mv[dir][i][1];
                     }
 
a91d3658
                     s->current_picture.motion_val[dir][xy][0]     = motion_x;
                     s->current_picture.motion_val[dir][xy][1]     = motion_y;
1b6d6674
                     s->current_picture.motion_val[dir][xy + 1][0] = motion_x;
                     s->current_picture.motion_val[dir][xy + 1][1] = motion_y;
a91d3658
                     s->current_picture.ref_index [dir][b8_xy]     =
1b6d6674
                     s->current_picture.ref_index [dir][b8_xy + 1] = s->field_select[dir][i];
acd75053
                     av_assert2(s->field_select[dir][i] == 0 ||
                                s->field_select[dir][i] == 1);
1b6d6674
                 }
a91d3658
                 xy    += wrap;
                 b8_xy += 2;
1b6d6674
             }
         }
 
016c00cf
         s->dest[0] += 16 >> lowres;
         s->dest[1] +=(16 >> lowres) >> s->chroma_x_shift;
         s->dest[2] +=(16 >> lowres) >> s->chroma_x_shift;
1b6d6674
 
         ff_MPV_decode_mb(s, s->block);
 
         if (++s->mb_x >= s->mb_width) {
016c00cf
             const int mb_size = 16 >> s->avctx->lowres;
1b6d6674
 
a91d3658
             ff_mpeg_draw_horiz_band(s, mb_size * (s->mb_y >> field_pic), mb_size);
1b6d6674
             ff_MPV_report_decode_progress(s);
 
a91d3658
             s->mb_x  = 0;
1b6d6674
             s->mb_y += 1 << field_pic;
 
             if (s->mb_y >= s->mb_height) {
                 int left   = get_bits_left(&s->gb);
a91d3658
                 int is_d10 = s->chroma_format == 2 &&
                              s->pict_type == AV_PICTURE_TYPE_I &&
                              avctx->profile == 0 && avctx->level == 5 &&
                              s->intra_dc_precision == 2 &&
                              s->q_scale_type == 1 && s->alternate_scan == 0 &&
                              s->progressive_frame == 0
                              /* vbv_delay == 0xBBB || 0xE10 */;
1b6d6674
 
016c00cf
                 if (left >= 32 && !is_d10) {
                     GetBitContext gb = s->gb;
                     align_get_bits(&gb);
                     if (show_bits(&gb, 24) == 0x060E2B) {
                         av_log(avctx, AV_LOG_DEBUG, "Invalid MXF data found in video stream\n");
                         is_d10 = 1;
                     }
                 }
 
a91d3658
                 if (left < 0 ||
                     (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10) ||
acd75053
                     ((avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_AGGRESSIVE)) && left > 8)) {
a91d3658
                     av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n",
                            left, show_bits(&s->gb, FFMIN(left, 23)));
1b6d6674
                     return -1;
                 } else
                     goto eos;
             }
 
             ff_init_block_index(s);
         }
 
         /* skip mb handling */
         if (s->mb_skip_run == -1) {
             /* read increment again */
             s->mb_skip_run = 0;
             for (;;) {
                 int code = get_vlc2(&s->gb, ff_mbincr_vlc.table,
                                     MBINCR_VLC_BITS, 2);
                 if (code < 0) {
                     av_log(s->avctx, AV_LOG_ERROR, "mb incr damaged\n");
                     return -1;
                 }
                 if (code >= 33) {
                     if (code == 33) {
                         s->mb_skip_run += 33;
                     } else if (code == 35) {
                         if (s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0) {
                             av_log(s->avctx, AV_LOG_ERROR, "slice mismatch\n");
                             return -1;
                         }
                         goto eos; /* end of slice */
                     }
                     /* otherwise, stuffing, nothing to do */
                 } else {
                     s->mb_skip_run += code;
                     break;
                 }
             }
             if (s->mb_skip_run) {
                 int i;
                 if (s->pict_type == AV_PICTURE_TYPE_I) {
a91d3658
                     av_log(s->avctx, AV_LOG_ERROR,
                            "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y);
1b6d6674
                     return -1;
                 }
 
                 /* skip mb */
                 s->mb_intra = 0;
                 for (i = 0; i < 12; i++)
                     s->block_last_index[i] = -1;
                 if (s->picture_structure == PICT_FRAME)
                     s->mv_type = MV_TYPE_16X16;
                 else
                     s->mv_type = MV_TYPE_FIELD;
                 if (s->pict_type == AV_PICTURE_TYPE_P) {
                     /* if P type, zero motion vector is implied */
                     s->mv_dir             = MV_DIR_FORWARD;
                     s->mv[0][0][0]        = s->mv[0][0][1]      = 0;
                     s->last_mv[0][0][0]   = s->last_mv[0][0][1] = 0;
                     s->last_mv[0][1][0]   = s->last_mv[0][1][1] = 0;
                     s->field_select[0][0] = (s->picture_structure - 1) & 1;
                 } else {
                     /* if B type, reuse previous vectors and directions */
                     s->mv[0][0][0] = s->last_mv[0][0][0];
                     s->mv[0][0][1] = s->last_mv[0][0][1];
                     s->mv[1][0][0] = s->last_mv[1][0][0];
                     s->mv[1][0][1] = s->last_mv[1][0][1];
                 }
             }
         }
     }
 eos: // end of slice
76b5e99c
     if (get_bits_left(&s->gb) < 0)
         return AVERROR_INVALIDDATA;
a91d3658
     *buf += (get_bits_count(&s->gb) - 1) / 8;
1b6d6674
     av_dlog(s, "y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y);
     return 0;
 }
 
 static int slice_decode_thread(AVCodecContext *c, void *arg)
 {
a91d3658
     MpegEncContext *s   = *(void **) arg;
1b6d6674
     const uint8_t *buf  = s->gb.buffer;
     int mb_y            = s->start_mb_y;
     const int field_pic = s->picture_structure != PICT_FRAME;
 
     s->er.error_count = (3 * (s->end_mb_y - s->start_mb_y) * s->mb_width) >> field_pic;
 
     for (;;) {
         uint32_t start_code;
         int ret;
 
         ret = mpeg_decode_slice(s, mb_y, &buf, s->gb.buffer_end - buf);
         emms_c();
         av_dlog(c, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n",
                 ret, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y,
                 s->start_mb_y, s->end_mb_y, s->er.error_count);
         if (ret < 0) {
             if (c->err_recognition & AV_EF_EXPLODE)
                 return ret;
             if (s->resync_mb_x >= 0 && s->resync_mb_y >= 0)
a91d3658
                 ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
                                 s->mb_x, s->mb_y,
                                 ER_AC_ERROR | ER_DC_ERROR | ER_MV_ERROR);
1b6d6674
         } else {
a91d3658
             ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y,
                             s->mb_x - 1, s->mb_y,
                             ER_AC_END | ER_DC_END | ER_MV_END);
1b6d6674
         }
 
         if (s->mb_y == s->end_mb_y)
             return 0;
 
         start_code = -1;
a91d3658
         buf        = avpriv_find_start_code(buf, s->gb.buffer_end, &start_code);
acd75053
         mb_y       = start_code - SLICE_MIN_START_CODE;
         if (s->codec_id != AV_CODEC_ID_MPEG1VIDEO && s->mb_height > 2800/16)
016c00cf
             mb_y += (*buf&0xE0)<<2;
         mb_y <<= field_pic;
1b6d6674
         if (s->picture_structure == PICT_BOTTOM_FIELD)
             mb_y++;
         if (mb_y < 0 || mb_y >= s->end_mb_y)
             return -1;
     }
 }
 
 /**
  * Handle slice ends.
  * @return 1 if it seems to be the last slice
  */
 static int slice_end(AVCodecContext *avctx, AVFrame *pict)
 {
a91d3658
     Mpeg1Context *s1  = avctx->priv_data;
1b6d6674
     MpegEncContext *s = &s1->mpeg_enc_ctx;
 
     if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr)
         return 0;
 
     if (s->avctx->hwaccel) {
         if (s->avctx->hwaccel->end_frame(s->avctx) < 0)
a91d3658
             av_log(avctx, AV_LOG_ERROR,
                    "hardware accelerator failed to decode picture\n");
1b6d6674
     }
 
     /* end of slice reached */
acd75053
     if (/* s->mb_y << field_pic == s->mb_height && */ !s->first_field && !s1->first_slice) {
1b6d6674
         /* end of image */
 
         ff_er_frame_end(&s->er);
 
         ff_MPV_frame_end(s);
 
         if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
             int ret = av_frame_ref(pict, &s->current_picture_ptr->f);
             if (ret < 0)
                 return ret;
016c00cf
             ff_print_debug_info(s, s->current_picture_ptr, pict);
             ff_mpv_export_qp_table(s, pict, s->current_picture_ptr, FF_QSCALE_TYPE_MPEG2);
1b6d6674
         } else {
             if (avctx->active_thread_type & FF_THREAD_FRAME)
                 s->picture_number++;
             /* latency of 1 frame for I- and P-frames */
             /* XXX: use another variable than picture_number */
             if (s->last_picture_ptr != NULL) {
                 int ret = av_frame_ref(pict, &s->last_picture_ptr->f);
                 if (ret < 0)
                     return ret;
016c00cf
                 ff_print_debug_info(s, s->last_picture_ptr, pict);
                 ff_mpv_export_qp_table(s, pict, s->last_picture_ptr, FF_QSCALE_TYPE_MPEG2);
1b6d6674
             }
         }
 
         return 1;
     } else {
         return 0;
     }
 }
 
 static int mpeg1_decode_sequence(AVCodecContext *avctx,
                                  const uint8_t *buf, int buf_size)
 {
a91d3658
     Mpeg1Context *s1  = avctx->priv_data;
1b6d6674
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int width, height;
     int i, v, j;
 
a91d3658
     init_get_bits(&s->gb, buf, buf_size * 8);
1b6d6674
 
     width  = get_bits(&s->gb, 12);
     height = get_bits(&s->gb, 12);
     if (width == 0 || height == 0) {
a91d3658
         av_log(avctx, AV_LOG_WARNING,
                "Invalid horizontal or vertical size value.\n");
016c00cf
         if (avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_COMPLIANT))
1b6d6674
             return AVERROR_INVALIDDATA;
     }
     s->aspect_ratio_info = get_bits(&s->gb, 4);
     if (s->aspect_ratio_info == 0) {
         av_log(avctx, AV_LOG_ERROR, "aspect ratio has forbidden 0 value\n");
016c00cf
         if (avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_COMPLIANT))
1b6d6674
             return -1;
     }
     s->frame_rate_index = get_bits(&s->gb, 4);
     if (s->frame_rate_index == 0 || s->frame_rate_index > 13)
         return -1;
     s->bit_rate = get_bits(&s->gb, 18) * 400;
     if (get_bits1(&s->gb) == 0) /* marker */
         return -1;
     s->width  = width;
     s->height = height;
 
     s->avctx->rc_buffer_size = get_bits(&s->gb, 10) * 1024 * 16;
     skip_bits(&s->gb, 1);
 
     /* get matrix */
     if (get_bits1(&s->gb)) {
         load_matrix(s, s->chroma_intra_matrix, s->intra_matrix, 1);
     } else {
         for (i = 0; i < 64; i++) {
             j = s->dsp.idct_permutation[i];
             v = ff_mpeg1_default_intra_matrix[i];
             s->intra_matrix[j]        = v;
             s->chroma_intra_matrix[j] = v;
         }
     }
     if (get_bits1(&s->gb)) {
         load_matrix(s, s->chroma_inter_matrix, s->inter_matrix, 0);
     } else {
         for (i = 0; i < 64; i++) {
             int j = s->dsp.idct_permutation[i];
             v = ff_mpeg1_default_non_intra_matrix[i];
             s->inter_matrix[j]        = v;
             s->chroma_inter_matrix[j] = v;
         }
     }
 
     if (show_bits(&s->gb, 23) != 0) {
         av_log(s->avctx, AV_LOG_ERROR, "sequence header damaged\n");
         return -1;
     }
 
a91d3658
     /* We set MPEG-2 parameters so that it emulates MPEG-1. */
1b6d6674
     s->progressive_sequence = 1;
     s->progressive_frame    = 1;
     s->picture_structure    = PICT_FRAME;
016c00cf
     s->first_field          = 0;
1b6d6674
     s->frame_pred_frame_dct = 1;
     s->chroma_format        = 1;
a91d3658
     s->codec_id             =
     s->avctx->codec_id      = AV_CODEC_ID_MPEG1VIDEO;
1b6d6674
     s->out_format           = FMT_MPEG1;
     s->swap_uv              = 0; // AFAIK VCR2 does not have SEQ_HEADER
     if (s->flags & CODEC_FLAG_LOW_DELAY)
         s->low_delay = 1;
 
     if (s->avctx->debug & FF_DEBUG_PICT_INFO)
         av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%d\n",
                s->avctx->rc_buffer_size, s->bit_rate);
 
     return 0;
 }
 
 static int vcr2_init_sequence(AVCodecContext *avctx)
 {
a91d3658
     Mpeg1Context *s1  = avctx->priv_data;
1b6d6674
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int i, v;
 
     /* start new MPEG-1 context decoding */
     s->out_format = FMT_MPEG1;
     if (s1->mpeg_enc_ctx_allocated) {
         ff_MPV_common_end(s);
108b91c3
         s1->mpeg_enc_ctx_allocated = 0;
1b6d6674
     }
a91d3658
     s->width            = avctx->coded_width;
     s->height           = avctx->coded_height;
1b6d6674
     avctx->has_b_frames = 0; // true?
a91d3658
     s->low_delay        = 1;
1b6d6674
 
     avctx->pix_fmt = mpeg_get_pixelformat(avctx);
016c00cf
     setup_hwaccel_for_pixfmt(avctx);
1b6d6674
 
     if (ff_MPV_common_init(s) < 0)
         return -1;
     s1->mpeg_enc_ctx_allocated = 1;
 
     for (i = 0; i < 64; i++) {
         int j = s->dsp.idct_permutation[i];
         v = ff_mpeg1_default_intra_matrix[i];
         s->intra_matrix[j]        = v;
         s->chroma_intra_matrix[j] = v;
 
         v = ff_mpeg1_default_non_intra_matrix[i];
         s->inter_matrix[j]        = v;
         s->chroma_inter_matrix[j] = v;
     }
 
     s->progressive_sequence  = 1;
     s->progressive_frame     = 1;
     s->picture_structure     = PICT_FRAME;
016c00cf
     s->first_field           = 0;
1b6d6674
     s->frame_pred_frame_dct  = 1;
     s->chroma_format         = 1;
016c00cf
     if (s->codec_tag == AV_RL32("BW10")) {
         s->codec_id              = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
     } else {
         s->swap_uv = 1; // in case of xvmc we need to swap uv for each MB
         s->codec_id              = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
     }
1b6d6674
     s1->save_width           = s->width;
     s1->save_height          = s->height;
     s1->save_progressive_seq = s->progressive_sequence;
     return 0;
 }
 
1eaac1d6
 static int mpeg_decode_a53_cc(AVCodecContext *avctx,
                               const uint8_t *p, int buf_size)
 {
     Mpeg1Context *s1 = avctx->priv_data;
 
     if (buf_size >= 6 &&
         p[0] == 'G' && p[1] == 'A' && p[2] == '9' && p[3] == '4' &&
         p[4] == 3 && (p[5] & 0x40)) {
         /* extract A53 Part 4 CC data */
         int cc_count = p[5] & 0x1f;
         if (cc_count > 0 && buf_size >= 7 + cc_count * 3) {
             av_freep(&s1->a53_caption);
             s1->a53_caption_size = cc_count * 3;
a91d3658
             s1->a53_caption      = av_malloc(s1->a53_caption_size);
             if (s1->a53_caption)
1eaac1d6
                 memcpy(s1->a53_caption, p + 7, s1->a53_caption_size);
         }
         return 1;
     } else if (buf_size >= 11 &&
a91d3658
                p[0] == 'C' && p[1] == 'C' && p[2] == 0x01 && p[3] == 0xf8) {
1eaac1d6
         /* extract DVD CC data */
         int cc_count = 0;
         int i;
         // There is a caption count field in the data, but it is often
         // incorect.  So count the number of captions present.
         for (i = 5; i + 6 <= buf_size && ((p[i] & 0xfe) == 0xfe); i += 6)
             cc_count++;
         // Transform the DVD format into A53 Part 4 format
         if (cc_count > 0) {
             av_freep(&s1->a53_caption);
             s1->a53_caption_size = cc_count * 6;
a91d3658
             s1->a53_caption      = av_malloc(s1->a53_caption_size);
1eaac1d6
             if (s1->a53_caption) {
                 uint8_t field1 = !!(p[4] & 0x80);
                 uint8_t *cap = s1->a53_caption;
                 p += 5;
                 for (i = 0; i < cc_count; i++) {
                     cap[0] = (p[0] == 0xff && field1) ? 0xfc : 0xfd;
                     cap[1] = p[1];
                     cap[2] = p[2];
                     cap[3] = (p[3] == 0xff && !field1) ? 0xfc : 0xfd;
                     cap[4] = p[4];
                     cap[5] = p[5];
                     cap += 6;
                     p += 6;
                 }
             }
         }
         return 1;
     }
     return 0;
 }
 
1b6d6674
 static void mpeg_decode_user_data(AVCodecContext *avctx,
                                   const uint8_t *p, int buf_size)
 {
016c00cf
     Mpeg1Context *s = avctx->priv_data;
1b6d6674
     const uint8_t *buf_end = p + buf_size;
 
acd75053
     if (buf_size > 29){
016c00cf
         int i;
         for(i=0; i<20; i++)
acd75053
             if (!memcmp(p+i, "\0TMPGEXS\0", 9)){
016c00cf
                 s->tmpgexs= 1;
             }
 
 /*        for(i=0; !(!p[i-2] && !p[i-1] && p[i]==1) && i<buf_size; i++){
             av_log(avctx, AV_LOG_ERROR, "%c", p[i]);
         }
             av_log(avctx, AV_LOG_ERROR, "\n");*/
     }
 
1b6d6674
     /* we parse the DTG active format information */
     if (buf_end - p >= 5 &&
         p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') {
         int flags = p[4];
         p += 5;
         if (flags & 0x80) {
             /* skip event id */
             p += 2;
         }
         if (flags & 0x40) {
             if (buf_end - p < 1)
                 return;
             avctx->dtg_active_format = p[0] & 0x0f;
         }
bacc2869
     } else if (buf_end - p >= 6 &&
                p[0] == 'J' && p[1] == 'P' && p[2] == '3' && p[3] == 'D' &&
                p[4] == 0x03) { // S3D_video_format_length
         // the 0x7F mask ignores the reserved_bit value
         const uint8_t S3D_video_format_type = p[5] & 0x7F;
 
         if (S3D_video_format_type == 0x03 ||
             S3D_video_format_type == 0x04 ||
             S3D_video_format_type == 0x08 ||
             S3D_video_format_type == 0x23) {
             Mpeg1Context *s1   = avctx->priv_data;
fe285b04
 
73eca738
             s1->has_stereo3d = 1;
bacc2869
 
             switch (S3D_video_format_type) {
             case 0x03:
73eca738
                 s1->stereo3d.type = AV_STEREO3D_SIDEBYSIDE;
bacc2869
                 break;
             case 0x04:
73eca738
                 s1->stereo3d.type = AV_STEREO3D_TOPBOTTOM;
bacc2869
                 break;
             case 0x08:
73eca738
                 s1->stereo3d.type = AV_STEREO3D_2D;
bacc2869
                 break;
             case 0x23:
73eca738
                 s1->stereo3d.type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
bacc2869
                 break;
             }
         }
1eaac1d6
     } else if (mpeg_decode_a53_cc(avctx, p, buf_size)) {
         return;
1b6d6674
     }
 }
 
 static void mpeg_decode_gop(AVCodecContext *avctx,
                             const uint8_t *buf, int buf_size)
 {
     Mpeg1Context *s1  = avctx->priv_data;
     MpegEncContext *s = &s1->mpeg_enc_ctx;
     int broken_link;
016c00cf
     int64_t tc;
1b6d6674
 
a91d3658
     init_get_bits(&s->gb, buf, buf_size * 8);
1b6d6674
 
016c00cf
     tc = avctx->timecode_frame_start = get_bits(&s->gb, 25);
1b6d6674
 
016c00cf
     s->closed_gop = get_bits1(&s->gb);
a91d3658
     /* broken_link indicate that after editing the
      * reference frames of the first B-Frames after GOP I-Frame
      * are missing (open gop) */
1b6d6674
     broken_link = get_bits1(&s->gb);
 
016c00cf
     if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
         char tcbuf[AV_TIMECODE_STR_SIZE];
         av_timecode_make_mpeg_tc_string(tcbuf, tc);
         av_log(s->avctx, AV_LOG_DEBUG,
                "GOP (%s) closed_gop=%d broken_link=%d\n",
                tcbuf, s->closed_gop, broken_link);
     }
1b6d6674
 }
 
a91d3658
 static int decode_chunks(AVCodecContext *avctx, AVFrame *picture,
                          int *got_output, const uint8_t *buf, int buf_size)
1b6d6674
 {
     Mpeg1Context *s = avctx->priv_data;
     MpegEncContext *s2 = &s->mpeg_enc_ctx;
     const uint8_t *buf_ptr = buf;
     const uint8_t *buf_end = buf + buf_size;
     int ret, input_size;
bf20cdbd
     int last_code = 0, skip_frame = 0;
016c00cf
     int picture_start_code_seen = 0;
1b6d6674
 
     for (;;) {
         /* find next start code */
         uint32_t start_code = -1;
         buf_ptr = avpriv_find_start_code(buf_ptr, buf_end, &start_code);
         if (start_code > 0x1ff) {
bf20cdbd
             if (!skip_frame) {
a91d3658
                 if (HAVE_THREADS &&
                     (avctx->active_thread_type & FF_THREAD_SLICE) &&
93a51984
                     !avctx->hwaccel) {
1b6d6674
                     int i;
016c00cf
                     av_assert0(avctx->thread_count > 1);
1b6d6674
 
a91d3658
                     avctx->execute(avctx, slice_decode_thread,
                                    &s2->thread_context[0], NULL,
                                    s->slice_count, sizeof(void *));
1b6d6674
                     for (i = 0; i < s->slice_count; i++)
                         s2->er.error_count += s2->thread_context[i]->er.error_count;
                 }
 
a0c6c8e5
                 if ((CONFIG_MPEG_VDPAU_DECODER || CONFIG_MPEG1_VDPAU_DECODER)
                     && uses_vdpau(avctx))
                     ff_vdpau_mpeg_picture_complete(s2, buf, buf_size, s->slice_count);
 
1b6d6674
                 ret = slice_end(avctx, picture);
                 if (ret < 0)
                     return ret;
                 else if (ret) {
a91d3658
                     // FIXME: merge with the stuff in mpeg_decode_slice
                     if (s2->last_picture_ptr || s2->low_delay)
1b6d6674
                         *got_output = 1;
                 }
             }
             s2->pict_type = 0;
e1848aa4
 
             if (avctx->err_recognition & AV_EF_EXPLODE && s2->er.error_count)
                 return AVERROR_INVALIDDATA;
 
1b6d6674
             return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index);
         }
 
         input_size = buf_end - buf_ptr;
 
a91d3658
         if (avctx->debug & FF_DEBUG_STARTCODE)
             av_log(avctx, AV_LOG_DEBUG, "%3X at %td left %d\n",
                    start_code, buf_ptr - buf, input_size);
1b6d6674
 
         /* prepare data for next start code */
         switch (start_code) {
         case SEQ_START_CODE:
             if (last_code == 0) {
                 mpeg1_decode_sequence(avctx, buf_ptr, input_size);
acd75053
                 if (buf != avctx->extradata)
                     s->sync = 1;
1b6d6674
             } else {
a91d3658
                 av_log(avctx, AV_LOG_ERROR,
                        "ignoring SEQ_START_CODE after %X\n", last_code);
1b6d6674
                 if (avctx->err_recognition & AV_EF_EXPLODE)
                     return AVERROR_INVALIDDATA;
             }
             break;
 
         case PICTURE_START_CODE:
016c00cf
             if (picture_start_code_seen && s2->picture_structure == PICT_FRAME) {
                /* If it's a frame picture, there can't be more than one picture header.
                   Yet, it does happen and we need to handle it. */
                av_log(avctx, AV_LOG_WARNING, "ignoring extra picture following a frame-picture\n");
                break;
             }
             picture_start_code_seen = 1;
 
1b6d6674
             if (s2->width <= 0 || s2->height <= 0) {
                 av_log(avctx, AV_LOG_ERROR, "Invalid frame dimensions %dx%d.\n",
                        s2->width, s2->height);
                 return AVERROR_INVALIDDATA;
             }
 
acd75053
             if (s->tmpgexs){
016c00cf
                 s2->intra_dc_precision= 3;
                 s2->intra_matrix[0]= 1;
             }
93a51984
             if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE) &&
                 !avctx->hwaccel && s->slice_count) {
1b6d6674
                 int i;
 
                 avctx->execute(avctx, slice_decode_thread,
                                s2->thread_context, NULL,
a91d3658
                                s->slice_count, sizeof(void *));
1b6d6674
                 for (i = 0; i < s->slice_count; i++)
                     s2->er.error_count += s2->thread_context[i]->er.error_count;
                 s->slice_count = 0;
             }
             if (last_code == 0 || last_code == SLICE_MIN_START_CODE) {
                 ret = mpeg_decode_postinit(avctx);
                 if (ret < 0) {
a91d3658
                     av_log(avctx, AV_LOG_ERROR,
                            "mpeg_decode_postinit() failure\n");
1b6d6674
                     return ret;
                 }
 
a91d3658
                 /* We have a complete image: we try to decompress it. */
1b6d6674
                 if (mpeg1_decode_picture(avctx, buf_ptr, input_size) < 0)
                     s2->pict_type = 0;
a097f004
                 s->first_slice = 1;
a91d3658
                 last_code      = PICTURE_START_CODE;
1b6d6674
             } else {
a91d3658
                 av_log(avctx, AV_LOG_ERROR,
                        "ignoring pic after %X\n", last_code);
1b6d6674
                 if (avctx->err_recognition & AV_EF_EXPLODE)
                     return AVERROR_INVALIDDATA;
             }
             break;
         case EXT_START_CODE:
a91d3658
             init_get_bits(&s2->gb, buf_ptr, input_size * 8);
1b6d6674
 
             switch (get_bits(&s2->gb, 4)) {
             case 0x1:
                 if (last_code == 0) {
a91d3658
                     mpeg_decode_sequence_extension(s);
1b6d6674
                 } else {
a91d3658
                     av_log(avctx, AV_LOG_ERROR,
                            "ignoring seq ext after %X\n", last_code);
1b6d6674
                     if (avctx->err_recognition & AV_EF_EXPLODE)
                         return AVERROR_INVALIDDATA;
                 }
                 break;
             case 0x2:
                 mpeg_decode_sequence_display_extension(s);
                 break;
             case 0x3:
                 mpeg_decode_quant_matrix_extension(s2);
                 break;
             case 0x7:
                 mpeg_decode_picture_display_extension(s);
                 break;
             case 0x8:
                 if (last_code == PICTURE_START_CODE) {
                     mpeg_decode_picture_coding_extension(s);
                 } else {
a91d3658
                     av_log(avctx, AV_LOG_ERROR,
                            "ignoring pic cod ext after %X\n", last_code);
1b6d6674
                     if (avctx->err_recognition & AV_EF_EXPLODE)
                         return AVERROR_INVALIDDATA;
                 }
                 break;
             }
             break;
         case USER_START_CODE:
             mpeg_decode_user_data(avctx, buf_ptr, input_size);
             break;
         case GOP_START_CODE:
             if (last_code == 0) {
a91d3658
                 s2->first_field = 0;
1b6d6674
                 mpeg_decode_gop(avctx, buf_ptr, input_size);
a91d3658
                 s->sync = 1;
1b6d6674
             } else {
a91d3658
                 av_log(avctx, AV_LOG_ERROR,
                        "ignoring GOP_START_CODE after %X\n", last_code);
1b6d6674
                 if (avctx->err_recognition & AV_EF_EXPLODE)
                     return AVERROR_INVALIDDATA;
             }
             break;
         default:
             if (start_code >= SLICE_MIN_START_CODE &&
016c00cf
                 start_code <= SLICE_MAX_START_CODE && last_code == PICTURE_START_CODE) {
                 if (s2->progressive_sequence && !s2->progressive_frame) {
                     s2->progressive_frame = 1;
acd75053
                     av_log(s2->avctx, AV_LOG_ERROR,
                            "interlaced frame in progressive sequence, ignoring\n");
016c00cf
                 }
 
acd75053
                 if (s2->picture_structure == 0 ||
                     (s2->progressive_frame && s2->picture_structure != PICT_FRAME)) {
                     av_log(s2->avctx, AV_LOG_ERROR,
                            "picture_structure %d invalid, ignoring\n",
                            s2->picture_structure);
016c00cf
                     s2->picture_structure = PICT_FRAME;
                 }
 
acd75053
                 if (s2->progressive_sequence && !s2->frame_pred_frame_dct)
016c00cf
                     av_log(s2->avctx, AV_LOG_WARNING, "invalid frame_pred_frame_dct\n");
 
                 if (s2->picture_structure == PICT_FRAME) {
                     s2->first_field = 0;
                     s2->v_edge_pos  = 16 * s2->mb_height;
                 } else {
                     s2->first_field ^= 1;
                     s2->v_edge_pos   = 8 * s2->mb_height;
                     memset(s2->mbskip_table, 0, s2->mb_stride * s2->mb_height);
                 }
             }
             if (start_code >= SLICE_MIN_START_CODE &&
1b6d6674
                 start_code <= SLICE_MAX_START_CODE && last_code != 0) {
                 const int field_pic = s2->picture_structure != PICT_FRAME;
016c00cf
                 int mb_y = start_code - SLICE_MIN_START_CODE;
1b6d6674
                 last_code = SLICE_MIN_START_CODE;
acd75053
                 if (s2->codec_id != AV_CODEC_ID_MPEG1VIDEO && s2->mb_height > 2800/16)
016c00cf
                     mb_y += (*buf_ptr&0xE0)<<2;
1b6d6674
 
016c00cf
                 mb_y <<= field_pic;
1b6d6674
                 if (s2->picture_structure == PICT_BOTTOM_FIELD)
                     mb_y++;
 
97064019
                 if (buf_end - buf_ptr < 2) {
                     av_log(s2->avctx, AV_LOG_ERROR, "slice too small\n");
                     return AVERROR_INVALIDDATA;
                 }
 
1b6d6674
                 if (mb_y >= s2->mb_height) {
a91d3658
                     av_log(s2->avctx, AV_LOG_ERROR,
                            "slice below image (%d >= %d)\n", mb_y, s2->mb_height);
1b6d6674
                     return -1;
                 }
 
                 if (s2->last_picture_ptr == NULL) {
a91d3658
                     /* Skip B-frames if we do not have reference frames and
                      * GOP is not closed. */
1b6d6674
                     if (s2->pict_type == AV_PICTURE_TYPE_B) {
200ef1e3
                         if (!s2->closed_gop) {
bf20cdbd
                             skip_frame = 1;
1b6d6674
                             break;
bf20cdbd
                         }
1b6d6674
                     }
                 }
016c00cf
                 if (s2->pict_type == AV_PICTURE_TYPE_I || (s2->flags2 & CODEC_FLAG2_SHOW_ALL))
a91d3658
                     s->sync = 1;
1b6d6674
                 if (s2->next_picture_ptr == NULL) {
a91d3658
                     /* Skip P-frames if we do not have a reference frame or
                      * we have an invalid header. */
bf20cdbd
                     if (s2->pict_type == AV_PICTURE_TYPE_P && !s->sync) {
                         skip_frame = 1;
                         break;
                     }
1b6d6674
                 }
a91d3658
                 if ((avctx->skip_frame >= AVDISCARD_NONREF &&
                      s2->pict_type == AV_PICTURE_TYPE_B) ||
                     (avctx->skip_frame >= AVDISCARD_NONKEY &&
                      s2->pict_type != AV_PICTURE_TYPE_I) ||
                     avctx->skip_frame >= AVDISCARD_ALL) {
bf20cdbd
                     skip_frame = 1;
1b6d6674
                     break;
bf20cdbd
                 }
1b6d6674
 
                 if (!s->mpeg_enc_ctx_allocated)
                     break;
 
                 if (s2->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
a91d3658
                     if (mb_y < avctx->skip_top ||
                         mb_y >= s2->mb_height - avctx->skip_bottom)
1b6d6674
                         break;
                 }
 
                 if (!s2->pict_type) {
                     av_log(avctx, AV_LOG_ERROR, "Missing picture start code\n");
                     if (avctx->err_recognition & AV_EF_EXPLODE)
                         return AVERROR_INVALIDDATA;
                     break;
                 }
 
a097f004
                 if (s->first_slice) {
a91d3658
                     skip_frame     = 0;
a097f004
                     s->first_slice = 0;
1b6d6674
                     if (mpeg_field_start(s2, buf, buf_size) < 0)
                         return -1;
                 }
                 if (!s2->current_picture_ptr) {
a91d3658
                     av_log(avctx, AV_LOG_ERROR,
                            "current_picture not initialized\n");
1b6d6674
                     return AVERROR_INVALIDDATA;
                 }
 
a0c6c8e5
                 if (uses_vdpau(avctx)) {
                     s->slice_count++;
                     break;
                 }
 
a91d3658
                 if (HAVE_THREADS &&
                     (avctx->active_thread_type & FF_THREAD_SLICE) &&
93a51984
                     !avctx->hwaccel) {
1b6d6674
                     int threshold = (s2->mb_height * s->slice_count +
                                      s2->slice_context_count / 2) /
                                     s2->slice_context_count;
016c00cf
                     av_assert0(avctx->thread_count > 1);
1b6d6674
                     if (threshold <= mb_y) {
                         MpegEncContext *thread_context = s2->thread_context[s->slice_count];
 
                         thread_context->start_mb_y = mb_y;
                         thread_context->end_mb_y   = s2->mb_height;
                         if (s->slice_count) {
a91d3658
                             s2->thread_context[s->slice_count - 1]->end_mb_y = mb_y;
                             ret = ff_update_duplicate_context(thread_context, s2);
1b6d6674
                             if (ret < 0)
                                 return ret;
                         }
a91d3658
                         init_get_bits(&thread_context->gb, buf_ptr, input_size * 8);
1b6d6674
                         s->slice_count++;
                     }
                     buf_ptr += 2; // FIXME add minimum number of bytes per slice
                 } else {
                     ret = mpeg_decode_slice(s2, mb_y, &buf_ptr, input_size);
                     emms_c();
 
                     if (ret < 0) {
                         if (avctx->err_recognition & AV_EF_EXPLODE)
                             return ret;
                         if (s2->resync_mb_x >= 0 && s2->resync_mb_y >= 0)
a91d3658
                             ff_er_add_slice(&s2->er, s2->resync_mb_x,
                                             s2->resync_mb_y, s2->mb_x, s2->mb_y,
                                             ER_AC_ERROR | ER_DC_ERROR | ER_MV_ERROR);
1b6d6674
                     } else {
a91d3658
                         ff_er_add_slice(&s2->er, s2->resync_mb_x,
                                         s2->resync_mb_y, s2->mb_x - 1, s2->mb_y,
                                         ER_AC_END | ER_DC_END | ER_MV_END);
1b6d6674
                     }
                 }
             }
             break;
         }
     }
 }
 
a91d3658
 static int mpeg_decode_frame(AVCodecContext *avctx, void *data,
                              int *got_output, AVPacket *avpkt)
1b6d6674
 {
     const uint8_t *buf = avpkt->data;
016c00cf
     int ret;
1b6d6674
     int buf_size = avpkt->size;
     Mpeg1Context *s = avctx->priv_data;
     AVFrame *picture = data;
     MpegEncContext *s2 = &s->mpeg_enc_ctx;
     av_dlog(avctx, "fill_buffer\n");
 
     if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) {
         /* special case for last picture */
         if (s2->low_delay == 0 && s2->next_picture_ptr) {
             int ret = av_frame_ref(picture, &s2->next_picture_ptr->f);
             if (ret < 0)
                 return ret;
 
             s2->next_picture_ptr = NULL;
 
             *got_output = 1;
         }
         return buf_size;
     }
 
     if (s2->flags & CODEC_FLAG_TRUNCATED) {
a91d3658
         int next = ff_mpeg1_find_frame_end(&s2->parse_context, buf,
                                            buf_size, NULL);
1b6d6674
 
a91d3658
         if (ff_combine_frame(&s2->parse_context, next,
                              (const uint8_t **) &buf, &buf_size) < 0)
1b6d6674
             return buf_size;
     }
 
016c00cf
     s2->codec_tag = avpriv_toupper4(avctx->codec_tag);
     if (s->mpeg_enc_ctx_allocated == 0 && (   s2->codec_tag == AV_RL32("VCR2")
                                            || s2->codec_tag == AV_RL32("BW10")
                                           ))
1b6d6674
         vcr2_init_sequence(avctx);
 
     s->slice_count = 0;
 
     if (avctx->extradata && !s->extradata_decoded) {
acd75053
         ret = decode_chunks(avctx, picture, got_output,
                             avctx->extradata, avctx->extradata_size);
         if (*got_output) {
016c00cf
             av_log(avctx, AV_LOG_ERROR, "picture in extradata\n");
             *got_output = 0;
         }
1b6d6674
         s->extradata_decoded = 1;
016c00cf
         if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) {
             s2->current_picture_ptr = NULL;
1b6d6674
             return ret;
016c00cf
         }
1b6d6674
     }
 
016c00cf
     ret = decode_chunks(avctx, picture, got_output, buf, buf_size);
     if (ret<0 || *got_output)
         s2->current_picture_ptr = NULL;
 
     return ret;
1b6d6674
 }
 
 static void flush(AVCodecContext *avctx)
 {
     Mpeg1Context *s = avctx->priv_data;
 
a91d3658
     s->sync       = 0;
1b6d6674
 
     ff_mpeg_flush(avctx);
 }
 
bd8ac882
 static av_cold int mpeg_decode_end(AVCodecContext *avctx)
1b6d6674
 {
     Mpeg1Context *s = avctx->priv_data;
 
     if (s->mpeg_enc_ctx_allocated)
         ff_MPV_common_end(&s->mpeg_enc_ctx);
1eaac1d6
     av_freep(&s->a53_caption);
1b6d6674
     return 0;
 }
 
 static const AVProfile mpeg2_video_profiles[] = {
     { FF_PROFILE_MPEG2_422,          "4:2:2"              },
     { FF_PROFILE_MPEG2_HIGH,         "High"               },
     { FF_PROFILE_MPEG2_SS,           "Spatially Scalable" },
     { FF_PROFILE_MPEG2_SNR_SCALABLE, "SNR Scalable"       },
     { FF_PROFILE_MPEG2_MAIN,         "Main"               },
     { FF_PROFILE_MPEG2_SIMPLE,       "Simple"             },
     { FF_PROFILE_RESERVED,           "Reserved"           },
     { FF_PROFILE_RESERVED,           "Reserved"           },
a91d3658
     { FF_PROFILE_UNKNOWN                                  },
1b6d6674
 };
 
 AVCodec ff_mpeg1video_decoder = {
     .name                  = "mpeg1video",
b2bed932
     .long_name             = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
1b6d6674
     .type                  = AVMEDIA_TYPE_VIDEO,
     .id                    = AV_CODEC_ID_MPEG1VIDEO,
     .priv_data_size        = sizeof(Mpeg1Context),
     .init                  = mpeg_decode_init,
     .close                 = mpeg_decode_end,
     .decode                = mpeg_decode_frame,
     .capabilities          = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
                              CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
                              CODEC_CAP_SLICE_THREADS,
     .flush                 = flush,
016c00cf
     .max_lowres            = 3,
1b6d6674
     .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context)
 };
 
 AVCodec ff_mpeg2video_decoder = {
     .name           = "mpeg2video",
b2bed932
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-2 video"),
1b6d6674
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG2VIDEO,
     .priv_data_size = sizeof(Mpeg1Context),
     .init           = mpeg_decode_init,
     .close          = mpeg_decode_end,
     .decode         = mpeg_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
                       CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
                       CODEC_CAP_SLICE_THREADS,
     .flush          = flush,
016c00cf
     .max_lowres     = 3,
1b6d6674
     .profiles       = NULL_IF_CONFIG_SMALL(mpeg2_video_profiles),
 };
 
016c00cf
 //legacy decoder
 AVCodec ff_mpegvideo_decoder = {
     .name           = "mpegvideo",
b46f1910
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
016c00cf
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG2VIDEO,
     .priv_data_size = sizeof(Mpeg1Context),
     .init           = mpeg_decode_init,
     .close          = mpeg_decode_end,
     .decode         = mpeg_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS,
     .flush          = flush,
     .max_lowres     = 3,
 };
 
19e30a58
 #if FF_API_XVMC
1b6d6674
 #if CONFIG_MPEG_XVMC_DECODER
 static av_cold int mpeg_mc_decode_init(AVCodecContext *avctx)
 {
     if (avctx->active_thread_type & FF_THREAD_SLICE)
         return -1;
     if (!(avctx->slice_flags & SLICE_FLAG_CODED_ORDER))
         return -1;
     if (!(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) {
         av_dlog(avctx, "mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n");
     }
     mpeg_decode_init(avctx);
 
     avctx->pix_fmt           = AV_PIX_FMT_XVMC_MPEG2_IDCT;
     avctx->xvmc_acceleration = 2; // 2 - the blocks are packed!
 
     return 0;
 }
 
 AVCodec ff_mpeg_xvmc_decoder = {
     .name           = "mpegvideo_xvmc",
b2bed932
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-1/2 video XvMC (X-Video Motion Compensation)"),
1b6d6674
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG2VIDEO_XVMC,
     .priv_data_size = sizeof(Mpeg1Context),
     .init           = mpeg_mc_decode_init,
     .close          = mpeg_decode_end,
     .decode         = mpeg_decode_frame,
     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
a91d3658
                       CODEC_CAP_TRUNCATED | CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
1b6d6674
     .flush          = flush,
 };
 
 #endif
19e30a58
 #endif /* FF_API_XVMC */
a0c6c8e5
 
 #if CONFIG_MPEG_VDPAU_DECODER
 AVCodec ff_mpeg_vdpau_decoder = {
     .name           = "mpegvideo_vdpau",
b46f1910
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-1/2 video (VDPAU acceleration)"),
a0c6c8e5
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG2VIDEO,
     .priv_data_size = sizeof(Mpeg1Context),
     .init           = mpeg_decode_init,
     .close          = mpeg_decode_end,
     .decode         = mpeg_decode_frame,
     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED |
                       CODEC_CAP_HWACCEL_VDPAU | CODEC_CAP_DELAY,
     .flush          = flush,
 };
 #endif
 
 #if CONFIG_MPEG1_VDPAU_DECODER
 AVCodec ff_mpeg1_vdpau_decoder = {
     .name           = "mpeg1video_vdpau",
b46f1910
     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-1 video (VDPAU acceleration)"),
a0c6c8e5
     .type           = AVMEDIA_TYPE_VIDEO,
     .id             = AV_CODEC_ID_MPEG1VIDEO,
     .priv_data_size = sizeof(Mpeg1Context),
     .init           = mpeg_decode_init,
     .close          = mpeg_decode_end,
     .decode         = mpeg_decode_frame,
     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED |
                       CODEC_CAP_HWACCEL_VDPAU | CODEC_CAP_DELAY,
     .flush          = flush,
 };
 #endif