annotate ffmpeg/libavcodec/mpeg12dec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * MPEG-1/2 decoder
yading@10 3 * Copyright (c) 2000, 2001 Fabrice Bellard
yading@10 4 * Copyright (c) 2002-2013 Michael Niedermayer <michaelni@gmx.at>
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 /**
yading@10 24 * @file
yading@10 25 * MPEG-1/2 decoder
yading@10 26 */
yading@10 27
yading@10 28 //#define DEBUG
yading@10 29 #include "libavutil/internal.h"
yading@10 30 #include "internal.h"
yading@10 31 #include "avcodec.h"
yading@10 32 #include "dsputil.h"
yading@10 33 #include "mpegvideo.h"
yading@10 34 #include "error_resilience.h"
yading@10 35 #include "mpeg12.h"
yading@10 36 #include "mpeg12data.h"
yading@10 37 #include "mpeg12decdata.h"
yading@10 38 #include "bytestream.h"
yading@10 39 #include "vdpau_internal.h"
yading@10 40 #include "xvmc_internal.h"
yading@10 41 #include "thread.h"
yading@10 42
yading@10 43 typedef struct Mpeg1Context {
yading@10 44 MpegEncContext mpeg_enc_ctx;
yading@10 45 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
yading@10 46 int repeat_field; /* true if we must repeat the field */
yading@10 47 AVPanScan pan_scan; /**< some temporary storage for the panscan */
yading@10 48 int slice_count;
yading@10 49 int swap_uv;//indicate VCR2
yading@10 50 int save_aspect_info;
yading@10 51 int save_width, save_height, save_progressive_seq;
yading@10 52 AVRational frame_rate_ext; ///< MPEG-2 specific framerate modificator
yading@10 53 int sync; ///< Did we reach a sync point like a GOP/SEQ/KEYFrame?
yading@10 54 int tmpgexs;
yading@10 55 int extradata_decoded;
yading@10 56 } Mpeg1Context;
yading@10 57
yading@10 58 /* as H.263, but only 17 codes */
yading@10 59 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred)
yading@10 60 {
yading@10 61 int code, sign, val, shift;
yading@10 62
yading@10 63 code = get_vlc2(&s->gb, ff_mv_vlc.table, MV_VLC_BITS, 2);
yading@10 64 if (code == 0) {
yading@10 65 return pred;
yading@10 66 }
yading@10 67 if (code < 0) {
yading@10 68 return 0xffff;
yading@10 69 }
yading@10 70
yading@10 71 sign = get_bits1(&s->gb);
yading@10 72 shift = fcode - 1;
yading@10 73 val = code;
yading@10 74 if (shift) {
yading@10 75 val = (val - 1) << shift;
yading@10 76 val |= get_bits(&s->gb, shift);
yading@10 77 val++;
yading@10 78 }
yading@10 79 if (sign)
yading@10 80 val = -val;
yading@10 81 val += pred;
yading@10 82
yading@10 83 /* modulo decoding */
yading@10 84 return sign_extend(val, 5 + shift);
yading@10 85 }
yading@10 86
yading@10 87 static inline int mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
yading@10 88 {
yading@10 89 int level, dc, diff, i, j, run;
yading@10 90 int component;
yading@10 91 RLTable *rl = &ff_rl_mpeg1;
yading@10 92 uint8_t * const scantable = s->intra_scantable.permutated;
yading@10 93 const uint16_t *quant_matrix = s->intra_matrix;
yading@10 94 const int qscale = s->qscale;
yading@10 95
yading@10 96 /* DC coefficient */
yading@10 97 component = (n <= 3 ? 0 : n - 4 + 1);
yading@10 98 diff = decode_dc(&s->gb, component);
yading@10 99 if (diff >= 0xffff)
yading@10 100 return -1;
yading@10 101 dc = s->last_dc[component];
yading@10 102 dc += diff;
yading@10 103 s->last_dc[component] = dc;
yading@10 104 block[0] = dc * quant_matrix[0];
yading@10 105 av_dlog(s->avctx, "dc=%d diff=%d\n", dc, diff);
yading@10 106 i = 0;
yading@10 107 {
yading@10 108 OPEN_READER(re, &s->gb);
yading@10 109 /* now quantify & encode AC coefficients */
yading@10 110 for (;;) {
yading@10 111 UPDATE_CACHE(re, &s->gb);
yading@10 112 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 113
yading@10 114 if (level == 127) {
yading@10 115 break;
yading@10 116 } else if (level != 0) {
yading@10 117 i += run;
yading@10 118 j = scantable[i];
yading@10 119 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 120 level = (level - 1) | 1;
yading@10 121 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 122 LAST_SKIP_BITS(re, &s->gb, 1);
yading@10 123 } else {
yading@10 124 /* escape */
yading@10 125 run = SHOW_UBITS(re, &s->gb, 6) + 1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 126 UPDATE_CACHE(re, &s->gb);
yading@10 127 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
yading@10 128 if (level == -128) {
yading@10 129 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8);
yading@10 130 } else if (level == 0) {
yading@10 131 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8);
yading@10 132 }
yading@10 133 i += run;
yading@10 134 j = scantable[i];
yading@10 135 if (level < 0) {
yading@10 136 level = -level;
yading@10 137 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 138 level = (level - 1) | 1;
yading@10 139 level = -level;
yading@10 140 } else {
yading@10 141 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 142 level = (level - 1) | 1;
yading@10 143 }
yading@10 144 }
yading@10 145 if (i > 63) {
yading@10 146 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
yading@10 147 return -1;
yading@10 148 }
yading@10 149
yading@10 150 block[j] = level;
yading@10 151 }
yading@10 152 CLOSE_READER(re, &s->gb);
yading@10 153 }
yading@10 154 s->block_last_index[n] = i;
yading@10 155 return 0;
yading@10 156 }
yading@10 157
yading@10 158 int ff_mpeg1_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
yading@10 159 {
yading@10 160 return mpeg1_decode_block_intra(s, block, n);
yading@10 161 }
yading@10 162
yading@10 163 static inline int mpeg1_decode_block_inter(MpegEncContext *s, int16_t *block, int n)
yading@10 164 {
yading@10 165 int level, i, j, run;
yading@10 166 RLTable *rl = &ff_rl_mpeg1;
yading@10 167 uint8_t * const scantable = s->intra_scantable.permutated;
yading@10 168 const uint16_t *quant_matrix = s->inter_matrix;
yading@10 169 const int qscale = s->qscale;
yading@10 170
yading@10 171 {
yading@10 172 OPEN_READER(re, &s->gb);
yading@10 173 i = -1;
yading@10 174 // special case for first coefficient, no need to add second VLC table
yading@10 175 UPDATE_CACHE(re, &s->gb);
yading@10 176 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
yading@10 177 level = (3 * qscale * quant_matrix[0]) >> 5;
yading@10 178 level = (level - 1) | 1;
yading@10 179 if (GET_CACHE(re, &s->gb) & 0x40000000)
yading@10 180 level = -level;
yading@10 181 block[0] = level;
yading@10 182 i++;
yading@10 183 SKIP_BITS(re, &s->gb, 2);
yading@10 184 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 185 goto end;
yading@10 186 }
yading@10 187 /* now quantify & encode AC coefficients */
yading@10 188 for (;;) {
yading@10 189 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 190
yading@10 191 if (level != 0) {
yading@10 192 i += run;
yading@10 193 j = scantable[i];
yading@10 194 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
yading@10 195 level = (level - 1) | 1;
yading@10 196 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 197 SKIP_BITS(re, &s->gb, 1);
yading@10 198 } else {
yading@10 199 /* escape */
yading@10 200 run = SHOW_UBITS(re, &s->gb, 6) + 1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 201 UPDATE_CACHE(re, &s->gb);
yading@10 202 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
yading@10 203 if (level == -128) {
yading@10 204 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8);
yading@10 205 } else if (level == 0) {
yading@10 206 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8);
yading@10 207 }
yading@10 208 i += run;
yading@10 209 j = scantable[i];
yading@10 210 if (level < 0) {
yading@10 211 level = -level;
yading@10 212 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
yading@10 213 level = (level - 1) | 1;
yading@10 214 level = -level;
yading@10 215 } else {
yading@10 216 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
yading@10 217 level = (level - 1) | 1;
yading@10 218 }
yading@10 219 }
yading@10 220 if (i > 63) {
yading@10 221 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
yading@10 222 return -1;
yading@10 223 }
yading@10 224
yading@10 225 block[j] = level;
yading@10 226 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 227 break;
yading@10 228 UPDATE_CACHE(re, &s->gb);
yading@10 229 }
yading@10 230 end:
yading@10 231 LAST_SKIP_BITS(re, &s->gb, 2);
yading@10 232 CLOSE_READER(re, &s->gb);
yading@10 233 }
yading@10 234 s->block_last_index[n] = i;
yading@10 235 return 0;
yading@10 236 }
yading@10 237
yading@10 238 /**
yading@10 239 * Note: this function can read out of range and crash for corrupt streams.
yading@10 240 * Changing this would eat up any speed benefits it has.
yading@10 241 * Do not use "fast" flag if you need the code to be robust.
yading@10 242 */
yading@10 243 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, int16_t *block, int n)
yading@10 244 {
yading@10 245 int level, i, j, run;
yading@10 246 RLTable *rl = &ff_rl_mpeg1;
yading@10 247 uint8_t * const scantable = s->intra_scantable.permutated;
yading@10 248 const int qscale = s->qscale;
yading@10 249
yading@10 250 {
yading@10 251 OPEN_READER(re, &s->gb);
yading@10 252 i = -1;
yading@10 253 // special case for first coefficient, no need to add second VLC table
yading@10 254 UPDATE_CACHE(re, &s->gb);
yading@10 255 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
yading@10 256 level = (3 * qscale) >> 1;
yading@10 257 level = (level - 1) | 1;
yading@10 258 if (GET_CACHE(re, &s->gb) & 0x40000000)
yading@10 259 level = -level;
yading@10 260 block[0] = level;
yading@10 261 i++;
yading@10 262 SKIP_BITS(re, &s->gb, 2);
yading@10 263 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 264 goto end;
yading@10 265 }
yading@10 266
yading@10 267 /* now quantify & encode AC coefficients */
yading@10 268 for (;;) {
yading@10 269 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 270
yading@10 271 if (level != 0) {
yading@10 272 i += run;
yading@10 273 j = scantable[i];
yading@10 274 level = ((level * 2 + 1) * qscale) >> 1;
yading@10 275 level = (level - 1) | 1;
yading@10 276 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 277 SKIP_BITS(re, &s->gb, 1);
yading@10 278 } else {
yading@10 279 /* escape */
yading@10 280 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 281 UPDATE_CACHE(re, &s->gb);
yading@10 282 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8);
yading@10 283 if (level == -128) {
yading@10 284 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8);
yading@10 285 } else if (level == 0) {
yading@10 286 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8);
yading@10 287 }
yading@10 288 i += run;
yading@10 289 j = scantable[i];
yading@10 290 if (level < 0) {
yading@10 291 level = -level;
yading@10 292 level = ((level * 2 + 1) * qscale) >> 1;
yading@10 293 level = (level - 1) | 1;
yading@10 294 level = -level;
yading@10 295 } else {
yading@10 296 level = ((level * 2 + 1) * qscale) >> 1;
yading@10 297 level = (level - 1) | 1;
yading@10 298 }
yading@10 299 }
yading@10 300
yading@10 301 block[j] = level;
yading@10 302 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 303 break;
yading@10 304 UPDATE_CACHE(re, &s->gb);
yading@10 305 }
yading@10 306 end:
yading@10 307 LAST_SKIP_BITS(re, &s->gb, 2);
yading@10 308 CLOSE_READER(re, &s->gb);
yading@10 309 }
yading@10 310 s->block_last_index[n] = i;
yading@10 311 return 0;
yading@10 312 }
yading@10 313
yading@10 314
yading@10 315 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, int16_t *block, int n)
yading@10 316 {
yading@10 317 int level, i, j, run;
yading@10 318 RLTable *rl = &ff_rl_mpeg1;
yading@10 319 uint8_t * const scantable = s->intra_scantable.permutated;
yading@10 320 const uint16_t *quant_matrix;
yading@10 321 const int qscale = s->qscale;
yading@10 322 int mismatch;
yading@10 323
yading@10 324 mismatch = 1;
yading@10 325
yading@10 326 {
yading@10 327 OPEN_READER(re, &s->gb);
yading@10 328 i = -1;
yading@10 329 if (n < 4)
yading@10 330 quant_matrix = s->inter_matrix;
yading@10 331 else
yading@10 332 quant_matrix = s->chroma_inter_matrix;
yading@10 333
yading@10 334 // special case for first coefficient, no need to add second VLC table
yading@10 335 UPDATE_CACHE(re, &s->gb);
yading@10 336 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
yading@10 337 level= (3 * qscale * quant_matrix[0]) >> 5;
yading@10 338 if (GET_CACHE(re, &s->gb) & 0x40000000)
yading@10 339 level = -level;
yading@10 340 block[0] = level;
yading@10 341 mismatch ^= level;
yading@10 342 i++;
yading@10 343 SKIP_BITS(re, &s->gb, 2);
yading@10 344 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 345 goto end;
yading@10 346 }
yading@10 347
yading@10 348 /* now quantify & encode AC coefficients */
yading@10 349 for (;;) {
yading@10 350 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 351
yading@10 352 if (level != 0) {
yading@10 353 i += run;
yading@10 354 j = scantable[i];
yading@10 355 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
yading@10 356 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 357 SKIP_BITS(re, &s->gb, 1);
yading@10 358 } else {
yading@10 359 /* escape */
yading@10 360 run = SHOW_UBITS(re, &s->gb, 6) + 1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 361 UPDATE_CACHE(re, &s->gb);
yading@10 362 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
yading@10 363
yading@10 364 i += run;
yading@10 365 j = scantable[i];
yading@10 366 if (level < 0) {
yading@10 367 level = ((-level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
yading@10 368 level = -level;
yading@10 369 } else {
yading@10 370 level = ((level * 2 + 1) * qscale * quant_matrix[j]) >> 5;
yading@10 371 }
yading@10 372 }
yading@10 373 if (i > 63) {
yading@10 374 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
yading@10 375 return -1;
yading@10 376 }
yading@10 377
yading@10 378 mismatch ^= level;
yading@10 379 block[j] = level;
yading@10 380 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 381 break;
yading@10 382 UPDATE_CACHE(re, &s->gb);
yading@10 383 }
yading@10 384 end:
yading@10 385 LAST_SKIP_BITS(re, &s->gb, 2);
yading@10 386 CLOSE_READER(re, &s->gb);
yading@10 387 }
yading@10 388 block[63] ^= (mismatch & 1);
yading@10 389
yading@10 390 s->block_last_index[n] = i;
yading@10 391 return 0;
yading@10 392 }
yading@10 393
yading@10 394 /**
yading@10 395 * Note: this function can read out of range and crash for corrupt streams.
yading@10 396 * Changing this would eat up any speed benefits it has.
yading@10 397 * Do not use "fast" flag if you need the code to be robust.
yading@10 398 */
yading@10 399 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s,
yading@10 400 int16_t *block, int n)
yading@10 401 {
yading@10 402 int level, i, j, run;
yading@10 403 RLTable *rl = &ff_rl_mpeg1;
yading@10 404 uint8_t * const scantable = s->intra_scantable.permutated;
yading@10 405 const int qscale = s->qscale;
yading@10 406 OPEN_READER(re, &s->gb);
yading@10 407 i = -1;
yading@10 408
yading@10 409 // special case for first coefficient, no need to add second VLC table
yading@10 410 UPDATE_CACHE(re, &s->gb);
yading@10 411 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) {
yading@10 412 level = (3 * qscale) >> 1;
yading@10 413 if (GET_CACHE(re, &s->gb) & 0x40000000)
yading@10 414 level = -level;
yading@10 415 block[0] = level;
yading@10 416 i++;
yading@10 417 SKIP_BITS(re, &s->gb, 2);
yading@10 418 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 419 goto end;
yading@10 420 }
yading@10 421
yading@10 422 /* now quantify & encode AC coefficients */
yading@10 423 for (;;) {
yading@10 424 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 425
yading@10 426 if (level != 0) {
yading@10 427 i += run;
yading@10 428 j = scantable[i];
yading@10 429 level = ((level * 2 + 1) * qscale) >> 1;
yading@10 430 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 431 SKIP_BITS(re, &s->gb, 1);
yading@10 432 } else {
yading@10 433 /* escape */
yading@10 434 run = SHOW_UBITS(re, &s->gb, 6) + 1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 435 UPDATE_CACHE(re, &s->gb);
yading@10 436 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
yading@10 437
yading@10 438 i += run;
yading@10 439 j = scantable[i];
yading@10 440 if (level < 0) {
yading@10 441 level = ((-level * 2 + 1) * qscale) >> 1;
yading@10 442 level = -level;
yading@10 443 } else {
yading@10 444 level = ((level * 2 + 1) * qscale) >> 1;
yading@10 445 }
yading@10 446 }
yading@10 447
yading@10 448 block[j] = level;
yading@10 449 if (((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF)
yading@10 450 break;
yading@10 451 UPDATE_CACHE(re, &s->gb);
yading@10 452 }
yading@10 453 end:
yading@10 454 LAST_SKIP_BITS(re, &s->gb, 2);
yading@10 455 CLOSE_READER(re, &s->gb);
yading@10 456 s->block_last_index[n] = i;
yading@10 457 return 0;
yading@10 458 }
yading@10 459
yading@10 460
yading@10 461 static inline int mpeg2_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
yading@10 462 {
yading@10 463 int level, dc, diff, i, j, run;
yading@10 464 int component;
yading@10 465 RLTable *rl;
yading@10 466 uint8_t * const scantable = s->intra_scantable.permutated;
yading@10 467 const uint16_t *quant_matrix;
yading@10 468 const int qscale = s->qscale;
yading@10 469 int mismatch;
yading@10 470
yading@10 471 /* DC coefficient */
yading@10 472 if (n < 4) {
yading@10 473 quant_matrix = s->intra_matrix;
yading@10 474 component = 0;
yading@10 475 } else {
yading@10 476 quant_matrix = s->chroma_intra_matrix;
yading@10 477 component = (n & 1) + 1;
yading@10 478 }
yading@10 479 diff = decode_dc(&s->gb, component);
yading@10 480 if (diff >= 0xffff)
yading@10 481 return -1;
yading@10 482 dc = s->last_dc[component];
yading@10 483 dc += diff;
yading@10 484 s->last_dc[component] = dc;
yading@10 485 block[0] = dc << (3 - s->intra_dc_precision);
yading@10 486 av_dlog(s->avctx, "dc=%d\n", block[0]);
yading@10 487 mismatch = block[0] ^ 1;
yading@10 488 i = 0;
yading@10 489 if (s->intra_vlc_format)
yading@10 490 rl = &ff_rl_mpeg2;
yading@10 491 else
yading@10 492 rl = &ff_rl_mpeg1;
yading@10 493
yading@10 494 {
yading@10 495 OPEN_READER(re, &s->gb);
yading@10 496 /* now quantify & encode AC coefficients */
yading@10 497 for (;;) {
yading@10 498 UPDATE_CACHE(re, &s->gb);
yading@10 499 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 500
yading@10 501 if (level == 127) {
yading@10 502 break;
yading@10 503 } else if (level != 0) {
yading@10 504 i += run;
yading@10 505 j = scantable[i];
yading@10 506 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 507 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 508 LAST_SKIP_BITS(re, &s->gb, 1);
yading@10 509 } else {
yading@10 510 /* escape */
yading@10 511 run = SHOW_UBITS(re, &s->gb, 6) + 1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 512 UPDATE_CACHE(re, &s->gb);
yading@10 513 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
yading@10 514 i += run;
yading@10 515 j = scantable[i];
yading@10 516 if (level < 0) {
yading@10 517 level = (-level * qscale * quant_matrix[j]) >> 4;
yading@10 518 level = -level;
yading@10 519 } else {
yading@10 520 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 521 }
yading@10 522 }
yading@10 523 if (i > 63) {
yading@10 524 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
yading@10 525 return -1;
yading@10 526 }
yading@10 527
yading@10 528 mismatch ^= level;
yading@10 529 block[j] = level;
yading@10 530 }
yading@10 531 CLOSE_READER(re, &s->gb);
yading@10 532 }
yading@10 533 block[63] ^= mismatch & 1;
yading@10 534
yading@10 535 s->block_last_index[n] = i;
yading@10 536 return 0;
yading@10 537 }
yading@10 538
yading@10 539 /**
yading@10 540 * Note: this function can read out of range and crash for corrupt streams.
yading@10 541 * Changing this would eat up any speed benefits it has.
yading@10 542 * Do not use "fast" flag if you need the code to be robust.
yading@10 543 */
yading@10 544 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, int16_t *block, int n)
yading@10 545 {
yading@10 546 int level, dc, diff, j, run;
yading@10 547 int component;
yading@10 548 RLTable *rl;
yading@10 549 uint8_t * scantable = s->intra_scantable.permutated;
yading@10 550 const uint16_t *quant_matrix;
yading@10 551 const int qscale = s->qscale;
yading@10 552
yading@10 553 /* DC coefficient */
yading@10 554 if (n < 4) {
yading@10 555 quant_matrix = s->intra_matrix;
yading@10 556 component = 0;
yading@10 557 } else {
yading@10 558 quant_matrix = s->chroma_intra_matrix;
yading@10 559 component = (n & 1) + 1;
yading@10 560 }
yading@10 561 diff = decode_dc(&s->gb, component);
yading@10 562 if (diff >= 0xffff)
yading@10 563 return -1;
yading@10 564 dc = s->last_dc[component];
yading@10 565 dc += diff;
yading@10 566 s->last_dc[component] = dc;
yading@10 567 block[0] = dc << (3 - s->intra_dc_precision);
yading@10 568 if (s->intra_vlc_format)
yading@10 569 rl = &ff_rl_mpeg2;
yading@10 570 else
yading@10 571 rl = &ff_rl_mpeg1;
yading@10 572
yading@10 573 {
yading@10 574 OPEN_READER(re, &s->gb);
yading@10 575 /* now quantify & encode AC coefficients */
yading@10 576 for (;;) {
yading@10 577 UPDATE_CACHE(re, &s->gb);
yading@10 578 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0);
yading@10 579
yading@10 580 if (level == 127) {
yading@10 581 break;
yading@10 582 } else if (level != 0) {
yading@10 583 scantable += run;
yading@10 584 j = *scantable;
yading@10 585 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 586 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 587 LAST_SKIP_BITS(re, &s->gb, 1);
yading@10 588 } else {
yading@10 589 /* escape */
yading@10 590 run = SHOW_UBITS(re, &s->gb, 6) + 1; LAST_SKIP_BITS(re, &s->gb, 6);
yading@10 591 UPDATE_CACHE(re, &s->gb);
yading@10 592 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12);
yading@10 593 scantable += run;
yading@10 594 j = *scantable;
yading@10 595 if (level < 0) {
yading@10 596 level = (-level * qscale * quant_matrix[j]) >> 4;
yading@10 597 level = -level;
yading@10 598 } else {
yading@10 599 level = (level * qscale * quant_matrix[j]) >> 4;
yading@10 600 }
yading@10 601 }
yading@10 602
yading@10 603 block[j] = level;
yading@10 604 }
yading@10 605 CLOSE_READER(re, &s->gb);
yading@10 606 }
yading@10 607
yading@10 608 s->block_last_index[n] = scantable - s->intra_scantable.permutated;
yading@10 609 return 0;
yading@10 610 }
yading@10 611
yading@10 612 /******************************************/
yading@10 613 /* decoding */
yading@10 614
yading@10 615 static inline int get_dmv(MpegEncContext *s)
yading@10 616 {
yading@10 617 if (get_bits1(&s->gb))
yading@10 618 return 1 - (get_bits1(&s->gb) << 1);
yading@10 619 else
yading@10 620 return 0;
yading@10 621 }
yading@10 622
yading@10 623 static inline int get_qscale(MpegEncContext *s)
yading@10 624 {
yading@10 625 int qscale = get_bits(&s->gb, 5);
yading@10 626 if (s->q_scale_type) {
yading@10 627 return non_linear_qscale[qscale];
yading@10 628 } else {
yading@10 629 return qscale << 1;
yading@10 630 }
yading@10 631 }
yading@10 632
yading@10 633 static void exchange_uv(MpegEncContext *s)
yading@10 634 {
yading@10 635 int16_t (*tmp)[64];
yading@10 636
yading@10 637 tmp = s->pblocks[4];
yading@10 638 s->pblocks[4] = s->pblocks[5];
yading@10 639 s->pblocks[5] = tmp;
yading@10 640 }
yading@10 641
yading@10 642 /* motion type (for MPEG-2) */
yading@10 643 #define MT_FIELD 1
yading@10 644 #define MT_FRAME 2
yading@10 645 #define MT_16X8 2
yading@10 646 #define MT_DMV 3
yading@10 647
yading@10 648 static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64])
yading@10 649 {
yading@10 650 int i, j, k, cbp, val, mb_type, motion_type;
yading@10 651 const int mb_block_count = 4 + (1 << s->chroma_format);
yading@10 652
yading@10 653 av_dlog(s->avctx, "decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y);
yading@10 654
yading@10 655 av_assert2(s->mb_skipped == 0);
yading@10 656
yading@10 657 if (s->mb_skip_run-- != 0) {
yading@10 658 if (s->pict_type == AV_PICTURE_TYPE_P) {
yading@10 659 s->mb_skipped = 1;
yading@10 660 s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride] = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
yading@10 661 } else {
yading@10 662 int mb_type;
yading@10 663
yading@10 664 if (s->mb_x)
yading@10 665 mb_type = s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride - 1];
yading@10 666 else
yading@10 667 mb_type = s->current_picture.mb_type[s->mb_width + (s->mb_y - 1) * s->mb_stride - 1]; // FIXME not sure if this is allowed in MPEG at all
yading@10 668 if (IS_INTRA(mb_type)) {
yading@10 669 av_log(s->avctx, AV_LOG_ERROR, "skip with previntra\n");
yading@10 670 return -1;
yading@10 671 }
yading@10 672 s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
yading@10 673 mb_type | MB_TYPE_SKIP;
yading@10 674
yading@10 675 // assert(s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride - 1] & (MB_TYPE_16x16 | MB_TYPE_16x8));
yading@10 676
yading@10 677 if ((s->mv[0][0][0] | s->mv[0][0][1] | s->mv[1][0][0] | s->mv[1][0][1]) == 0)
yading@10 678 s->mb_skipped = 1;
yading@10 679 }
yading@10 680
yading@10 681 return 0;
yading@10 682 }
yading@10 683
yading@10 684 switch (s->pict_type) {
yading@10 685 default:
yading@10 686 case AV_PICTURE_TYPE_I:
yading@10 687 if (get_bits1(&s->gb) == 0) {
yading@10 688 if (get_bits1(&s->gb) == 0) {
yading@10 689 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y);
yading@10 690 return -1;
yading@10 691 }
yading@10 692 mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA;
yading@10 693 } else {
yading@10 694 mb_type = MB_TYPE_INTRA;
yading@10 695 }
yading@10 696 break;
yading@10 697 case AV_PICTURE_TYPE_P:
yading@10 698 mb_type = get_vlc2(&s->gb, ff_mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1);
yading@10 699 if (mb_type < 0) {
yading@10 700 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y);
yading@10 701 return -1;
yading@10 702 }
yading@10 703 mb_type = ptype2mb_type[mb_type];
yading@10 704 break;
yading@10 705 case AV_PICTURE_TYPE_B:
yading@10 706 mb_type = get_vlc2(&s->gb, ff_mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1);
yading@10 707 if (mb_type < 0) {
yading@10 708 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y);
yading@10 709 return -1;
yading@10 710 }
yading@10 711 mb_type = btype2mb_type[mb_type];
yading@10 712 break;
yading@10 713 }
yading@10 714 av_dlog(s->avctx, "mb_type=%x\n", mb_type);
yading@10 715 // motion_type = 0; /* avoid warning */
yading@10 716 if (IS_INTRA(mb_type)) {
yading@10 717 s->dsp.clear_blocks(s->block[0]);
yading@10 718
yading@10 719 if (!s->chroma_y_shift) {
yading@10 720 s->dsp.clear_blocks(s->block[6]);
yading@10 721 }
yading@10 722
yading@10 723 /* compute DCT type */
yading@10 724 if (s->picture_structure == PICT_FRAME && // FIXME add an interlaced_dct coded var?
yading@10 725 !s->frame_pred_frame_dct) {
yading@10 726 s->interlaced_dct = get_bits1(&s->gb);
yading@10 727 }
yading@10 728
yading@10 729 if (IS_QUANT(mb_type))
yading@10 730 s->qscale = get_qscale(s);
yading@10 731
yading@10 732 if (s->concealment_motion_vectors) {
yading@10 733 /* just parse them */
yading@10 734 if (s->picture_structure != PICT_FRAME)
yading@10 735 skip_bits1(&s->gb); /* field select */
yading@10 736
yading@10 737 s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] =
yading@10 738 mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]);
yading@10 739 s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] =
yading@10 740 mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]);
yading@10 741
yading@10 742 skip_bits1(&s->gb); /* marker */
yading@10 743 } else
yading@10 744 memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */
yading@10 745 s->mb_intra = 1;
yading@10 746 // if 1, we memcpy blocks in xvmcvideo
yading@10 747 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration > 1) {
yading@10 748 ff_xvmc_pack_pblocks(s, -1); // inter are always full blocks
yading@10 749 if (s->swap_uv) {
yading@10 750 exchange_uv(s);
yading@10 751 }
yading@10 752 }
yading@10 753
yading@10 754 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
yading@10 755 if (s->flags2 & CODEC_FLAG2_FAST) {
yading@10 756 for (i = 0; i < 6; i++) {
yading@10 757 mpeg2_fast_decode_block_intra(s, *s->pblocks[i], i);
yading@10 758 }
yading@10 759 } else {
yading@10 760 for (i = 0; i < mb_block_count; i++) {
yading@10 761 if (mpeg2_decode_block_intra(s, *s->pblocks[i], i) < 0)
yading@10 762 return -1;
yading@10 763 }
yading@10 764 }
yading@10 765 } else {
yading@10 766 for (i = 0; i < 6; i++) {
yading@10 767 if (mpeg1_decode_block_intra(s, *s->pblocks[i], i) < 0)
yading@10 768 return -1;
yading@10 769 }
yading@10 770 }
yading@10 771 } else {
yading@10 772 if (mb_type & MB_TYPE_ZERO_MV) {
yading@10 773 av_assert2(mb_type & MB_TYPE_CBP);
yading@10 774
yading@10 775 s->mv_dir = MV_DIR_FORWARD;
yading@10 776 if (s->picture_structure == PICT_FRAME) {
yading@10 777 if (s->picture_structure == PICT_FRAME
yading@10 778 && !s->frame_pred_frame_dct)
yading@10 779 s->interlaced_dct = get_bits1(&s->gb);
yading@10 780 s->mv_type = MV_TYPE_16X16;
yading@10 781 } else {
yading@10 782 s->mv_type = MV_TYPE_FIELD;
yading@10 783 mb_type |= MB_TYPE_INTERLACED;
yading@10 784 s->field_select[0][0] = s->picture_structure - 1;
yading@10 785 }
yading@10 786
yading@10 787 if (IS_QUANT(mb_type))
yading@10 788 s->qscale = get_qscale(s);
yading@10 789
yading@10 790 s->last_mv[0][0][0] = 0;
yading@10 791 s->last_mv[0][0][1] = 0;
yading@10 792 s->last_mv[0][1][0] = 0;
yading@10 793 s->last_mv[0][1][1] = 0;
yading@10 794 s->mv[0][0][0] = 0;
yading@10 795 s->mv[0][0][1] = 0;
yading@10 796 } else {
yading@10 797 av_assert2(mb_type & MB_TYPE_L0L1);
yading@10 798 // FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
yading@10 799 /* get additional motion vector type */
yading@10 800 if (s->picture_structure == PICT_FRAME && s->frame_pred_frame_dct)
yading@10 801 motion_type = MT_FRAME;
yading@10 802 else {
yading@10 803 motion_type = get_bits(&s->gb, 2);
yading@10 804 if (s->picture_structure == PICT_FRAME && HAS_CBP(mb_type))
yading@10 805 s->interlaced_dct = get_bits1(&s->gb);
yading@10 806 }
yading@10 807
yading@10 808 if (IS_QUANT(mb_type))
yading@10 809 s->qscale = get_qscale(s);
yading@10 810
yading@10 811 /* motion vectors */
yading@10 812 s->mv_dir = (mb_type >> 13) & 3;
yading@10 813 av_dlog(s->avctx, "motion_type=%d\n", motion_type);
yading@10 814 switch (motion_type) {
yading@10 815 case MT_FRAME: /* or MT_16X8 */
yading@10 816 if (s->picture_structure == PICT_FRAME) {
yading@10 817 mb_type |= MB_TYPE_16x16;
yading@10 818 s->mv_type = MV_TYPE_16X16;
yading@10 819 for (i = 0; i < 2; i++) {
yading@10 820 if (USES_LIST(mb_type, i)) {
yading@10 821 /* MT_FRAME */
yading@10 822 s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] =
yading@10 823 mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]);
yading@10 824 s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] =
yading@10 825 mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]);
yading@10 826 /* full_pel: only for MPEG-1 */
yading@10 827 if (s->full_pel[i]) {
yading@10 828 s->mv[i][0][0] <<= 1;
yading@10 829 s->mv[i][0][1] <<= 1;
yading@10 830 }
yading@10 831 }
yading@10 832 }
yading@10 833 } else {
yading@10 834 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
yading@10 835 s->mv_type = MV_TYPE_16X8;
yading@10 836 for (i = 0; i < 2; i++) {
yading@10 837 if (USES_LIST(mb_type, i)) {
yading@10 838 /* MT_16X8 */
yading@10 839 for (j = 0; j < 2; j++) {
yading@10 840 s->field_select[i][j] = get_bits1(&s->gb);
yading@10 841 for (k = 0; k < 2; k++) {
yading@10 842 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
yading@10 843 s->last_mv[i][j][k]);
yading@10 844 s->last_mv[i][j][k] = val;
yading@10 845 s->mv[i][j][k] = val;
yading@10 846 }
yading@10 847 }
yading@10 848 }
yading@10 849 }
yading@10 850 }
yading@10 851 break;
yading@10 852 case MT_FIELD:
yading@10 853 s->mv_type = MV_TYPE_FIELD;
yading@10 854 if (s->picture_structure == PICT_FRAME) {
yading@10 855 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
yading@10 856 for (i = 0; i < 2; i++) {
yading@10 857 if (USES_LIST(mb_type, i)) {
yading@10 858 for (j = 0; j < 2; j++) {
yading@10 859 s->field_select[i][j] = get_bits1(&s->gb);
yading@10 860 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
yading@10 861 s->last_mv[i][j][0]);
yading@10 862 s->last_mv[i][j][0] = val;
yading@10 863 s->mv[i][j][0] = val;
yading@10 864 av_dlog(s->avctx, "fmx=%d\n", val);
yading@10 865 val = mpeg_decode_motion(s, s->mpeg_f_code[i][1],
yading@10 866 s->last_mv[i][j][1] >> 1);
yading@10 867 s->last_mv[i][j][1] = val << 1;
yading@10 868 s->mv[i][j][1] = val;
yading@10 869 av_dlog(s->avctx, "fmy=%d\n", val);
yading@10 870 }
yading@10 871 }
yading@10 872 }
yading@10 873 } else {
yading@10 874 av_assert0(!s->progressive_sequence);
yading@10 875 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
yading@10 876 for (i = 0; i < 2; i++) {
yading@10 877 if (USES_LIST(mb_type, i)) {
yading@10 878 s->field_select[i][0] = get_bits1(&s->gb);
yading@10 879 for (k = 0; k < 2; k++) {
yading@10 880 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
yading@10 881 s->last_mv[i][0][k]);
yading@10 882 s->last_mv[i][0][k] = val;
yading@10 883 s->last_mv[i][1][k] = val;
yading@10 884 s->mv[i][0][k] = val;
yading@10 885 }
yading@10 886 }
yading@10 887 }
yading@10 888 }
yading@10 889 break;
yading@10 890 case MT_DMV:
yading@10 891 if(s->progressive_sequence){
yading@10 892 av_log(s->avctx, AV_LOG_ERROR, "MT_DMV in progressive_sequence\n");
yading@10 893 return -1;
yading@10 894 }
yading@10 895 s->mv_type = MV_TYPE_DMV;
yading@10 896 for (i = 0; i < 2; i++) {
yading@10 897 if (USES_LIST(mb_type, i)) {
yading@10 898 int dmx, dmy, mx, my, m;
yading@10 899 const int my_shift = s->picture_structure == PICT_FRAME;
yading@10 900
yading@10 901 mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
yading@10 902 s->last_mv[i][0][0]);
yading@10 903 s->last_mv[i][0][0] = mx;
yading@10 904 s->last_mv[i][1][0] = mx;
yading@10 905 dmx = get_dmv(s);
yading@10 906 my = mpeg_decode_motion(s, s->mpeg_f_code[i][1],
yading@10 907 s->last_mv[i][0][1] >> my_shift);
yading@10 908 dmy = get_dmv(s);
yading@10 909
yading@10 910
yading@10 911 s->last_mv[i][0][1] = my << my_shift;
yading@10 912 s->last_mv[i][1][1] = my << my_shift;
yading@10 913
yading@10 914 s->mv[i][0][0] = mx;
yading@10 915 s->mv[i][0][1] = my;
yading@10 916 s->mv[i][1][0] = mx; // not used
yading@10 917 s->mv[i][1][1] = my; // not used
yading@10 918
yading@10 919 if (s->picture_structure == PICT_FRAME) {
yading@10 920 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
yading@10 921
yading@10 922 // m = 1 + 2 * s->top_field_first;
yading@10 923 m = s->top_field_first ? 1 : 3;
yading@10 924
yading@10 925 /* top -> top pred */
yading@10 926 s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
yading@10 927 s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1;
yading@10 928 m = 4 - m;
yading@10 929 s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx;
yading@10 930 s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1;
yading@10 931 } else {
yading@10 932 mb_type |= MB_TYPE_16x16;
yading@10 933
yading@10 934 s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx;
yading@10 935 s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy;
yading@10 936 if (s->picture_structure == PICT_TOP_FIELD)
yading@10 937 s->mv[i][2][1]--;
yading@10 938 else
yading@10 939 s->mv[i][2][1]++;
yading@10 940 }
yading@10 941 }
yading@10 942 }
yading@10 943 break;
yading@10 944 default:
yading@10 945 av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y);
yading@10 946 return -1;
yading@10 947 }
yading@10 948 }
yading@10 949
yading@10 950 s->mb_intra = 0;
yading@10 951 if (HAS_CBP(mb_type)) {
yading@10 952 s->dsp.clear_blocks(s->block[0]);
yading@10 953
yading@10 954 cbp = get_vlc2(&s->gb, ff_mb_pat_vlc.table, MB_PAT_VLC_BITS, 1);
yading@10 955 if (mb_block_count > 6) {
yading@10 956 cbp <<= mb_block_count - 6;
yading@10 957 cbp |= get_bits(&s->gb, mb_block_count - 6);
yading@10 958 s->dsp.clear_blocks(s->block[6]);
yading@10 959 }
yading@10 960 if (cbp <= 0) {
yading@10 961 av_log(s->avctx, AV_LOG_ERROR, "invalid cbp %d at %d %d\n", cbp, s->mb_x, s->mb_y);
yading@10 962 return -1;
yading@10 963 }
yading@10 964
yading@10 965 //if 1, we memcpy blocks in xvmcvideo
yading@10 966 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration > 1) {
yading@10 967 ff_xvmc_pack_pblocks(s, cbp);
yading@10 968 if (s->swap_uv) {
yading@10 969 exchange_uv(s);
yading@10 970 }
yading@10 971 }
yading@10 972
yading@10 973 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
yading@10 974 if (s->flags2 & CODEC_FLAG2_FAST) {
yading@10 975 for (i = 0; i < 6; i++) {
yading@10 976 if (cbp & 32) {
yading@10 977 mpeg2_fast_decode_block_non_intra(s, *s->pblocks[i], i);
yading@10 978 } else {
yading@10 979 s->block_last_index[i] = -1;
yading@10 980 }
yading@10 981 cbp += cbp;
yading@10 982 }
yading@10 983 } else {
yading@10 984 cbp <<= 12-mb_block_count;
yading@10 985
yading@10 986 for (i = 0; i < mb_block_count; i++) {
yading@10 987 if (cbp & (1 << 11)) {
yading@10 988 if (mpeg2_decode_block_non_intra(s, *s->pblocks[i], i) < 0)
yading@10 989 return -1;
yading@10 990 } else {
yading@10 991 s->block_last_index[i] = -1;
yading@10 992 }
yading@10 993 cbp += cbp;
yading@10 994 }
yading@10 995 }
yading@10 996 } else {
yading@10 997 if (s->flags2 & CODEC_FLAG2_FAST) {
yading@10 998 for (i = 0; i < 6; i++) {
yading@10 999 if (cbp & 32) {
yading@10 1000 mpeg1_fast_decode_block_inter(s, *s->pblocks[i], i);
yading@10 1001 } else {
yading@10 1002 s->block_last_index[i] = -1;
yading@10 1003 }
yading@10 1004 cbp += cbp;
yading@10 1005 }
yading@10 1006 } else {
yading@10 1007 for (i = 0; i < 6; i++) {
yading@10 1008 if (cbp & 32) {
yading@10 1009 if (mpeg1_decode_block_inter(s, *s->pblocks[i], i) < 0)
yading@10 1010 return -1;
yading@10 1011 } else {
yading@10 1012 s->block_last_index[i] = -1;
yading@10 1013 }
yading@10 1014 cbp += cbp;
yading@10 1015 }
yading@10 1016 }
yading@10 1017 }
yading@10 1018 } else {
yading@10 1019 for (i = 0; i < 12; i++)
yading@10 1020 s->block_last_index[i] = -1;
yading@10 1021 }
yading@10 1022 }
yading@10 1023
yading@10 1024 s->current_picture.mb_type[s->mb_x + s->mb_y * s->mb_stride] = mb_type;
yading@10 1025
yading@10 1026 return 0;
yading@10 1027 }
yading@10 1028
yading@10 1029 static av_cold int mpeg_decode_init(AVCodecContext *avctx)
yading@10 1030 {
yading@10 1031 Mpeg1Context *s = avctx->priv_data;
yading@10 1032 MpegEncContext *s2 = &s->mpeg_enc_ctx;
yading@10 1033 int i;
yading@10 1034
yading@10 1035 /* we need some permutation to store matrices,
yading@10 1036 * until MPV_common_init() sets the real permutation. */
yading@10 1037 for (i = 0; i < 64; i++)
yading@10 1038 s2->dsp.idct_permutation[i]=i;
yading@10 1039
yading@10 1040 ff_MPV_decode_defaults(s2);
yading@10 1041
yading@10 1042 s->mpeg_enc_ctx.avctx = avctx;
yading@10 1043 s->mpeg_enc_ctx.flags = avctx->flags;
yading@10 1044 s->mpeg_enc_ctx.flags2 = avctx->flags2;
yading@10 1045 ff_mpeg12_common_init(&s->mpeg_enc_ctx);
yading@10 1046 ff_mpeg12_init_vlcs();
yading@10 1047
yading@10 1048 s->mpeg_enc_ctx_allocated = 0;
yading@10 1049 s->mpeg_enc_ctx.picture_number = 0;
yading@10 1050 s->repeat_field = 0;
yading@10 1051 s->mpeg_enc_ctx.codec_id = avctx->codec->id;
yading@10 1052 avctx->color_range = AVCOL_RANGE_MPEG;
yading@10 1053 if (avctx->codec->id == AV_CODEC_ID_MPEG1VIDEO)
yading@10 1054 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
yading@10 1055 else
yading@10 1056 avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
yading@10 1057 return 0;
yading@10 1058 }
yading@10 1059
yading@10 1060 static int mpeg_decode_update_thread_context(AVCodecContext *avctx, const AVCodecContext *avctx_from)
yading@10 1061 {
yading@10 1062 Mpeg1Context *ctx = avctx->priv_data, *ctx_from = avctx_from->priv_data;
yading@10 1063 MpegEncContext *s = &ctx->mpeg_enc_ctx, *s1 = &ctx_from->mpeg_enc_ctx;
yading@10 1064 int err;
yading@10 1065
yading@10 1066 if (avctx == avctx_from || !ctx_from->mpeg_enc_ctx_allocated || !s1->context_initialized)
yading@10 1067 return 0;
yading@10 1068
yading@10 1069 err = ff_mpeg_update_thread_context(avctx, avctx_from);
yading@10 1070 if (err) return err;
yading@10 1071
yading@10 1072 if (!ctx->mpeg_enc_ctx_allocated)
yading@10 1073 memcpy(s + 1, s1 + 1, sizeof(Mpeg1Context) - sizeof(MpegEncContext));
yading@10 1074
yading@10 1075 if (!(s->pict_type == AV_PICTURE_TYPE_B || s->low_delay))
yading@10 1076 s->picture_number++;
yading@10 1077
yading@10 1078 return 0;
yading@10 1079 }
yading@10 1080
yading@10 1081 static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm,
yading@10 1082 const uint8_t *new_perm)
yading@10 1083 {
yading@10 1084 uint16_t temp_matrix[64];
yading@10 1085 int i;
yading@10 1086
yading@10 1087 memcpy(temp_matrix, matrix, 64 * sizeof(uint16_t));
yading@10 1088
yading@10 1089 for (i = 0; i < 64; i++) {
yading@10 1090 matrix[new_perm[i]] = temp_matrix[old_perm[i]];
yading@10 1091 }
yading@10 1092 }
yading@10 1093
yading@10 1094 static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = {
yading@10 1095 #if CONFIG_MPEG_XVMC_DECODER
yading@10 1096 AV_PIX_FMT_XVMC_MPEG2_IDCT,
yading@10 1097 AV_PIX_FMT_XVMC_MPEG2_MC,
yading@10 1098 #endif
yading@10 1099 #if CONFIG_MPEG1_VDPAU_HWACCEL
yading@10 1100 AV_PIX_FMT_VDPAU_MPEG1,
yading@10 1101 #endif
yading@10 1102 AV_PIX_FMT_YUV420P,
yading@10 1103 AV_PIX_FMT_NONE
yading@10 1104 };
yading@10 1105
yading@10 1106 static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = {
yading@10 1107 #if CONFIG_MPEG_XVMC_DECODER
yading@10 1108 AV_PIX_FMT_XVMC_MPEG2_IDCT,
yading@10 1109 AV_PIX_FMT_XVMC_MPEG2_MC,
yading@10 1110 #endif
yading@10 1111 #if CONFIG_MPEG2_VDPAU_HWACCEL
yading@10 1112 AV_PIX_FMT_VDPAU_MPEG2,
yading@10 1113 #endif
yading@10 1114 #if CONFIG_MPEG2_DXVA2_HWACCEL
yading@10 1115 AV_PIX_FMT_DXVA2_VLD,
yading@10 1116 #endif
yading@10 1117 #if CONFIG_MPEG2_VAAPI_HWACCEL
yading@10 1118 AV_PIX_FMT_VAAPI_VLD,
yading@10 1119 #endif
yading@10 1120 AV_PIX_FMT_YUV420P,
yading@10 1121 AV_PIX_FMT_NONE
yading@10 1122 };
yading@10 1123
yading@10 1124 static inline int uses_vdpau(AVCodecContext *avctx) {
yading@10 1125 return avctx->pix_fmt == AV_PIX_FMT_VDPAU_MPEG1 || avctx->pix_fmt == AV_PIX_FMT_VDPAU_MPEG2;
yading@10 1126 }
yading@10 1127
yading@10 1128 static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
yading@10 1129 {
yading@10 1130 Mpeg1Context *s1 = avctx->priv_data;
yading@10 1131 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1132
yading@10 1133 if(s->chroma_format < 2) {
yading@10 1134 return ff_thread_get_format(avctx,
yading@10 1135 avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO ?
yading@10 1136 mpeg1_hwaccel_pixfmt_list_420 :
yading@10 1137 mpeg2_hwaccel_pixfmt_list_420);
yading@10 1138 } else if(s->chroma_format == 2)
yading@10 1139 return AV_PIX_FMT_YUV422P;
yading@10 1140 else
yading@10 1141 return AV_PIX_FMT_YUV444P;
yading@10 1142 }
yading@10 1143
yading@10 1144 static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
yading@10 1145 {
yading@10 1146 if (avctx->pix_fmt != AV_PIX_FMT_XVMC_MPEG2_IDCT && avctx->pix_fmt != AV_PIX_FMT_XVMC_MPEG2_MC) {
yading@10 1147 avctx->xvmc_acceleration = 0;
yading@10 1148 } else if (!avctx->xvmc_acceleration) {
yading@10 1149 avctx->xvmc_acceleration = 2;
yading@10 1150 }
yading@10 1151 avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
yading@10 1152 // until then pix_fmt may be changed right after codec init
yading@10 1153 if (avctx->pix_fmt == AV_PIX_FMT_XVMC_MPEG2_IDCT ||
yading@10 1154 avctx->hwaccel || uses_vdpau(avctx))
yading@10 1155 if (avctx->idct_algo == FF_IDCT_AUTO)
yading@10 1156 avctx->idct_algo = FF_IDCT_SIMPLE;
yading@10 1157 }
yading@10 1158
yading@10 1159 /* Call this function when we know all parameters.
yading@10 1160 * It may be called in different places for MPEG-1 and MPEG-2. */
yading@10 1161 static int mpeg_decode_postinit(AVCodecContext *avctx)
yading@10 1162 {
yading@10 1163 Mpeg1Context *s1 = avctx->priv_data;
yading@10 1164 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1165 uint8_t old_permutation[64];
yading@10 1166
yading@10 1167 if ((s1->mpeg_enc_ctx_allocated == 0) ||
yading@10 1168 avctx->coded_width != s->width ||
yading@10 1169 avctx->coded_height != s->height ||
yading@10 1170 s1->save_width != s->width ||
yading@10 1171 s1->save_height != s->height ||
yading@10 1172 s1->save_aspect_info != s->aspect_ratio_info ||
yading@10 1173 s1->save_progressive_seq != s->progressive_sequence ||
yading@10 1174 0)
yading@10 1175 {
yading@10 1176
yading@10 1177 if (s1->mpeg_enc_ctx_allocated) {
yading@10 1178 ParseContext pc = s->parse_context;
yading@10 1179 s->parse_context.buffer = 0;
yading@10 1180 ff_MPV_common_end(s);
yading@10 1181 s->parse_context = pc;
yading@10 1182 }
yading@10 1183
yading@10 1184 if ((s->width == 0) || (s->height == 0))
yading@10 1185 return -2;
yading@10 1186
yading@10 1187 avcodec_set_dimensions(avctx, s->width, s->height);
yading@10 1188 if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && s->bit_rate) {
yading@10 1189 avctx->rc_max_rate = s->bit_rate;
yading@10 1190 } else if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO && s->bit_rate &&
yading@10 1191 (s->bit_rate != 0x3FFFF*400 || s->vbv_delay != 0xFFFF)) {
yading@10 1192 avctx->bit_rate = s->bit_rate;
yading@10 1193 }
yading@10 1194 s1->save_aspect_info = s->aspect_ratio_info;
yading@10 1195 s1->save_width = s->width;
yading@10 1196 s1->save_height = s->height;
yading@10 1197 s1->save_progressive_seq = s->progressive_sequence;
yading@10 1198
yading@10 1199 /* low_delay may be forced, in this case we will have B-frames
yading@10 1200 * that behave like P-frames. */
yading@10 1201 avctx->has_b_frames = !s->low_delay;
yading@10 1202
yading@10 1203 if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
yading@10 1204 //MPEG-1 fps
yading@10 1205 avctx->time_base.den = ff_mpeg12_frame_rate_tab[s->frame_rate_index].num;
yading@10 1206 avctx->time_base.num = ff_mpeg12_frame_rate_tab[s->frame_rate_index].den;
yading@10 1207 //MPEG-1 aspect
yading@10 1208 avctx->sample_aspect_ratio = av_d2q(1.0/ff_mpeg1_aspect[s->aspect_ratio_info], 255);
yading@10 1209 avctx->ticks_per_frame=1;
yading@10 1210 } else {//MPEG-2
yading@10 1211 //MPEG-2 fps
yading@10 1212 av_reduce(&s->avctx->time_base.den,
yading@10 1213 &s->avctx->time_base.num,
yading@10 1214 ff_mpeg12_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num*2,
yading@10 1215 ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
yading@10 1216 1 << 30);
yading@10 1217 avctx->ticks_per_frame = 2;
yading@10 1218 //MPEG-2 aspect
yading@10 1219 if (s->aspect_ratio_info > 1) {
yading@10 1220 AVRational dar =
yading@10 1221 av_mul_q(av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
yading@10 1222 (AVRational) {s1->pan_scan.width, s1->pan_scan.height}),
yading@10 1223 (AVRational) {s->width, s->height});
yading@10 1224
yading@10 1225 // we ignore the spec here and guess a bit as reality does not match the spec, see for example
yading@10 1226 // res_change_ffmpeg_aspect.ts and sequence-display-aspect.mpg
yading@10 1227 // issue1613, 621, 562
yading@10 1228 if ((s1->pan_scan.width == 0) || (s1->pan_scan.height == 0) ||
yading@10 1229 (av_cmp_q(dar, (AVRational) {4, 3}) && av_cmp_q(dar, (AVRational) {16, 9}))) {
yading@10 1230 s->avctx->sample_aspect_ratio =
yading@10 1231 av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
yading@10 1232 (AVRational) {s->width, s->height});
yading@10 1233 } else {
yading@10 1234 s->avctx->sample_aspect_ratio =
yading@10 1235 av_div_q(ff_mpeg2_aspect[s->aspect_ratio_info],
yading@10 1236 (AVRational) {s1->pan_scan.width, s1->pan_scan.height});
yading@10 1237 //issue1613 4/3 16/9 -> 16/9
yading@10 1238 //res_change_ffmpeg_aspect.ts 4/3 225/44 ->4/3
yading@10 1239 //widescreen-issue562.mpg 4/3 16/9 -> 16/9
yading@10 1240 // s->avctx->sample_aspect_ratio = av_mul_q(s->avctx->sample_aspect_ratio, (AVRational) {s->width, s->height});
yading@10 1241 av_dlog(avctx, "A %d/%d\n",
yading@10 1242 ff_mpeg2_aspect[s->aspect_ratio_info].num, ff_mpeg2_aspect[s->aspect_ratio_info].den);
yading@10 1243 av_dlog(avctx, "B %d/%d\n", s->avctx->sample_aspect_ratio.num,
yading@10 1244 s->avctx->sample_aspect_ratio.den);
yading@10 1245 }
yading@10 1246 } else {
yading@10 1247 s->avctx->sample_aspect_ratio =
yading@10 1248 ff_mpeg2_aspect[s->aspect_ratio_info];
yading@10 1249 }
yading@10 1250 } // MPEG-2
yading@10 1251
yading@10 1252 avctx->pix_fmt = mpeg_get_pixelformat(avctx);
yading@10 1253 setup_hwaccel_for_pixfmt(avctx);
yading@10 1254
yading@10 1255 /* Quantization matrices may need reordering
yading@10 1256 * if DCT permutation is changed. */
yading@10 1257 memcpy(old_permutation, s->dsp.idct_permutation, 64 * sizeof(uint8_t));
yading@10 1258
yading@10 1259 if (ff_MPV_common_init(s) < 0)
yading@10 1260 return -2;
yading@10 1261
yading@10 1262 quant_matrix_rebuild(s->intra_matrix, old_permutation, s->dsp.idct_permutation);
yading@10 1263 quant_matrix_rebuild(s->inter_matrix, old_permutation, s->dsp.idct_permutation);
yading@10 1264 quant_matrix_rebuild(s->chroma_intra_matrix, old_permutation, s->dsp.idct_permutation);
yading@10 1265 quant_matrix_rebuild(s->chroma_inter_matrix, old_permutation, s->dsp.idct_permutation);
yading@10 1266
yading@10 1267 s1->mpeg_enc_ctx_allocated = 1;
yading@10 1268 }
yading@10 1269 return 0;
yading@10 1270 }
yading@10 1271
yading@10 1272 static int mpeg1_decode_picture(AVCodecContext *avctx,
yading@10 1273 const uint8_t *buf, int buf_size)
yading@10 1274 {
yading@10 1275 Mpeg1Context *s1 = avctx->priv_data;
yading@10 1276 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1277 int ref, f_code, vbv_delay;
yading@10 1278
yading@10 1279 init_get_bits(&s->gb, buf, buf_size*8);
yading@10 1280
yading@10 1281 ref = get_bits(&s->gb, 10); /* temporal ref */
yading@10 1282 s->pict_type = get_bits(&s->gb, 3);
yading@10 1283 if (s->pict_type == 0 || s->pict_type > 3)
yading@10 1284 return -1;
yading@10 1285
yading@10 1286 vbv_delay = get_bits(&s->gb, 16);
yading@10 1287 s->vbv_delay = vbv_delay;
yading@10 1288 if (s->pict_type == AV_PICTURE_TYPE_P || s->pict_type == AV_PICTURE_TYPE_B) {
yading@10 1289 s->full_pel[0] = get_bits1(&s->gb);
yading@10 1290 f_code = get_bits(&s->gb, 3);
yading@10 1291 if (f_code == 0 && (avctx->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)))
yading@10 1292 return -1;
yading@10 1293 f_code += !f_code;
yading@10 1294 s->mpeg_f_code[0][0] = f_code;
yading@10 1295 s->mpeg_f_code[0][1] = f_code;
yading@10 1296 }
yading@10 1297 if (s->pict_type == AV_PICTURE_TYPE_B) {
yading@10 1298 s->full_pel[1] = get_bits1(&s->gb);
yading@10 1299 f_code = get_bits(&s->gb, 3);
yading@10 1300 if (f_code == 0 && (avctx->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)))
yading@10 1301 return -1;
yading@10 1302 f_code += !f_code;
yading@10 1303 s->mpeg_f_code[1][0] = f_code;
yading@10 1304 s->mpeg_f_code[1][1] = f_code;
yading@10 1305 }
yading@10 1306 s->current_picture.f.pict_type = s->pict_type;
yading@10 1307 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
yading@10 1308
yading@10 1309 if (avctx->debug & FF_DEBUG_PICT_INFO)
yading@10 1310 av_log(avctx, AV_LOG_DEBUG, "vbv_delay %d, ref %d type:%d\n", vbv_delay, ref, s->pict_type);
yading@10 1311
yading@10 1312 s->y_dc_scale = 8;
yading@10 1313 s->c_dc_scale = 8;
yading@10 1314 return 0;
yading@10 1315 }
yading@10 1316
yading@10 1317 static void mpeg_decode_sequence_extension(Mpeg1Context *s1)
yading@10 1318 {
yading@10 1319 MpegEncContext *s= &s1->mpeg_enc_ctx;
yading@10 1320 int horiz_size_ext, vert_size_ext;
yading@10 1321 int bit_rate_ext;
yading@10 1322
yading@10 1323 skip_bits(&s->gb, 1); /* profile and level esc*/
yading@10 1324 s->avctx->profile = get_bits(&s->gb, 3);
yading@10 1325 s->avctx->level = get_bits(&s->gb, 4);
yading@10 1326 s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */
yading@10 1327 s->chroma_format = get_bits(&s->gb, 2); /* chroma_format 1=420, 2=422, 3=444 */
yading@10 1328 horiz_size_ext = get_bits(&s->gb, 2);
yading@10 1329 vert_size_ext = get_bits(&s->gb, 2);
yading@10 1330 s->width |= (horiz_size_ext << 12);
yading@10 1331 s->height |= (vert_size_ext << 12);
yading@10 1332 bit_rate_ext = get_bits(&s->gb, 12); /* XXX: handle it */
yading@10 1333 s->bit_rate += (bit_rate_ext << 18) * 400;
yading@10 1334 skip_bits1(&s->gb); /* marker */
yading@10 1335 s->avctx->rc_buffer_size += get_bits(&s->gb, 8) * 1024 * 16 << 10;
yading@10 1336
yading@10 1337 s->low_delay = get_bits1(&s->gb);
yading@10 1338 if (s->flags & CODEC_FLAG_LOW_DELAY)
yading@10 1339 s->low_delay = 1;
yading@10 1340
yading@10 1341 s1->frame_rate_ext.num = get_bits(&s->gb, 2) + 1;
yading@10 1342 s1->frame_rate_ext.den = get_bits(&s->gb, 5) + 1;
yading@10 1343
yading@10 1344 av_dlog(s->avctx, "sequence extension\n");
yading@10 1345 s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
yading@10 1346
yading@10 1347 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
yading@10 1348 av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n",
yading@10 1349 s->avctx->profile, s->avctx->level, s->avctx->rc_buffer_size, s->bit_rate);
yading@10 1350
yading@10 1351 }
yading@10 1352
yading@10 1353 static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1)
yading@10 1354 {
yading@10 1355 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1356 int color_description, w, h;
yading@10 1357
yading@10 1358 skip_bits(&s->gb, 3); /* video format */
yading@10 1359 color_description = get_bits1(&s->gb);
yading@10 1360 if (color_description) {
yading@10 1361 s->avctx->color_primaries = get_bits(&s->gb, 8);
yading@10 1362 s->avctx->color_trc = get_bits(&s->gb, 8);
yading@10 1363 s->avctx->colorspace = get_bits(&s->gb, 8);
yading@10 1364 }
yading@10 1365 w = get_bits(&s->gb, 14);
yading@10 1366 skip_bits(&s->gb, 1); //marker
yading@10 1367 h = get_bits(&s->gb, 14);
yading@10 1368 // remaining 3 bits are zero padding
yading@10 1369
yading@10 1370 s1->pan_scan.width = 16 * w;
yading@10 1371 s1->pan_scan.height = 16 * h;
yading@10 1372
yading@10 1373 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
yading@10 1374 av_log(s->avctx, AV_LOG_DEBUG, "sde w:%d, h:%d\n", w, h);
yading@10 1375 }
yading@10 1376
yading@10 1377 static void mpeg_decode_picture_display_extension(Mpeg1Context *s1)
yading@10 1378 {
yading@10 1379 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1380 int i, nofco;
yading@10 1381
yading@10 1382 nofco = 1;
yading@10 1383 if (s->progressive_sequence) {
yading@10 1384 if (s->repeat_first_field) {
yading@10 1385 nofco++;
yading@10 1386 if (s->top_field_first)
yading@10 1387 nofco++;
yading@10 1388 }
yading@10 1389 } else {
yading@10 1390 if (s->picture_structure == PICT_FRAME) {
yading@10 1391 nofco++;
yading@10 1392 if (s->repeat_first_field)
yading@10 1393 nofco++;
yading@10 1394 }
yading@10 1395 }
yading@10 1396 for (i = 0; i < nofco; i++) {
yading@10 1397 s1->pan_scan.position[i][0] = get_sbits(&s->gb, 16);
yading@10 1398 skip_bits(&s->gb, 1); // marker
yading@10 1399 s1->pan_scan.position[i][1] = get_sbits(&s->gb, 16);
yading@10 1400 skip_bits(&s->gb, 1); // marker
yading@10 1401 }
yading@10 1402
yading@10 1403 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
yading@10 1404 av_log(s->avctx, AV_LOG_DEBUG, "pde (%d,%d) (%d,%d) (%d,%d)\n",
yading@10 1405 s1->pan_scan.position[0][0], s1->pan_scan.position[0][1],
yading@10 1406 s1->pan_scan.position[1][0], s1->pan_scan.position[1][1],
yading@10 1407 s1->pan_scan.position[2][0], s1->pan_scan.position[2][1]);
yading@10 1408 }
yading@10 1409
yading@10 1410 static int load_matrix(MpegEncContext *s, uint16_t matrix0[64], uint16_t matrix1[64], int intra)
yading@10 1411 {
yading@10 1412 int i;
yading@10 1413
yading@10 1414 for (i = 0; i < 64; i++) {
yading@10 1415 int j = s->dsp.idct_permutation[ff_zigzag_direct[i]];
yading@10 1416 int v = get_bits(&s->gb, 8);
yading@10 1417 if (v == 0) {
yading@10 1418 av_log(s->avctx, AV_LOG_ERROR, "matrix damaged\n");
yading@10 1419 return -1;
yading@10 1420 }
yading@10 1421 if (intra && i == 0 && v != 8) {
yading@10 1422 av_log(s->avctx, AV_LOG_DEBUG, "intra matrix specifies invalid DC quantizer %d, ignoring\n", v);
yading@10 1423 v = 8; // needed by pink.mpg / issue1046
yading@10 1424 }
yading@10 1425 matrix0[j] = v;
yading@10 1426 if (matrix1)
yading@10 1427 matrix1[j] = v;
yading@10 1428 }
yading@10 1429 return 0;
yading@10 1430 }
yading@10 1431
yading@10 1432 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
yading@10 1433 {
yading@10 1434 av_dlog(s->avctx, "matrix extension\n");
yading@10 1435
yading@10 1436 if (get_bits1(&s->gb)) load_matrix(s, s->chroma_intra_matrix, s->intra_matrix, 1);
yading@10 1437 if (get_bits1(&s->gb)) load_matrix(s, s->chroma_inter_matrix, s->inter_matrix, 0);
yading@10 1438 if (get_bits1(&s->gb)) load_matrix(s, s->chroma_intra_matrix, NULL , 1);
yading@10 1439 if (get_bits1(&s->gb)) load_matrix(s, s->chroma_inter_matrix, NULL , 0);
yading@10 1440 }
yading@10 1441
yading@10 1442 static void mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
yading@10 1443 {
yading@10 1444 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1445
yading@10 1446 s->full_pel[0] = s->full_pel[1] = 0;
yading@10 1447 s->mpeg_f_code[0][0] = get_bits(&s->gb, 4);
yading@10 1448 s->mpeg_f_code[0][1] = get_bits(&s->gb, 4);
yading@10 1449 s->mpeg_f_code[1][0] = get_bits(&s->gb, 4);
yading@10 1450 s->mpeg_f_code[1][1] = get_bits(&s->gb, 4);
yading@10 1451 if (!s->pict_type && s1->mpeg_enc_ctx_allocated) {
yading@10 1452 av_log(s->avctx, AV_LOG_ERROR, "Missing picture start code, guessing missing values\n");
yading@10 1453 if (s->mpeg_f_code[1][0] == 15 && s->mpeg_f_code[1][1] == 15) {
yading@10 1454 if (s->mpeg_f_code[0][0] == 15 && s->mpeg_f_code[0][1] == 15)
yading@10 1455 s->pict_type = AV_PICTURE_TYPE_I;
yading@10 1456 else
yading@10 1457 s->pict_type = AV_PICTURE_TYPE_P;
yading@10 1458 } else
yading@10 1459 s->pict_type = AV_PICTURE_TYPE_B;
yading@10 1460 s->current_picture.f.pict_type = s->pict_type;
yading@10 1461 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
yading@10 1462 }
yading@10 1463 s->mpeg_f_code[0][0] += !s->mpeg_f_code[0][0];
yading@10 1464 s->mpeg_f_code[0][1] += !s->mpeg_f_code[0][1];
yading@10 1465 s->mpeg_f_code[1][0] += !s->mpeg_f_code[1][0];
yading@10 1466 s->mpeg_f_code[1][1] += !s->mpeg_f_code[1][1];
yading@10 1467
yading@10 1468 s->intra_dc_precision = get_bits(&s->gb, 2);
yading@10 1469 s->picture_structure = get_bits(&s->gb, 2);
yading@10 1470 s->top_field_first = get_bits1(&s->gb);
yading@10 1471 s->frame_pred_frame_dct = get_bits1(&s->gb);
yading@10 1472 s->concealment_motion_vectors = get_bits1(&s->gb);
yading@10 1473 s->q_scale_type = get_bits1(&s->gb);
yading@10 1474 s->intra_vlc_format = get_bits1(&s->gb);
yading@10 1475 s->alternate_scan = get_bits1(&s->gb);
yading@10 1476 s->repeat_first_field = get_bits1(&s->gb);
yading@10 1477 s->chroma_420_type = get_bits1(&s->gb);
yading@10 1478 s->progressive_frame = get_bits1(&s->gb);
yading@10 1479
yading@10 1480
yading@10 1481 if (s->alternate_scan) {
yading@10 1482 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan);
yading@10 1483 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan);
yading@10 1484 } else {
yading@10 1485 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct);
yading@10 1486 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
yading@10 1487 }
yading@10 1488
yading@10 1489 /* composite display not parsed */
yading@10 1490 av_dlog(s->avctx, "intra_dc_precision=%d\n", s->intra_dc_precision);
yading@10 1491 av_dlog(s->avctx, "picture_structure=%d\n", s->picture_structure);
yading@10 1492 av_dlog(s->avctx, "top field first=%d\n", s->top_field_first);
yading@10 1493 av_dlog(s->avctx, "repeat first field=%d\n", s->repeat_first_field);
yading@10 1494 av_dlog(s->avctx, "conceal=%d\n", s->concealment_motion_vectors);
yading@10 1495 av_dlog(s->avctx, "intra_vlc_format=%d\n", s->intra_vlc_format);
yading@10 1496 av_dlog(s->avctx, "alternate_scan=%d\n", s->alternate_scan);
yading@10 1497 av_dlog(s->avctx, "frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct);
yading@10 1498 av_dlog(s->avctx, "progressive_frame=%d\n", s->progressive_frame);
yading@10 1499 }
yading@10 1500
yading@10 1501 static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size)
yading@10 1502 {
yading@10 1503 AVCodecContext *avctx = s->avctx;
yading@10 1504 Mpeg1Context *s1 = (Mpeg1Context*)s;
yading@10 1505
yading@10 1506 /* start frame decoding */
yading@10 1507 if (s->first_field || s->picture_structure == PICT_FRAME) {
yading@10 1508 AVFrameSideData *pan_scan;
yading@10 1509
yading@10 1510 if (ff_MPV_frame_start(s, avctx) < 0)
yading@10 1511 return -1;
yading@10 1512
yading@10 1513 ff_mpeg_er_frame_start(s);
yading@10 1514
yading@10 1515 /* first check if we must repeat the frame */
yading@10 1516 s->current_picture_ptr->f.repeat_pict = 0;
yading@10 1517 if (s->repeat_first_field) {
yading@10 1518 if (s->progressive_sequence) {
yading@10 1519 if (s->top_field_first)
yading@10 1520 s->current_picture_ptr->f.repeat_pict = 4;
yading@10 1521 else
yading@10 1522 s->current_picture_ptr->f.repeat_pict = 2;
yading@10 1523 } else if (s->progressive_frame) {
yading@10 1524 s->current_picture_ptr->f.repeat_pict = 1;
yading@10 1525 }
yading@10 1526 }
yading@10 1527
yading@10 1528 pan_scan = av_frame_new_side_data(&s->current_picture_ptr->f,
yading@10 1529 AV_FRAME_DATA_PANSCAN,
yading@10 1530 sizeof(s1->pan_scan));
yading@10 1531 if (!pan_scan)
yading@10 1532 return AVERROR(ENOMEM);
yading@10 1533 memcpy(pan_scan->data, &s1->pan_scan, sizeof(s1->pan_scan));
yading@10 1534
yading@10 1535 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME))
yading@10 1536 ff_thread_finish_setup(avctx);
yading@10 1537 } else { // second field
yading@10 1538 int i;
yading@10 1539
yading@10 1540 if (!s->current_picture_ptr) {
yading@10 1541 av_log(s->avctx, AV_LOG_ERROR, "first field missing\n");
yading@10 1542 return -1;
yading@10 1543 }
yading@10 1544
yading@10 1545 if (s->avctx->hwaccel &&
yading@10 1546 (s->avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) {
yading@10 1547 if (s->avctx->hwaccel->end_frame(s->avctx) < 0)
yading@10 1548 av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode first field\n");
yading@10 1549 }
yading@10 1550
yading@10 1551 for (i = 0; i < 4; i++) {
yading@10 1552 s->current_picture.f.data[i] = s->current_picture_ptr->f.data[i];
yading@10 1553 if (s->picture_structure == PICT_BOTTOM_FIELD) {
yading@10 1554 s->current_picture.f.data[i] += s->current_picture_ptr->f.linesize[i];
yading@10 1555 }
yading@10 1556 }
yading@10 1557 }
yading@10 1558
yading@10 1559 if (avctx->hwaccel) {
yading@10 1560 if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
yading@10 1561 return -1;
yading@10 1562 }
yading@10 1563
yading@10 1564 // MPV_frame_start will call this function too,
yading@10 1565 // but we need to call it on every field
yading@10 1566 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
yading@10 1567 if (ff_xvmc_field_start(s, avctx) < 0)
yading@10 1568 return -1;
yading@10 1569
yading@10 1570 return 0;
yading@10 1571 }
yading@10 1572
yading@10 1573 #define DECODE_SLICE_ERROR -1
yading@10 1574 #define DECODE_SLICE_OK 0
yading@10 1575
yading@10 1576 /**
yading@10 1577 * Decode a slice.
yading@10 1578 * MpegEncContext.mb_y must be set to the MB row from the startcode.
yading@10 1579 * @return DECODE_SLICE_ERROR if the slice is damaged,
yading@10 1580 * DECODE_SLICE_OK if this slice is OK
yading@10 1581 */
yading@10 1582 static int mpeg_decode_slice(MpegEncContext *s, int mb_y,
yading@10 1583 const uint8_t **buf, int buf_size)
yading@10 1584 {
yading@10 1585 AVCodecContext *avctx = s->avctx;
yading@10 1586 const int lowres = s->avctx->lowres;
yading@10 1587 const int field_pic = s->picture_structure != PICT_FRAME;
yading@10 1588
yading@10 1589 s->resync_mb_x =
yading@10 1590 s->resync_mb_y = -1;
yading@10 1591
yading@10 1592 av_assert0(mb_y < s->mb_height);
yading@10 1593
yading@10 1594 init_get_bits(&s->gb, *buf, buf_size * 8);
yading@10 1595 if(s->codec_id != AV_CODEC_ID_MPEG1VIDEO && s->mb_height > 2800/16)
yading@10 1596 skip_bits(&s->gb, 3);
yading@10 1597
yading@10 1598 ff_mpeg1_clean_buffers(s);
yading@10 1599 s->interlaced_dct = 0;
yading@10 1600
yading@10 1601 s->qscale = get_qscale(s);
yading@10 1602
yading@10 1603 if (s->qscale == 0) {
yading@10 1604 av_log(s->avctx, AV_LOG_ERROR, "qscale == 0\n");
yading@10 1605 return -1;
yading@10 1606 }
yading@10 1607
yading@10 1608 /* extra slice info */
yading@10 1609 while (get_bits1(&s->gb) != 0) {
yading@10 1610 skip_bits(&s->gb, 8);
yading@10 1611 }
yading@10 1612
yading@10 1613 s->mb_x = 0;
yading@10 1614
yading@10 1615 if (mb_y == 0 && s->codec_tag == AV_RL32("SLIF")) {
yading@10 1616 skip_bits1(&s->gb);
yading@10 1617 } else {
yading@10 1618 while (get_bits_left(&s->gb) > 0) {
yading@10 1619 int code = get_vlc2(&s->gb, ff_mbincr_vlc.table,
yading@10 1620 MBINCR_VLC_BITS, 2);
yading@10 1621 if (code < 0) {
yading@10 1622 av_log(s->avctx, AV_LOG_ERROR, "first mb_incr damaged\n");
yading@10 1623 return -1;
yading@10 1624 }
yading@10 1625 if (code >= 33) {
yading@10 1626 if (code == 33) {
yading@10 1627 s->mb_x += 33;
yading@10 1628 }
yading@10 1629 /* otherwise, stuffing, nothing to do */
yading@10 1630 } else {
yading@10 1631 s->mb_x += code;
yading@10 1632 break;
yading@10 1633 }
yading@10 1634 }
yading@10 1635 }
yading@10 1636
yading@10 1637 if (s->mb_x >= (unsigned)s->mb_width) {
yading@10 1638 av_log(s->avctx, AV_LOG_ERROR, "initial skip overflow\n");
yading@10 1639 return -1;
yading@10 1640 }
yading@10 1641
yading@10 1642 if (avctx->hwaccel) {
yading@10 1643 const uint8_t *buf_end, *buf_start = *buf - 4; /* include start_code */
yading@10 1644 int start_code = -1;
yading@10 1645 buf_end = avpriv_find_start_code(buf_start + 2, *buf + buf_size, &start_code);
yading@10 1646 if (buf_end < *buf + buf_size)
yading@10 1647 buf_end -= 4;
yading@10 1648 s->mb_y = mb_y;
yading@10 1649 if (avctx->hwaccel->decode_slice(avctx, buf_start, buf_end - buf_start) < 0)
yading@10 1650 return DECODE_SLICE_ERROR;
yading@10 1651 *buf = buf_end;
yading@10 1652 return DECODE_SLICE_OK;
yading@10 1653 }
yading@10 1654
yading@10 1655 s->resync_mb_x = s->mb_x;
yading@10 1656 s->resync_mb_y = s->mb_y = mb_y;
yading@10 1657 s->mb_skip_run = 0;
yading@10 1658 ff_init_block_index(s);
yading@10 1659
yading@10 1660 if (s->mb_y == 0 && s->mb_x == 0 && (s->first_field || s->picture_structure == PICT_FRAME)) {
yading@10 1661 if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
yading@10 1662 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",
yading@10 1663 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],
yading@10 1664 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")),
yading@10 1665 s->progressive_sequence ? "ps" :"", s->progressive_frame ? "pf" : "", s->alternate_scan ? "alt" :"", s->top_field_first ? "top" :"",
yading@10 1666 s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors,
yading@10 1667 s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :"");
yading@10 1668 }
yading@10 1669 }
yading@10 1670
yading@10 1671 for (;;) {
yading@10 1672 // If 1, we memcpy blocks in xvmcvideo.
yading@10 1673 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration > 1)
yading@10 1674 ff_xvmc_init_block(s); // set s->block
yading@10 1675
yading@10 1676 if (mpeg_decode_mb(s, s->block) < 0)
yading@10 1677 return -1;
yading@10 1678
yading@10 1679 if (s->current_picture.motion_val[0] && !s->encoding) { // note motion_val is normally NULL unless we want to extract the MVs
yading@10 1680 const int wrap = s->b8_stride;
yading@10 1681 int xy = s->mb_x * 2 + s->mb_y * 2 * wrap;
yading@10 1682 int b8_xy = 4 * (s->mb_x + s->mb_y * s->mb_stride);
yading@10 1683 int motion_x, motion_y, dir, i;
yading@10 1684
yading@10 1685 for (i = 0; i < 2; i++) {
yading@10 1686 for (dir = 0; dir < 2; dir++) {
yading@10 1687 if (s->mb_intra || (dir == 1 && s->pict_type != AV_PICTURE_TYPE_B)) {
yading@10 1688 motion_x = motion_y = 0;
yading@10 1689 } else if (s->mv_type == MV_TYPE_16X16 || (s->mv_type == MV_TYPE_FIELD && field_pic)) {
yading@10 1690 motion_x = s->mv[dir][0][0];
yading@10 1691 motion_y = s->mv[dir][0][1];
yading@10 1692 } else /*if ((s->mv_type == MV_TYPE_FIELD) || (s->mv_type == MV_TYPE_16X8))*/ {
yading@10 1693 motion_x = s->mv[dir][i][0];
yading@10 1694 motion_y = s->mv[dir][i][1];
yading@10 1695 }
yading@10 1696
yading@10 1697 s->current_picture.motion_val[dir][xy ][0] = motion_x;
yading@10 1698 s->current_picture.motion_val[dir][xy ][1] = motion_y;
yading@10 1699 s->current_picture.motion_val[dir][xy + 1][0] = motion_x;
yading@10 1700 s->current_picture.motion_val[dir][xy + 1][1] = motion_y;
yading@10 1701 s->current_picture.ref_index [dir][b8_xy ] =
yading@10 1702 s->current_picture.ref_index [dir][b8_xy + 1] = s->field_select[dir][i];
yading@10 1703 av_assert2(s->field_select[dir][i] == 0 || s->field_select[dir][i] == 1);
yading@10 1704 }
yading@10 1705 xy += wrap;
yading@10 1706 b8_xy +=2;
yading@10 1707 }
yading@10 1708 }
yading@10 1709
yading@10 1710 s->dest[0] += 16 >> lowres;
yading@10 1711 s->dest[1] +=(16 >> lowres) >> s->chroma_x_shift;
yading@10 1712 s->dest[2] +=(16 >> lowres) >> s->chroma_x_shift;
yading@10 1713
yading@10 1714 ff_MPV_decode_mb(s, s->block);
yading@10 1715
yading@10 1716 if (++s->mb_x >= s->mb_width) {
yading@10 1717 const int mb_size = 16 >> s->avctx->lowres;
yading@10 1718
yading@10 1719 ff_mpeg_draw_horiz_band(s, mb_size*(s->mb_y >> field_pic), mb_size);
yading@10 1720 ff_MPV_report_decode_progress(s);
yading@10 1721
yading@10 1722 s->mb_x = 0;
yading@10 1723 s->mb_y += 1 << field_pic;
yading@10 1724
yading@10 1725 if (s->mb_y >= s->mb_height) {
yading@10 1726 int left = get_bits_left(&s->gb);
yading@10 1727 int is_d10 = s->chroma_format == 2 && s->pict_type == AV_PICTURE_TYPE_I && avctx->profile == 0 && avctx->level == 5
yading@10 1728 && s->intra_dc_precision == 2 && s->q_scale_type == 1 && s->alternate_scan == 0
yading@10 1729 && s->progressive_frame == 0 /* vbv_delay == 0xBBB || 0xE10*/;
yading@10 1730
yading@10 1731 if (left >= 32 && !is_d10) {
yading@10 1732 GetBitContext gb = s->gb;
yading@10 1733 align_get_bits(&gb);
yading@10 1734 if (show_bits(&gb, 24) == 0x060E2B) {
yading@10 1735 av_log(avctx, AV_LOG_DEBUG, "Invalid MXF data found in video stream\n");
yading@10 1736 is_d10 = 1;
yading@10 1737 }
yading@10 1738 }
yading@10 1739
yading@10 1740 if (left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10)
yading@10 1741 || ((avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_AGGRESSIVE)) && left > 8)) {
yading@10 1742 av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n", left, show_bits(&s->gb, FFMIN(left, 23)));
yading@10 1743 return -1;
yading@10 1744 } else
yading@10 1745 goto eos;
yading@10 1746 }
yading@10 1747
yading@10 1748 ff_init_block_index(s);
yading@10 1749 }
yading@10 1750
yading@10 1751 /* skip mb handling */
yading@10 1752 if (s->mb_skip_run == -1) {
yading@10 1753 /* read increment again */
yading@10 1754 s->mb_skip_run = 0;
yading@10 1755 for (;;) {
yading@10 1756 int code = get_vlc2(&s->gb, ff_mbincr_vlc.table,
yading@10 1757 MBINCR_VLC_BITS, 2);
yading@10 1758 if (code < 0) {
yading@10 1759 av_log(s->avctx, AV_LOG_ERROR, "mb incr damaged\n");
yading@10 1760 return -1;
yading@10 1761 }
yading@10 1762 if (code >= 33) {
yading@10 1763 if (code == 33) {
yading@10 1764 s->mb_skip_run += 33;
yading@10 1765 } else if (code == 35) {
yading@10 1766 if (s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0) {
yading@10 1767 av_log(s->avctx, AV_LOG_ERROR, "slice mismatch\n");
yading@10 1768 return -1;
yading@10 1769 }
yading@10 1770 goto eos; /* end of slice */
yading@10 1771 }
yading@10 1772 /* otherwise, stuffing, nothing to do */
yading@10 1773 } else {
yading@10 1774 s->mb_skip_run += code;
yading@10 1775 break;
yading@10 1776 }
yading@10 1777 }
yading@10 1778 if (s->mb_skip_run) {
yading@10 1779 int i;
yading@10 1780 if (s->pict_type == AV_PICTURE_TYPE_I) {
yading@10 1781 av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y);
yading@10 1782 return -1;
yading@10 1783 }
yading@10 1784
yading@10 1785 /* skip mb */
yading@10 1786 s->mb_intra = 0;
yading@10 1787 for (i = 0; i < 12; i++)
yading@10 1788 s->block_last_index[i] = -1;
yading@10 1789 if (s->picture_structure == PICT_FRAME)
yading@10 1790 s->mv_type = MV_TYPE_16X16;
yading@10 1791 else
yading@10 1792 s->mv_type = MV_TYPE_FIELD;
yading@10 1793 if (s->pict_type == AV_PICTURE_TYPE_P) {
yading@10 1794 /* if P type, zero motion vector is implied */
yading@10 1795 s->mv_dir = MV_DIR_FORWARD;
yading@10 1796 s->mv[0][0][0] = s->mv[0][0][1] = 0;
yading@10 1797 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0;
yading@10 1798 s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0;
yading@10 1799 s->field_select[0][0] = (s->picture_structure - 1) & 1;
yading@10 1800 } else {
yading@10 1801 /* if B type, reuse previous vectors and directions */
yading@10 1802 s->mv[0][0][0] = s->last_mv[0][0][0];
yading@10 1803 s->mv[0][0][1] = s->last_mv[0][0][1];
yading@10 1804 s->mv[1][0][0] = s->last_mv[1][0][0];
yading@10 1805 s->mv[1][0][1] = s->last_mv[1][0][1];
yading@10 1806 }
yading@10 1807 }
yading@10 1808 }
yading@10 1809 }
yading@10 1810 eos: // end of slice
yading@10 1811 *buf += (get_bits_count(&s->gb)-1)/8;
yading@10 1812 av_dlog(s, "y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y);
yading@10 1813 return 0;
yading@10 1814 }
yading@10 1815
yading@10 1816 static int slice_decode_thread(AVCodecContext *c, void *arg)
yading@10 1817 {
yading@10 1818 MpegEncContext *s = *(void**)arg;
yading@10 1819 const uint8_t *buf = s->gb.buffer;
yading@10 1820 int mb_y = s->start_mb_y;
yading@10 1821 const int field_pic = s->picture_structure != PICT_FRAME;
yading@10 1822
yading@10 1823 s->er.error_count = (3 * (s->end_mb_y - s->start_mb_y) * s->mb_width) >> field_pic;
yading@10 1824
yading@10 1825 for (;;) {
yading@10 1826 uint32_t start_code;
yading@10 1827 int ret;
yading@10 1828
yading@10 1829 ret = mpeg_decode_slice(s, mb_y, &buf, s->gb.buffer_end - buf);
yading@10 1830 emms_c();
yading@10 1831 av_dlog(c, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n",
yading@10 1832 ret, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y,
yading@10 1833 s->start_mb_y, s->end_mb_y, s->er.error_count);
yading@10 1834 if (ret < 0) {
yading@10 1835 if (c->err_recognition & AV_EF_EXPLODE)
yading@10 1836 return ret;
yading@10 1837 if (s->resync_mb_x >= 0 && s->resync_mb_y >= 0)
yading@10 1838 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);
yading@10 1839 } else {
yading@10 1840 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);
yading@10 1841 }
yading@10 1842
yading@10 1843 if (s->mb_y == s->end_mb_y)
yading@10 1844 return 0;
yading@10 1845
yading@10 1846 start_code = -1;
yading@10 1847 buf = avpriv_find_start_code(buf, s->gb.buffer_end, &start_code);
yading@10 1848 mb_y= start_code - SLICE_MIN_START_CODE;
yading@10 1849 if(s->codec_id != AV_CODEC_ID_MPEG1VIDEO && s->mb_height > 2800/16)
yading@10 1850 mb_y += (*buf&0xE0)<<2;
yading@10 1851 mb_y <<= field_pic;
yading@10 1852 if (s->picture_structure == PICT_BOTTOM_FIELD)
yading@10 1853 mb_y++;
yading@10 1854 if (mb_y < 0 || mb_y >= s->end_mb_y)
yading@10 1855 return -1;
yading@10 1856 }
yading@10 1857 }
yading@10 1858
yading@10 1859 /**
yading@10 1860 * Handle slice ends.
yading@10 1861 * @return 1 if it seems to be the last slice
yading@10 1862 */
yading@10 1863 static int slice_end(AVCodecContext *avctx, AVFrame *pict)
yading@10 1864 {
yading@10 1865 Mpeg1Context *s1 = avctx->priv_data;
yading@10 1866 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1867
yading@10 1868 if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr)
yading@10 1869 return 0;
yading@10 1870
yading@10 1871 if (s->avctx->hwaccel) {
yading@10 1872 if (s->avctx->hwaccel->end_frame(s->avctx) < 0)
yading@10 1873 av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n");
yading@10 1874 }
yading@10 1875
yading@10 1876 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
yading@10 1877 ff_xvmc_field_end(s);
yading@10 1878
yading@10 1879 /* end of slice reached */
yading@10 1880 if (/*s->mb_y << field_pic == s->mb_height &&*/ !s->first_field && !s->first_slice) {
yading@10 1881 /* end of image */
yading@10 1882
yading@10 1883 ff_er_frame_end(&s->er);
yading@10 1884
yading@10 1885 ff_MPV_frame_end(s);
yading@10 1886
yading@10 1887 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
yading@10 1888 int ret = av_frame_ref(pict, &s->current_picture_ptr->f);
yading@10 1889 if (ret < 0)
yading@10 1890 return ret;
yading@10 1891 ff_print_debug_info(s, s->current_picture_ptr, pict);
yading@10 1892 ff_mpv_export_qp_table(s, pict, s->current_picture_ptr, FF_QSCALE_TYPE_MPEG2);
yading@10 1893 } else {
yading@10 1894 if (avctx->active_thread_type & FF_THREAD_FRAME)
yading@10 1895 s->picture_number++;
yading@10 1896 /* latency of 1 frame for I- and P-frames */
yading@10 1897 /* XXX: use another variable than picture_number */
yading@10 1898 if (s->last_picture_ptr != NULL) {
yading@10 1899 int ret = av_frame_ref(pict, &s->last_picture_ptr->f);
yading@10 1900 if (ret < 0)
yading@10 1901 return ret;
yading@10 1902 ff_print_debug_info(s, s->last_picture_ptr, pict);
yading@10 1903 ff_mpv_export_qp_table(s, pict, s->last_picture_ptr, FF_QSCALE_TYPE_MPEG2);
yading@10 1904 }
yading@10 1905 }
yading@10 1906
yading@10 1907 return 1;
yading@10 1908 } else {
yading@10 1909 return 0;
yading@10 1910 }
yading@10 1911 }
yading@10 1912
yading@10 1913 static int mpeg1_decode_sequence(AVCodecContext *avctx,
yading@10 1914 const uint8_t *buf, int buf_size)
yading@10 1915 {
yading@10 1916 Mpeg1Context *s1 = avctx->priv_data;
yading@10 1917 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 1918 int width, height;
yading@10 1919 int i, v, j;
yading@10 1920
yading@10 1921 init_get_bits(&s->gb, buf, buf_size*8);
yading@10 1922
yading@10 1923 width = get_bits(&s->gb, 12);
yading@10 1924 height = get_bits(&s->gb, 12);
yading@10 1925 if (width == 0 || height == 0) {
yading@10 1926 av_log(avctx, AV_LOG_WARNING, "Invalid horizontal or vertical size "
yading@10 1927 "value.\n");
yading@10 1928 if (avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_COMPLIANT))
yading@10 1929 return AVERROR_INVALIDDATA;
yading@10 1930 }
yading@10 1931 s->aspect_ratio_info = get_bits(&s->gb, 4);
yading@10 1932 if (s->aspect_ratio_info == 0) {
yading@10 1933 av_log(avctx, AV_LOG_ERROR, "aspect ratio has forbidden 0 value\n");
yading@10 1934 if (avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_COMPLIANT))
yading@10 1935 return -1;
yading@10 1936 }
yading@10 1937 s->frame_rate_index = get_bits(&s->gb, 4);
yading@10 1938 if (s->frame_rate_index == 0 || s->frame_rate_index > 13)
yading@10 1939 return -1;
yading@10 1940 s->bit_rate = get_bits(&s->gb, 18) * 400;
yading@10 1941 if (get_bits1(&s->gb) == 0) /* marker */
yading@10 1942 return -1;
yading@10 1943 s->width = width;
yading@10 1944 s->height = height;
yading@10 1945
yading@10 1946 s->avctx->rc_buffer_size = get_bits(&s->gb, 10) * 1024 * 16;
yading@10 1947 skip_bits(&s->gb, 1);
yading@10 1948
yading@10 1949 /* get matrix */
yading@10 1950 if (get_bits1(&s->gb)) {
yading@10 1951 load_matrix(s, s->chroma_intra_matrix, s->intra_matrix, 1);
yading@10 1952 } else {
yading@10 1953 for (i = 0; i < 64; i++) {
yading@10 1954 j = s->dsp.idct_permutation[i];
yading@10 1955 v = ff_mpeg1_default_intra_matrix[i];
yading@10 1956 s->intra_matrix[j] = v;
yading@10 1957 s->chroma_intra_matrix[j] = v;
yading@10 1958 }
yading@10 1959 }
yading@10 1960 if (get_bits1(&s->gb)) {
yading@10 1961 load_matrix(s, s->chroma_inter_matrix, s->inter_matrix, 0);
yading@10 1962 } else {
yading@10 1963 for (i = 0; i < 64; i++) {
yading@10 1964 int j = s->dsp.idct_permutation[i];
yading@10 1965 v = ff_mpeg1_default_non_intra_matrix[i];
yading@10 1966 s->inter_matrix[j] = v;
yading@10 1967 s->chroma_inter_matrix[j] = v;
yading@10 1968 }
yading@10 1969 }
yading@10 1970
yading@10 1971 if (show_bits(&s->gb, 23) != 0) {
yading@10 1972 av_log(s->avctx, AV_LOG_ERROR, "sequence header damaged\n");
yading@10 1973 return -1;
yading@10 1974 }
yading@10 1975
yading@10 1976 /* we set MPEG-2 parameters so that it emulates MPEG-1 */
yading@10 1977 s->progressive_sequence = 1;
yading@10 1978 s->progressive_frame = 1;
yading@10 1979 s->picture_structure = PICT_FRAME;
yading@10 1980 s->first_field = 0;
yading@10 1981 s->frame_pred_frame_dct = 1;
yading@10 1982 s->chroma_format = 1;
yading@10 1983 s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
yading@10 1984 s->out_format = FMT_MPEG1;
yading@10 1985 s->swap_uv = 0; // AFAIK VCR2 does not have SEQ_HEADER
yading@10 1986 if (s->flags & CODEC_FLAG_LOW_DELAY)
yading@10 1987 s->low_delay = 1;
yading@10 1988
yading@10 1989 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
yading@10 1990 av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%d\n",
yading@10 1991 s->avctx->rc_buffer_size, s->bit_rate);
yading@10 1992
yading@10 1993 return 0;
yading@10 1994 }
yading@10 1995
yading@10 1996 static int vcr2_init_sequence(AVCodecContext *avctx)
yading@10 1997 {
yading@10 1998 Mpeg1Context *s1 = avctx->priv_data;
yading@10 1999 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 2000 int i, v;
yading@10 2001
yading@10 2002 /* start new MPEG-1 context decoding */
yading@10 2003 s->out_format = FMT_MPEG1;
yading@10 2004 if (s1->mpeg_enc_ctx_allocated) {
yading@10 2005 ff_MPV_common_end(s);
yading@10 2006 }
yading@10 2007 s->width = avctx->coded_width;
yading@10 2008 s->height = avctx->coded_height;
yading@10 2009 avctx->has_b_frames = 0; // true?
yading@10 2010 s->low_delay = 1;
yading@10 2011
yading@10 2012 avctx->pix_fmt = mpeg_get_pixelformat(avctx);
yading@10 2013 setup_hwaccel_for_pixfmt(avctx);
yading@10 2014
yading@10 2015 if (ff_MPV_common_init(s) < 0)
yading@10 2016 return -1;
yading@10 2017 s1->mpeg_enc_ctx_allocated = 1;
yading@10 2018
yading@10 2019 for (i = 0; i < 64; i++) {
yading@10 2020 int j = s->dsp.idct_permutation[i];
yading@10 2021 v = ff_mpeg1_default_intra_matrix[i];
yading@10 2022 s->intra_matrix[j] = v;
yading@10 2023 s->chroma_intra_matrix[j] = v;
yading@10 2024
yading@10 2025 v = ff_mpeg1_default_non_intra_matrix[i];
yading@10 2026 s->inter_matrix[j] = v;
yading@10 2027 s->chroma_inter_matrix[j] = v;
yading@10 2028 }
yading@10 2029
yading@10 2030 s->progressive_sequence = 1;
yading@10 2031 s->progressive_frame = 1;
yading@10 2032 s->picture_structure = PICT_FRAME;
yading@10 2033 s->first_field = 0;
yading@10 2034 s->frame_pred_frame_dct = 1;
yading@10 2035 s->chroma_format = 1;
yading@10 2036 if (s->codec_tag == AV_RL32("BW10")) {
yading@10 2037 s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG1VIDEO;
yading@10 2038 } else {
yading@10 2039 exchange_uv(s); // common init reset pblocks, so we swap them here
yading@10 2040 s->swap_uv = 1; // in case of xvmc we need to swap uv for each MB
yading@10 2041 s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
yading@10 2042 }
yading@10 2043 s1->save_width = s->width;
yading@10 2044 s1->save_height = s->height;
yading@10 2045 s1->save_progressive_seq = s->progressive_sequence;
yading@10 2046 return 0;
yading@10 2047 }
yading@10 2048
yading@10 2049
yading@10 2050 static void mpeg_decode_user_data(AVCodecContext *avctx,
yading@10 2051 const uint8_t *p, int buf_size)
yading@10 2052 {
yading@10 2053 Mpeg1Context *s = avctx->priv_data;
yading@10 2054 const uint8_t *buf_end = p + buf_size;
yading@10 2055
yading@10 2056 if(buf_size > 29){
yading@10 2057 int i;
yading@10 2058 for(i=0; i<20; i++)
yading@10 2059 if(!memcmp(p+i, "\0TMPGEXS\0", 9)){
yading@10 2060 s->tmpgexs= 1;
yading@10 2061 }
yading@10 2062
yading@10 2063 /* for(i=0; !(!p[i-2] && !p[i-1] && p[i]==1) && i<buf_size; i++){
yading@10 2064 av_log(avctx, AV_LOG_ERROR, "%c", p[i]);
yading@10 2065 }
yading@10 2066 av_log(avctx, AV_LOG_ERROR, "\n");*/
yading@10 2067 }
yading@10 2068
yading@10 2069 /* we parse the DTG active format information */
yading@10 2070 if (buf_end - p >= 5 &&
yading@10 2071 p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') {
yading@10 2072 int flags = p[4];
yading@10 2073 p += 5;
yading@10 2074 if (flags & 0x80) {
yading@10 2075 /* skip event id */
yading@10 2076 p += 2;
yading@10 2077 }
yading@10 2078 if (flags & 0x40) {
yading@10 2079 if (buf_end - p < 1)
yading@10 2080 return;
yading@10 2081 avctx->dtg_active_format = p[0] & 0x0f;
yading@10 2082 }
yading@10 2083 }
yading@10 2084 }
yading@10 2085
yading@10 2086 static void mpeg_decode_gop(AVCodecContext *avctx,
yading@10 2087 const uint8_t *buf, int buf_size)
yading@10 2088 {
yading@10 2089 Mpeg1Context *s1 = avctx->priv_data;
yading@10 2090 MpegEncContext *s = &s1->mpeg_enc_ctx;
yading@10 2091 int broken_link;
yading@10 2092 int64_t tc;
yading@10 2093
yading@10 2094 init_get_bits(&s->gb, buf, buf_size*8);
yading@10 2095
yading@10 2096 tc = avctx->timecode_frame_start = get_bits(&s->gb, 25);
yading@10 2097
yading@10 2098 s->closed_gop = get_bits1(&s->gb);
yading@10 2099 /*broken_link indicate that after editing the
yading@10 2100 reference frames of the first B-Frames after GOP I-Frame
yading@10 2101 are missing (open gop)*/
yading@10 2102 broken_link = get_bits1(&s->gb);
yading@10 2103
yading@10 2104 if (s->avctx->debug & FF_DEBUG_PICT_INFO) {
yading@10 2105 char tcbuf[AV_TIMECODE_STR_SIZE];
yading@10 2106 av_timecode_make_mpeg_tc_string(tcbuf, tc);
yading@10 2107 av_log(s->avctx, AV_LOG_DEBUG,
yading@10 2108 "GOP (%s) closed_gop=%d broken_link=%d\n",
yading@10 2109 tcbuf, s->closed_gop, broken_link);
yading@10 2110 }
yading@10 2111 }
yading@10 2112
yading@10 2113 static int decode_chunks(AVCodecContext *avctx,
yading@10 2114 AVFrame *picture, int *got_output,
yading@10 2115 const uint8_t *buf, int buf_size)
yading@10 2116 {
yading@10 2117 Mpeg1Context *s = avctx->priv_data;
yading@10 2118 MpegEncContext *s2 = &s->mpeg_enc_ctx;
yading@10 2119 const uint8_t *buf_ptr = buf;
yading@10 2120 const uint8_t *buf_end = buf + buf_size;
yading@10 2121 int ret, input_size;
yading@10 2122 int last_code = 0;
yading@10 2123 int picture_start_code_seen = 0;
yading@10 2124
yading@10 2125 for (;;) {
yading@10 2126 /* find next start code */
yading@10 2127 uint32_t start_code = -1;
yading@10 2128 buf_ptr = avpriv_find_start_code(buf_ptr, buf_end, &start_code);
yading@10 2129 if (start_code > 0x1ff) {
yading@10 2130 if (s2->pict_type != AV_PICTURE_TYPE_B || avctx->skip_frame <= AVDISCARD_DEFAULT) {
yading@10 2131 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE)) {
yading@10 2132 int i;
yading@10 2133 av_assert0(avctx->thread_count > 1);
yading@10 2134
yading@10 2135 avctx->execute(avctx, slice_decode_thread, &s2->thread_context[0], NULL, s->slice_count, sizeof(void*));
yading@10 2136 for (i = 0; i < s->slice_count; i++)
yading@10 2137 s2->er.error_count += s2->thread_context[i]->er.error_count;
yading@10 2138 }
yading@10 2139
yading@10 2140 if ((CONFIG_MPEG_VDPAU_DECODER || CONFIG_MPEG1_VDPAU_DECODER)
yading@10 2141 && uses_vdpau(avctx))
yading@10 2142 ff_vdpau_mpeg_picture_complete(s2, buf, buf_size, s->slice_count);
yading@10 2143
yading@10 2144 ret = slice_end(avctx, picture);
yading@10 2145 if (ret < 0)
yading@10 2146 return ret;
yading@10 2147 else if (ret) {
yading@10 2148 if (s2->last_picture_ptr || s2->low_delay) //FIXME merge with the stuff in mpeg_decode_slice
yading@10 2149 *got_output = 1;
yading@10 2150 }
yading@10 2151 }
yading@10 2152 s2->pict_type = 0;
yading@10 2153 return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index);
yading@10 2154 }
yading@10 2155
yading@10 2156 input_size = buf_end - buf_ptr;
yading@10 2157
yading@10 2158 if (avctx->debug & FF_DEBUG_STARTCODE) {
yading@10 2159 av_log(avctx, AV_LOG_DEBUG, "%3X at %td left %d\n", start_code, buf_ptr-buf, input_size);
yading@10 2160 }
yading@10 2161
yading@10 2162 /* prepare data for next start code */
yading@10 2163 switch (start_code) {
yading@10 2164 case SEQ_START_CODE:
yading@10 2165 if (last_code == 0) {
yading@10 2166 mpeg1_decode_sequence(avctx, buf_ptr, input_size);
yading@10 2167 if(buf != avctx->extradata)
yading@10 2168 s->sync=1;
yading@10 2169 } else {
yading@10 2170 av_log(avctx, AV_LOG_ERROR, "ignoring SEQ_START_CODE after %X\n", last_code);
yading@10 2171 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2172 return AVERROR_INVALIDDATA;
yading@10 2173 }
yading@10 2174 break;
yading@10 2175
yading@10 2176 case PICTURE_START_CODE:
yading@10 2177 if (picture_start_code_seen && s2->picture_structure == PICT_FRAME) {
yading@10 2178 /* If it's a frame picture, there can't be more than one picture header.
yading@10 2179 Yet, it does happen and we need to handle it. */
yading@10 2180 av_log(avctx, AV_LOG_WARNING, "ignoring extra picture following a frame-picture\n");
yading@10 2181 break;
yading@10 2182 }
yading@10 2183 picture_start_code_seen = 1;
yading@10 2184
yading@10 2185 if (s2->width <= 0 || s2->height <= 0) {
yading@10 2186 av_log(avctx, AV_LOG_ERROR, "Invalid frame dimensions %dx%d.\n",
yading@10 2187 s2->width, s2->height);
yading@10 2188 return AVERROR_INVALIDDATA;
yading@10 2189 }
yading@10 2190
yading@10 2191 if(s->tmpgexs){
yading@10 2192 s2->intra_dc_precision= 3;
yading@10 2193 s2->intra_matrix[0]= 1;
yading@10 2194 }
yading@10 2195 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE) && s->slice_count) {
yading@10 2196 int i;
yading@10 2197
yading@10 2198 avctx->execute(avctx, slice_decode_thread,
yading@10 2199 s2->thread_context, NULL,
yading@10 2200 s->slice_count, sizeof(void*));
yading@10 2201 for (i = 0; i < s->slice_count; i++)
yading@10 2202 s2->er.error_count += s2->thread_context[i]->er.error_count;
yading@10 2203 s->slice_count = 0;
yading@10 2204 }
yading@10 2205 if (last_code == 0 || last_code == SLICE_MIN_START_CODE) {
yading@10 2206 ret = mpeg_decode_postinit(avctx);
yading@10 2207 if (ret < 0) {
yading@10 2208 av_log(avctx, AV_LOG_ERROR, "mpeg_decode_postinit() failure\n");
yading@10 2209 return ret;
yading@10 2210 }
yading@10 2211
yading@10 2212 /* we have a complete image: we try to decompress it */
yading@10 2213 if (mpeg1_decode_picture(avctx, buf_ptr, input_size) < 0)
yading@10 2214 s2->pict_type = 0;
yading@10 2215 s2->first_slice = 1;
yading@10 2216 last_code = PICTURE_START_CODE;
yading@10 2217 } else {
yading@10 2218 av_log(avctx, AV_LOG_ERROR, "ignoring pic after %X\n", last_code);
yading@10 2219 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2220 return AVERROR_INVALIDDATA;
yading@10 2221 }
yading@10 2222 break;
yading@10 2223 case EXT_START_CODE:
yading@10 2224 init_get_bits(&s2->gb, buf_ptr, input_size*8);
yading@10 2225
yading@10 2226 switch (get_bits(&s2->gb, 4)) {
yading@10 2227 case 0x1:
yading@10 2228 if (last_code == 0) {
yading@10 2229 mpeg_decode_sequence_extension(s);
yading@10 2230 } else {
yading@10 2231 av_log(avctx, AV_LOG_ERROR, "ignoring seq ext after %X\n", last_code);
yading@10 2232 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2233 return AVERROR_INVALIDDATA;
yading@10 2234 }
yading@10 2235 break;
yading@10 2236 case 0x2:
yading@10 2237 mpeg_decode_sequence_display_extension(s);
yading@10 2238 break;
yading@10 2239 case 0x3:
yading@10 2240 mpeg_decode_quant_matrix_extension(s2);
yading@10 2241 break;
yading@10 2242 case 0x7:
yading@10 2243 mpeg_decode_picture_display_extension(s);
yading@10 2244 break;
yading@10 2245 case 0x8:
yading@10 2246 if (last_code == PICTURE_START_CODE) {
yading@10 2247 mpeg_decode_picture_coding_extension(s);
yading@10 2248 } else {
yading@10 2249 av_log(avctx, AV_LOG_ERROR, "ignoring pic cod ext after %X\n", last_code);
yading@10 2250 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2251 return AVERROR_INVALIDDATA;
yading@10 2252 }
yading@10 2253 break;
yading@10 2254 }
yading@10 2255 break;
yading@10 2256 case USER_START_CODE:
yading@10 2257 mpeg_decode_user_data(avctx, buf_ptr, input_size);
yading@10 2258 break;
yading@10 2259 case GOP_START_CODE:
yading@10 2260 if (last_code == 0) {
yading@10 2261 s2->first_field=0;
yading@10 2262 mpeg_decode_gop(avctx, buf_ptr, input_size);
yading@10 2263 s->sync=1;
yading@10 2264 } else {
yading@10 2265 av_log(avctx, AV_LOG_ERROR, "ignoring GOP_START_CODE after %X\n", last_code);
yading@10 2266 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2267 return AVERROR_INVALIDDATA;
yading@10 2268 }
yading@10 2269 break;
yading@10 2270 default:
yading@10 2271 if (start_code >= SLICE_MIN_START_CODE &&
yading@10 2272 start_code <= SLICE_MAX_START_CODE && last_code == PICTURE_START_CODE) {
yading@10 2273
yading@10 2274 if (s2->progressive_sequence && !s2->progressive_frame) {
yading@10 2275 s2->progressive_frame = 1;
yading@10 2276 av_log(s2->avctx, AV_LOG_ERROR, "interlaced frame in progressive sequence, ignoring\n");
yading@10 2277 }
yading@10 2278
yading@10 2279 if (s2->picture_structure == 0 || (s2->progressive_frame && s2->picture_structure != PICT_FRAME)) {
yading@10 2280 av_log(s2->avctx, AV_LOG_ERROR, "picture_structure %d invalid, ignoring\n", s2->picture_structure);
yading@10 2281 s2->picture_structure = PICT_FRAME;
yading@10 2282 }
yading@10 2283
yading@10 2284 if (s2->progressive_sequence && !s2->frame_pred_frame_dct) {
yading@10 2285 av_log(s2->avctx, AV_LOG_WARNING, "invalid frame_pred_frame_dct\n");
yading@10 2286 }
yading@10 2287
yading@10 2288 if (s2->picture_structure == PICT_FRAME) {
yading@10 2289 s2->first_field = 0;
yading@10 2290 s2->v_edge_pos = 16 * s2->mb_height;
yading@10 2291 } else {
yading@10 2292 s2->first_field ^= 1;
yading@10 2293 s2->v_edge_pos = 8 * s2->mb_height;
yading@10 2294 memset(s2->mbskip_table, 0, s2->mb_stride * s2->mb_height);
yading@10 2295 }
yading@10 2296 }
yading@10 2297 if (start_code >= SLICE_MIN_START_CODE &&
yading@10 2298 start_code <= SLICE_MAX_START_CODE && last_code != 0) {
yading@10 2299 const int field_pic = s2->picture_structure != PICT_FRAME;
yading@10 2300 int mb_y = start_code - SLICE_MIN_START_CODE;
yading@10 2301 last_code = SLICE_MIN_START_CODE;
yading@10 2302 if(s2->codec_id != AV_CODEC_ID_MPEG1VIDEO && s2->mb_height > 2800/16)
yading@10 2303 mb_y += (*buf_ptr&0xE0)<<2;
yading@10 2304
yading@10 2305 mb_y <<= field_pic;
yading@10 2306 if (s2->picture_structure == PICT_BOTTOM_FIELD)
yading@10 2307 mb_y++;
yading@10 2308
yading@10 2309 if (mb_y >= s2->mb_height) {
yading@10 2310 av_log(s2->avctx, AV_LOG_ERROR, "slice below image (%d >= %d)\n", mb_y, s2->mb_height);
yading@10 2311 return -1;
yading@10 2312 }
yading@10 2313
yading@10 2314 if (s2->last_picture_ptr == NULL) {
yading@10 2315 /* Skip B-frames if we do not have reference frames and gop is not closed */
yading@10 2316 if (s2->pict_type == AV_PICTURE_TYPE_B) {
yading@10 2317 if (!s2->closed_gop)
yading@10 2318 break;
yading@10 2319 }
yading@10 2320 }
yading@10 2321 if (s2->pict_type == AV_PICTURE_TYPE_I || (s2->flags2 & CODEC_FLAG2_SHOW_ALL))
yading@10 2322 s->sync=1;
yading@10 2323 if (s2->next_picture_ptr == NULL) {
yading@10 2324 /* Skip P-frames if we do not have a reference frame or we have an invalid header. */
yading@10 2325 if (s2->pict_type == AV_PICTURE_TYPE_P && !s->sync) break;
yading@10 2326 }
yading@10 2327 if ((avctx->skip_frame >= AVDISCARD_NONREF && s2->pict_type == AV_PICTURE_TYPE_B) ||
yading@10 2328 (avctx->skip_frame >= AVDISCARD_NONKEY && s2->pict_type != AV_PICTURE_TYPE_I) ||
yading@10 2329 avctx->skip_frame >= AVDISCARD_ALL)
yading@10 2330 break;
yading@10 2331
yading@10 2332 if (!s->mpeg_enc_ctx_allocated)
yading@10 2333 break;
yading@10 2334
yading@10 2335 if (s2->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
yading@10 2336 if (mb_y < avctx->skip_top || mb_y >= s2->mb_height - avctx->skip_bottom)
yading@10 2337 break;
yading@10 2338 }
yading@10 2339
yading@10 2340 if (!s2->pict_type) {
yading@10 2341 av_log(avctx, AV_LOG_ERROR, "Missing picture start code\n");
yading@10 2342 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2343 return AVERROR_INVALIDDATA;
yading@10 2344 break;
yading@10 2345 }
yading@10 2346
yading@10 2347 if (s2->first_slice) {
yading@10 2348 s2->first_slice = 0;
yading@10 2349 if (mpeg_field_start(s2, buf, buf_size) < 0)
yading@10 2350 return -1;
yading@10 2351 }
yading@10 2352 if (!s2->current_picture_ptr) {
yading@10 2353 av_log(avctx, AV_LOG_ERROR, "current_picture not initialized\n");
yading@10 2354 return AVERROR_INVALIDDATA;
yading@10 2355 }
yading@10 2356
yading@10 2357 if (uses_vdpau(avctx)) {
yading@10 2358 s->slice_count++;
yading@10 2359 break;
yading@10 2360 }
yading@10 2361
yading@10 2362 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE)) {
yading@10 2363 int threshold = (s2->mb_height * s->slice_count +
yading@10 2364 s2->slice_context_count / 2) /
yading@10 2365 s2->slice_context_count;
yading@10 2366 av_assert0(avctx->thread_count > 1);
yading@10 2367 if (threshold <= mb_y) {
yading@10 2368 MpegEncContext *thread_context = s2->thread_context[s->slice_count];
yading@10 2369
yading@10 2370 thread_context->start_mb_y = mb_y;
yading@10 2371 thread_context->end_mb_y = s2->mb_height;
yading@10 2372 if (s->slice_count) {
yading@10 2373 s2->thread_context[s->slice_count-1]->end_mb_y = mb_y;
yading@10 2374 ret = ff_update_duplicate_context(thread_context,
yading@10 2375 s2);
yading@10 2376 if (ret < 0)
yading@10 2377 return ret;
yading@10 2378 }
yading@10 2379 init_get_bits(&thread_context->gb, buf_ptr, input_size*8);
yading@10 2380 s->slice_count++;
yading@10 2381 }
yading@10 2382 buf_ptr += 2; // FIXME add minimum number of bytes per slice
yading@10 2383 } else {
yading@10 2384 ret = mpeg_decode_slice(s2, mb_y, &buf_ptr, input_size);
yading@10 2385 emms_c();
yading@10 2386
yading@10 2387 if (ret < 0) {
yading@10 2388 if (avctx->err_recognition & AV_EF_EXPLODE)
yading@10 2389 return ret;
yading@10 2390 if (s2->resync_mb_x >= 0 && s2->resync_mb_y >= 0)
yading@10 2391 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);
yading@10 2392 } else {
yading@10 2393 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);
yading@10 2394 }
yading@10 2395 }
yading@10 2396 }
yading@10 2397 break;
yading@10 2398 }
yading@10 2399 }
yading@10 2400 }
yading@10 2401
yading@10 2402 static int mpeg_decode_frame(AVCodecContext *avctx,
yading@10 2403 void *data, int *got_output,
yading@10 2404 AVPacket *avpkt)
yading@10 2405 {
yading@10 2406 const uint8_t *buf = avpkt->data;
yading@10 2407 int ret;
yading@10 2408 int buf_size = avpkt->size;
yading@10 2409 Mpeg1Context *s = avctx->priv_data;
yading@10 2410 AVFrame *picture = data;
yading@10 2411 MpegEncContext *s2 = &s->mpeg_enc_ctx;
yading@10 2412 av_dlog(avctx, "fill_buffer\n");
yading@10 2413
yading@10 2414 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) {
yading@10 2415 /* special case for last picture */
yading@10 2416 if (s2->low_delay == 0 && s2->next_picture_ptr) {
yading@10 2417 int ret = av_frame_ref(picture, &s2->next_picture_ptr->f);
yading@10 2418 if (ret < 0)
yading@10 2419 return ret;
yading@10 2420
yading@10 2421 s2->next_picture_ptr = NULL;
yading@10 2422
yading@10 2423 *got_output = 1;
yading@10 2424 }
yading@10 2425 return buf_size;
yading@10 2426 }
yading@10 2427
yading@10 2428 if (s2->flags & CODEC_FLAG_TRUNCATED) {
yading@10 2429 int next = ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size, NULL);
yading@10 2430
yading@10 2431 if (ff_combine_frame(&s2->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0)
yading@10 2432 return buf_size;
yading@10 2433 }
yading@10 2434
yading@10 2435 s2->codec_tag = avpriv_toupper4(avctx->codec_tag);
yading@10 2436 if (s->mpeg_enc_ctx_allocated == 0 && ( s2->codec_tag == AV_RL32("VCR2")
yading@10 2437 || s2->codec_tag == AV_RL32("BW10")
yading@10 2438 ))
yading@10 2439 vcr2_init_sequence(avctx);
yading@10 2440
yading@10 2441 s->slice_count = 0;
yading@10 2442
yading@10 2443 if (avctx->extradata && !s->extradata_decoded) {
yading@10 2444 ret = decode_chunks(avctx, picture, got_output, avctx->extradata, avctx->extradata_size);
yading@10 2445 if(*got_output) {
yading@10 2446 av_log(avctx, AV_LOG_ERROR, "picture in extradata\n");
yading@10 2447 *got_output = 0;
yading@10 2448 }
yading@10 2449 s->extradata_decoded = 1;
yading@10 2450 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) {
yading@10 2451 s2->current_picture_ptr = NULL;
yading@10 2452 return ret;
yading@10 2453 }
yading@10 2454 }
yading@10 2455
yading@10 2456 ret = decode_chunks(avctx, picture, got_output, buf, buf_size);
yading@10 2457 if (ret<0 || *got_output)
yading@10 2458 s2->current_picture_ptr = NULL;
yading@10 2459
yading@10 2460 return ret;
yading@10 2461 }
yading@10 2462
yading@10 2463
yading@10 2464 static void flush(AVCodecContext *avctx)
yading@10 2465 {
yading@10 2466 Mpeg1Context *s = avctx->priv_data;
yading@10 2467
yading@10 2468 s->sync=0;
yading@10 2469
yading@10 2470 ff_mpeg_flush(avctx);
yading@10 2471 }
yading@10 2472
yading@10 2473 static int mpeg_decode_end(AVCodecContext *avctx)
yading@10 2474 {
yading@10 2475 Mpeg1Context *s = avctx->priv_data;
yading@10 2476
yading@10 2477 if (s->mpeg_enc_ctx_allocated)
yading@10 2478 ff_MPV_common_end(&s->mpeg_enc_ctx);
yading@10 2479 return 0;
yading@10 2480 }
yading@10 2481
yading@10 2482 static const AVProfile mpeg2_video_profiles[] = {
yading@10 2483 { FF_PROFILE_MPEG2_422, "4:2:2" },
yading@10 2484 { FF_PROFILE_MPEG2_HIGH, "High" },
yading@10 2485 { FF_PROFILE_MPEG2_SS, "Spatially Scalable" },
yading@10 2486 { FF_PROFILE_MPEG2_SNR_SCALABLE, "SNR Scalable" },
yading@10 2487 { FF_PROFILE_MPEG2_MAIN, "Main" },
yading@10 2488 { FF_PROFILE_MPEG2_SIMPLE, "Simple" },
yading@10 2489 { FF_PROFILE_RESERVED, "Reserved" },
yading@10 2490 { FF_PROFILE_RESERVED, "Reserved" },
yading@10 2491 { FF_PROFILE_UNKNOWN },
yading@10 2492 };
yading@10 2493
yading@10 2494
yading@10 2495 AVCodec ff_mpeg1video_decoder = {
yading@10 2496 .name = "mpeg1video",
yading@10 2497 .type = AVMEDIA_TYPE_VIDEO,
yading@10 2498 .id = AV_CODEC_ID_MPEG1VIDEO,
yading@10 2499 .priv_data_size = sizeof(Mpeg1Context),
yading@10 2500 .init = mpeg_decode_init,
yading@10 2501 .close = mpeg_decode_end,
yading@10 2502 .decode = mpeg_decode_frame,
yading@10 2503 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
yading@10 2504 CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
yading@10 2505 CODEC_CAP_SLICE_THREADS,
yading@10 2506 .flush = flush,
yading@10 2507 .max_lowres = 3,
yading@10 2508 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
yading@10 2509 .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context)
yading@10 2510 };
yading@10 2511
yading@10 2512 AVCodec ff_mpeg2video_decoder = {
yading@10 2513 .name = "mpeg2video",
yading@10 2514 .type = AVMEDIA_TYPE_VIDEO,
yading@10 2515 .id = AV_CODEC_ID_MPEG2VIDEO,
yading@10 2516 .priv_data_size = sizeof(Mpeg1Context),
yading@10 2517 .init = mpeg_decode_init,
yading@10 2518 .close = mpeg_decode_end,
yading@10 2519 .decode = mpeg_decode_frame,
yading@10 2520 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
yading@10 2521 CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY |
yading@10 2522 CODEC_CAP_SLICE_THREADS,
yading@10 2523 .flush = flush,
yading@10 2524 .max_lowres = 3,
yading@10 2525 .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 video"),
yading@10 2526 .profiles = NULL_IF_CONFIG_SMALL(mpeg2_video_profiles),
yading@10 2527 };
yading@10 2528
yading@10 2529 //legacy decoder
yading@10 2530 AVCodec ff_mpegvideo_decoder = {
yading@10 2531 .name = "mpegvideo",
yading@10 2532 .type = AVMEDIA_TYPE_VIDEO,
yading@10 2533 .id = AV_CODEC_ID_MPEG2VIDEO,
yading@10 2534 .priv_data_size = sizeof(Mpeg1Context),
yading@10 2535 .init = mpeg_decode_init,
yading@10 2536 .close = mpeg_decode_end,
yading@10 2537 .decode = mpeg_decode_frame,
yading@10 2538 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS,
yading@10 2539 .flush = flush,
yading@10 2540 .max_lowres = 3,
yading@10 2541 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video"),
yading@10 2542 };
yading@10 2543
yading@10 2544 #if CONFIG_MPEG_XVMC_DECODER
yading@10 2545 static av_cold int mpeg_mc_decode_init(AVCodecContext *avctx)
yading@10 2546 {
yading@10 2547 if (avctx->active_thread_type & FF_THREAD_SLICE)
yading@10 2548 return -1;
yading@10 2549 if (!(avctx->slice_flags & SLICE_FLAG_CODED_ORDER))
yading@10 2550 return -1;
yading@10 2551 if (!(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) {
yading@10 2552 av_dlog(avctx, "mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n");
yading@10 2553 }
yading@10 2554 mpeg_decode_init(avctx);
yading@10 2555
yading@10 2556 avctx->pix_fmt = AV_PIX_FMT_XVMC_MPEG2_IDCT;
yading@10 2557 avctx->xvmc_acceleration = 2; // 2 - the blocks are packed!
yading@10 2558
yading@10 2559 return 0;
yading@10 2560 }
yading@10 2561
yading@10 2562 AVCodec ff_mpeg_xvmc_decoder = {
yading@10 2563 .name = "mpegvideo_xvmc",
yading@10 2564 .type = AVMEDIA_TYPE_VIDEO,
yading@10 2565 .id = AV_CODEC_ID_MPEG2VIDEO_XVMC,
yading@10 2566 .priv_data_size = sizeof(Mpeg1Context),
yading@10 2567 .init = mpeg_mc_decode_init,
yading@10 2568 .close = mpeg_decode_end,
yading@10 2569 .decode = mpeg_decode_frame,
yading@10 2570 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 |
yading@10 2571 CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY,
yading@10 2572 .flush = flush,
yading@10 2573 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1/2 video XvMC (X-Video Motion Compensation)"),
yading@10 2574 };
yading@10 2575
yading@10 2576 #endif
yading@10 2577
yading@10 2578 #if CONFIG_MPEG_VDPAU_DECODER
yading@10 2579 AVCodec ff_mpeg_vdpau_decoder = {
yading@10 2580 .name = "mpegvideo_vdpau",
yading@10 2581 .type = AVMEDIA_TYPE_VIDEO,
yading@10 2582 .id = AV_CODEC_ID_MPEG2VIDEO,
yading@10 2583 .priv_data_size = sizeof(Mpeg1Context),
yading@10 2584 .init = mpeg_decode_init,
yading@10 2585 .close = mpeg_decode_end,
yading@10 2586 .decode = mpeg_decode_frame,
yading@10 2587 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED |
yading@10 2588 CODEC_CAP_HWACCEL_VDPAU | CODEC_CAP_DELAY,
yading@10 2589 .flush = flush,
yading@10 2590 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1/2 video (VDPAU acceleration)"),
yading@10 2591 };
yading@10 2592 #endif
yading@10 2593
yading@10 2594 #if CONFIG_MPEG1_VDPAU_DECODER
yading@10 2595 AVCodec ff_mpeg1_vdpau_decoder = {
yading@10 2596 .name = "mpeg1video_vdpau",
yading@10 2597 .type = AVMEDIA_TYPE_VIDEO,
yading@10 2598 .id = AV_CODEC_ID_MPEG1VIDEO,
yading@10 2599 .priv_data_size = sizeof(Mpeg1Context),
yading@10 2600 .init = mpeg_decode_init,
yading@10 2601 .close = mpeg_decode_end,
yading@10 2602 .decode = mpeg_decode_frame,
yading@10 2603 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED |
yading@10 2604 CODEC_CAP_HWACCEL_VDPAU | CODEC_CAP_DELAY,
yading@10 2605 .flush = flush,
yading@10 2606 .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video (VDPAU acceleration)"),
yading@10 2607 };
yading@10 2608 #endif