Mercurial > audlegacy-plugins
comparison src/ffmpeg/libavcodec/mpeg12.c @ 808:e8776388b02a trunk
[svn] - add ffmpeg
| author | nenolod |
|---|---|
| date | Mon, 12 Mar 2007 11:18:54 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 807:0f9c8d4d3ac4 | 808:e8776388b02a |
|---|---|
| 1 /* | |
| 2 * MPEG1 codec / MPEG2 decoder | |
| 3 * Copyright (c) 2000,2001 Fabrice Bellard. | |
| 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | |
| 5 * | |
| 6 * This file is part of FFmpeg. | |
| 7 * | |
| 8 * FFmpeg is free software; you can redistribute it and/or | |
| 9 * modify it under the terms of the GNU Lesser General Public | |
| 10 * License as published by the Free Software Foundation; either | |
| 11 * version 2.1 of the License, or (at your option) any later version. | |
| 12 * | |
| 13 * FFmpeg is distributed in the hope that it will be useful, | |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 * Lesser General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU Lesser General Public | |
| 19 * License along with FFmpeg; if not, write to the Free Software | |
| 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 */ | |
| 22 | |
| 23 /** | |
| 24 * @file mpeg12.c | |
| 25 * MPEG1/2 codec | |
| 26 */ | |
| 27 | |
| 28 //#define DEBUG | |
| 29 #include "avcodec.h" | |
| 30 #include "dsputil.h" | |
| 31 #include "mpegvideo.h" | |
| 32 | |
| 33 #include "mpeg12data.h" | |
| 34 | |
| 35 //#undef NDEBUG | |
| 36 //#include <assert.h> | |
| 37 | |
| 38 | |
| 39 /* Start codes. */ | |
| 40 #define SEQ_END_CODE 0x000001b7 | |
| 41 #define SEQ_START_CODE 0x000001b3 | |
| 42 #define GOP_START_CODE 0x000001b8 | |
| 43 #define PICTURE_START_CODE 0x00000100 | |
| 44 #define SLICE_MIN_START_CODE 0x00000101 | |
| 45 #define SLICE_MAX_START_CODE 0x000001af | |
| 46 #define EXT_START_CODE 0x000001b5 | |
| 47 #define USER_START_CODE 0x000001b2 | |
| 48 | |
| 49 #define DC_VLC_BITS 9 | |
| 50 #define MV_VLC_BITS 9 | |
| 51 #define MBINCR_VLC_BITS 9 | |
| 52 #define MB_PAT_VLC_BITS 9 | |
| 53 #define MB_PTYPE_VLC_BITS 6 | |
| 54 #define MB_BTYPE_VLC_BITS 6 | |
| 55 #define TEX_VLC_BITS 9 | |
| 56 | |
| 57 #ifdef CONFIG_ENCODERS | |
| 58 static void mpeg1_encode_block(MpegEncContext *s, | |
| 59 DCTELEM *block, | |
| 60 int component); | |
| 61 static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code); // RAL: f_code parameter added | |
| 62 #endif //CONFIG_ENCODERS | |
| 63 static inline int mpeg1_decode_block_inter(MpegEncContext *s, | |
| 64 DCTELEM *block, | |
| 65 int n); | |
| 66 static inline int mpeg1_decode_block_intra(MpegEncContext *s, | |
| 67 DCTELEM *block, | |
| 68 int n); | |
| 69 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n); | |
| 70 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | |
| 71 DCTELEM *block, | |
| 72 int n); | |
| 73 static inline int mpeg2_decode_block_intra(MpegEncContext *s, | |
| 74 DCTELEM *block, | |
| 75 int n); | |
| 76 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, DCTELEM *block, int n); | |
| 77 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, DCTELEM *block, int n); | |
| 78 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); | |
| 79 static void exchange_uv(MpegEncContext *s); | |
| 80 | |
| 81 #ifdef HAVE_XVMC | |
| 82 extern int XVMC_field_start(MpegEncContext *s, AVCodecContext *avctx); | |
| 83 extern int XVMC_field_end(MpegEncContext *s); | |
| 84 extern void XVMC_pack_pblocks(MpegEncContext *s,int cbp); | |
| 85 extern void XVMC_init_block(MpegEncContext *s);//set s->block | |
| 86 #endif | |
| 87 | |
| 88 const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1}; | |
| 89 const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1}; | |
| 90 const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1}; | |
| 91 const enum PixelFormat pixfmt_xvmc_mpg2_420[] = { | |
| 92 PIX_FMT_XVMC_MPEG2_IDCT, | |
| 93 PIX_FMT_XVMC_MPEG2_MC, | |
| 94 -1}; | |
| 95 #ifdef CONFIG_ENCODERS | |
| 96 static uint8_t (*mv_penalty)[MAX_MV*2+1]= NULL; | |
| 97 static uint8_t fcode_tab[MAX_MV*2+1]; | |
| 98 | |
| 99 static uint8_t uni_mpeg1_ac_vlc_len [64*64*2]; | |
| 100 static uint8_t uni_mpeg2_ac_vlc_len [64*64*2]; | |
| 101 | |
| 102 /* simple include everything table for dc, first byte is bits number next 3 are code*/ | |
| 103 static uint32_t mpeg1_lum_dc_uni[512]; | |
| 104 static uint32_t mpeg1_chr_dc_uni[512]; | |
| 105 | |
| 106 static uint8_t mpeg1_index_run[2][64]; | |
| 107 static int8_t mpeg1_max_level[2][64]; | |
| 108 #endif //CONFIG_ENCODERS | |
| 109 | |
| 110 static void init_2d_vlc_rl(RLTable *rl, int use_static) | |
| 111 { | |
| 112 int i; | |
| 113 | |
| 114 init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2, | |
| 115 &rl->table_vlc[0][1], 4, 2, | |
| 116 &rl->table_vlc[0][0], 4, 2, use_static); | |
| 117 | |
| 118 if(use_static) | |
| 119 rl->rl_vlc[0]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); | |
| 120 else | |
| 121 rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); | |
| 122 | |
| 123 for(i=0; i<rl->vlc.table_size; i++){ | |
| 124 int code= rl->vlc.table[i][0]; | |
| 125 int len = rl->vlc.table[i][1]; | |
| 126 int level, run; | |
| 127 | |
| 128 if(len==0){ // illegal code | |
| 129 run= 65; | |
| 130 level= MAX_LEVEL; | |
| 131 }else if(len<0){ //more bits needed | |
| 132 run= 0; | |
| 133 level= code; | |
| 134 }else{ | |
| 135 if(code==rl->n){ //esc | |
| 136 run= 65; | |
| 137 level= 0; | |
| 138 }else if(code==rl->n+1){ //eob | |
| 139 run= 0; | |
| 140 level= 127; | |
| 141 }else{ | |
| 142 run= rl->table_run [code] + 1; | |
| 143 level= rl->table_level[code]; | |
| 144 } | |
| 145 } | |
| 146 rl->rl_vlc[0][i].len= len; | |
| 147 rl->rl_vlc[0][i].level= level; | |
| 148 rl->rl_vlc[0][i].run= run; | |
| 149 } | |
| 150 } | |
| 151 | |
| 152 #ifdef CONFIG_ENCODERS | |
| 153 static void init_uni_ac_vlc(RLTable *rl, uint8_t *uni_ac_vlc_len){ | |
| 154 int i; | |
| 155 | |
| 156 for(i=0; i<128; i++){ | |
| 157 int level= i-64; | |
| 158 int run; | |
| 159 for(run=0; run<64; run++){ | |
| 160 int len, bits, code; | |
| 161 | |
| 162 int alevel= FFABS(level); | |
| 163 int sign= (level>>31)&1; | |
| 164 | |
| 165 if (alevel > rl->max_level[0][run]) | |
| 166 code= 111; /*rl->n*/ | |
| 167 else | |
| 168 code= rl->index_run[0][run] + alevel - 1; | |
| 169 | |
| 170 if (code < 111 /* rl->n */) { | |
| 171 /* store the vlc & sign at once */ | |
| 172 len= rl->table_vlc[code][1]+1; | |
| 173 bits= (rl->table_vlc[code][0]<<1) + sign; | |
| 174 } else { | |
| 175 len= rl->table_vlc[111/*rl->n*/][1]+6; | |
| 176 bits= rl->table_vlc[111/*rl->n*/][0]<<6; | |
| 177 | |
| 178 bits|= run; | |
| 179 if (alevel < 128) { | |
| 180 bits<<=8; len+=8; | |
| 181 bits|= level & 0xff; | |
| 182 } else { | |
| 183 bits<<=16; len+=16; | |
| 184 bits|= level & 0xff; | |
| 185 if (level < 0) { | |
| 186 bits|= 0x8001 + level + 255; | |
| 187 } else { | |
| 188 bits|= level & 0xffff; | |
| 189 } | |
| 190 } | |
| 191 } | |
| 192 | |
| 193 uni_ac_vlc_len [UNI_AC_ENC_INDEX(run, i)]= len; | |
| 194 } | |
| 195 } | |
| 196 } | |
| 197 | |
| 198 | |
| 199 static int find_frame_rate_index(MpegEncContext *s){ | |
| 200 int i; | |
| 201 int64_t dmin= INT64_MAX; | |
| 202 int64_t d; | |
| 203 | |
| 204 for(i=1;i<14;i++) { | |
| 205 int64_t n0= 1001LL/ff_frame_rate_tab[i].den*ff_frame_rate_tab[i].num*s->avctx->time_base.num; | |
| 206 int64_t n1= 1001LL*s->avctx->time_base.den; | |
| 207 if(s->avctx->strict_std_compliance > FF_COMPLIANCE_INOFFICIAL && i>=9) break; | |
| 208 | |
| 209 d = FFABS(n0 - n1); | |
| 210 if(d < dmin){ | |
| 211 dmin=d; | |
| 212 s->frame_rate_index= i; | |
| 213 } | |
| 214 } | |
| 215 if(dmin) | |
| 216 return -1; | |
| 217 else | |
| 218 return 0; | |
| 219 } | |
| 220 | |
| 221 static int encode_init(AVCodecContext *avctx) | |
| 222 { | |
| 223 MpegEncContext *s = avctx->priv_data; | |
| 224 | |
| 225 if(MPV_encode_init(avctx) < 0) | |
| 226 return -1; | |
| 227 | |
| 228 if(find_frame_rate_index(s) < 0){ | |
| 229 if(s->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ | |
| 230 av_log(avctx, AV_LOG_ERROR, "MPEG1/2 does not support %d/%d fps\n", avctx->time_base.den, avctx->time_base.num); | |
| 231 return -1; | |
| 232 }else{ | |
| 233 av_log(avctx, AV_LOG_INFO, "MPEG1/2 does not support %d/%d fps, there may be AV sync issues\n", avctx->time_base.den, avctx->time_base.num); | |
| 234 } | |
| 235 } | |
| 236 | |
| 237 if(avctx->profile == FF_PROFILE_UNKNOWN) | |
| 238 avctx->profile = s->chroma_format == CHROMA_420 ? 4 : 0; | |
| 239 | |
| 240 if(avctx->level == FF_LEVEL_UNKNOWN) | |
| 241 avctx->level = s->chroma_format == CHROMA_420 ? 8 : 5; | |
| 242 | |
| 243 return 0; | |
| 244 } | |
| 245 | |
| 246 static void put_header(MpegEncContext *s, int header) | |
| 247 { | |
| 248 align_put_bits(&s->pb); | |
| 249 put_bits(&s->pb, 16, header>>16); | |
| 250 put_bits(&s->pb, 16, header&0xFFFF); | |
| 251 } | |
| 252 | |
| 253 /* put sequence header if needed */ | |
| 254 static void mpeg1_encode_sequence_header(MpegEncContext *s) | |
| 255 { | |
| 256 unsigned int vbv_buffer_size; | |
| 257 unsigned int fps, v; | |
| 258 int i; | |
| 259 uint64_t time_code; | |
| 260 float best_aspect_error= 1E10; | |
| 261 float aspect_ratio= av_q2d(s->avctx->sample_aspect_ratio); | |
| 262 int constraint_parameter_flag; | |
| 263 | |
| 264 if(aspect_ratio==0.0) aspect_ratio= 1.0; //pixel aspect 1:1 (VGA) | |
| 265 | |
| 266 if (s->current_picture.key_frame) { | |
| 267 AVRational framerate= ff_frame_rate_tab[s->frame_rate_index]; | |
| 268 | |
| 269 /* mpeg1 header repeated every gop */ | |
| 270 put_header(s, SEQ_START_CODE); | |
| 271 | |
| 272 put_bits(&s->pb, 12, s->width); | |
| 273 put_bits(&s->pb, 12, s->height); | |
| 274 | |
| 275 for(i=1; i<15; i++){ | |
| 276 float error= aspect_ratio; | |
| 277 if(s->codec_id == CODEC_ID_MPEG1VIDEO || i <=1) | |
| 278 error-= 1.0/mpeg1_aspect[i]; | |
| 279 else | |
| 280 error-= av_q2d(mpeg2_aspect[i])*s->height/s->width; | |
| 281 | |
| 282 error= FFABS(error); | |
| 283 | |
| 284 if(error < best_aspect_error){ | |
| 285 best_aspect_error= error; | |
| 286 s->aspect_ratio_info= i; | |
| 287 } | |
| 288 } | |
| 289 | |
| 290 put_bits(&s->pb, 4, s->aspect_ratio_info); | |
| 291 put_bits(&s->pb, 4, s->frame_rate_index); | |
| 292 | |
| 293 if(s->avctx->rc_max_rate){ | |
| 294 v = (s->avctx->rc_max_rate + 399) / 400; | |
| 295 if (v > 0x3ffff && s->codec_id == CODEC_ID_MPEG1VIDEO) | |
| 296 v = 0x3ffff; | |
| 297 }else{ | |
| 298 v= 0x3FFFF; | |
| 299 } | |
| 300 | |
| 301 if(s->avctx->rc_buffer_size) | |
| 302 vbv_buffer_size = s->avctx->rc_buffer_size; | |
| 303 else | |
| 304 /* VBV calculation: Scaled so that a VCD has the proper VBV size of 40 kilobytes */ | |
| 305 vbv_buffer_size = (( 20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; | |
| 306 vbv_buffer_size= (vbv_buffer_size + 16383) / 16384; | |
| 307 | |
| 308 put_bits(&s->pb, 18, v & 0x3FFFF); | |
| 309 put_bits(&s->pb, 1, 1); /* marker */ | |
| 310 put_bits(&s->pb, 10, vbv_buffer_size & 0x3FF); | |
| 311 | |
| 312 constraint_parameter_flag= | |
| 313 s->width <= 768 && s->height <= 576 && | |
| 314 s->mb_width * s->mb_height <= 396 && | |
| 315 s->mb_width * s->mb_height * framerate.num <= framerate.den*396*25 && | |
| 316 framerate.num <= framerate.den*30 && | |
| 317 s->avctx->me_range && s->avctx->me_range < 128 && | |
| 318 vbv_buffer_size <= 20 && | |
| 319 v <= 1856000/400 && | |
| 320 s->codec_id == CODEC_ID_MPEG1VIDEO; | |
| 321 | |
| 322 put_bits(&s->pb, 1, constraint_parameter_flag); | |
| 323 | |
| 324 ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); | |
| 325 ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); | |
| 326 | |
| 327 if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | |
| 328 put_header(s, EXT_START_CODE); | |
| 329 put_bits(&s->pb, 4, 1); //seq ext | |
| 330 | |
| 331 put_bits(&s->pb, 1, s->chroma_format == CHROMA_422); //escx | |
| 332 | |
| 333 put_bits(&s->pb, 3, s->avctx->profile); //profile | |
| 334 put_bits(&s->pb, 4, s->avctx->level); //level | |
| 335 | |
| 336 put_bits(&s->pb, 1, s->progressive_sequence); | |
| 337 put_bits(&s->pb, 2, s->chroma_format); | |
| 338 put_bits(&s->pb, 2, 0); //horizontal size ext | |
| 339 put_bits(&s->pb, 2, 0); //vertical size ext | |
| 340 put_bits(&s->pb, 12, v>>18); //bitrate ext | |
| 341 put_bits(&s->pb, 1, 1); //marker | |
| 342 put_bits(&s->pb, 8, vbv_buffer_size >>10); //vbv buffer ext | |
| 343 put_bits(&s->pb, 1, s->low_delay); | |
| 344 put_bits(&s->pb, 2, 0); // frame_rate_ext_n | |
| 345 put_bits(&s->pb, 5, 0); // frame_rate_ext_d | |
| 346 } | |
| 347 | |
| 348 put_header(s, GOP_START_CODE); | |
| 349 put_bits(&s->pb, 1, 0); /* do drop frame */ | |
| 350 /* time code : we must convert from the real frame rate to a | |
| 351 fake mpeg frame rate in case of low frame rate */ | |
| 352 fps = (framerate.num + framerate.den/2)/ framerate.den; | |
| 353 time_code = s->current_picture_ptr->coded_picture_number; | |
| 354 | |
| 355 s->gop_picture_number = time_code; | |
| 356 put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); | |
| 357 put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); | |
| 358 put_bits(&s->pb, 1, 1); | |
| 359 put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); | |
| 360 put_bits(&s->pb, 6, (uint32_t)((time_code % fps))); | |
| 361 put_bits(&s->pb, 1, !!(s->flags & CODEC_FLAG_CLOSED_GOP)); | |
| 362 put_bits(&s->pb, 1, 0); /* broken link */ | |
| 363 } | |
| 364 } | |
| 365 | |
| 366 static inline void encode_mb_skip_run(MpegEncContext *s, int run){ | |
| 367 while (run >= 33) { | |
| 368 put_bits(&s->pb, 11, 0x008); | |
| 369 run -= 33; | |
| 370 } | |
| 371 put_bits(&s->pb, mbAddrIncrTable[run][1], | |
| 372 mbAddrIncrTable[run][0]); | |
| 373 } | |
| 374 #endif //CONFIG_ENCODERS | |
| 375 | |
| 376 static void common_init(MpegEncContext *s) | |
| 377 { | |
| 378 | |
| 379 s->y_dc_scale_table= | |
| 380 s->c_dc_scale_table= mpeg2_dc_scale_table[s->intra_dc_precision]; | |
| 381 | |
| 382 } | |
| 383 | |
| 384 void ff_mpeg1_clean_buffers(MpegEncContext *s){ | |
| 385 s->last_dc[0] = 1 << (7 + s->intra_dc_precision); | |
| 386 s->last_dc[1] = s->last_dc[0]; | |
| 387 s->last_dc[2] = s->last_dc[0]; | |
| 388 memset(s->last_mv, 0, sizeof(s->last_mv)); | |
| 389 } | |
| 390 | |
| 391 #ifdef CONFIG_ENCODERS | |
| 392 | |
| 393 void ff_mpeg1_encode_slice_header(MpegEncContext *s){ | |
| 394 put_header(s, SLICE_MIN_START_CODE + s->mb_y); | |
| 395 put_bits(&s->pb, 5, s->qscale); /* quantizer scale */ | |
| 396 put_bits(&s->pb, 1, 0); /* slice extra information */ | |
| 397 } | |
| 398 | |
| 399 void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) | |
| 400 { | |
| 401 mpeg1_encode_sequence_header(s); | |
| 402 | |
| 403 /* mpeg1 picture header */ | |
| 404 put_header(s, PICTURE_START_CODE); | |
| 405 /* temporal reference */ | |
| 406 | |
| 407 // RAL: s->picture_number instead of s->fake_picture_number | |
| 408 put_bits(&s->pb, 10, (s->picture_number - | |
| 409 s->gop_picture_number) & 0x3ff); | |
| 410 put_bits(&s->pb, 3, s->pict_type); | |
| 411 | |
| 412 s->vbv_delay_ptr= s->pb.buf + put_bits_count(&s->pb)/8; | |
| 413 put_bits(&s->pb, 16, 0xFFFF); /* vbv_delay */ | |
| 414 | |
| 415 // RAL: Forward f_code also needed for B frames | |
| 416 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | |
| 417 put_bits(&s->pb, 1, 0); /* half pel coordinates */ | |
| 418 if(s->codec_id == CODEC_ID_MPEG1VIDEO) | |
| 419 put_bits(&s->pb, 3, s->f_code); /* forward_f_code */ | |
| 420 else | |
| 421 put_bits(&s->pb, 3, 7); /* forward_f_code */ | |
| 422 } | |
| 423 | |
| 424 // RAL: Backward f_code necessary for B frames | |
| 425 if (s->pict_type == B_TYPE) { | |
| 426 put_bits(&s->pb, 1, 0); /* half pel coordinates */ | |
| 427 if(s->codec_id == CODEC_ID_MPEG1VIDEO) | |
| 428 put_bits(&s->pb, 3, s->b_code); /* backward_f_code */ | |
| 429 else | |
| 430 put_bits(&s->pb, 3, 7); /* backward_f_code */ | |
| 431 } | |
| 432 | |
| 433 put_bits(&s->pb, 1, 0); /* extra bit picture */ | |
| 434 | |
| 435 s->frame_pred_frame_dct = 1; | |
| 436 if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | |
| 437 put_header(s, EXT_START_CODE); | |
| 438 put_bits(&s->pb, 4, 8); //pic ext | |
| 439 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | |
| 440 put_bits(&s->pb, 4, s->f_code); | |
| 441 put_bits(&s->pb, 4, s->f_code); | |
| 442 }else{ | |
| 443 put_bits(&s->pb, 8, 255); | |
| 444 } | |
| 445 if (s->pict_type == B_TYPE) { | |
| 446 put_bits(&s->pb, 4, s->b_code); | |
| 447 put_bits(&s->pb, 4, s->b_code); | |
| 448 }else{ | |
| 449 put_bits(&s->pb, 8, 255); | |
| 450 } | |
| 451 put_bits(&s->pb, 2, s->intra_dc_precision); | |
| 452 | |
| 453 assert(s->picture_structure == PICT_FRAME); | |
| 454 put_bits(&s->pb, 2, s->picture_structure); | |
| 455 if (s->progressive_sequence) { | |
| 456 put_bits(&s->pb, 1, 0); /* no repeat */ | |
| 457 } else { | |
| 458 put_bits(&s->pb, 1, s->current_picture_ptr->top_field_first); | |
| 459 } | |
| 460 /* XXX: optimize the generation of this flag with entropy | |
| 461 measures */ | |
| 462 s->frame_pred_frame_dct = s->progressive_sequence; | |
| 463 | |
| 464 put_bits(&s->pb, 1, s->frame_pred_frame_dct); | |
| 465 put_bits(&s->pb, 1, s->concealment_motion_vectors); | |
| 466 put_bits(&s->pb, 1, s->q_scale_type); | |
| 467 put_bits(&s->pb, 1, s->intra_vlc_format); | |
| 468 put_bits(&s->pb, 1, s->alternate_scan); | |
| 469 put_bits(&s->pb, 1, s->repeat_first_field); | |
| 470 s->progressive_frame = s->progressive_sequence; | |
| 471 put_bits(&s->pb, 1, s->chroma_format == CHROMA_420 ? s->progressive_frame : 0); /* chroma_420_type */ | |
| 472 put_bits(&s->pb, 1, s->progressive_frame); | |
| 473 put_bits(&s->pb, 1, 0); //composite_display_flag | |
| 474 } | |
| 475 if(s->flags & CODEC_FLAG_SVCD_SCAN_OFFSET){ | |
| 476 int i; | |
| 477 | |
| 478 put_header(s, USER_START_CODE); | |
| 479 for(i=0; i<sizeof(svcd_scan_offset_placeholder); i++){ | |
| 480 put_bits(&s->pb, 8, svcd_scan_offset_placeholder[i]); | |
| 481 } | |
| 482 } | |
| 483 | |
| 484 s->mb_y=0; | |
| 485 ff_mpeg1_encode_slice_header(s); | |
| 486 } | |
| 487 | |
| 488 static inline void put_mb_modes(MpegEncContext *s, int n, int bits, | |
| 489 int has_mv, int field_motion) | |
| 490 { | |
| 491 put_bits(&s->pb, n, bits); | |
| 492 if (!s->frame_pred_frame_dct) { | |
| 493 if (has_mv) | |
| 494 put_bits(&s->pb, 2, 2 - field_motion); /* motion_type: frame/field */ | |
| 495 put_bits(&s->pb, 1, s->interlaced_dct); | |
| 496 } | |
| 497 } | |
| 498 | |
| 499 static always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, | |
| 500 DCTELEM block[6][64], | |
| 501 int motion_x, int motion_y, | |
| 502 int mb_block_count) | |
| 503 { | |
| 504 int i, cbp; | |
| 505 const int mb_x = s->mb_x; | |
| 506 const int mb_y = s->mb_y; | |
| 507 const int first_mb= mb_x == s->resync_mb_x && mb_y == s->resync_mb_y; | |
| 508 | |
| 509 /* compute cbp */ | |
| 510 cbp = 0; | |
| 511 for(i=0;i<mb_block_count;i++) { | |
| 512 if (s->block_last_index[i] >= 0) | |
| 513 cbp |= 1 << (mb_block_count - 1 - i); | |
| 514 } | |
| 515 | |
| 516 if (cbp == 0 && !first_mb && s->mv_type == MV_TYPE_16X16 && | |
| 517 (mb_x != s->mb_width - 1 || (mb_y != s->mb_height - 1 && s->codec_id == CODEC_ID_MPEG1VIDEO)) && | |
| 518 ((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) || | |
| 519 (s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | | |
| 520 ((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) { | |
| 521 s->mb_skip_run++; | |
| 522 s->qscale -= s->dquant; | |
| 523 s->skip_count++; | |
| 524 s->misc_bits++; | |
| 525 s->last_bits++; | |
| 526 if(s->pict_type == P_TYPE){ | |
| 527 s->last_mv[0][1][0]= s->last_mv[0][0][0]= | |
| 528 s->last_mv[0][1][1]= s->last_mv[0][0][1]= 0; | |
| 529 } | |
| 530 } else { | |
| 531 if(first_mb){ | |
| 532 assert(s->mb_skip_run == 0); | |
| 533 encode_mb_skip_run(s, s->mb_x); | |
| 534 }else{ | |
| 535 encode_mb_skip_run(s, s->mb_skip_run); | |
| 536 } | |
| 537 | |
| 538 if (s->pict_type == I_TYPE) { | |
| 539 if(s->dquant && cbp){ | |
| 540 put_mb_modes(s, 2, 1, 0, 0); /* macroblock_type : macroblock_quant = 1 */ | |
| 541 put_bits(&s->pb, 5, s->qscale); | |
| 542 }else{ | |
| 543 put_mb_modes(s, 1, 1, 0, 0); /* macroblock_type : macroblock_quant = 0 */ | |
| 544 s->qscale -= s->dquant; | |
| 545 } | |
| 546 s->misc_bits+= get_bits_diff(s); | |
| 547 s->i_count++; | |
| 548 } else if (s->mb_intra) { | |
| 549 if(s->dquant && cbp){ | |
| 550 put_mb_modes(s, 6, 0x01, 0, 0); | |
| 551 put_bits(&s->pb, 5, s->qscale); | |
| 552 }else{ | |
| 553 put_mb_modes(s, 5, 0x03, 0, 0); | |
| 554 s->qscale -= s->dquant; | |
| 555 } | |
| 556 s->misc_bits+= get_bits_diff(s); | |
| 557 s->i_count++; | |
| 558 memset(s->last_mv, 0, sizeof(s->last_mv)); | |
| 559 } else if (s->pict_type == P_TYPE) { | |
| 560 if(s->mv_type == MV_TYPE_16X16){ | |
| 561 if (cbp != 0) { | |
| 562 if ((motion_x|motion_y) == 0) { | |
| 563 if(s->dquant){ | |
| 564 put_mb_modes(s, 5, 1, 0, 0); /* macroblock_pattern & quant */ | |
| 565 put_bits(&s->pb, 5, s->qscale); | |
| 566 }else{ | |
| 567 put_mb_modes(s, 2, 1, 0, 0); /* macroblock_pattern only */ | |
| 568 } | |
| 569 s->misc_bits+= get_bits_diff(s); | |
| 570 } else { | |
| 571 if(s->dquant){ | |
| 572 put_mb_modes(s, 5, 2, 1, 0); /* motion + cbp */ | |
| 573 put_bits(&s->pb, 5, s->qscale); | |
| 574 }else{ | |
| 575 put_mb_modes(s, 1, 1, 1, 0); /* motion + cbp */ | |
| 576 } | |
| 577 s->misc_bits+= get_bits_diff(s); | |
| 578 mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); // RAL: f_code parameter added | |
| 579 mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); // RAL: f_code parameter added | |
| 580 s->mv_bits+= get_bits_diff(s); | |
| 581 } | |
| 582 } else { | |
| 583 put_bits(&s->pb, 3, 1); /* motion only */ | |
| 584 if (!s->frame_pred_frame_dct) | |
| 585 put_bits(&s->pb, 2, 2); /* motion_type: frame */ | |
| 586 s->misc_bits+= get_bits_diff(s); | |
| 587 mpeg1_encode_motion(s, motion_x - s->last_mv[0][0][0], s->f_code); // RAL: f_code parameter added | |
| 588 mpeg1_encode_motion(s, motion_y - s->last_mv[0][0][1], s->f_code); // RAL: f_code parameter added | |
| 589 s->qscale -= s->dquant; | |
| 590 s->mv_bits+= get_bits_diff(s); | |
| 591 } | |
| 592 s->last_mv[0][1][0]= s->last_mv[0][0][0]= motion_x; | |
| 593 s->last_mv[0][1][1]= s->last_mv[0][0][1]= motion_y; | |
| 594 }else{ | |
| 595 assert(!s->frame_pred_frame_dct && s->mv_type == MV_TYPE_FIELD); | |
| 596 | |
| 597 if (cbp) { | |
| 598 if(s->dquant){ | |
| 599 put_mb_modes(s, 5, 2, 1, 1); /* motion + cbp */ | |
| 600 put_bits(&s->pb, 5, s->qscale); | |
| 601 }else{ | |
| 602 put_mb_modes(s, 1, 1, 1, 1); /* motion + cbp */ | |
| 603 } | |
| 604 } else { | |
| 605 put_bits(&s->pb, 3, 1); /* motion only */ | |
| 606 put_bits(&s->pb, 2, 1); /* motion_type: field */ | |
| 607 s->qscale -= s->dquant; | |
| 608 } | |
| 609 s->misc_bits+= get_bits_diff(s); | |
| 610 for(i=0; i<2; i++){ | |
| 611 put_bits(&s->pb, 1, s->field_select[0][i]); | |
| 612 mpeg1_encode_motion(s, s->mv[0][i][0] - s->last_mv[0][i][0] , s->f_code); | |
| 613 mpeg1_encode_motion(s, s->mv[0][i][1] - (s->last_mv[0][i][1]>>1), s->f_code); | |
| 614 s->last_mv[0][i][0]= s->mv[0][i][0]; | |
| 615 s->last_mv[0][i][1]= 2*s->mv[0][i][1]; | |
| 616 } | |
| 617 s->mv_bits+= get_bits_diff(s); | |
| 618 } | |
| 619 if(cbp) { | |
| 620 if (s->chroma_y_shift) { | |
| 621 put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]); | |
| 622 } else { | |
| 623 put_bits(&s->pb, mbPatTable[cbp>>2][1], mbPatTable[cbp>>2][0]); | |
| 624 put_bits(&s->pb, 2, cbp & 3); | |
| 625 } | |
| 626 } | |
| 627 s->f_count++; | |
| 628 } else{ | |
| 629 static const int mb_type_len[4]={0,3,4,2}; //bak,for,bi | |
| 630 | |
| 631 if(s->mv_type == MV_TYPE_16X16){ | |
| 632 if (cbp){ // With coded bloc pattern | |
| 633 if (s->dquant) { | |
| 634 if(s->mv_dir == MV_DIR_FORWARD) | |
| 635 put_mb_modes(s, 6, 3, 1, 0); | |
| 636 else | |
| 637 put_mb_modes(s, mb_type_len[s->mv_dir]+3, 2, 1, 0); | |
| 638 put_bits(&s->pb, 5, s->qscale); | |
| 639 } else { | |
| 640 put_mb_modes(s, mb_type_len[s->mv_dir], 3, 1, 0); | |
| 641 } | |
| 642 }else{ // No coded bloc pattern | |
| 643 put_bits(&s->pb, mb_type_len[s->mv_dir], 2); | |
| 644 if (!s->frame_pred_frame_dct) | |
| 645 put_bits(&s->pb, 2, 2); /* motion_type: frame */ | |
| 646 s->qscale -= s->dquant; | |
| 647 } | |
| 648 s->misc_bits += get_bits_diff(s); | |
| 649 if (s->mv_dir&MV_DIR_FORWARD){ | |
| 650 mpeg1_encode_motion(s, s->mv[0][0][0] - s->last_mv[0][0][0], s->f_code); | |
| 651 mpeg1_encode_motion(s, s->mv[0][0][1] - s->last_mv[0][0][1], s->f_code); | |
| 652 s->last_mv[0][0][0]=s->last_mv[0][1][0]= s->mv[0][0][0]; | |
| 653 s->last_mv[0][0][1]=s->last_mv[0][1][1]= s->mv[0][0][1]; | |
| 654 s->f_count++; | |
| 655 } | |
| 656 if (s->mv_dir&MV_DIR_BACKWARD){ | |
| 657 mpeg1_encode_motion(s, s->mv[1][0][0] - s->last_mv[1][0][0], s->b_code); | |
| 658 mpeg1_encode_motion(s, s->mv[1][0][1] - s->last_mv[1][0][1], s->b_code); | |
| 659 s->last_mv[1][0][0]=s->last_mv[1][1][0]= s->mv[1][0][0]; | |
| 660 s->last_mv[1][0][1]=s->last_mv[1][1][1]= s->mv[1][0][1]; | |
| 661 s->b_count++; | |
| 662 } | |
| 663 }else{ | |
| 664 assert(s->mv_type == MV_TYPE_FIELD); | |
| 665 assert(!s->frame_pred_frame_dct); | |
| 666 if (cbp){ // With coded bloc pattern | |
| 667 if (s->dquant) { | |
| 668 if(s->mv_dir == MV_DIR_FORWARD) | |
| 669 put_mb_modes(s, 6, 3, 1, 1); | |
| 670 else | |
| 671 put_mb_modes(s, mb_type_len[s->mv_dir]+3, 2, 1, 1); | |
| 672 put_bits(&s->pb, 5, s->qscale); | |
| 673 } else { | |
| 674 put_mb_modes(s, mb_type_len[s->mv_dir], 3, 1, 1); | |
| 675 } | |
| 676 }else{ // No coded bloc pattern | |
| 677 put_bits(&s->pb, mb_type_len[s->mv_dir], 2); | |
| 678 put_bits(&s->pb, 2, 1); /* motion_type: field */ | |
| 679 s->qscale -= s->dquant; | |
| 680 } | |
| 681 s->misc_bits += get_bits_diff(s); | |
| 682 if (s->mv_dir&MV_DIR_FORWARD){ | |
| 683 for(i=0; i<2; i++){ | |
| 684 put_bits(&s->pb, 1, s->field_select[0][i]); | |
| 685 mpeg1_encode_motion(s, s->mv[0][i][0] - s->last_mv[0][i][0] , s->f_code); | |
| 686 mpeg1_encode_motion(s, s->mv[0][i][1] - (s->last_mv[0][i][1]>>1), s->f_code); | |
| 687 s->last_mv[0][i][0]= s->mv[0][i][0]; | |
| 688 s->last_mv[0][i][1]= 2*s->mv[0][i][1]; | |
| 689 } | |
| 690 s->f_count++; | |
| 691 } | |
| 692 if (s->mv_dir&MV_DIR_BACKWARD){ | |
| 693 for(i=0; i<2; i++){ | |
| 694 put_bits(&s->pb, 1, s->field_select[1][i]); | |
| 695 mpeg1_encode_motion(s, s->mv[1][i][0] - s->last_mv[1][i][0] , s->b_code); | |
| 696 mpeg1_encode_motion(s, s->mv[1][i][1] - (s->last_mv[1][i][1]>>1), s->b_code); | |
| 697 s->last_mv[1][i][0]= s->mv[1][i][0]; | |
| 698 s->last_mv[1][i][1]= 2*s->mv[1][i][1]; | |
| 699 } | |
| 700 s->b_count++; | |
| 701 } | |
| 702 } | |
| 703 s->mv_bits += get_bits_diff(s); | |
| 704 if(cbp) { | |
| 705 if (s->chroma_y_shift) { | |
| 706 put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]); | |
| 707 } else { | |
| 708 put_bits(&s->pb, mbPatTable[cbp>>2][1], mbPatTable[cbp>>2][0]); | |
| 709 put_bits(&s->pb, 2, cbp & 3); | |
| 710 } | |
| 711 } | |
| 712 } | |
| 713 for(i=0;i<mb_block_count;i++) { | |
| 714 if (cbp & (1 << (mb_block_count - 1 - i))) { | |
| 715 mpeg1_encode_block(s, block[i], i); | |
| 716 } | |
| 717 } | |
| 718 s->mb_skip_run = 0; | |
| 719 if(s->mb_intra) | |
| 720 s->i_tex_bits+= get_bits_diff(s); | |
| 721 else | |
| 722 s->p_tex_bits+= get_bits_diff(s); | |
| 723 } | |
| 724 } | |
| 725 | |
| 726 void mpeg1_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int motion_y) | |
| 727 { | |
| 728 if (s->chroma_format == CHROMA_420) mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 6); | |
| 729 else mpeg1_encode_mb_internal(s, block, motion_x, motion_y, 8); | |
| 730 } | |
| 731 | |
| 732 // RAL: Parameter added: f_or_b_code | |
| 733 static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) | |
| 734 { | |
| 735 int code, bit_size, l, bits, range, sign; | |
| 736 | |
| 737 if (val == 0) { | |
| 738 /* zero vector */ | |
| 739 code = 0; | |
| 740 put_bits(&s->pb, | |
| 741 mbMotionVectorTable[0][1], | |
| 742 mbMotionVectorTable[0][0]); | |
| 743 } else { | |
| 744 bit_size = f_or_b_code - 1; | |
| 745 range = 1 << bit_size; | |
| 746 /* modulo encoding */ | |
| 747 l= INT_BIT - 5 - bit_size; | |
| 748 val= (val<<l)>>l; | |
| 749 | |
| 750 if (val >= 0) { | |
| 751 val--; | |
| 752 code = (val >> bit_size) + 1; | |
| 753 bits = val & (range - 1); | |
| 754 sign = 0; | |
| 755 } else { | |
| 756 val = -val; | |
| 757 val--; | |
| 758 code = (val >> bit_size) + 1; | |
| 759 bits = val & (range - 1); | |
| 760 sign = 1; | |
| 761 } | |
| 762 | |
| 763 assert(code > 0 && code <= 16); | |
| 764 | |
| 765 put_bits(&s->pb, | |
| 766 mbMotionVectorTable[code][1], | |
| 767 mbMotionVectorTable[code][0]); | |
| 768 | |
| 769 put_bits(&s->pb, 1, sign); | |
| 770 if (bit_size > 0) { | |
| 771 put_bits(&s->pb, bit_size, bits); | |
| 772 } | |
| 773 } | |
| 774 } | |
| 775 | |
| 776 void ff_mpeg1_encode_init(MpegEncContext *s) | |
| 777 { | |
| 778 static int done=0; | |
| 779 | |
| 780 common_init(s); | |
| 781 | |
| 782 if(!done){ | |
| 783 int f_code; | |
| 784 int mv; | |
| 785 int i; | |
| 786 | |
| 787 done=1; | |
| 788 init_rl(&rl_mpeg1, 1); | |
| 789 if(s->intra_vlc_format) | |
| 790 init_rl(&rl_mpeg2, 1); | |
| 791 | |
| 792 for(i=0; i<64; i++) | |
| 793 { | |
| 794 mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i]; | |
| 795 mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i]; | |
| 796 } | |
| 797 | |
| 798 init_uni_ac_vlc(&rl_mpeg1, uni_mpeg1_ac_vlc_len); | |
| 799 if(s->intra_vlc_format) | |
| 800 init_uni_ac_vlc(&rl_mpeg2, uni_mpeg2_ac_vlc_len); | |
| 801 | |
| 802 /* build unified dc encoding tables */ | |
| 803 for(i=-255; i<256; i++) | |
| 804 { | |
| 805 int adiff, index; | |
| 806 int bits, code; | |
| 807 int diff=i; | |
| 808 | |
| 809 adiff = FFABS(diff); | |
| 810 if(diff<0) diff--; | |
| 811 index = av_log2(2*adiff); | |
| 812 | |
| 813 bits= vlc_dc_lum_bits[index] + index; | |
| 814 code= (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1)); | |
| 815 mpeg1_lum_dc_uni[i+255]= bits + (code<<8); | |
| 816 | |
| 817 bits= vlc_dc_chroma_bits[index] + index; | |
| 818 code= (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1)); | |
| 819 mpeg1_chr_dc_uni[i+255]= bits + (code<<8); | |
| 820 } | |
| 821 | |
| 822 mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) ); | |
| 823 | |
| 824 for(f_code=1; f_code<=MAX_FCODE; f_code++){ | |
| 825 for(mv=-MAX_MV; mv<=MAX_MV; mv++){ | |
| 826 int len; | |
| 827 | |
| 828 if(mv==0) len= mbMotionVectorTable[0][1]; | |
| 829 else{ | |
| 830 int val, bit_size, range, code; | |
| 831 | |
| 832 bit_size = f_code - 1; | |
| 833 range = 1 << bit_size; | |
| 834 | |
| 835 val=mv; | |
| 836 if (val < 0) | |
| 837 val = -val; | |
| 838 val--; | |
| 839 code = (val >> bit_size) + 1; | |
| 840 if(code<17){ | |
| 841 len= mbMotionVectorTable[code][1] + 1 + bit_size; | |
| 842 }else{ | |
| 843 len= mbMotionVectorTable[16][1] + 2 + bit_size; | |
| 844 } | |
| 845 } | |
| 846 | |
| 847 mv_penalty[f_code][mv+MAX_MV]= len; | |
| 848 } | |
| 849 } | |
| 850 | |
| 851 | |
| 852 for(f_code=MAX_FCODE; f_code>0; f_code--){ | |
| 853 for(mv=-(8<<f_code); mv<(8<<f_code); mv++){ | |
| 854 fcode_tab[mv+MAX_MV]= f_code; | |
| 855 } | |
| 856 } | |
| 857 } | |
| 858 s->me.mv_penalty= mv_penalty; | |
| 859 s->fcode_tab= fcode_tab; | |
| 860 if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | |
| 861 s->min_qcoeff=-255; | |
| 862 s->max_qcoeff= 255; | |
| 863 }else{ | |
| 864 s->min_qcoeff=-2047; | |
| 865 s->max_qcoeff= 2047; | |
| 866 } | |
| 867 if (s->intra_vlc_format) { | |
| 868 s->intra_ac_vlc_length= | |
| 869 s->intra_ac_vlc_last_length= uni_mpeg2_ac_vlc_len; | |
| 870 } else { | |
| 871 s->intra_ac_vlc_length= | |
| 872 s->intra_ac_vlc_last_length= uni_mpeg1_ac_vlc_len; | |
| 873 } | |
| 874 s->inter_ac_vlc_length= | |
| 875 s->inter_ac_vlc_last_length= uni_mpeg1_ac_vlc_len; | |
| 876 } | |
| 877 | |
| 878 static inline void encode_dc(MpegEncContext *s, int diff, int component) | |
| 879 { | |
| 880 if(((unsigned) (diff+255)) >= 511){ | |
| 881 int index; | |
| 882 | |
| 883 if(diff<0){ | |
| 884 index= av_log2_16bit(-2*diff); | |
| 885 diff--; | |
| 886 }else{ | |
| 887 index= av_log2_16bit(2*diff); | |
| 888 } | |
| 889 if (component == 0) { | |
| 890 put_bits( | |
| 891 &s->pb, | |
| 892 vlc_dc_lum_bits[index] + index, | |
| 893 (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1))); | |
| 894 }else{ | |
| 895 put_bits( | |
| 896 &s->pb, | |
| 897 vlc_dc_chroma_bits[index] + index, | |
| 898 (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1))); | |
| 899 } | |
| 900 }else{ | |
| 901 if (component == 0) { | |
| 902 put_bits( | |
| 903 &s->pb, | |
| 904 mpeg1_lum_dc_uni[diff+255]&0xFF, | |
| 905 mpeg1_lum_dc_uni[diff+255]>>8); | |
| 906 } else { | |
| 907 put_bits( | |
| 908 &s->pb, | |
| 909 mpeg1_chr_dc_uni[diff+255]&0xFF, | |
| 910 mpeg1_chr_dc_uni[diff+255]>>8); | |
| 911 } | |
| 912 } | |
| 913 } | |
| 914 | |
| 915 static void mpeg1_encode_block(MpegEncContext *s, | |
| 916 DCTELEM *block, | |
| 917 int n) | |
| 918 { | |
| 919 int alevel, level, last_non_zero, dc, diff, i, j, run, last_index, sign; | |
| 920 int code, component; | |
| 921 const uint16_t (*table_vlc)[2] = rl_mpeg1.table_vlc; | |
| 922 | |
| 923 last_index = s->block_last_index[n]; | |
| 924 | |
| 925 /* DC coef */ | |
| 926 if (s->mb_intra) { | |
| 927 component = (n <= 3 ? 0 : (n&1) + 1); | |
| 928 dc = block[0]; /* overflow is impossible */ | |
| 929 diff = dc - s->last_dc[component]; | |
| 930 encode_dc(s, diff, component); | |
| 931 s->last_dc[component] = dc; | |
| 932 i = 1; | |
| 933 if (s->intra_vlc_format) | |
| 934 table_vlc = rl_mpeg2.table_vlc; | |
| 935 } else { | |
| 936 /* encode the first coefficient : needs to be done here because | |
| 937 it is handled slightly differently */ | |
| 938 level = block[0]; | |
| 939 if (abs(level) == 1) { | |
| 940 code = ((uint32_t)level >> 31); /* the sign bit */ | |
| 941 put_bits(&s->pb, 2, code | 0x02); | |
| 942 i = 1; | |
| 943 } else { | |
| 944 i = 0; | |
| 945 last_non_zero = -1; | |
| 946 goto next_coef; | |
| 947 } | |
| 948 } | |
| 949 | |
| 950 /* now quantify & encode AC coefs */ | |
| 951 last_non_zero = i - 1; | |
| 952 | |
| 953 for(;i<=last_index;i++) { | |
| 954 j = s->intra_scantable.permutated[i]; | |
| 955 level = block[j]; | |
| 956 next_coef: | |
| 957 #if 0 | |
| 958 if (level != 0) | |
| 959 dprintf("level[%d]=%d\n", i, level); | |
| 960 #endif | |
| 961 /* encode using VLC */ | |
| 962 if (level != 0) { | |
| 963 run = i - last_non_zero - 1; | |
| 964 | |
| 965 alevel= level; | |
| 966 MASK_ABS(sign, alevel) | |
| 967 sign&=1; | |
| 968 | |
| 969 if (alevel <= mpeg1_max_level[0][run]){ | |
| 970 code= mpeg1_index_run[0][run] + alevel - 1; | |
| 971 /* store the vlc & sign at once */ | |
| 972 put_bits(&s->pb, table_vlc[code][1]+1, (table_vlc[code][0]<<1) + sign); | |
| 973 } else { | |
| 974 /* escape seems to be pretty rare <5% so i dont optimize it */ | |
| 975 put_bits(&s->pb, table_vlc[111][1], table_vlc[111][0]); | |
| 976 /* escape: only clip in this case */ | |
| 977 put_bits(&s->pb, 6, run); | |
| 978 if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | |
| 979 if (alevel < 128) { | |
| 980 put_bits(&s->pb, 8, level & 0xff); | |
| 981 } else { | |
| 982 if (level < 0) { | |
| 983 put_bits(&s->pb, 16, 0x8001 + level + 255); | |
| 984 } else { | |
| 985 put_bits(&s->pb, 16, level & 0xffff); | |
| 986 } | |
| 987 } | |
| 988 }else{ | |
| 989 put_bits(&s->pb, 12, level & 0xfff); | |
| 990 } | |
| 991 } | |
| 992 last_non_zero = i; | |
| 993 } | |
| 994 } | |
| 995 /* end of block */ | |
| 996 put_bits(&s->pb, table_vlc[112][1], table_vlc[112][0]); | |
| 997 } | |
| 998 #endif //CONFIG_ENCODERS | |
| 999 | |
| 1000 /******************************************/ | |
| 1001 /* decoding */ | |
| 1002 | |
| 1003 static VLC dc_lum_vlc; | |
| 1004 static VLC dc_chroma_vlc; | |
| 1005 static VLC mv_vlc; | |
| 1006 static VLC mbincr_vlc; | |
| 1007 static VLC mb_ptype_vlc; | |
| 1008 static VLC mb_btype_vlc; | |
| 1009 static VLC mb_pat_vlc; | |
| 1010 | |
| 1011 static void init_vlcs(void) | |
| 1012 { | |
| 1013 static int done = 0; | |
| 1014 | |
| 1015 if (!done) { | |
| 1016 done = 1; | |
| 1017 | |
| 1018 init_vlc(&dc_lum_vlc, DC_VLC_BITS, 12, | |
| 1019 vlc_dc_lum_bits, 1, 1, | |
| 1020 vlc_dc_lum_code, 2, 2, 1); | |
| 1021 init_vlc(&dc_chroma_vlc, DC_VLC_BITS, 12, | |
| 1022 vlc_dc_chroma_bits, 1, 1, | |
| 1023 vlc_dc_chroma_code, 2, 2, 1); | |
| 1024 init_vlc(&mv_vlc, MV_VLC_BITS, 17, | |
| 1025 &mbMotionVectorTable[0][1], 2, 1, | |
| 1026 &mbMotionVectorTable[0][0], 2, 1, 1); | |
| 1027 init_vlc(&mbincr_vlc, MBINCR_VLC_BITS, 36, | |
| 1028 &mbAddrIncrTable[0][1], 2, 1, | |
| 1029 &mbAddrIncrTable[0][0], 2, 1, 1); | |
| 1030 init_vlc(&mb_pat_vlc, MB_PAT_VLC_BITS, 64, | |
| 1031 &mbPatTable[0][1], 2, 1, | |
| 1032 &mbPatTable[0][0], 2, 1, 1); | |
| 1033 | |
| 1034 init_vlc(&mb_ptype_vlc, MB_PTYPE_VLC_BITS, 7, | |
| 1035 &table_mb_ptype[0][1], 2, 1, | |
| 1036 &table_mb_ptype[0][0], 2, 1, 1); | |
| 1037 init_vlc(&mb_btype_vlc, MB_BTYPE_VLC_BITS, 11, | |
| 1038 &table_mb_btype[0][1], 2, 1, | |
| 1039 &table_mb_btype[0][0], 2, 1, 1); | |
| 1040 init_rl(&rl_mpeg1, 1); | |
| 1041 init_rl(&rl_mpeg2, 1); | |
| 1042 | |
| 1043 init_2d_vlc_rl(&rl_mpeg1, 1); | |
| 1044 init_2d_vlc_rl(&rl_mpeg2, 1); | |
| 1045 } | |
| 1046 } | |
| 1047 | |
| 1048 static inline int get_dmv(MpegEncContext *s) | |
| 1049 { | |
| 1050 if(get_bits1(&s->gb)) | |
| 1051 return 1 - (get_bits1(&s->gb) << 1); | |
| 1052 else | |
| 1053 return 0; | |
| 1054 } | |
| 1055 | |
| 1056 static inline int get_qscale(MpegEncContext *s) | |
| 1057 { | |
| 1058 int qscale = get_bits(&s->gb, 5); | |
| 1059 if (s->q_scale_type) { | |
| 1060 return non_linear_qscale[qscale]; | |
| 1061 } else { | |
| 1062 return qscale << 1; | |
| 1063 } | |
| 1064 } | |
| 1065 | |
| 1066 /* motion type (for mpeg2) */ | |
| 1067 #define MT_FIELD 1 | |
| 1068 #define MT_FRAME 2 | |
| 1069 #define MT_16X8 2 | |
| 1070 #define MT_DMV 3 | |
| 1071 | |
| 1072 static int mpeg_decode_mb(MpegEncContext *s, | |
| 1073 DCTELEM block[12][64]) | |
| 1074 { | |
| 1075 int i, j, k, cbp, val, mb_type, motion_type; | |
| 1076 const int mb_block_count = 4 + (1<< s->chroma_format); | |
| 1077 | |
| 1078 dprintf("decode_mb: x=%d y=%d\n", s->mb_x, s->mb_y); | |
| 1079 | |
| 1080 assert(s->mb_skipped==0); | |
| 1081 | |
| 1082 if (s->mb_skip_run-- != 0) { | |
| 1083 if(s->pict_type == I_TYPE){ | |
| 1084 av_log(s->avctx, AV_LOG_ERROR, "skipped MB in I frame at %d %d\n", s->mb_x, s->mb_y); | |
| 1085 return -1; | |
| 1086 } | |
| 1087 | |
| 1088 /* skip mb */ | |
| 1089 s->mb_intra = 0; | |
| 1090 for(i=0;i<12;i++) | |
| 1091 s->block_last_index[i] = -1; | |
| 1092 if(s->picture_structure == PICT_FRAME) | |
| 1093 s->mv_type = MV_TYPE_16X16; | |
| 1094 else | |
| 1095 s->mv_type = MV_TYPE_FIELD; | |
| 1096 if (s->pict_type == P_TYPE) { | |
| 1097 /* if P type, zero motion vector is implied */ | |
| 1098 s->mv_dir = MV_DIR_FORWARD; | |
| 1099 s->mv[0][0][0] = s->mv[0][0][1] = 0; | |
| 1100 s->last_mv[0][0][0] = s->last_mv[0][0][1] = 0; | |
| 1101 s->last_mv[0][1][0] = s->last_mv[0][1][1] = 0; | |
| 1102 s->field_select[0][0]= s->picture_structure - 1; | |
| 1103 s->mb_skipped = 1; | |
| 1104 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; | |
| 1105 } else { | |
| 1106 int mb_type; | |
| 1107 | |
| 1108 if(s->mb_x) | |
| 1109 mb_type= s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]; | |
| 1110 else | |
| 1111 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, | |
| 1112 if(IS_INTRA(mb_type)) | |
| 1113 return -1; | |
| 1114 | |
| 1115 /* if B type, reuse previous vectors and directions */ | |
| 1116 s->mv[0][0][0] = s->last_mv[0][0][0]; | |
| 1117 s->mv[0][0][1] = s->last_mv[0][0][1]; | |
| 1118 s->mv[1][0][0] = s->last_mv[1][0][0]; | |
| 1119 s->mv[1][0][1] = s->last_mv[1][0][1]; | |
| 1120 | |
| 1121 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= | |
| 1122 mb_type | MB_TYPE_SKIP; | |
| 1123 // assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8)); | |
| 1124 | |
| 1125 if((s->mv[0][0][0]|s->mv[0][0][1]|s->mv[1][0][0]|s->mv[1][0][1])==0) | |
| 1126 s->mb_skipped = 1; | |
| 1127 } | |
| 1128 | |
| 1129 return 0; | |
| 1130 } | |
| 1131 | |
| 1132 switch(s->pict_type) { | |
| 1133 default: | |
| 1134 case I_TYPE: | |
| 1135 if (get_bits1(&s->gb) == 0) { | |
| 1136 if (get_bits1(&s->gb) == 0){ | |
| 1137 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in I Frame at %d %d\n", s->mb_x, s->mb_y); | |
| 1138 return -1; | |
| 1139 } | |
| 1140 mb_type = MB_TYPE_QUANT | MB_TYPE_INTRA; | |
| 1141 } else { | |
| 1142 mb_type = MB_TYPE_INTRA; | |
| 1143 } | |
| 1144 break; | |
| 1145 case P_TYPE: | |
| 1146 mb_type = get_vlc2(&s->gb, mb_ptype_vlc.table, MB_PTYPE_VLC_BITS, 1); | |
| 1147 if (mb_type < 0){ | |
| 1148 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in P Frame at %d %d\n", s->mb_x, s->mb_y); | |
| 1149 return -1; | |
| 1150 } | |
| 1151 mb_type = ptype2mb_type[ mb_type ]; | |
| 1152 break; | |
| 1153 case B_TYPE: | |
| 1154 mb_type = get_vlc2(&s->gb, mb_btype_vlc.table, MB_BTYPE_VLC_BITS, 1); | |
| 1155 if (mb_type < 0){ | |
| 1156 av_log(s->avctx, AV_LOG_ERROR, "invalid mb type in B Frame at %d %d\n", s->mb_x, s->mb_y); | |
| 1157 return -1; | |
| 1158 } | |
| 1159 mb_type = btype2mb_type[ mb_type ]; | |
| 1160 break; | |
| 1161 } | |
| 1162 dprintf("mb_type=%x\n", mb_type); | |
| 1163 // motion_type = 0; /* avoid warning */ | |
| 1164 if (IS_INTRA(mb_type)) { | |
| 1165 s->dsp.clear_blocks(s->block[0]); | |
| 1166 | |
| 1167 if(!s->chroma_y_shift){ | |
| 1168 s->dsp.clear_blocks(s->block[6]); | |
| 1169 } | |
| 1170 | |
| 1171 /* compute dct type */ | |
| 1172 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? | |
| 1173 !s->frame_pred_frame_dct) { | |
| 1174 s->interlaced_dct = get_bits1(&s->gb); | |
| 1175 } | |
| 1176 | |
| 1177 if (IS_QUANT(mb_type)) | |
| 1178 s->qscale = get_qscale(s); | |
| 1179 | |
| 1180 if (s->concealment_motion_vectors) { | |
| 1181 /* just parse them */ | |
| 1182 if (s->picture_structure != PICT_FRAME) | |
| 1183 skip_bits1(&s->gb); /* field select */ | |
| 1184 | |
| 1185 s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = | |
| 1186 mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); | |
| 1187 s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = | |
| 1188 mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); | |
| 1189 | |
| 1190 skip_bits1(&s->gb); /* marker */ | |
| 1191 }else | |
| 1192 memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ | |
| 1193 s->mb_intra = 1; | |
| 1194 #ifdef HAVE_XVMC | |
| 1195 //one 1 we memcpy blocks in xvmcvideo | |
| 1196 if(s->avctx->xvmc_acceleration > 1){ | |
| 1197 XVMC_pack_pblocks(s,-1);//inter are always full blocks | |
| 1198 if(s->swap_uv){ | |
| 1199 exchange_uv(s); | |
| 1200 } | |
| 1201 } | |
| 1202 #endif | |
| 1203 | |
| 1204 if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | |
| 1205 if(s->flags2 & CODEC_FLAG2_FAST){ | |
| 1206 for(i=0;i<6;i++) { | |
| 1207 mpeg2_fast_decode_block_intra(s, s->pblocks[i], i); | |
| 1208 } | |
| 1209 }else{ | |
| 1210 for(i=0;i<mb_block_count;i++) { | |
| 1211 if (mpeg2_decode_block_intra(s, s->pblocks[i], i) < 0) | |
| 1212 return -1; | |
| 1213 } | |
| 1214 } | |
| 1215 } else { | |
| 1216 for(i=0;i<6;i++) { | |
| 1217 if (mpeg1_decode_block_intra(s, s->pblocks[i], i) < 0) | |
| 1218 return -1; | |
| 1219 } | |
| 1220 } | |
| 1221 } else { | |
| 1222 if (mb_type & MB_TYPE_ZERO_MV){ | |
| 1223 assert(mb_type & MB_TYPE_CBP); | |
| 1224 | |
| 1225 /* compute dct type */ | |
| 1226 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? | |
| 1227 !s->frame_pred_frame_dct) { | |
| 1228 s->interlaced_dct = get_bits1(&s->gb); | |
| 1229 } | |
| 1230 | |
| 1231 if (IS_QUANT(mb_type)) | |
| 1232 s->qscale = get_qscale(s); | |
| 1233 | |
| 1234 s->mv_dir = MV_DIR_FORWARD; | |
| 1235 if(s->picture_structure == PICT_FRAME) | |
| 1236 s->mv_type = MV_TYPE_16X16; | |
| 1237 else{ | |
| 1238 s->mv_type = MV_TYPE_FIELD; | |
| 1239 mb_type |= MB_TYPE_INTERLACED; | |
| 1240 s->field_select[0][0]= s->picture_structure - 1; | |
| 1241 } | |
| 1242 s->last_mv[0][0][0] = 0; | |
| 1243 s->last_mv[0][0][1] = 0; | |
| 1244 s->last_mv[0][1][0] = 0; | |
| 1245 s->last_mv[0][1][1] = 0; | |
| 1246 s->mv[0][0][0] = 0; | |
| 1247 s->mv[0][0][1] = 0; | |
| 1248 }else{ | |
| 1249 assert(mb_type & MB_TYPE_L0L1); | |
| 1250 //FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED | |
| 1251 /* get additionnal motion vector type */ | |
| 1252 if (s->frame_pred_frame_dct) | |
| 1253 motion_type = MT_FRAME; | |
| 1254 else{ | |
| 1255 motion_type = get_bits(&s->gb, 2); | |
| 1256 } | |
| 1257 | |
| 1258 /* compute dct type */ | |
| 1259 if (s->picture_structure == PICT_FRAME && //FIXME add a interlaced_dct coded var? | |
| 1260 !s->frame_pred_frame_dct && HAS_CBP(mb_type)) { | |
| 1261 s->interlaced_dct = get_bits1(&s->gb); | |
| 1262 } | |
| 1263 | |
| 1264 if (IS_QUANT(mb_type)) | |
| 1265 s->qscale = get_qscale(s); | |
| 1266 | |
| 1267 /* motion vectors */ | |
| 1268 s->mv_dir = 0; | |
| 1269 for(i=0;i<2;i++) { | |
| 1270 if (USES_LIST(mb_type, i)) { | |
| 1271 s->mv_dir |= (MV_DIR_FORWARD >> i); | |
| 1272 dprintf("motion_type=%d\n", motion_type); | |
| 1273 switch(motion_type) { | |
| 1274 case MT_FRAME: /* or MT_16X8 */ | |
| 1275 if (s->picture_structure == PICT_FRAME) { | |
| 1276 /* MT_FRAME */ | |
| 1277 mb_type |= MB_TYPE_16x16; | |
| 1278 s->mv_type = MV_TYPE_16X16; | |
| 1279 s->mv[i][0][0]= s->last_mv[i][0][0]= s->last_mv[i][1][0] = | |
| 1280 mpeg_decode_motion(s, s->mpeg_f_code[i][0], s->last_mv[i][0][0]); | |
| 1281 s->mv[i][0][1]= s->last_mv[i][0][1]= s->last_mv[i][1][1] = | |
| 1282 mpeg_decode_motion(s, s->mpeg_f_code[i][1], s->last_mv[i][0][1]); | |
| 1283 /* full_pel: only for mpeg1 */ | |
| 1284 if (s->full_pel[i]){ | |
| 1285 s->mv[i][0][0] <<= 1; | |
| 1286 s->mv[i][0][1] <<= 1; | |
| 1287 } | |
| 1288 } else { | |
| 1289 /* MT_16X8 */ | |
| 1290 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; | |
| 1291 s->mv_type = MV_TYPE_16X8; | |
| 1292 for(j=0;j<2;j++) { | |
| 1293 s->field_select[i][j] = get_bits1(&s->gb); | |
| 1294 for(k=0;k<2;k++) { | |
| 1295 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], | |
| 1296 s->last_mv[i][j][k]); | |
| 1297 s->last_mv[i][j][k] = val; | |
| 1298 s->mv[i][j][k] = val; | |
| 1299 } | |
| 1300 } | |
| 1301 } | |
| 1302 break; | |
| 1303 case MT_FIELD: | |
| 1304 s->mv_type = MV_TYPE_FIELD; | |
| 1305 if (s->picture_structure == PICT_FRAME) { | |
| 1306 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED; | |
| 1307 for(j=0;j<2;j++) { | |
| 1308 s->field_select[i][j] = get_bits1(&s->gb); | |
| 1309 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0], | |
| 1310 s->last_mv[i][j][0]); | |
| 1311 s->last_mv[i][j][0] = val; | |
| 1312 s->mv[i][j][0] = val; | |
| 1313 dprintf("fmx=%d\n", val); | |
| 1314 val = mpeg_decode_motion(s, s->mpeg_f_code[i][1], | |
| 1315 s->last_mv[i][j][1] >> 1); | |
| 1316 s->last_mv[i][j][1] = val << 1; | |
| 1317 s->mv[i][j][1] = val; | |
| 1318 dprintf("fmy=%d\n", val); | |
| 1319 } | |
| 1320 } else { | |
| 1321 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; | |
| 1322 s->field_select[i][0] = get_bits1(&s->gb); | |
| 1323 for(k=0;k<2;k++) { | |
| 1324 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k], | |
| 1325 s->last_mv[i][0][k]); | |
| 1326 s->last_mv[i][0][k] = val; | |
| 1327 s->last_mv[i][1][k] = val; | |
| 1328 s->mv[i][0][k] = val; | |
| 1329 } | |
| 1330 } | |
| 1331 break; | |
| 1332 case MT_DMV: | |
| 1333 { | |
| 1334 int dmx, dmy, mx, my, m; | |
| 1335 | |
| 1336 mx = mpeg_decode_motion(s, s->mpeg_f_code[i][0], | |
| 1337 s->last_mv[i][0][0]); | |
| 1338 s->last_mv[i][0][0] = mx; | |
| 1339 s->last_mv[i][1][0] = mx; | |
| 1340 dmx = get_dmv(s); | |
| 1341 my = mpeg_decode_motion(s, s->mpeg_f_code[i][1], | |
| 1342 s->last_mv[i][0][1] >> 1); | |
| 1343 dmy = get_dmv(s); | |
| 1344 s->mv_type = MV_TYPE_DMV; | |
| 1345 | |
| 1346 | |
| 1347 s->last_mv[i][0][1] = my<<1; | |
| 1348 s->last_mv[i][1][1] = my<<1; | |
| 1349 | |
| 1350 s->mv[i][0][0] = mx; | |
| 1351 s->mv[i][0][1] = my; | |
| 1352 s->mv[i][1][0] = mx;//not used | |
| 1353 s->mv[i][1][1] = my;//not used | |
| 1354 | |
| 1355 if (s->picture_structure == PICT_FRAME) { | |
| 1356 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED; | |
| 1357 | |
| 1358 //m = 1 + 2 * s->top_field_first; | |
| 1359 m = s->top_field_first ? 1 : 3; | |
| 1360 | |
| 1361 /* top -> top pred */ | |
| 1362 s->mv[i][2][0] = ((mx * m + (mx > 0)) >> 1) + dmx; | |
| 1363 s->mv[i][2][1] = ((my * m + (my > 0)) >> 1) + dmy - 1; | |
| 1364 m = 4 - m; | |
| 1365 s->mv[i][3][0] = ((mx * m + (mx > 0)) >> 1) + dmx; | |
| 1366 s->mv[i][3][1] = ((my * m + (my > 0)) >> 1) + dmy + 1; | |
| 1367 } else { | |
| 1368 mb_type |= MB_TYPE_16x16; | |
| 1369 | |
| 1370 s->mv[i][2][0] = ((mx + (mx > 0)) >> 1) + dmx; | |
| 1371 s->mv[i][2][1] = ((my + (my > 0)) >> 1) + dmy; | |
| 1372 if(s->picture_structure == PICT_TOP_FIELD) | |
| 1373 s->mv[i][2][1]--; | |
| 1374 else | |
| 1375 s->mv[i][2][1]++; | |
| 1376 } | |
| 1377 } | |
| 1378 break; | |
| 1379 default: | |
| 1380 av_log(s->avctx, AV_LOG_ERROR, "00 motion_type at %d %d\n", s->mb_x, s->mb_y); | |
| 1381 return -1; | |
| 1382 } | |
| 1383 } | |
| 1384 } | |
| 1385 } | |
| 1386 | |
| 1387 s->mb_intra = 0; | |
| 1388 if (HAS_CBP(mb_type)) { | |
| 1389 s->dsp.clear_blocks(s->block[0]); | |
| 1390 | |
| 1391 if(!s->chroma_y_shift){ | |
| 1392 s->dsp.clear_blocks(s->block[6]); | |
| 1393 } | |
| 1394 | |
| 1395 cbp = get_vlc2(&s->gb, mb_pat_vlc.table, MB_PAT_VLC_BITS, 1); | |
| 1396 if (cbp < 0 || ((cbp == 0) && (s->chroma_format < 2)) ){ | |
| 1397 av_log(s->avctx, AV_LOG_ERROR, "invalid cbp at %d %d\n", s->mb_x, s->mb_y); | |
| 1398 return -1; | |
| 1399 } | |
| 1400 if(mb_block_count > 6){ | |
| 1401 cbp<<= mb_block_count-6; | |
| 1402 cbp |= get_bits(&s->gb, mb_block_count-6); | |
| 1403 } | |
| 1404 | |
| 1405 #ifdef HAVE_XVMC | |
| 1406 //on 1 we memcpy blocks in xvmcvideo | |
| 1407 if(s->avctx->xvmc_acceleration > 1){ | |
| 1408 XVMC_pack_pblocks(s,cbp); | |
| 1409 if(s->swap_uv){ | |
| 1410 exchange_uv(s); | |
| 1411 } | |
| 1412 } | |
| 1413 #endif | |
| 1414 | |
| 1415 if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | |
| 1416 if(s->flags2 & CODEC_FLAG2_FAST){ | |
| 1417 for(i=0;i<6;i++) { | |
| 1418 if(cbp & 32) { | |
| 1419 mpeg2_fast_decode_block_non_intra(s, s->pblocks[i], i); | |
| 1420 } else { | |
| 1421 s->block_last_index[i] = -1; | |
| 1422 } | |
| 1423 cbp+=cbp; | |
| 1424 } | |
| 1425 }else{ | |
| 1426 cbp<<= 12-mb_block_count; | |
| 1427 | |
| 1428 for(i=0;i<mb_block_count;i++) { | |
| 1429 if ( cbp & (1<<11) ) { | |
| 1430 if (mpeg2_decode_block_non_intra(s, s->pblocks[i], i) < 0) | |
| 1431 return -1; | |
| 1432 } else { | |
| 1433 s->block_last_index[i] = -1; | |
| 1434 } | |
| 1435 cbp+=cbp; | |
| 1436 } | |
| 1437 } | |
| 1438 } else { | |
| 1439 if(s->flags2 & CODEC_FLAG2_FAST){ | |
| 1440 for(i=0;i<6;i++) { | |
| 1441 if (cbp & 32) { | |
| 1442 mpeg1_fast_decode_block_inter(s, s->pblocks[i], i); | |
| 1443 } else { | |
| 1444 s->block_last_index[i] = -1; | |
| 1445 } | |
| 1446 cbp+=cbp; | |
| 1447 } | |
| 1448 }else{ | |
| 1449 for(i=0;i<6;i++) { | |
| 1450 if (cbp & 32) { | |
| 1451 if (mpeg1_decode_block_inter(s, s->pblocks[i], i) < 0) | |
| 1452 return -1; | |
| 1453 } else { | |
| 1454 s->block_last_index[i] = -1; | |
| 1455 } | |
| 1456 cbp+=cbp; | |
| 1457 } | |
| 1458 } | |
| 1459 } | |
| 1460 }else{ | |
| 1461 for(i=0;i<12;i++) | |
| 1462 s->block_last_index[i] = -1; | |
| 1463 } | |
| 1464 } | |
| 1465 | |
| 1466 s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]= mb_type; | |
| 1467 | |
| 1468 return 0; | |
| 1469 } | |
| 1470 | |
| 1471 /* as h263, but only 17 codes */ | |
| 1472 static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred) | |
| 1473 { | |
| 1474 int code, sign, val, l, shift; | |
| 1475 | |
| 1476 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); | |
| 1477 if (code == 0) { | |
| 1478 return pred; | |
| 1479 } | |
| 1480 if (code < 0) { | |
| 1481 return 0xffff; | |
| 1482 } | |
| 1483 | |
| 1484 sign = get_bits1(&s->gb); | |
| 1485 shift = fcode - 1; | |
| 1486 val = code; | |
| 1487 if (shift) { | |
| 1488 val = (val - 1) << shift; | |
| 1489 val |= get_bits(&s->gb, shift); | |
| 1490 val++; | |
| 1491 } | |
| 1492 if (sign) | |
| 1493 val = -val; | |
| 1494 val += pred; | |
| 1495 | |
| 1496 /* modulo decoding */ | |
| 1497 l= INT_BIT - 5 - shift; | |
| 1498 val = (val<<l)>>l; | |
| 1499 return val; | |
| 1500 } | |
| 1501 | |
| 1502 static inline int decode_dc(GetBitContext *gb, int component) | |
| 1503 { | |
| 1504 int code, diff; | |
| 1505 | |
| 1506 if (component == 0) { | |
| 1507 code = get_vlc2(gb, dc_lum_vlc.table, DC_VLC_BITS, 2); | |
| 1508 } else { | |
| 1509 code = get_vlc2(gb, dc_chroma_vlc.table, DC_VLC_BITS, 2); | |
| 1510 } | |
| 1511 if (code < 0){ | |
| 1512 av_log(NULL, AV_LOG_ERROR, "invalid dc code at\n"); | |
| 1513 return 0xffff; | |
| 1514 } | |
| 1515 if (code == 0) { | |
| 1516 diff = 0; | |
| 1517 } else { | |
| 1518 diff = get_xbits(gb, code); | |
| 1519 } | |
| 1520 return diff; | |
| 1521 } | |
| 1522 | |
| 1523 static inline int mpeg1_decode_block_intra(MpegEncContext *s, | |
| 1524 DCTELEM *block, | |
| 1525 int n) | |
| 1526 { | |
| 1527 int level, dc, diff, i, j, run; | |
| 1528 int component; | |
| 1529 RLTable *rl = &rl_mpeg1; | |
| 1530 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1531 const uint16_t *quant_matrix= s->intra_matrix; | |
| 1532 const int qscale= s->qscale; | |
| 1533 | |
| 1534 /* DC coef */ | |
| 1535 component = (n <= 3 ? 0 : n - 4 + 1); | |
| 1536 diff = decode_dc(&s->gb, component); | |
| 1537 if (diff >= 0xffff) | |
| 1538 return -1; | |
| 1539 dc = s->last_dc[component]; | |
| 1540 dc += diff; | |
| 1541 s->last_dc[component] = dc; | |
| 1542 block[0] = dc<<3; | |
| 1543 dprintf("dc=%d diff=%d\n", dc, diff); | |
| 1544 i = 0; | |
| 1545 { | |
| 1546 OPEN_READER(re, &s->gb); | |
| 1547 /* now quantify & encode AC coefs */ | |
| 1548 for(;;) { | |
| 1549 UPDATE_CACHE(re, &s->gb); | |
| 1550 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 1551 | |
| 1552 if(level == 127){ | |
| 1553 break; | |
| 1554 } else if(level != 0) { | |
| 1555 i += run; | |
| 1556 j = scantable[i]; | |
| 1557 level= (level*qscale*quant_matrix[j])>>4; | |
| 1558 level= (level-1)|1; | |
| 1559 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1560 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 1561 } else { | |
| 1562 /* escape */ | |
| 1563 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1564 UPDATE_CACHE(re, &s->gb); | |
| 1565 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | |
| 1566 if (level == -128) { | |
| 1567 level = SHOW_UBITS(re, &s->gb, 8) - 256; LAST_SKIP_BITS(re, &s->gb, 8); | |
| 1568 } else if (level == 0) { | |
| 1569 level = SHOW_UBITS(re, &s->gb, 8) ; LAST_SKIP_BITS(re, &s->gb, 8); | |
| 1570 } | |
| 1571 i += run; | |
| 1572 j = scantable[i]; | |
| 1573 if(level<0){ | |
| 1574 level= -level; | |
| 1575 level= (level*qscale*quant_matrix[j])>>4; | |
| 1576 level= (level-1)|1; | |
| 1577 level= -level; | |
| 1578 }else{ | |
| 1579 level= (level*qscale*quant_matrix[j])>>4; | |
| 1580 level= (level-1)|1; | |
| 1581 } | |
| 1582 } | |
| 1583 if (i > 63){ | |
| 1584 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | |
| 1585 return -1; | |
| 1586 } | |
| 1587 | |
| 1588 block[j] = level; | |
| 1589 } | |
| 1590 CLOSE_READER(re, &s->gb); | |
| 1591 } | |
| 1592 s->block_last_index[n] = i; | |
| 1593 return 0; | |
| 1594 } | |
| 1595 | |
| 1596 static inline int mpeg1_decode_block_inter(MpegEncContext *s, | |
| 1597 DCTELEM *block, | |
| 1598 int n) | |
| 1599 { | |
| 1600 int level, i, j, run; | |
| 1601 RLTable *rl = &rl_mpeg1; | |
| 1602 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1603 const uint16_t *quant_matrix= s->inter_matrix; | |
| 1604 const int qscale= s->qscale; | |
| 1605 | |
| 1606 { | |
| 1607 OPEN_READER(re, &s->gb); | |
| 1608 i = -1; | |
| 1609 /* special case for the first coef. no need to add a second vlc table */ | |
| 1610 UPDATE_CACHE(re, &s->gb); | |
| 1611 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | |
| 1612 level= (3*qscale*quant_matrix[0])>>5; | |
| 1613 level= (level-1)|1; | |
| 1614 if(GET_CACHE(re, &s->gb)&0x40000000) | |
| 1615 level= -level; | |
| 1616 block[0] = level; | |
| 1617 i++; | |
| 1618 SKIP_BITS(re, &s->gb, 2); | |
| 1619 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1620 goto end; | |
| 1621 } | |
| 1622 | |
| 1623 /* now quantify & encode AC coefs */ | |
| 1624 for(;;) { | |
| 1625 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 1626 | |
| 1627 if(level != 0) { | |
| 1628 i += run; | |
| 1629 j = scantable[i]; | |
| 1630 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 1631 level= (level-1)|1; | |
| 1632 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1633 SKIP_BITS(re, &s->gb, 1); | |
| 1634 } else { | |
| 1635 /* escape */ | |
| 1636 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1637 UPDATE_CACHE(re, &s->gb); | |
| 1638 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | |
| 1639 if (level == -128) { | |
| 1640 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); | |
| 1641 } else if (level == 0) { | |
| 1642 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); | |
| 1643 } | |
| 1644 i += run; | |
| 1645 j = scantable[i]; | |
| 1646 if(level<0){ | |
| 1647 level= -level; | |
| 1648 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 1649 level= (level-1)|1; | |
| 1650 level= -level; | |
| 1651 }else{ | |
| 1652 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 1653 level= (level-1)|1; | |
| 1654 } | |
| 1655 } | |
| 1656 if (i > 63){ | |
| 1657 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | |
| 1658 return -1; | |
| 1659 } | |
| 1660 | |
| 1661 block[j] = level; | |
| 1662 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1663 break; | |
| 1664 UPDATE_CACHE(re, &s->gb); | |
| 1665 } | |
| 1666 end: | |
| 1667 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 1668 CLOSE_READER(re, &s->gb); | |
| 1669 } | |
| 1670 s->block_last_index[n] = i; | |
| 1671 return 0; | |
| 1672 } | |
| 1673 | |
| 1674 static inline int mpeg1_fast_decode_block_inter(MpegEncContext *s, DCTELEM *block, int n) | |
| 1675 { | |
| 1676 int level, i, j, run; | |
| 1677 RLTable *rl = &rl_mpeg1; | |
| 1678 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1679 const int qscale= s->qscale; | |
| 1680 | |
| 1681 { | |
| 1682 OPEN_READER(re, &s->gb); | |
| 1683 i = -1; | |
| 1684 /* special case for the first coef. no need to add a second vlc table */ | |
| 1685 UPDATE_CACHE(re, &s->gb); | |
| 1686 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | |
| 1687 level= (3*qscale)>>1; | |
| 1688 level= (level-1)|1; | |
| 1689 if(GET_CACHE(re, &s->gb)&0x40000000) | |
| 1690 level= -level; | |
| 1691 block[0] = level; | |
| 1692 i++; | |
| 1693 SKIP_BITS(re, &s->gb, 2); | |
| 1694 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1695 goto end; | |
| 1696 } | |
| 1697 | |
| 1698 /* now quantify & encode AC coefs */ | |
| 1699 for(;;) { | |
| 1700 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 1701 | |
| 1702 if(level != 0) { | |
| 1703 i += run; | |
| 1704 j = scantable[i]; | |
| 1705 level= ((level*2+1)*qscale)>>1; | |
| 1706 level= (level-1)|1; | |
| 1707 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1708 SKIP_BITS(re, &s->gb, 1); | |
| 1709 } else { | |
| 1710 /* escape */ | |
| 1711 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1712 UPDATE_CACHE(re, &s->gb); | |
| 1713 level = SHOW_SBITS(re, &s->gb, 8); SKIP_BITS(re, &s->gb, 8); | |
| 1714 if (level == -128) { | |
| 1715 level = SHOW_UBITS(re, &s->gb, 8) - 256; SKIP_BITS(re, &s->gb, 8); | |
| 1716 } else if (level == 0) { | |
| 1717 level = SHOW_UBITS(re, &s->gb, 8) ; SKIP_BITS(re, &s->gb, 8); | |
| 1718 } | |
| 1719 i += run; | |
| 1720 j = scantable[i]; | |
| 1721 if(level<0){ | |
| 1722 level= -level; | |
| 1723 level= ((level*2+1)*qscale)>>1; | |
| 1724 level= (level-1)|1; | |
| 1725 level= -level; | |
| 1726 }else{ | |
| 1727 level= ((level*2+1)*qscale)>>1; | |
| 1728 level= (level-1)|1; | |
| 1729 } | |
| 1730 } | |
| 1731 | |
| 1732 block[j] = level; | |
| 1733 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1734 break; | |
| 1735 UPDATE_CACHE(re, &s->gb); | |
| 1736 } | |
| 1737 end: | |
| 1738 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 1739 CLOSE_READER(re, &s->gb); | |
| 1740 } | |
| 1741 s->block_last_index[n] = i; | |
| 1742 return 0; | |
| 1743 } | |
| 1744 | |
| 1745 | |
| 1746 static inline int mpeg2_decode_block_non_intra(MpegEncContext *s, | |
| 1747 DCTELEM *block, | |
| 1748 int n) | |
| 1749 { | |
| 1750 int level, i, j, run; | |
| 1751 RLTable *rl = &rl_mpeg1; | |
| 1752 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1753 const uint16_t *quant_matrix; | |
| 1754 const int qscale= s->qscale; | |
| 1755 int mismatch; | |
| 1756 | |
| 1757 mismatch = 1; | |
| 1758 | |
| 1759 { | |
| 1760 OPEN_READER(re, &s->gb); | |
| 1761 i = -1; | |
| 1762 if (n < 4) | |
| 1763 quant_matrix = s->inter_matrix; | |
| 1764 else | |
| 1765 quant_matrix = s->chroma_inter_matrix; | |
| 1766 | |
| 1767 /* special case for the first coef. no need to add a second vlc table */ | |
| 1768 UPDATE_CACHE(re, &s->gb); | |
| 1769 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | |
| 1770 level= (3*qscale*quant_matrix[0])>>5; | |
| 1771 if(GET_CACHE(re, &s->gb)&0x40000000) | |
| 1772 level= -level; | |
| 1773 block[0] = level; | |
| 1774 mismatch ^= level; | |
| 1775 i++; | |
| 1776 SKIP_BITS(re, &s->gb, 2); | |
| 1777 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1778 goto end; | |
| 1779 } | |
| 1780 | |
| 1781 /* now quantify & encode AC coefs */ | |
| 1782 for(;;) { | |
| 1783 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 1784 | |
| 1785 if(level != 0) { | |
| 1786 i += run; | |
| 1787 j = scantable[i]; | |
| 1788 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 1789 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1790 SKIP_BITS(re, &s->gb, 1); | |
| 1791 } else { | |
| 1792 /* escape */ | |
| 1793 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1794 UPDATE_CACHE(re, &s->gb); | |
| 1795 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1796 | |
| 1797 i += run; | |
| 1798 j = scantable[i]; | |
| 1799 if(level<0){ | |
| 1800 level= ((-level*2+1)*qscale*quant_matrix[j])>>5; | |
| 1801 level= -level; | |
| 1802 }else{ | |
| 1803 level= ((level*2+1)*qscale*quant_matrix[j])>>5; | |
| 1804 } | |
| 1805 } | |
| 1806 if (i > 63){ | |
| 1807 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | |
| 1808 return -1; | |
| 1809 } | |
| 1810 | |
| 1811 mismatch ^= level; | |
| 1812 block[j] = level; | |
| 1813 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1814 break; | |
| 1815 UPDATE_CACHE(re, &s->gb); | |
| 1816 } | |
| 1817 end: | |
| 1818 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 1819 CLOSE_READER(re, &s->gb); | |
| 1820 } | |
| 1821 block[63] ^= (mismatch & 1); | |
| 1822 | |
| 1823 s->block_last_index[n] = i; | |
| 1824 return 0; | |
| 1825 } | |
| 1826 | |
| 1827 static inline int mpeg2_fast_decode_block_non_intra(MpegEncContext *s, | |
| 1828 DCTELEM *block, | |
| 1829 int n) | |
| 1830 { | |
| 1831 int level, i, j, run; | |
| 1832 RLTable *rl = &rl_mpeg1; | |
| 1833 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1834 const int qscale= s->qscale; | |
| 1835 OPEN_READER(re, &s->gb); | |
| 1836 i = -1; | |
| 1837 | |
| 1838 /* special case for the first coef. no need to add a second vlc table */ | |
| 1839 UPDATE_CACHE(re, &s->gb); | |
| 1840 if (((int32_t)GET_CACHE(re, &s->gb)) < 0) { | |
| 1841 level= (3*qscale)>>1; | |
| 1842 if(GET_CACHE(re, &s->gb)&0x40000000) | |
| 1843 level= -level; | |
| 1844 block[0] = level; | |
| 1845 i++; | |
| 1846 SKIP_BITS(re, &s->gb, 2); | |
| 1847 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1848 goto end; | |
| 1849 } | |
| 1850 | |
| 1851 /* now quantify & encode AC coefs */ | |
| 1852 for(;;) { | |
| 1853 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 1854 | |
| 1855 if(level != 0) { | |
| 1856 i += run; | |
| 1857 j = scantable[i]; | |
| 1858 level= ((level*2+1)*qscale)>>1; | |
| 1859 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1860 SKIP_BITS(re, &s->gb, 1); | |
| 1861 } else { | |
| 1862 /* escape */ | |
| 1863 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1864 UPDATE_CACHE(re, &s->gb); | |
| 1865 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1866 | |
| 1867 i += run; | |
| 1868 j = scantable[i]; | |
| 1869 if(level<0){ | |
| 1870 level= ((-level*2+1)*qscale)>>1; | |
| 1871 level= -level; | |
| 1872 }else{ | |
| 1873 level= ((level*2+1)*qscale)>>1; | |
| 1874 } | |
| 1875 } | |
| 1876 | |
| 1877 block[j] = level; | |
| 1878 if(((int32_t)GET_CACHE(re, &s->gb)) <= (int32_t)0xBFFFFFFF) | |
| 1879 break; | |
| 1880 UPDATE_CACHE(re, &s->gb); | |
| 1881 } | |
| 1882 end: | |
| 1883 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 1884 CLOSE_READER(re, &s->gb); | |
| 1885 s->block_last_index[n] = i; | |
| 1886 return 0; | |
| 1887 } | |
| 1888 | |
| 1889 | |
| 1890 static inline int mpeg2_decode_block_intra(MpegEncContext *s, | |
| 1891 DCTELEM *block, | |
| 1892 int n) | |
| 1893 { | |
| 1894 int level, dc, diff, i, j, run; | |
| 1895 int component; | |
| 1896 RLTable *rl; | |
| 1897 uint8_t * const scantable= s->intra_scantable.permutated; | |
| 1898 const uint16_t *quant_matrix; | |
| 1899 const int qscale= s->qscale; | |
| 1900 int mismatch; | |
| 1901 | |
| 1902 /* DC coef */ | |
| 1903 if (n < 4){ | |
| 1904 quant_matrix = s->intra_matrix; | |
| 1905 component = 0; | |
| 1906 }else{ | |
| 1907 quant_matrix = s->chroma_intra_matrix; | |
| 1908 component = (n&1) + 1; | |
| 1909 } | |
| 1910 diff = decode_dc(&s->gb, component); | |
| 1911 if (diff >= 0xffff) | |
| 1912 return -1; | |
| 1913 dc = s->last_dc[component]; | |
| 1914 dc += diff; | |
| 1915 s->last_dc[component] = dc; | |
| 1916 block[0] = dc << (3 - s->intra_dc_precision); | |
| 1917 dprintf("dc=%d\n", block[0]); | |
| 1918 mismatch = block[0] ^ 1; | |
| 1919 i = 0; | |
| 1920 if (s->intra_vlc_format) | |
| 1921 rl = &rl_mpeg2; | |
| 1922 else | |
| 1923 rl = &rl_mpeg1; | |
| 1924 | |
| 1925 { | |
| 1926 OPEN_READER(re, &s->gb); | |
| 1927 /* now quantify & encode AC coefs */ | |
| 1928 for(;;) { | |
| 1929 UPDATE_CACHE(re, &s->gb); | |
| 1930 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 1931 | |
| 1932 if(level == 127){ | |
| 1933 break; | |
| 1934 } else if(level != 0) { | |
| 1935 i += run; | |
| 1936 j = scantable[i]; | |
| 1937 level= (level*qscale*quant_matrix[j])>>4; | |
| 1938 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1939 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 1940 } else { | |
| 1941 /* escape */ | |
| 1942 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 1943 UPDATE_CACHE(re, &s->gb); | |
| 1944 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 1945 i += run; | |
| 1946 j = scantable[i]; | |
| 1947 if(level<0){ | |
| 1948 level= (-level*qscale*quant_matrix[j])>>4; | |
| 1949 level= -level; | |
| 1950 }else{ | |
| 1951 level= (level*qscale*quant_matrix[j])>>4; | |
| 1952 } | |
| 1953 } | |
| 1954 if (i > 63){ | |
| 1955 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); | |
| 1956 return -1; | |
| 1957 } | |
| 1958 | |
| 1959 mismatch^= level; | |
| 1960 block[j] = level; | |
| 1961 } | |
| 1962 CLOSE_READER(re, &s->gb); | |
| 1963 } | |
| 1964 block[63]^= mismatch&1; | |
| 1965 | |
| 1966 s->block_last_index[n] = i; | |
| 1967 return 0; | |
| 1968 } | |
| 1969 | |
| 1970 static inline int mpeg2_fast_decode_block_intra(MpegEncContext *s, | |
| 1971 DCTELEM *block, | |
| 1972 int n) | |
| 1973 { | |
| 1974 int level, dc, diff, j, run; | |
| 1975 int component; | |
| 1976 RLTable *rl; | |
| 1977 uint8_t * scantable= s->intra_scantable.permutated; | |
| 1978 const uint16_t *quant_matrix; | |
| 1979 const int qscale= s->qscale; | |
| 1980 | |
| 1981 /* DC coef */ | |
| 1982 if (n < 4){ | |
| 1983 quant_matrix = s->intra_matrix; | |
| 1984 component = 0; | |
| 1985 }else{ | |
| 1986 quant_matrix = s->chroma_intra_matrix; | |
| 1987 component = (n&1) + 1; | |
| 1988 } | |
| 1989 diff = decode_dc(&s->gb, component); | |
| 1990 if (diff >= 0xffff) | |
| 1991 return -1; | |
| 1992 dc = s->last_dc[component]; | |
| 1993 dc += diff; | |
| 1994 s->last_dc[component] = dc; | |
| 1995 block[0] = dc << (3 - s->intra_dc_precision); | |
| 1996 if (s->intra_vlc_format) | |
| 1997 rl = &rl_mpeg2; | |
| 1998 else | |
| 1999 rl = &rl_mpeg1; | |
| 2000 | |
| 2001 { | |
| 2002 OPEN_READER(re, &s->gb); | |
| 2003 /* now quantify & encode AC coefs */ | |
| 2004 for(;;) { | |
| 2005 UPDATE_CACHE(re, &s->gb); | |
| 2006 GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); | |
| 2007 | |
| 2008 if(level == 127){ | |
| 2009 break; | |
| 2010 } else if(level != 0) { | |
| 2011 scantable += run; | |
| 2012 j = *scantable; | |
| 2013 level= (level*qscale*quant_matrix[j])>>4; | |
| 2014 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 2015 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 2016 } else { | |
| 2017 /* escape */ | |
| 2018 run = SHOW_UBITS(re, &s->gb, 6)+1; LAST_SKIP_BITS(re, &s->gb, 6); | |
| 2019 UPDATE_CACHE(re, &s->gb); | |
| 2020 level = SHOW_SBITS(re, &s->gb, 12); SKIP_BITS(re, &s->gb, 12); | |
| 2021 scantable += run; | |
| 2022 j = *scantable; | |
| 2023 if(level<0){ | |
| 2024 level= (-level*qscale*quant_matrix[j])>>4; | |
| 2025 level= -level; | |
| 2026 }else{ | |
| 2027 level= (level*qscale*quant_matrix[j])>>4; | |
| 2028 } | |
| 2029 } | |
| 2030 | |
| 2031 block[j] = level; | |
| 2032 } | |
| 2033 CLOSE_READER(re, &s->gb); | |
| 2034 } | |
| 2035 | |
| 2036 s->block_last_index[n] = scantable - s->intra_scantable.permutated; | |
| 2037 return 0; | |
| 2038 } | |
| 2039 | |
| 2040 typedef struct Mpeg1Context { | |
| 2041 MpegEncContext mpeg_enc_ctx; | |
| 2042 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ | |
| 2043 int repeat_field; /* true if we must repeat the field */ | |
| 2044 AVPanScan pan_scan; /** some temporary storage for the panscan */ | |
| 2045 int slice_count; | |
| 2046 int swap_uv;//indicate VCR2 | |
| 2047 int save_aspect_info; | |
| 2048 AVRational frame_rate_ext; ///< MPEG-2 specific framerate modificator | |
| 2049 | |
| 2050 } Mpeg1Context; | |
| 2051 | |
| 2052 static int mpeg_decode_init(AVCodecContext *avctx) | |
| 2053 { | |
| 2054 Mpeg1Context *s = avctx->priv_data; | |
| 2055 MpegEncContext *s2 = &s->mpeg_enc_ctx; | |
| 2056 int i; | |
| 2057 | |
| 2058 //we need some parmutation to store | |
| 2059 //matrixes, until MPV_common_init() | |
| 2060 //set the real permutatuon | |
| 2061 for(i=0;i<64;i++) | |
| 2062 s2->dsp.idct_permutation[i]=i; | |
| 2063 | |
| 2064 MPV_decode_defaults(s2); | |
| 2065 | |
| 2066 s->mpeg_enc_ctx.avctx= avctx; | |
| 2067 s->mpeg_enc_ctx.flags= avctx->flags; | |
| 2068 s->mpeg_enc_ctx.flags2= avctx->flags2; | |
| 2069 common_init(&s->mpeg_enc_ctx); | |
| 2070 init_vlcs(); | |
| 2071 | |
| 2072 s->mpeg_enc_ctx_allocated = 0; | |
| 2073 s->mpeg_enc_ctx.picture_number = 0; | |
| 2074 s->repeat_field = 0; | |
| 2075 s->mpeg_enc_ctx.codec_id= avctx->codec->id; | |
| 2076 return 0; | |
| 2077 } | |
| 2078 | |
| 2079 static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm, | |
| 2080 const uint8_t *new_perm){ | |
| 2081 uint16_t temp_matrix[64]; | |
| 2082 int i; | |
| 2083 | |
| 2084 memcpy(temp_matrix,matrix,64*sizeof(uint16_t)); | |
| 2085 | |
| 2086 for(i=0;i<64;i++){ | |
| 2087 matrix[new_perm[i]] = temp_matrix[old_perm[i]]; | |
| 2088 } | |
| 2089 } | |
| 2090 | |
| 2091 //Call this function when we know all parameters | |
| 2092 //it may be called in different places for mpeg1 and mpeg2 | |
| 2093 static int mpeg_decode_postinit(AVCodecContext *avctx){ | |
| 2094 Mpeg1Context *s1 = avctx->priv_data; | |
| 2095 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2096 uint8_t old_permutation[64]; | |
| 2097 | |
| 2098 if ( | |
| 2099 (s1->mpeg_enc_ctx_allocated == 0)|| | |
| 2100 avctx->coded_width != s->width || | |
| 2101 avctx->coded_height != s->height|| | |
| 2102 s1->save_aspect_info != s->aspect_ratio_info|| | |
| 2103 0) | |
| 2104 { | |
| 2105 | |
| 2106 if (s1->mpeg_enc_ctx_allocated) { | |
| 2107 ParseContext pc= s->parse_context; | |
| 2108 s->parse_context.buffer=0; | |
| 2109 MPV_common_end(s); | |
| 2110 s->parse_context= pc; | |
| 2111 } | |
| 2112 | |
| 2113 if( (s->width == 0 )||(s->height == 0)) | |
| 2114 return -2; | |
| 2115 | |
| 2116 avcodec_set_dimensions(avctx, s->width, s->height); | |
| 2117 avctx->bit_rate = s->bit_rate; | |
| 2118 s1->save_aspect_info = s->aspect_ratio_info; | |
| 2119 | |
| 2120 //low_delay may be forced, in this case we will have B frames | |
| 2121 //that behave like P frames | |
| 2122 avctx->has_b_frames = !(s->low_delay); | |
| 2123 | |
| 2124 if(avctx->sub_id==1){//s->codec_id==avctx->codec_id==CODEC_ID | |
| 2125 //mpeg1 fps | |
| 2126 avctx->time_base.den= ff_frame_rate_tab[s->frame_rate_index].num; | |
| 2127 avctx->time_base.num= ff_frame_rate_tab[s->frame_rate_index].den; | |
| 2128 //mpeg1 aspect | |
| 2129 avctx->sample_aspect_ratio= av_d2q( | |
| 2130 1.0/mpeg1_aspect[s->aspect_ratio_info], 255); | |
| 2131 | |
| 2132 }else{//mpeg2 | |
| 2133 //mpeg2 fps | |
| 2134 av_reduce( | |
| 2135 &s->avctx->time_base.den, | |
| 2136 &s->avctx->time_base.num, | |
| 2137 ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num, | |
| 2138 ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den, | |
| 2139 1<<30); | |
| 2140 //mpeg2 aspect | |
| 2141 if(s->aspect_ratio_info > 1){ | |
| 2142 if( (s1->pan_scan.width == 0 )||(s1->pan_scan.height == 0) ){ | |
| 2143 s->avctx->sample_aspect_ratio= | |
| 2144 av_div_q( | |
| 2145 mpeg2_aspect[s->aspect_ratio_info], | |
| 2146 (AVRational){s->width, s->height} | |
| 2147 ); | |
| 2148 }else{ | |
| 2149 s->avctx->sample_aspect_ratio= | |
| 2150 av_div_q( | |
| 2151 mpeg2_aspect[s->aspect_ratio_info], | |
| 2152 (AVRational){s1->pan_scan.width, s1->pan_scan.height} | |
| 2153 ); | |
| 2154 } | |
| 2155 }else{ | |
| 2156 s->avctx->sample_aspect_ratio= | |
| 2157 mpeg2_aspect[s->aspect_ratio_info]; | |
| 2158 } | |
| 2159 }//mpeg2 | |
| 2160 | |
| 2161 if(avctx->xvmc_acceleration){ | |
| 2162 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); | |
| 2163 }else{ | |
| 2164 if(s->chroma_format < 2){ | |
| 2165 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420); | |
| 2166 }else | |
| 2167 if(s->chroma_format == 2){ | |
| 2168 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_422); | |
| 2169 }else | |
| 2170 if(s->chroma_format > 2){ | |
| 2171 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_444); | |
| 2172 } | |
| 2173 } | |
| 2174 //until then pix_fmt may be changed right after codec init | |
| 2175 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT ) | |
| 2176 if( avctx->idct_algo == FF_IDCT_AUTO ) | |
| 2177 avctx->idct_algo = FF_IDCT_SIMPLE; | |
| 2178 | |
| 2179 //quantization matrixes may need reordering | |
| 2180 //if dct permutation is changed | |
| 2181 memcpy(old_permutation,s->dsp.idct_permutation,64*sizeof(uint8_t)); | |
| 2182 | |
| 2183 if (MPV_common_init(s) < 0) | |
| 2184 return -2; | |
| 2185 | |
| 2186 quant_matrix_rebuild(s->intra_matrix, old_permutation,s->dsp.idct_permutation); | |
| 2187 quant_matrix_rebuild(s->inter_matrix, old_permutation,s->dsp.idct_permutation); | |
| 2188 quant_matrix_rebuild(s->chroma_intra_matrix,old_permutation,s->dsp.idct_permutation); | |
| 2189 quant_matrix_rebuild(s->chroma_inter_matrix,old_permutation,s->dsp.idct_permutation); | |
| 2190 | |
| 2191 s1->mpeg_enc_ctx_allocated = 1; | |
| 2192 } | |
| 2193 return 0; | |
| 2194 } | |
| 2195 | |
| 2196 static int mpeg1_decode_picture(AVCodecContext *avctx, | |
| 2197 const uint8_t *buf, int buf_size) | |
| 2198 { | |
| 2199 Mpeg1Context *s1 = avctx->priv_data; | |
| 2200 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2201 int ref, f_code, vbv_delay; | |
| 2202 | |
| 2203 if(mpeg_decode_postinit(s->avctx) < 0) | |
| 2204 return -2; | |
| 2205 | |
| 2206 init_get_bits(&s->gb, buf, buf_size*8); | |
| 2207 | |
| 2208 ref = get_bits(&s->gb, 10); /* temporal ref */ | |
| 2209 s->pict_type = get_bits(&s->gb, 3); | |
| 2210 if(s->pict_type == 0 || s->pict_type > 3) | |
| 2211 return -1; | |
| 2212 | |
| 2213 vbv_delay= get_bits(&s->gb, 16); | |
| 2214 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { | |
| 2215 s->full_pel[0] = get_bits1(&s->gb); | |
| 2216 f_code = get_bits(&s->gb, 3); | |
| 2217 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) | |
| 2218 return -1; | |
| 2219 s->mpeg_f_code[0][0] = f_code; | |
| 2220 s->mpeg_f_code[0][1] = f_code; | |
| 2221 } | |
| 2222 if (s->pict_type == B_TYPE) { | |
| 2223 s->full_pel[1] = get_bits1(&s->gb); | |
| 2224 f_code = get_bits(&s->gb, 3); | |
| 2225 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) | |
| 2226 return -1; | |
| 2227 s->mpeg_f_code[1][0] = f_code; | |
| 2228 s->mpeg_f_code[1][1] = f_code; | |
| 2229 } | |
| 2230 s->current_picture.pict_type= s->pict_type; | |
| 2231 s->current_picture.key_frame= s->pict_type == I_TYPE; | |
| 2232 | |
| 2233 if(avctx->debug & FF_DEBUG_PICT_INFO) | |
| 2234 av_log(avctx, AV_LOG_DEBUG, "vbv_delay %d, ref %d type:%d\n", vbv_delay, ref, s->pict_type); | |
| 2235 | |
| 2236 s->y_dc_scale = 8; | |
| 2237 s->c_dc_scale = 8; | |
| 2238 s->first_slice = 1; | |
| 2239 return 0; | |
| 2240 } | |
| 2241 | |
| 2242 static void mpeg_decode_sequence_extension(Mpeg1Context *s1) | |
| 2243 { | |
| 2244 MpegEncContext *s= &s1->mpeg_enc_ctx; | |
| 2245 int horiz_size_ext, vert_size_ext; | |
| 2246 int bit_rate_ext; | |
| 2247 | |
| 2248 skip_bits(&s->gb, 1); /* profil and level esc*/ | |
| 2249 s->avctx->profile= get_bits(&s->gb, 3); | |
| 2250 s->avctx->level= get_bits(&s->gb, 4); | |
| 2251 s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ | |
| 2252 s->chroma_format = get_bits(&s->gb, 2); /* chroma_format 1=420, 2=422, 3=444 */ | |
| 2253 horiz_size_ext = get_bits(&s->gb, 2); | |
| 2254 vert_size_ext = get_bits(&s->gb, 2); | |
| 2255 s->width |= (horiz_size_ext << 12); | |
| 2256 s->height |= (vert_size_ext << 12); | |
| 2257 bit_rate_ext = get_bits(&s->gb, 12); /* XXX: handle it */ | |
| 2258 s->bit_rate += (bit_rate_ext << 18) * 400; | |
| 2259 skip_bits1(&s->gb); /* marker */ | |
| 2260 s->avctx->rc_buffer_size += get_bits(&s->gb, 8)*1024*16<<10; | |
| 2261 | |
| 2262 s->low_delay = get_bits1(&s->gb); | |
| 2263 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1; | |
| 2264 | |
| 2265 s1->frame_rate_ext.num = get_bits(&s->gb, 2)+1; | |
| 2266 s1->frame_rate_ext.den = get_bits(&s->gb, 5)+1; | |
| 2267 | |
| 2268 dprintf("sequence extension\n"); | |
| 2269 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; | |
| 2270 s->avctx->sub_id = 2; /* indicates mpeg2 found */ | |
| 2271 | |
| 2272 if(s->avctx->debug & FF_DEBUG_PICT_INFO) | |
| 2273 av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d vbv buffer: %d, bitrate:%d\n", | |
| 2274 s->avctx->profile, s->avctx->level, s->avctx->rc_buffer_size, s->bit_rate); | |
| 2275 | |
| 2276 } | |
| 2277 | |
| 2278 static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1) | |
| 2279 { | |
| 2280 MpegEncContext *s= &s1->mpeg_enc_ctx; | |
| 2281 int color_description, w, h; | |
| 2282 | |
| 2283 skip_bits(&s->gb, 3); /* video format */ | |
| 2284 color_description= get_bits1(&s->gb); | |
| 2285 if(color_description){ | |
| 2286 skip_bits(&s->gb, 8); /* color primaries */ | |
| 2287 skip_bits(&s->gb, 8); /* transfer_characteristics */ | |
| 2288 skip_bits(&s->gb, 8); /* matrix_coefficients */ | |
| 2289 } | |
| 2290 w= get_bits(&s->gb, 14); | |
| 2291 skip_bits(&s->gb, 1); //marker | |
| 2292 h= get_bits(&s->gb, 14); | |
| 2293 skip_bits(&s->gb, 1); //marker | |
| 2294 | |
| 2295 s1->pan_scan.width= 16*w; | |
| 2296 s1->pan_scan.height=16*h; | |
| 2297 | |
| 2298 if(s->avctx->debug & FF_DEBUG_PICT_INFO) | |
| 2299 av_log(s->avctx, AV_LOG_DEBUG, "sde w:%d, h:%d\n", w, h); | |
| 2300 } | |
| 2301 | |
| 2302 static void mpeg_decode_picture_display_extension(Mpeg1Context *s1) | |
| 2303 { | |
| 2304 MpegEncContext *s= &s1->mpeg_enc_ctx; | |
| 2305 int i,nofco; | |
| 2306 | |
| 2307 nofco = 1; | |
| 2308 if(s->progressive_sequence){ | |
| 2309 if(s->repeat_first_field){ | |
| 2310 nofco++; | |
| 2311 if(s->top_field_first) | |
| 2312 nofco++; | |
| 2313 } | |
| 2314 }else{ | |
| 2315 if(s->picture_structure == PICT_FRAME){ | |
| 2316 nofco++; | |
| 2317 if(s->repeat_first_field) | |
| 2318 nofco++; | |
| 2319 } | |
| 2320 } | |
| 2321 for(i=0; i<nofco; i++){ | |
| 2322 s1->pan_scan.position[i][0]= get_sbits(&s->gb, 16); | |
| 2323 skip_bits(&s->gb, 1); //marker | |
| 2324 s1->pan_scan.position[i][1]= get_sbits(&s->gb, 16); | |
| 2325 skip_bits(&s->gb, 1); //marker | |
| 2326 } | |
| 2327 | |
| 2328 if(s->avctx->debug & FF_DEBUG_PICT_INFO) | |
| 2329 av_log(s->avctx, AV_LOG_DEBUG, "pde (%d,%d) (%d,%d) (%d,%d)\n", | |
| 2330 s1->pan_scan.position[0][0], s1->pan_scan.position[0][1], | |
| 2331 s1->pan_scan.position[1][0], s1->pan_scan.position[1][1], | |
| 2332 s1->pan_scan.position[2][0], s1->pan_scan.position[2][1] | |
| 2333 ); | |
| 2334 } | |
| 2335 | |
| 2336 static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) | |
| 2337 { | |
| 2338 int i, v, j; | |
| 2339 | |
| 2340 dprintf("matrix extension\n"); | |
| 2341 | |
| 2342 if (get_bits1(&s->gb)) { | |
| 2343 for(i=0;i<64;i++) { | |
| 2344 v = get_bits(&s->gb, 8); | |
| 2345 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | |
| 2346 s->intra_matrix[j] = v; | |
| 2347 s->chroma_intra_matrix[j] = v; | |
| 2348 } | |
| 2349 } | |
| 2350 if (get_bits1(&s->gb)) { | |
| 2351 for(i=0;i<64;i++) { | |
| 2352 v = get_bits(&s->gb, 8); | |
| 2353 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | |
| 2354 s->inter_matrix[j] = v; | |
| 2355 s->chroma_inter_matrix[j] = v; | |
| 2356 } | |
| 2357 } | |
| 2358 if (get_bits1(&s->gb)) { | |
| 2359 for(i=0;i<64;i++) { | |
| 2360 v = get_bits(&s->gb, 8); | |
| 2361 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | |
| 2362 s->chroma_intra_matrix[j] = v; | |
| 2363 } | |
| 2364 } | |
| 2365 if (get_bits1(&s->gb)) { | |
| 2366 for(i=0;i<64;i++) { | |
| 2367 v = get_bits(&s->gb, 8); | |
| 2368 j= s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | |
| 2369 s->chroma_inter_matrix[j] = v; | |
| 2370 } | |
| 2371 } | |
| 2372 } | |
| 2373 | |
| 2374 static void mpeg_decode_picture_coding_extension(MpegEncContext *s) | |
| 2375 { | |
| 2376 s->full_pel[0] = s->full_pel[1] = 0; | |
| 2377 s->mpeg_f_code[0][0] = get_bits(&s->gb, 4); | |
| 2378 s->mpeg_f_code[0][1] = get_bits(&s->gb, 4); | |
| 2379 s->mpeg_f_code[1][0] = get_bits(&s->gb, 4); | |
| 2380 s->mpeg_f_code[1][1] = get_bits(&s->gb, 4); | |
| 2381 s->intra_dc_precision = get_bits(&s->gb, 2); | |
| 2382 s->picture_structure = get_bits(&s->gb, 2); | |
| 2383 s->top_field_first = get_bits1(&s->gb); | |
| 2384 s->frame_pred_frame_dct = get_bits1(&s->gb); | |
| 2385 s->concealment_motion_vectors = get_bits1(&s->gb); | |
| 2386 s->q_scale_type = get_bits1(&s->gb); | |
| 2387 s->intra_vlc_format = get_bits1(&s->gb); | |
| 2388 s->alternate_scan = get_bits1(&s->gb); | |
| 2389 s->repeat_first_field = get_bits1(&s->gb); | |
| 2390 s->chroma_420_type = get_bits1(&s->gb); | |
| 2391 s->progressive_frame = get_bits1(&s->gb); | |
| 2392 | |
| 2393 if(s->picture_structure == PICT_FRAME) | |
| 2394 s->first_field=0; | |
| 2395 else{ | |
| 2396 s->first_field ^= 1; | |
| 2397 memset(s->mbskip_table, 0, s->mb_stride*s->mb_height); | |
| 2398 } | |
| 2399 | |
| 2400 if(s->alternate_scan){ | |
| 2401 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); | |
| 2402 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); | |
| 2403 }else{ | |
| 2404 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); | |
| 2405 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); | |
| 2406 } | |
| 2407 | |
| 2408 /* composite display not parsed */ | |
| 2409 dprintf("intra_dc_precision=%d\n", s->intra_dc_precision); | |
| 2410 dprintf("picture_structure=%d\n", s->picture_structure); | |
| 2411 dprintf("top field first=%d\n", s->top_field_first); | |
| 2412 dprintf("repeat first field=%d\n", s->repeat_first_field); | |
| 2413 dprintf("conceal=%d\n", s->concealment_motion_vectors); | |
| 2414 dprintf("intra_vlc_format=%d\n", s->intra_vlc_format); | |
| 2415 dprintf("alternate_scan=%d\n", s->alternate_scan); | |
| 2416 dprintf("frame_pred_frame_dct=%d\n", s->frame_pred_frame_dct); | |
| 2417 dprintf("progressive_frame=%d\n", s->progressive_frame); | |
| 2418 } | |
| 2419 | |
| 2420 static void mpeg_decode_extension(AVCodecContext *avctx, | |
| 2421 const uint8_t *buf, int buf_size) | |
| 2422 { | |
| 2423 Mpeg1Context *s1 = avctx->priv_data; | |
| 2424 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2425 int ext_type; | |
| 2426 | |
| 2427 init_get_bits(&s->gb, buf, buf_size*8); | |
| 2428 | |
| 2429 ext_type = get_bits(&s->gb, 4); | |
| 2430 switch(ext_type) { | |
| 2431 case 0x1: | |
| 2432 mpeg_decode_sequence_extension(s1); | |
| 2433 break; | |
| 2434 case 0x2: | |
| 2435 mpeg_decode_sequence_display_extension(s1); | |
| 2436 break; | |
| 2437 case 0x3: | |
| 2438 mpeg_decode_quant_matrix_extension(s); | |
| 2439 break; | |
| 2440 case 0x7: | |
| 2441 mpeg_decode_picture_display_extension(s1); | |
| 2442 break; | |
| 2443 case 0x8: | |
| 2444 mpeg_decode_picture_coding_extension(s); | |
| 2445 break; | |
| 2446 } | |
| 2447 } | |
| 2448 | |
| 2449 static void exchange_uv(MpegEncContext *s){ | |
| 2450 short * tmp = s->pblocks[4]; | |
| 2451 s->pblocks[4] = s->pblocks[5]; | |
| 2452 s->pblocks[5] = tmp; | |
| 2453 } | |
| 2454 | |
| 2455 static int mpeg_field_start(MpegEncContext *s){ | |
| 2456 AVCodecContext *avctx= s->avctx; | |
| 2457 Mpeg1Context *s1 = (Mpeg1Context*)s; | |
| 2458 | |
| 2459 /* start frame decoding */ | |
| 2460 if(s->first_field || s->picture_structure==PICT_FRAME){ | |
| 2461 if(MPV_frame_start(s, avctx) < 0) | |
| 2462 return -1; | |
| 2463 | |
| 2464 ff_er_frame_start(s); | |
| 2465 | |
| 2466 /* first check if we must repeat the frame */ | |
| 2467 s->current_picture_ptr->repeat_pict = 0; | |
| 2468 if (s->repeat_first_field) { | |
| 2469 if (s->progressive_sequence) { | |
| 2470 if (s->top_field_first) | |
| 2471 s->current_picture_ptr->repeat_pict = 4; | |
| 2472 else | |
| 2473 s->current_picture_ptr->repeat_pict = 2; | |
| 2474 } else if (s->progressive_frame) { | |
| 2475 s->current_picture_ptr->repeat_pict = 1; | |
| 2476 } | |
| 2477 } | |
| 2478 | |
| 2479 *s->current_picture_ptr->pan_scan= s1->pan_scan; | |
| 2480 }else{ //second field | |
| 2481 int i; | |
| 2482 | |
| 2483 if(!s->current_picture_ptr){ | |
| 2484 av_log(s->avctx, AV_LOG_ERROR, "first field missing\n"); | |
| 2485 return -1; | |
| 2486 } | |
| 2487 | |
| 2488 for(i=0; i<4; i++){ | |
| 2489 s->current_picture.data[i] = s->current_picture_ptr->data[i]; | |
| 2490 if(s->picture_structure == PICT_BOTTOM_FIELD){ | |
| 2491 s->current_picture.data[i] += s->current_picture_ptr->linesize[i]; | |
| 2492 } | |
| 2493 } | |
| 2494 } | |
| 2495 #ifdef HAVE_XVMC | |
| 2496 // MPV_frame_start will call this function too, | |
| 2497 // but we need to call it on every field | |
| 2498 if(s->avctx->xvmc_acceleration) | |
| 2499 XVMC_field_start(s,avctx); | |
| 2500 #endif | |
| 2501 | |
| 2502 return 0; | |
| 2503 } | |
| 2504 | |
| 2505 #define DECODE_SLICE_ERROR -1 | |
| 2506 #define DECODE_SLICE_OK 0 | |
| 2507 | |
| 2508 /** | |
| 2509 * decodes a slice. MpegEncContext.mb_y must be set to the MB row from the startcode | |
| 2510 * @return DECODE_SLICE_ERROR if the slice is damaged<br> | |
| 2511 * DECODE_SLICE_OK if this slice is ok<br> | |
| 2512 */ | |
| 2513 static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y, | |
| 2514 const uint8_t **buf, int buf_size) | |
| 2515 { | |
| 2516 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2517 AVCodecContext *avctx= s->avctx; | |
| 2518 int ret; | |
| 2519 const int field_pic= s->picture_structure != PICT_FRAME; | |
| 2520 const int lowres= s->avctx->lowres; | |
| 2521 | |
| 2522 s->resync_mb_x= | |
| 2523 s->resync_mb_y= -1; | |
| 2524 | |
| 2525 if (mb_y<<field_pic >= s->mb_height){ | |
| 2526 av_log(s->avctx, AV_LOG_ERROR, "slice below image (%d >= %d)\n", mb_y, s->mb_height); | |
| 2527 return -1; | |
| 2528 } | |
| 2529 | |
| 2530 init_get_bits(&s->gb, *buf, buf_size*8); | |
| 2531 | |
| 2532 ff_mpeg1_clean_buffers(s); | |
| 2533 s->interlaced_dct = 0; | |
| 2534 | |
| 2535 s->qscale = get_qscale(s); | |
| 2536 | |
| 2537 if(s->qscale == 0){ | |
| 2538 av_log(s->avctx, AV_LOG_ERROR, "qscale == 0\n"); | |
| 2539 return -1; | |
| 2540 } | |
| 2541 | |
| 2542 /* extra slice info */ | |
| 2543 while (get_bits1(&s->gb) != 0) { | |
| 2544 skip_bits(&s->gb, 8); | |
| 2545 } | |
| 2546 | |
| 2547 s->mb_x=0; | |
| 2548 | |
| 2549 for(;;) { | |
| 2550 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2); | |
| 2551 if (code < 0){ | |
| 2552 av_log(s->avctx, AV_LOG_ERROR, "first mb_incr damaged\n"); | |
| 2553 return -1; | |
| 2554 } | |
| 2555 if (code >= 33) { | |
| 2556 if (code == 33) { | |
| 2557 s->mb_x += 33; | |
| 2558 } | |
| 2559 /* otherwise, stuffing, nothing to do */ | |
| 2560 } else { | |
| 2561 s->mb_x += code; | |
| 2562 break; | |
| 2563 } | |
| 2564 } | |
| 2565 | |
| 2566 s->resync_mb_x= s->mb_x; | |
| 2567 s->resync_mb_y= s->mb_y= mb_y; | |
| 2568 s->mb_skip_run= 0; | |
| 2569 ff_init_block_index(s); | |
| 2570 | |
| 2571 if (s->mb_y==0 && s->mb_x==0 && (s->first_field || s->picture_structure==PICT_FRAME)) { | |
| 2572 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ | |
| 2573 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", | |
| 2574 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], | |
| 2575 s->pict_type == I_TYPE ? "I" : (s->pict_type == P_TYPE ? "P" : (s->pict_type == B_TYPE ? "B" : "S")), | |
| 2576 s->progressive_sequence ? "ps" :"", s->progressive_frame ? "pf" : "", s->alternate_scan ? "alt" :"", s->top_field_first ? "top" :"", | |
| 2577 s->intra_dc_precision, s->picture_structure, s->frame_pred_frame_dct, s->concealment_motion_vectors, | |
| 2578 s->q_scale_type, s->intra_vlc_format, s->repeat_first_field, s->chroma_420_type ? "420" :""); | |
| 2579 } | |
| 2580 } | |
| 2581 | |
| 2582 for(;;) { | |
| 2583 #ifdef HAVE_XVMC | |
| 2584 //one 1 we memcpy blocks in xvmcvideo | |
| 2585 if(s->avctx->xvmc_acceleration > 1) | |
| 2586 XVMC_init_block(s);//set s->block | |
| 2587 #endif | |
| 2588 | |
| 2589 ret = mpeg_decode_mb(s, s->block); | |
| 2590 s->chroma_qscale= s->qscale; | |
| 2591 | |
| 2592 dprintf("ret=%d\n", ret); | |
| 2593 if (ret < 0) | |
| 2594 return -1; | |
| 2595 | |
| 2596 if(s->current_picture.motion_val[0] && !s->encoding){ //note motion_val is normally NULL unless we want to extract the MVs | |
| 2597 const int wrap = field_pic ? 2*s->b8_stride : s->b8_stride; | |
| 2598 int xy = s->mb_x*2 + s->mb_y*2*wrap; | |
| 2599 int motion_x, motion_y, dir, i; | |
| 2600 if(field_pic && !s->first_field) | |
| 2601 xy += wrap/2; | |
| 2602 | |
| 2603 for(i=0; i<2; i++){ | |
| 2604 for(dir=0; dir<2; dir++){ | |
| 2605 if (s->mb_intra || (dir==1 && s->pict_type != B_TYPE)) { | |
| 2606 motion_x = motion_y = 0; | |
| 2607 }else if (s->mv_type == MV_TYPE_16X16 || (s->mv_type == MV_TYPE_FIELD && field_pic)){ | |
| 2608 motion_x = s->mv[dir][0][0]; | |
| 2609 motion_y = s->mv[dir][0][1]; | |
| 2610 } else /*if ((s->mv_type == MV_TYPE_FIELD) || (s->mv_type == MV_TYPE_16X8))*/ { | |
| 2611 motion_x = s->mv[dir][i][0]; | |
| 2612 motion_y = s->mv[dir][i][1]; | |
| 2613 } | |
| 2614 | |
| 2615 s->current_picture.motion_val[dir][xy ][0] = motion_x; | |
| 2616 s->current_picture.motion_val[dir][xy ][1] = motion_y; | |
| 2617 s->current_picture.motion_val[dir][xy + 1][0] = motion_x; | |
| 2618 s->current_picture.motion_val[dir][xy + 1][1] = motion_y; | |
| 2619 s->current_picture.ref_index [dir][xy ]= | |
| 2620 s->current_picture.ref_index [dir][xy + 1]= s->field_select[dir][i]; | |
| 2621 assert(s->field_select[dir][i]==0 || s->field_select[dir][i]==1); | |
| 2622 } | |
| 2623 xy += wrap; | |
| 2624 } | |
| 2625 } | |
| 2626 | |
| 2627 s->dest[0] += 16 >> lowres; | |
| 2628 s->dest[1] += 16 >> (s->chroma_x_shift + lowres); | |
| 2629 s->dest[2] += 16 >> (s->chroma_x_shift + lowres); | |
| 2630 | |
| 2631 MPV_decode_mb(s, s->block); | |
| 2632 | |
| 2633 if (++s->mb_x >= s->mb_width) { | |
| 2634 const int mb_size= 16>>s->avctx->lowres; | |
| 2635 | |
| 2636 ff_draw_horiz_band(s, mb_size*s->mb_y, mb_size); | |
| 2637 | |
| 2638 s->mb_x = 0; | |
| 2639 s->mb_y++; | |
| 2640 | |
| 2641 if(s->mb_y<<field_pic >= s->mb_height){ | |
| 2642 int left= s->gb.size_in_bits - get_bits_count(&s->gb); | |
| 2643 int is_d10= s->chroma_format==2 && s->pict_type==I_TYPE && avctx->profile==0 && avctx->level==5 | |
| 2644 && s->intra_dc_precision == 2 && s->q_scale_type == 1 && s->alternate_scan == 0 | |
| 2645 && s->progressive_frame == 0 /* vbv_delay == 0xBBB || 0xE10*/; | |
| 2646 | |
| 2647 if(left < 0 || (left && show_bits(&s->gb, FFMIN(left, 23)) && !is_d10) | |
| 2648 || (avctx->error_resilience >= FF_ER_AGGRESSIVE && left>8)){ | |
| 2649 av_log(avctx, AV_LOG_ERROR, "end mismatch left=%d %0X\n", left, show_bits(&s->gb, FFMIN(left, 23))); | |
| 2650 return -1; | |
| 2651 }else | |
| 2652 goto eos; | |
| 2653 } | |
| 2654 | |
| 2655 ff_init_block_index(s); | |
| 2656 } | |
| 2657 | |
| 2658 /* skip mb handling */ | |
| 2659 if (s->mb_skip_run == -1) { | |
| 2660 /* read again increment */ | |
| 2661 s->mb_skip_run = 0; | |
| 2662 for(;;) { | |
| 2663 int code = get_vlc2(&s->gb, mbincr_vlc.table, MBINCR_VLC_BITS, 2); | |
| 2664 if (code < 0){ | |
| 2665 av_log(s->avctx, AV_LOG_ERROR, "mb incr damaged\n"); | |
| 2666 return -1; | |
| 2667 } | |
| 2668 if (code >= 33) { | |
| 2669 if (code == 33) { | |
| 2670 s->mb_skip_run += 33; | |
| 2671 }else if(code == 35){ | |
| 2672 if(s->mb_skip_run != 0 || show_bits(&s->gb, 15) != 0){ | |
| 2673 av_log(s->avctx, AV_LOG_ERROR, "slice mismatch\n"); | |
| 2674 return -1; | |
| 2675 } | |
| 2676 goto eos; /* end of slice */ | |
| 2677 } | |
| 2678 /* otherwise, stuffing, nothing to do */ | |
| 2679 } else { | |
| 2680 s->mb_skip_run += code; | |
| 2681 break; | |
| 2682 } | |
| 2683 } | |
| 2684 } | |
| 2685 } | |
| 2686 eos: // end of slice | |
| 2687 *buf += get_bits_count(&s->gb)/8 - 1; | |
| 2688 //printf("y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y); | |
| 2689 return 0; | |
| 2690 } | |
| 2691 | |
| 2692 static int slice_decode_thread(AVCodecContext *c, void *arg){ | |
| 2693 MpegEncContext *s= arg; | |
| 2694 const uint8_t *buf= s->gb.buffer; | |
| 2695 int mb_y= s->start_mb_y; | |
| 2696 | |
| 2697 s->error_count= 3*(s->end_mb_y - s->start_mb_y)*s->mb_width; | |
| 2698 | |
| 2699 for(;;){ | |
| 2700 uint32_t start_code; | |
| 2701 int ret; | |
| 2702 | |
| 2703 ret= mpeg_decode_slice((Mpeg1Context*)s, mb_y, &buf, s->gb.buffer_end - buf); | |
| 2704 emms_c(); | |
| 2705 //av_log(c, AV_LOG_DEBUG, "ret:%d resync:%d/%d mb:%d/%d ts:%d/%d ec:%d\n", | |
| 2706 //ret, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, s->start_mb_y, s->end_mb_y, s->error_count); | |
| 2707 if(ret < 0){ | |
| 2708 if(s->resync_mb_x>=0 && s->resync_mb_y>=0) | |
| 2709 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); | |
| 2710 }else{ | |
| 2711 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); | |
| 2712 } | |
| 2713 | |
| 2714 if(s->mb_y == s->end_mb_y) | |
| 2715 return 0; | |
| 2716 | |
| 2717 start_code= -1; | |
| 2718 buf = ff_find_start_code(buf, s->gb.buffer_end, &start_code); | |
| 2719 mb_y= start_code - SLICE_MIN_START_CODE; | |
| 2720 if(mb_y < 0 || mb_y >= s->end_mb_y) | |
| 2721 return -1; | |
| 2722 } | |
| 2723 | |
| 2724 return 0; //not reached | |
| 2725 } | |
| 2726 | |
| 2727 /** | |
| 2728 * handles slice ends. | |
| 2729 * @return 1 if it seems to be the last slice of | |
| 2730 */ | |
| 2731 static int slice_end(AVCodecContext *avctx, AVFrame *pict) | |
| 2732 { | |
| 2733 Mpeg1Context *s1 = avctx->priv_data; | |
| 2734 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2735 | |
| 2736 if (!s1->mpeg_enc_ctx_allocated || !s->current_picture_ptr) | |
| 2737 return 0; | |
| 2738 | |
| 2739 #ifdef HAVE_XVMC | |
| 2740 if(s->avctx->xvmc_acceleration) | |
| 2741 XVMC_field_end(s); | |
| 2742 #endif | |
| 2743 /* end of slice reached */ | |
| 2744 if (/*s->mb_y<<field_pic == s->mb_height &&*/ !s->first_field) { | |
| 2745 /* end of image */ | |
| 2746 | |
| 2747 s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2; | |
| 2748 | |
| 2749 ff_er_frame_end(s); | |
| 2750 | |
| 2751 MPV_frame_end(s); | |
| 2752 | |
| 2753 if (s->pict_type == B_TYPE || s->low_delay) { | |
| 2754 *pict= *(AVFrame*)s->current_picture_ptr; | |
| 2755 ff_print_debug_info(s, pict); | |
| 2756 } else { | |
| 2757 s->picture_number++; | |
| 2758 /* latency of 1 frame for I and P frames */ | |
| 2759 /* XXX: use another variable than picture_number */ | |
| 2760 if (s->last_picture_ptr != NULL) { | |
| 2761 *pict= *(AVFrame*)s->last_picture_ptr; | |
| 2762 ff_print_debug_info(s, pict); | |
| 2763 } | |
| 2764 } | |
| 2765 | |
| 2766 return 1; | |
| 2767 } else { | |
| 2768 return 0; | |
| 2769 } | |
| 2770 } | |
| 2771 | |
| 2772 static int mpeg1_decode_sequence(AVCodecContext *avctx, | |
| 2773 const uint8_t *buf, int buf_size) | |
| 2774 { | |
| 2775 Mpeg1Context *s1 = avctx->priv_data; | |
| 2776 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2777 int width,height; | |
| 2778 int i, v, j; | |
| 2779 | |
| 2780 init_get_bits(&s->gb, buf, buf_size*8); | |
| 2781 | |
| 2782 width = get_bits(&s->gb, 12); | |
| 2783 height = get_bits(&s->gb, 12); | |
| 2784 if (width <= 0 || height <= 0 || | |
| 2785 (width % 2) != 0 || (height % 2) != 0) | |
| 2786 return -1; | |
| 2787 s->aspect_ratio_info= get_bits(&s->gb, 4); | |
| 2788 if (s->aspect_ratio_info == 0) | |
| 2789 return -1; | |
| 2790 s->frame_rate_index = get_bits(&s->gb, 4); | |
| 2791 if (s->frame_rate_index == 0 || s->frame_rate_index > 13) | |
| 2792 return -1; | |
| 2793 s->bit_rate = get_bits(&s->gb, 18) * 400; | |
| 2794 if (get_bits1(&s->gb) == 0) /* marker */ | |
| 2795 return -1; | |
| 2796 s->width = width; | |
| 2797 s->height = height; | |
| 2798 | |
| 2799 s->avctx->rc_buffer_size= get_bits(&s->gb, 10) * 1024*16; | |
| 2800 skip_bits(&s->gb, 1); | |
| 2801 | |
| 2802 /* get matrix */ | |
| 2803 if (get_bits1(&s->gb)) { | |
| 2804 for(i=0;i<64;i++) { | |
| 2805 v = get_bits(&s->gb, 8); | |
| 2806 if(v==0){ | |
| 2807 av_log(s->avctx, AV_LOG_ERROR, "intra matrix damaged\n"); | |
| 2808 return -1; | |
| 2809 } | |
| 2810 j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | |
| 2811 s->intra_matrix[j] = v; | |
| 2812 s->chroma_intra_matrix[j] = v; | |
| 2813 } | |
| 2814 #ifdef DEBUG | |
| 2815 dprintf("intra matrix present\n"); | |
| 2816 for(i=0;i<64;i++) | |
| 2817 dprintf(" %d", s->intra_matrix[s->dsp.idct_permutation[i]]); | |
| 2818 dprintf("\n"); | |
| 2819 #endif | |
| 2820 } else { | |
| 2821 for(i=0;i<64;i++) { | |
| 2822 j = s->dsp.idct_permutation[i]; | |
| 2823 v = ff_mpeg1_default_intra_matrix[i]; | |
| 2824 s->intra_matrix[j] = v; | |
| 2825 s->chroma_intra_matrix[j] = v; | |
| 2826 } | |
| 2827 } | |
| 2828 if (get_bits1(&s->gb)) { | |
| 2829 for(i=0;i<64;i++) { | |
| 2830 v = get_bits(&s->gb, 8); | |
| 2831 if(v==0){ | |
| 2832 av_log(s->avctx, AV_LOG_ERROR, "inter matrix damaged\n"); | |
| 2833 return -1; | |
| 2834 } | |
| 2835 j = s->dsp.idct_permutation[ ff_zigzag_direct[i] ]; | |
| 2836 s->inter_matrix[j] = v; | |
| 2837 s->chroma_inter_matrix[j] = v; | |
| 2838 } | |
| 2839 #ifdef DEBUG | |
| 2840 dprintf("non intra matrix present\n"); | |
| 2841 for(i=0;i<64;i++) | |
| 2842 dprintf(" %d", s->inter_matrix[s->dsp.idct_permutation[i]]); | |
| 2843 dprintf("\n"); | |
| 2844 #endif | |
| 2845 } else { | |
| 2846 for(i=0;i<64;i++) { | |
| 2847 int j= s->dsp.idct_permutation[i]; | |
| 2848 v = ff_mpeg1_default_non_intra_matrix[i]; | |
| 2849 s->inter_matrix[j] = v; | |
| 2850 s->chroma_inter_matrix[j] = v; | |
| 2851 } | |
| 2852 } | |
| 2853 | |
| 2854 if(show_bits(&s->gb, 23) != 0){ | |
| 2855 av_log(s->avctx, AV_LOG_ERROR, "sequence header damaged\n"); | |
| 2856 return -1; | |
| 2857 } | |
| 2858 | |
| 2859 /* we set mpeg2 parameters so that it emulates mpeg1 */ | |
| 2860 s->progressive_sequence = 1; | |
| 2861 s->progressive_frame = 1; | |
| 2862 s->picture_structure = PICT_FRAME; | |
| 2863 s->frame_pred_frame_dct = 1; | |
| 2864 s->chroma_format = 1; | |
| 2865 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO; | |
| 2866 avctx->sub_id = 1; /* indicates mpeg1 */ | |
| 2867 s->out_format = FMT_MPEG1; | |
| 2868 s->swap_uv = 0;//AFAIK VCR2 don't have SEQ_HEADER | |
| 2869 if(s->flags & CODEC_FLAG_LOW_DELAY) s->low_delay=1; | |
| 2870 | |
| 2871 if(s->avctx->debug & FF_DEBUG_PICT_INFO) | |
| 2872 av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%d\n", | |
| 2873 s->avctx->rc_buffer_size, s->bit_rate); | |
| 2874 | |
| 2875 return 0; | |
| 2876 } | |
| 2877 | |
| 2878 static int vcr2_init_sequence(AVCodecContext *avctx) | |
| 2879 { | |
| 2880 Mpeg1Context *s1 = avctx->priv_data; | |
| 2881 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2882 int i, v; | |
| 2883 | |
| 2884 /* start new mpeg1 context decoding */ | |
| 2885 s->out_format = FMT_MPEG1; | |
| 2886 if (s1->mpeg_enc_ctx_allocated) { | |
| 2887 MPV_common_end(s); | |
| 2888 } | |
| 2889 s->width = avctx->coded_width; | |
| 2890 s->height = avctx->coded_height; | |
| 2891 avctx->has_b_frames= 0; //true? | |
| 2892 s->low_delay= 1; | |
| 2893 | |
| 2894 if(avctx->xvmc_acceleration){ | |
| 2895 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_xvmc_mpg2_420); | |
| 2896 }else{ | |
| 2897 avctx->pix_fmt = avctx->get_format(avctx,pixfmt_yuv_420); | |
| 2898 } | |
| 2899 | |
| 2900 if( avctx->pix_fmt == PIX_FMT_XVMC_MPEG2_IDCT ) | |
| 2901 if( avctx->idct_algo == FF_IDCT_AUTO ) | |
| 2902 avctx->idct_algo = FF_IDCT_SIMPLE; | |
| 2903 | |
| 2904 if (MPV_common_init(s) < 0) | |
| 2905 return -1; | |
| 2906 exchange_uv(s);//common init reset pblocks, so we swap them here | |
| 2907 s->swap_uv = 1;// in case of xvmc we need to swap uv for each MB | |
| 2908 s1->mpeg_enc_ctx_allocated = 1; | |
| 2909 | |
| 2910 for(i=0;i<64;i++) { | |
| 2911 int j= s->dsp.idct_permutation[i]; | |
| 2912 v = ff_mpeg1_default_intra_matrix[i]; | |
| 2913 s->intra_matrix[j] = v; | |
| 2914 s->chroma_intra_matrix[j] = v; | |
| 2915 | |
| 2916 v = ff_mpeg1_default_non_intra_matrix[i]; | |
| 2917 s->inter_matrix[j] = v; | |
| 2918 s->chroma_inter_matrix[j] = v; | |
| 2919 } | |
| 2920 | |
| 2921 s->progressive_sequence = 1; | |
| 2922 s->progressive_frame = 1; | |
| 2923 s->picture_structure = PICT_FRAME; | |
| 2924 s->frame_pred_frame_dct = 1; | |
| 2925 s->chroma_format = 1; | |
| 2926 s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; | |
| 2927 avctx->sub_id = 2; /* indicates mpeg2 */ | |
| 2928 return 0; | |
| 2929 } | |
| 2930 | |
| 2931 | |
| 2932 static void mpeg_decode_user_data(AVCodecContext *avctx, | |
| 2933 const uint8_t *buf, int buf_size) | |
| 2934 { | |
| 2935 const uint8_t *p; | |
| 2936 int len, flags; | |
| 2937 p = buf; | |
| 2938 len = buf_size; | |
| 2939 | |
| 2940 /* we parse the DTG active format information */ | |
| 2941 if (len >= 5 && | |
| 2942 p[0] == 'D' && p[1] == 'T' && p[2] == 'G' && p[3] == '1') { | |
| 2943 flags = p[4]; | |
| 2944 p += 5; | |
| 2945 len -= 5; | |
| 2946 if (flags & 0x80) { | |
| 2947 /* skip event id */ | |
| 2948 if (len < 2) | |
| 2949 return; | |
| 2950 p += 2; | |
| 2951 len -= 2; | |
| 2952 } | |
| 2953 if (flags & 0x40) { | |
| 2954 if (len < 1) | |
| 2955 return; | |
| 2956 avctx->dtg_active_format = p[0] & 0x0f; | |
| 2957 } | |
| 2958 } | |
| 2959 } | |
| 2960 | |
| 2961 static void mpeg_decode_gop(AVCodecContext *avctx, | |
| 2962 const uint8_t *buf, int buf_size){ | |
| 2963 Mpeg1Context *s1 = avctx->priv_data; | |
| 2964 MpegEncContext *s = &s1->mpeg_enc_ctx; | |
| 2965 | |
| 2966 int drop_frame_flag; | |
| 2967 int time_code_hours, time_code_minutes; | |
| 2968 int time_code_seconds, time_code_pictures; | |
| 2969 int broken_link; | |
| 2970 | |
| 2971 init_get_bits(&s->gb, buf, buf_size*8); | |
| 2972 | |
| 2973 drop_frame_flag = get_bits1(&s->gb); | |
| 2974 | |
| 2975 time_code_hours=get_bits(&s->gb,5); | |
| 2976 time_code_minutes = get_bits(&s->gb,6); | |
| 2977 skip_bits1(&s->gb);//marker bit | |
| 2978 time_code_seconds = get_bits(&s->gb,6); | |
| 2979 time_code_pictures = get_bits(&s->gb,6); | |
| 2980 | |
| 2981 /*broken_link indicate that after editing the | |
| 2982 reference frames of the first B-Frames after GOP I-Frame | |
| 2983 are missing (open gop)*/ | |
| 2984 broken_link = get_bits1(&s->gb); | |
| 2985 | |
| 2986 if(s->avctx->debug & FF_DEBUG_PICT_INFO) | |
| 2987 av_log(s->avctx, AV_LOG_DEBUG, "GOP (%2d:%02d:%02d.[%02d]) broken_link=%d\n", | |
| 2988 time_code_hours, time_code_minutes, time_code_seconds, | |
| 2989 time_code_pictures, broken_link); | |
| 2990 } | |
| 2991 /** | |
| 2992 * finds the end of the current frame in the bitstream. | |
| 2993 * @return the position of the first byte of the next frame, or -1 | |
| 2994 */ | |
| 2995 int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) | |
| 2996 { | |
| 2997 int i; | |
| 2998 uint32_t state= pc->state; | |
| 2999 | |
| 3000 i=0; | |
| 3001 if(!pc->frame_start_found){ | |
| 3002 for(i=0; i<buf_size; i++){ | |
| 3003 i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; | |
| 3004 if(state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE){ | |
| 3005 i++; | |
| 3006 pc->frame_start_found=1; | |
| 3007 break; | |
| 3008 } | |
| 3009 } | |
| 3010 } | |
| 3011 | |
| 3012 if(pc->frame_start_found){ | |
| 3013 /* EOF considered as end of frame */ | |
| 3014 if (buf_size == 0) | |
| 3015 return 0; | |
| 3016 for(; i<buf_size; i++){ | |
| 3017 i= ff_find_start_code(buf+i, buf+buf_size, &state) - buf - 1; | |
| 3018 if((state&0xFFFFFF00) == 0x100){ | |
| 3019 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ | |
| 3020 pc->frame_start_found=0; | |
| 3021 pc->state=-1; | |
| 3022 return i-3; | |
| 3023 } | |
| 3024 } | |
| 3025 } | |
| 3026 } | |
| 3027 pc->state= state; | |
| 3028 return END_NOT_FOUND; | |
| 3029 } | |
| 3030 | |
| 3031 /* handle buffering and image synchronisation */ | |
| 3032 static int mpeg_decode_frame(AVCodecContext *avctx, | |
| 3033 void *data, int *data_size, | |
| 3034 uint8_t *buf, int buf_size) | |
| 3035 { | |
| 3036 Mpeg1Context *s = avctx->priv_data; | |
| 3037 const uint8_t *buf_end; | |
| 3038 const uint8_t *buf_ptr; | |
| 3039 uint32_t start_code; | |
| 3040 int ret, input_size; | |
| 3041 AVFrame *picture = data; | |
| 3042 MpegEncContext *s2 = &s->mpeg_enc_ctx; | |
| 3043 dprintf("fill_buffer\n"); | |
| 3044 | |
| 3045 if (buf_size == 0) { | |
| 3046 /* special case for last picture */ | |
| 3047 if (s2->low_delay==0 && s2->next_picture_ptr) { | |
| 3048 *picture= *(AVFrame*)s2->next_picture_ptr; | |
| 3049 s2->next_picture_ptr= NULL; | |
| 3050 | |
| 3051 *data_size = sizeof(AVFrame); | |
| 3052 } | |
| 3053 return 0; | |
| 3054 } | |
| 3055 | |
| 3056 if(s2->flags&CODEC_FLAG_TRUNCATED){ | |
| 3057 int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size); | |
| 3058 | |
| 3059 if( ff_combine_frame(&s2->parse_context, next, &buf, &buf_size) < 0 ) | |
| 3060 return buf_size; | |
| 3061 } | |
| 3062 | |
| 3063 buf_ptr = buf; | |
| 3064 buf_end = buf + buf_size; | |
| 3065 | |
| 3066 #if 0 | |
| 3067 if (s->repeat_field % 2 == 1) { | |
| 3068 s->repeat_field++; | |
| 3069 //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number, | |
| 3070 // s2->picture_number, s->repeat_field); | |
| 3071 if (avctx->flags & CODEC_FLAG_REPEAT_FIELD) { | |
| 3072 *data_size = sizeof(AVPicture); | |
| 3073 goto the_end; | |
| 3074 } | |
| 3075 } | |
| 3076 #endif | |
| 3077 | |
| 3078 if(s->mpeg_enc_ctx_allocated==0 && avctx->codec_tag == ff_get_fourcc("VCR2")) | |
| 3079 vcr2_init_sequence(avctx); | |
| 3080 | |
| 3081 s->slice_count= 0; | |
| 3082 | |
| 3083 for(;;) { | |
| 3084 /* find start next code */ | |
| 3085 start_code = -1; | |
| 3086 buf_ptr = ff_find_start_code(buf_ptr,buf_end, &start_code); | |
| 3087 if (start_code > 0x1ff){ | |
| 3088 if(s2->pict_type != B_TYPE || avctx->skip_frame <= AVDISCARD_DEFAULT){ | |
| 3089 if(avctx->thread_count > 1){ | |
| 3090 int i; | |
| 3091 | |
| 3092 avctx->execute(avctx, slice_decode_thread, (void**)&(s2->thread_context[0]), NULL, s->slice_count); | |
| 3093 for(i=0; i<s->slice_count; i++) | |
| 3094 s2->error_count += s2->thread_context[i]->error_count; | |
| 3095 } | |
| 3096 if (slice_end(avctx, picture)) { | |
| 3097 if(s2->last_picture_ptr || s2->low_delay) //FIXME merge with the stuff in mpeg_decode_slice | |
| 3098 *data_size = sizeof(AVPicture); | |
| 3099 } | |
| 3100 } | |
| 3101 return FFMAX(0, buf_ptr - buf - s2->parse_context.last_index); | |
| 3102 } | |
| 3103 | |
| 3104 input_size = buf_end - buf_ptr; | |
| 3105 | |
| 3106 if(avctx->debug & FF_DEBUG_STARTCODE){ | |
| 3107 av_log(avctx, AV_LOG_DEBUG, "%3X at %zd left %d\n", start_code, buf_ptr-buf, input_size); | |
| 3108 } | |
| 3109 | |
| 3110 /* prepare data for next start code */ | |
| 3111 switch(start_code) { | |
| 3112 case SEQ_START_CODE: | |
| 3113 mpeg1_decode_sequence(avctx, buf_ptr, | |
| 3114 input_size); | |
| 3115 break; | |
| 3116 | |
| 3117 case PICTURE_START_CODE: | |
| 3118 /* we have a complete image : we try to decompress it */ | |
| 3119 mpeg1_decode_picture(avctx, | |
| 3120 buf_ptr, input_size); | |
| 3121 break; | |
| 3122 case EXT_START_CODE: | |
| 3123 mpeg_decode_extension(avctx, | |
| 3124 buf_ptr, input_size); | |
| 3125 break; | |
| 3126 case USER_START_CODE: | |
| 3127 mpeg_decode_user_data(avctx, | |
| 3128 buf_ptr, input_size); | |
| 3129 break; | |
| 3130 case GOP_START_CODE: | |
| 3131 s2->first_field=0; | |
| 3132 mpeg_decode_gop(avctx, | |
| 3133 buf_ptr, input_size); | |
| 3134 break; | |
| 3135 default: | |
| 3136 if (start_code >= SLICE_MIN_START_CODE && | |
| 3137 start_code <= SLICE_MAX_START_CODE) { | |
| 3138 int mb_y= start_code - SLICE_MIN_START_CODE; | |
| 3139 | |
| 3140 if(s2->last_picture_ptr==NULL){ | |
| 3141 /* skip b frames if we dont have reference frames */ | |
| 3142 if(s2->pict_type==B_TYPE) break; | |
| 3143 /* skip P frames if we dont have reference frame no valid header */ | |
| 3144 // if(s2->pict_type==P_TYPE && s2->first_field && !s2->first_slice) break; | |
| 3145 } | |
| 3146 /* skip b frames if we are in a hurry */ | |
| 3147 if(avctx->hurry_up && s2->pict_type==B_TYPE) break; | |
| 3148 if( (avctx->skip_frame >= AVDISCARD_NONREF && s2->pict_type==B_TYPE) | |
| 3149 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s2->pict_type!=I_TYPE) | |
| 3150 || avctx->skip_frame >= AVDISCARD_ALL) | |
| 3151 break; | |
| 3152 /* skip everything if we are in a hurry>=5 */ | |
| 3153 if(avctx->hurry_up>=5) break; | |
| 3154 | |
| 3155 if (!s->mpeg_enc_ctx_allocated) break; | |
| 3156 | |
| 3157 if(s2->codec_id == CODEC_ID_MPEG2VIDEO){ | |
| 3158 if(mb_y < avctx->skip_top || mb_y >= s2->mb_height - avctx->skip_bottom) | |
| 3159 break; | |
| 3160 } | |
| 3161 | |
| 3162 if(s2->first_slice){ | |
| 3163 s2->first_slice=0; | |
| 3164 if(mpeg_field_start(s2) < 0) | |
| 3165 return -1; | |
| 3166 } | |
| 3167 | |
| 3168 if(avctx->thread_count > 1){ | |
| 3169 int threshold= (s2->mb_height*s->slice_count + avctx->thread_count/2) / avctx->thread_count; | |
| 3170 if(threshold <= mb_y){ | |
| 3171 MpegEncContext *thread_context= s2->thread_context[s->slice_count]; | |
| 3172 | |
| 3173 thread_context->start_mb_y= mb_y; | |
| 3174 thread_context->end_mb_y = s2->mb_height; | |
| 3175 if(s->slice_count){ | |
| 3176 s2->thread_context[s->slice_count-1]->end_mb_y= mb_y; | |
| 3177 ff_update_duplicate_context(thread_context, s2); | |
| 3178 } | |
| 3179 init_get_bits(&thread_context->gb, buf_ptr, input_size*8); | |
| 3180 s->slice_count++; | |
| 3181 } | |
| 3182 buf_ptr += 2; //FIXME add minimum num of bytes per slice | |
| 3183 }else{ | |
| 3184 ret = mpeg_decode_slice(s, mb_y, &buf_ptr, input_size); | |
| 3185 emms_c(); | |
| 3186 | |
| 3187 if(ret < 0){ | |
| 3188 if(s2->resync_mb_x>=0 && s2->resync_mb_y>=0) | |
| 3189 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); | |
| 3190 }else{ | |
| 3191 ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, AC_END|DC_END|MV_END); | |
| 3192 } | |
| 3193 } | |
| 3194 } | |
| 3195 break; | |
| 3196 } | |
| 3197 } | |
| 3198 } | |
| 3199 | |
| 3200 static int mpeg_decode_end(AVCodecContext *avctx) | |
| 3201 { | |
| 3202 Mpeg1Context *s = avctx->priv_data; | |
| 3203 | |
| 3204 if (s->mpeg_enc_ctx_allocated) | |
| 3205 MPV_common_end(&s->mpeg_enc_ctx); | |
| 3206 return 0; | |
| 3207 } | |
| 3208 | |
| 3209 AVCodec mpeg1video_decoder = { | |
| 3210 "mpeg1video", | |
| 3211 CODEC_TYPE_VIDEO, | |
| 3212 CODEC_ID_MPEG1VIDEO, | |
| 3213 sizeof(Mpeg1Context), | |
| 3214 mpeg_decode_init, | |
| 3215 NULL, | |
| 3216 mpeg_decode_end, | |
| 3217 mpeg_decode_frame, | |
| 3218 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | |
| 3219 .flush= ff_mpeg_flush, | |
| 3220 }; | |
| 3221 | |
| 3222 AVCodec mpeg2video_decoder = { | |
| 3223 "mpeg2video", | |
| 3224 CODEC_TYPE_VIDEO, | |
| 3225 CODEC_ID_MPEG2VIDEO, | |
| 3226 sizeof(Mpeg1Context), | |
| 3227 mpeg_decode_init, | |
| 3228 NULL, | |
| 3229 mpeg_decode_end, | |
| 3230 mpeg_decode_frame, | |
| 3231 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | |
| 3232 .flush= ff_mpeg_flush, | |
| 3233 }; | |
| 3234 | |
| 3235 //legacy decoder | |
| 3236 AVCodec mpegvideo_decoder = { | |
| 3237 "mpegvideo", | |
| 3238 CODEC_TYPE_VIDEO, | |
| 3239 CODEC_ID_MPEG2VIDEO, | |
| 3240 sizeof(Mpeg1Context), | |
| 3241 mpeg_decode_init, | |
| 3242 NULL, | |
| 3243 mpeg_decode_end, | |
| 3244 mpeg_decode_frame, | |
| 3245 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, | |
| 3246 .flush= ff_mpeg_flush, | |
| 3247 }; | |
| 3248 | |
| 3249 #ifdef CONFIG_ENCODERS | |
| 3250 | |
| 3251 AVCodec mpeg1video_encoder = { | |
| 3252 "mpeg1video", | |
| 3253 CODEC_TYPE_VIDEO, | |
| 3254 CODEC_ID_MPEG1VIDEO, | |
| 3255 sizeof(MpegEncContext), | |
| 3256 encode_init, | |
| 3257 MPV_encode_picture, | |
| 3258 MPV_encode_end, | |
| 3259 .supported_framerates= ff_frame_rate_tab+1, | |
| 3260 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1}, | |
| 3261 .capabilities= CODEC_CAP_DELAY, | |
| 3262 }; | |
| 3263 | |
| 3264 AVCodec mpeg2video_encoder = { | |
| 3265 "mpeg2video", | |
| 3266 CODEC_TYPE_VIDEO, | |
| 3267 CODEC_ID_MPEG2VIDEO, | |
| 3268 sizeof(MpegEncContext), | |
| 3269 encode_init, | |
| 3270 MPV_encode_picture, | |
| 3271 MPV_encode_end, | |
| 3272 .supported_framerates= ff_frame_rate_tab+1, | |
| 3273 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, -1}, | |
| 3274 .capabilities= CODEC_CAP_DELAY, | |
| 3275 }; | |
| 3276 #endif | |
| 3277 | |
| 3278 #ifdef HAVE_XVMC | |
| 3279 static int mpeg_mc_decode_init(AVCodecContext *avctx){ | |
| 3280 Mpeg1Context *s; | |
| 3281 | |
| 3282 if( avctx->thread_count > 1) | |
| 3283 return -1; | |
| 3284 if( !(avctx->slice_flags & SLICE_FLAG_CODED_ORDER) ) | |
| 3285 return -1; | |
| 3286 if( !(avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD) ){ | |
| 3287 dprintf("mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n"); | |
| 3288 } | |
| 3289 mpeg_decode_init(avctx); | |
| 3290 s = avctx->priv_data; | |
| 3291 | |
| 3292 avctx->pix_fmt = PIX_FMT_XVMC_MPEG2_IDCT; | |
| 3293 avctx->xvmc_acceleration = 2;//2 - the blocks are packed! | |
| 3294 | |
| 3295 return 0; | |
| 3296 } | |
| 3297 | |
| 3298 AVCodec mpeg_xvmc_decoder = { | |
| 3299 "mpegvideo_xvmc", | |
| 3300 CODEC_TYPE_VIDEO, | |
| 3301 CODEC_ID_MPEG2VIDEO_XVMC, | |
| 3302 sizeof(Mpeg1Context), | |
| 3303 mpeg_mc_decode_init, | |
| 3304 NULL, | |
| 3305 mpeg_decode_end, | |
| 3306 mpeg_decode_frame, | |
| 3307 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED| CODEC_CAP_HWACCEL | CODEC_CAP_DELAY, | |
| 3308 .flush= ff_mpeg_flush, | |
| 3309 }; | |
| 3310 | |
| 3311 #endif | |
| 3312 | |
| 3313 /* this is ugly i know, but the alternative is too make | |
| 3314 hundreds of vars global and prefix them with ff_mpeg1_ | |
| 3315 which is far uglier. */ | |
| 3316 #include "mdec.c" |
