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

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * MSMPEG4 backend for encoder and decoder
yading@10 3 * Copyright (c) 2001 Fabrice Bellard
yading@10 4 * Copyright (c) 2002-2013 Michael Niedermayer <michaelni@gmx.at>
yading@10 5 *
yading@10 6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
yading@10 7 *
yading@10 8 * This file is part of FFmpeg.
yading@10 9 *
yading@10 10 * FFmpeg is free software; you can redistribute it and/or
yading@10 11 * modify it under the terms of the GNU Lesser General Public
yading@10 12 * License as published by the Free Software Foundation; either
yading@10 13 * version 2.1 of the License, or (at your option) any later version.
yading@10 14 *
yading@10 15 * FFmpeg is distributed in the hope that it will be useful,
yading@10 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 18 * Lesser General Public License for more details.
yading@10 19 *
yading@10 20 * You should have received a copy of the GNU Lesser General Public
yading@10 21 * License along with FFmpeg; if not, write to the Free Software
yading@10 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 23 */
yading@10 24
yading@10 25 #include "avcodec.h"
yading@10 26 #include "dsputil.h"
yading@10 27 #include "mpegvideo.h"
yading@10 28 #include "msmpeg4.h"
yading@10 29 #include "libavutil/imgutils.h"
yading@10 30 #include "libavutil/x86/asm.h"
yading@10 31 #include "h263.h"
yading@10 32 #include "mpeg4video.h"
yading@10 33 #include "msmpeg4data.h"
yading@10 34 #include "vc1data.h"
yading@10 35
yading@10 36 #define DC_VLC_BITS 9
yading@10 37 #define V2_INTRA_CBPC_VLC_BITS 3
yading@10 38 #define V2_MB_TYPE_VLC_BITS 7
yading@10 39 #define MV_VLC_BITS 9
yading@10 40 #define V2_MV_VLC_BITS 9
yading@10 41 #define TEX_VLC_BITS 9
yading@10 42
yading@10 43 #define DEFAULT_INTER_INDEX 3
yading@10 44
yading@10 45 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
yading@10 46 int32_t **dc_val_ptr)
yading@10 47 {
yading@10 48 int i;
yading@10 49
yading@10 50 if (n < 4) {
yading@10 51 i= 0;
yading@10 52 } else {
yading@10 53 i= n-3;
yading@10 54 }
yading@10 55
yading@10 56 *dc_val_ptr= &s->last_dc[i];
yading@10 57 return s->last_dc[i];
yading@10 58 }
yading@10 59
yading@10 60 /****************************************/
yading@10 61 /* decoding stuff */
yading@10 62
yading@10 63 VLC ff_mb_non_intra_vlc[4];
yading@10 64 static VLC v2_dc_lum_vlc;
yading@10 65 static VLC v2_dc_chroma_vlc;
yading@10 66 static VLC v2_intra_cbpc_vlc;
yading@10 67 static VLC v2_mb_type_vlc;
yading@10 68 static VLC v2_mv_vlc;
yading@10 69 VLC ff_inter_intra_vlc;
yading@10 70
yading@10 71 /* This is identical to h263 except that its range is multiplied by 2. */
yading@10 72 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
yading@10 73 {
yading@10 74 int code, val, sign, shift;
yading@10 75
yading@10 76 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
yading@10 77 av_dlog(s, "MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
yading@10 78 if (code < 0)
yading@10 79 return 0xffff;
yading@10 80
yading@10 81 if (code == 0)
yading@10 82 return pred;
yading@10 83 sign = get_bits1(&s->gb);
yading@10 84 shift = f_code - 1;
yading@10 85 val = code;
yading@10 86 if (shift) {
yading@10 87 val = (val - 1) << shift;
yading@10 88 val |= get_bits(&s->gb, shift);
yading@10 89 val++;
yading@10 90 }
yading@10 91 if (sign)
yading@10 92 val = -val;
yading@10 93
yading@10 94 val += pred;
yading@10 95 if (val <= -64)
yading@10 96 val += 64;
yading@10 97 else if (val >= 64)
yading@10 98 val -= 64;
yading@10 99
yading@10 100 return val;
yading@10 101 }
yading@10 102
yading@10 103 static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64])
yading@10 104 {
yading@10 105 int cbp, code, i;
yading@10 106 uint32_t * const mb_type_ptr = &s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride];
yading@10 107
yading@10 108 if (s->pict_type == AV_PICTURE_TYPE_P) {
yading@10 109 if (s->use_skip_mb_code) {
yading@10 110 if (get_bits1(&s->gb)) {
yading@10 111 /* skip mb */
yading@10 112 s->mb_intra = 0;
yading@10 113 for(i=0;i<6;i++)
yading@10 114 s->block_last_index[i] = -1;
yading@10 115 s->mv_dir = MV_DIR_FORWARD;
yading@10 116 s->mv_type = MV_TYPE_16X16;
yading@10 117 s->mv[0][0][0] = 0;
yading@10 118 s->mv[0][0][1] = 0;
yading@10 119 s->mb_skipped = 1;
yading@10 120 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
yading@10 121 return 0;
yading@10 122 }
yading@10 123 }
yading@10 124
yading@10 125 if(s->msmpeg4_version==2)
yading@10 126 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
yading@10 127 else
yading@10 128 code = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
yading@10 129 if(code<0 || code>7){
yading@10 130 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
yading@10 131 return -1;
yading@10 132 }
yading@10 133
yading@10 134 s->mb_intra = code >>2;
yading@10 135
yading@10 136 cbp = code & 0x3;
yading@10 137 } else {
yading@10 138 s->mb_intra = 1;
yading@10 139 if(s->msmpeg4_version==2)
yading@10 140 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
yading@10 141 else
yading@10 142 cbp= get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
yading@10 143 if(cbp<0 || cbp>3){
yading@10 144 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
yading@10 145 return -1;
yading@10 146 }
yading@10 147 }
yading@10 148
yading@10 149 if (!s->mb_intra) {
yading@10 150 int mx, my, cbpy;
yading@10 151
yading@10 152 cbpy= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
yading@10 153 if(cbpy<0){
yading@10 154 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
yading@10 155 return -1;
yading@10 156 }
yading@10 157
yading@10 158 cbp|= cbpy<<2;
yading@10 159 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
yading@10 160
yading@10 161 ff_h263_pred_motion(s, 0, 0, &mx, &my);
yading@10 162 mx= msmpeg4v2_decode_motion(s, mx, 1);
yading@10 163 my= msmpeg4v2_decode_motion(s, my, 1);
yading@10 164
yading@10 165 s->mv_dir = MV_DIR_FORWARD;
yading@10 166 s->mv_type = MV_TYPE_16X16;
yading@10 167 s->mv[0][0][0] = mx;
yading@10 168 s->mv[0][0][1] = my;
yading@10 169 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
yading@10 170 } else {
yading@10 171 if(s->msmpeg4_version==2){
yading@10 172 s->ac_pred = get_bits1(&s->gb);
yading@10 173 cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
yading@10 174 } else{
yading@10 175 s->ac_pred = 0;
yading@10 176 cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
yading@10 177 if(s->pict_type==AV_PICTURE_TYPE_P) cbp^=0x3C;
yading@10 178 }
yading@10 179 *mb_type_ptr = MB_TYPE_INTRA;
yading@10 180 }
yading@10 181
yading@10 182 s->dsp.clear_blocks(s->block[0]);
yading@10 183 for (i = 0; i < 6; i++) {
yading@10 184 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
yading@10 185 {
yading@10 186 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
yading@10 187 return -1;
yading@10 188 }
yading@10 189 }
yading@10 190 return 0;
yading@10 191 }
yading@10 192
yading@10 193 static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64])
yading@10 194 {
yading@10 195 int cbp, code, i;
yading@10 196 uint8_t *coded_val;
yading@10 197 uint32_t * const mb_type_ptr = &s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride];
yading@10 198
yading@10 199 if (s->pict_type == AV_PICTURE_TYPE_P) {
yading@10 200 if (s->use_skip_mb_code) {
yading@10 201 if (get_bits1(&s->gb)) {
yading@10 202 /* skip mb */
yading@10 203 s->mb_intra = 0;
yading@10 204 for(i=0;i<6;i++)
yading@10 205 s->block_last_index[i] = -1;
yading@10 206 s->mv_dir = MV_DIR_FORWARD;
yading@10 207 s->mv_type = MV_TYPE_16X16;
yading@10 208 s->mv[0][0][0] = 0;
yading@10 209 s->mv[0][0][1] = 0;
yading@10 210 s->mb_skipped = 1;
yading@10 211 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
yading@10 212
yading@10 213 return 0;
yading@10 214 }
yading@10 215 }
yading@10 216
yading@10 217 code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
yading@10 218 if (code < 0)
yading@10 219 return -1;
yading@10 220 //s->mb_intra = (code & 0x40) ? 0 : 1;
yading@10 221 s->mb_intra = (~code & 0x40) >> 6;
yading@10 222
yading@10 223 cbp = code & 0x3f;
yading@10 224 } else {
yading@10 225 s->mb_intra = 1;
yading@10 226 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
yading@10 227 if (code < 0)
yading@10 228 return -1;
yading@10 229 /* predict coded block pattern */
yading@10 230 cbp = 0;
yading@10 231 for(i=0;i<6;i++) {
yading@10 232 int val = ((code >> (5 - i)) & 1);
yading@10 233 if (i < 4) {
yading@10 234 int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
yading@10 235 val = val ^ pred;
yading@10 236 *coded_val = val;
yading@10 237 }
yading@10 238 cbp |= val << (5 - i);
yading@10 239 }
yading@10 240 }
yading@10 241
yading@10 242 if (!s->mb_intra) {
yading@10 243 int mx, my;
yading@10 244 if(s->per_mb_rl_table && cbp){
yading@10 245 s->rl_table_index = decode012(&s->gb);
yading@10 246 s->rl_chroma_table_index = s->rl_table_index;
yading@10 247 }
yading@10 248 ff_h263_pred_motion(s, 0, 0, &mx, &my);
yading@10 249 if (ff_msmpeg4_decode_motion(s, &mx, &my) < 0)
yading@10 250 return -1;
yading@10 251 s->mv_dir = MV_DIR_FORWARD;
yading@10 252 s->mv_type = MV_TYPE_16X16;
yading@10 253 s->mv[0][0][0] = mx;
yading@10 254 s->mv[0][0][1] = my;
yading@10 255 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
yading@10 256 } else {
yading@10 257 av_dlog(s, "I at %d %d %d %06X\n", s->mb_x, s->mb_y,
yading@10 258 ((cbp & 3) ? 1 : 0) +((cbp & 0x3C)? 2 : 0),
yading@10 259 show_bits(&s->gb, 24));
yading@10 260 s->ac_pred = get_bits1(&s->gb);
yading@10 261 *mb_type_ptr = MB_TYPE_INTRA;
yading@10 262 if(s->inter_intra_pred){
yading@10 263 s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
yading@10 264 av_dlog(s, "%d%d %d %d/",
yading@10 265 s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
yading@10 266 }
yading@10 267 if(s->per_mb_rl_table && cbp){
yading@10 268 s->rl_table_index = decode012(&s->gb);
yading@10 269 s->rl_chroma_table_index = s->rl_table_index;
yading@10 270 }
yading@10 271 }
yading@10 272
yading@10 273 s->dsp.clear_blocks(s->block[0]);
yading@10 274 for (i = 0; i < 6; i++) {
yading@10 275 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
yading@10 276 {
yading@10 277 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
yading@10 278 return -1;
yading@10 279 }
yading@10 280 }
yading@10 281
yading@10 282 return 0;
yading@10 283 }
yading@10 284
yading@10 285 /* init all vlc decoding tables */
yading@10 286 av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
yading@10 287 {
yading@10 288 MpegEncContext *s = avctx->priv_data;
yading@10 289 static volatile int done = 0;
yading@10 290 int i, ret;
yading@10 291 MVTable *mv;
yading@10 292
yading@10 293 if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
yading@10 294 return ret;
yading@10 295
yading@10 296 if (ff_h263_decode_init(avctx) < 0)
yading@10 297 return -1;
yading@10 298
yading@10 299 ff_msmpeg4_common_init(s);
yading@10 300
yading@10 301 if (!done) {
yading@10 302 for(i=0;i<NB_RL_TABLES;i++) {
yading@10 303 ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]);
yading@10 304 }
yading@10 305 INIT_VLC_RL(ff_rl_table[0], 642);
yading@10 306 INIT_VLC_RL(ff_rl_table[1], 1104);
yading@10 307 INIT_VLC_RL(ff_rl_table[2], 554);
yading@10 308 INIT_VLC_RL(ff_rl_table[3], 940);
yading@10 309 INIT_VLC_RL(ff_rl_table[4], 962);
yading@10 310 INIT_VLC_RL(ff_rl_table[5], 554);
yading@10 311
yading@10 312 mv = &ff_mv_tables[0];
yading@10 313 INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
yading@10 314 mv->table_mv_bits, 1, 1,
yading@10 315 mv->table_mv_code, 2, 2, 3714);
yading@10 316 mv = &ff_mv_tables[1];
yading@10 317 INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
yading@10 318 mv->table_mv_bits, 1, 1,
yading@10 319 mv->table_mv_code, 2, 2, 2694);
yading@10 320
yading@10 321 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
yading@10 322 &ff_table0_dc_lum[0][1], 8, 4,
yading@10 323 &ff_table0_dc_lum[0][0], 8, 4, 1158);
yading@10 324 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
yading@10 325 &ff_table0_dc_chroma[0][1], 8, 4,
yading@10 326 &ff_table0_dc_chroma[0][0], 8, 4, 1118);
yading@10 327 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
yading@10 328 &ff_table1_dc_lum[0][1], 8, 4,
yading@10 329 &ff_table1_dc_lum[0][0], 8, 4, 1476);
yading@10 330 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
yading@10 331 &ff_table1_dc_chroma[0][1], 8, 4,
yading@10 332 &ff_table1_dc_chroma[0][0], 8, 4, 1216);
yading@10 333
yading@10 334 INIT_VLC_STATIC(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
yading@10 335 &ff_v2_dc_lum_table[0][1], 8, 4,
yading@10 336 &ff_v2_dc_lum_table[0][0], 8, 4, 1472);
yading@10 337 INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
yading@10 338 &ff_v2_dc_chroma_table[0][1], 8, 4,
yading@10 339 &ff_v2_dc_chroma_table[0][0], 8, 4, 1506);
yading@10 340
yading@10 341 INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
yading@10 342 &ff_v2_intra_cbpc[0][1], 2, 1,
yading@10 343 &ff_v2_intra_cbpc[0][0], 2, 1, 8);
yading@10 344 INIT_VLC_STATIC(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
yading@10 345 &ff_v2_mb_type[0][1], 2, 1,
yading@10 346 &ff_v2_mb_type[0][0], 2, 1, 128);
yading@10 347 INIT_VLC_STATIC(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
yading@10 348 &ff_mvtab[0][1], 2, 1,
yading@10 349 &ff_mvtab[0][0], 2, 1, 538);
yading@10 350
yading@10 351 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[0], MB_NON_INTRA_VLC_BITS, 128,
yading@10 352 &ff_wmv2_inter_table[0][0][1], 8, 4,
yading@10 353 &ff_wmv2_inter_table[0][0][0], 8, 4, 1636);
yading@10 354 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[1], MB_NON_INTRA_VLC_BITS, 128,
yading@10 355 &ff_wmv2_inter_table[1][0][1], 8, 4,
yading@10 356 &ff_wmv2_inter_table[1][0][0], 8, 4, 2648);
yading@10 357 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[2], MB_NON_INTRA_VLC_BITS, 128,
yading@10 358 &ff_wmv2_inter_table[2][0][1], 8, 4,
yading@10 359 &ff_wmv2_inter_table[2][0][0], 8, 4, 1532);
yading@10 360 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[3], MB_NON_INTRA_VLC_BITS, 128,
yading@10 361 &ff_wmv2_inter_table[3][0][1], 8, 4,
yading@10 362 &ff_wmv2_inter_table[3][0][0], 8, 4, 2488);
yading@10 363
yading@10 364 INIT_VLC_STATIC(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
yading@10 365 &ff_msmp4_mb_i_table[0][1], 4, 2,
yading@10 366 &ff_msmp4_mb_i_table[0][0], 4, 2, 536);
yading@10 367
yading@10 368 INIT_VLC_STATIC(&ff_inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
yading@10 369 &ff_table_inter_intra[0][1], 2, 1,
yading@10 370 &ff_table_inter_intra[0][0], 2, 1, 8);
yading@10 371 done = 1;
yading@10 372 }
yading@10 373
yading@10 374 switch(s->msmpeg4_version){
yading@10 375 case 1:
yading@10 376 case 2:
yading@10 377 s->decode_mb= msmpeg4v12_decode_mb;
yading@10 378 break;
yading@10 379 case 3:
yading@10 380 case 4:
yading@10 381 s->decode_mb= msmpeg4v34_decode_mb;
yading@10 382 break;
yading@10 383 case 5:
yading@10 384 if (CONFIG_WMV2_DECODER)
yading@10 385 s->decode_mb= ff_wmv2_decode_mb;
yading@10 386 case 6:
yading@10 387 //FIXME + TODO VC1 decode mb
yading@10 388 break;
yading@10 389 }
yading@10 390
yading@10 391 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
yading@10 392
yading@10 393 return 0;
yading@10 394 }
yading@10 395
yading@10 396 int ff_msmpeg4_decode_picture_header(MpegEncContext * s)
yading@10 397 {
yading@10 398 int code;
yading@10 399
yading@10 400 if(s->msmpeg4_version==1){
yading@10 401 int start_code = get_bits_long(&s->gb, 32);
yading@10 402 if(start_code!=0x00000100){
yading@10 403 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
yading@10 404 return -1;
yading@10 405 }
yading@10 406
yading@10 407 skip_bits(&s->gb, 5); // frame number */
yading@10 408 }
yading@10 409
yading@10 410 s->pict_type = get_bits(&s->gb, 2) + 1;
yading@10 411 if (s->pict_type != AV_PICTURE_TYPE_I &&
yading@10 412 s->pict_type != AV_PICTURE_TYPE_P){
yading@10 413 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
yading@10 414 return -1;
yading@10 415 }
yading@10 416 #if 0
yading@10 417 {
yading@10 418 static int had_i=0;
yading@10 419 if(s->pict_type == AV_PICTURE_TYPE_I) had_i=1;
yading@10 420 if(!had_i) return -1;
yading@10 421 }
yading@10 422 #endif
yading@10 423 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
yading@10 424 if(s->qscale==0){
yading@10 425 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
yading@10 426 return -1;
yading@10 427 }
yading@10 428
yading@10 429 if (s->pict_type == AV_PICTURE_TYPE_I) {
yading@10 430 code = get_bits(&s->gb, 5);
yading@10 431 if(s->msmpeg4_version==1){
yading@10 432 if(code==0 || code>s->mb_height){
yading@10 433 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
yading@10 434 return -1;
yading@10 435 }
yading@10 436
yading@10 437 s->slice_height = code;
yading@10 438 }else{
yading@10 439 /* 0x17: one slice, 0x18: two slices, ... */
yading@10 440 if (code < 0x17){
yading@10 441 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
yading@10 442 return -1;
yading@10 443 }
yading@10 444
yading@10 445 s->slice_height = s->mb_height / (code - 0x16);
yading@10 446 }
yading@10 447
yading@10 448 switch(s->msmpeg4_version){
yading@10 449 case 1:
yading@10 450 case 2:
yading@10 451 s->rl_chroma_table_index = 2;
yading@10 452 s->rl_table_index = 2;
yading@10 453
yading@10 454 s->dc_table_index = 0; //not used
yading@10 455 break;
yading@10 456 case 3:
yading@10 457 s->rl_chroma_table_index = decode012(&s->gb);
yading@10 458 s->rl_table_index = decode012(&s->gb);
yading@10 459
yading@10 460 s->dc_table_index = get_bits1(&s->gb);
yading@10 461 break;
yading@10 462 case 4:
yading@10 463 ff_msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
yading@10 464
yading@10 465 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
yading@10 466 else s->per_mb_rl_table= 0;
yading@10 467
yading@10 468 if(!s->per_mb_rl_table){
yading@10 469 s->rl_chroma_table_index = decode012(&s->gb);
yading@10 470 s->rl_table_index = decode012(&s->gb);
yading@10 471 }
yading@10 472
yading@10 473 s->dc_table_index = get_bits1(&s->gb);
yading@10 474 s->inter_intra_pred= 0;
yading@10 475 break;
yading@10 476 }
yading@10 477 s->no_rounding = 1;
yading@10 478 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
yading@10 479 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
yading@10 480 s->qscale,
yading@10 481 s->rl_chroma_table_index,
yading@10 482 s->rl_table_index,
yading@10 483 s->dc_table_index,
yading@10 484 s->per_mb_rl_table,
yading@10 485 s->slice_height);
yading@10 486 } else {
yading@10 487 switch(s->msmpeg4_version){
yading@10 488 case 1:
yading@10 489 case 2:
yading@10 490 if(s->msmpeg4_version==1)
yading@10 491 s->use_skip_mb_code = 1;
yading@10 492 else
yading@10 493 s->use_skip_mb_code = get_bits1(&s->gb);
yading@10 494 s->rl_table_index = 2;
yading@10 495 s->rl_chroma_table_index = s->rl_table_index;
yading@10 496 s->dc_table_index = 0; //not used
yading@10 497 s->mv_table_index = 0;
yading@10 498 break;
yading@10 499 case 3:
yading@10 500 s->use_skip_mb_code = get_bits1(&s->gb);
yading@10 501 s->rl_table_index = decode012(&s->gb);
yading@10 502 s->rl_chroma_table_index = s->rl_table_index;
yading@10 503
yading@10 504 s->dc_table_index = get_bits1(&s->gb);
yading@10 505
yading@10 506 s->mv_table_index = get_bits1(&s->gb);
yading@10 507 break;
yading@10 508 case 4:
yading@10 509 s->use_skip_mb_code = get_bits1(&s->gb);
yading@10 510
yading@10 511 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
yading@10 512 else s->per_mb_rl_table= 0;
yading@10 513
yading@10 514 if(!s->per_mb_rl_table){
yading@10 515 s->rl_table_index = decode012(&s->gb);
yading@10 516 s->rl_chroma_table_index = s->rl_table_index;
yading@10 517 }
yading@10 518
yading@10 519 s->dc_table_index = get_bits1(&s->gb);
yading@10 520
yading@10 521 s->mv_table_index = get_bits1(&s->gb);
yading@10 522 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
yading@10 523 break;
yading@10 524 }
yading@10 525
yading@10 526 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
yading@10 527 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
yading@10 528 s->use_skip_mb_code,
yading@10 529 s->rl_table_index,
yading@10 530 s->rl_chroma_table_index,
yading@10 531 s->dc_table_index,
yading@10 532 s->mv_table_index,
yading@10 533 s->per_mb_rl_table,
yading@10 534 s->qscale);
yading@10 535
yading@10 536 if(s->flipflop_rounding){
yading@10 537 s->no_rounding ^= 1;
yading@10 538 }else{
yading@10 539 s->no_rounding = 0;
yading@10 540 }
yading@10 541 }
yading@10 542 av_dlog(s->avctx, "%d %d %d %d %d\n", s->pict_type, s->bit_rate,
yading@10 543 s->inter_intra_pred, s->width, s->height);
yading@10 544
yading@10 545 s->esc3_level_length= 0;
yading@10 546 s->esc3_run_length= 0;
yading@10 547
yading@10 548 return 0;
yading@10 549 }
yading@10 550
yading@10 551 int ff_msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
yading@10 552 {
yading@10 553 int left= buf_size*8 - get_bits_count(&s->gb);
yading@10 554 int length= s->msmpeg4_version>=3 ? 17 : 16;
yading@10 555 /* the alt_bitstream reader could read over the end so we need to check it */
yading@10 556 if(left>=length && left<length+8)
yading@10 557 {
yading@10 558 skip_bits(&s->gb, 5); /* fps */
yading@10 559 s->bit_rate= get_bits(&s->gb, 11)*1024;
yading@10 560 if(s->msmpeg4_version>=3)
yading@10 561 s->flipflop_rounding= get_bits1(&s->gb);
yading@10 562 else
yading@10 563 s->flipflop_rounding= 0;
yading@10 564 }
yading@10 565 else if(left<length+8)
yading@10 566 {
yading@10 567 s->flipflop_rounding= 0;
yading@10 568 if(s->msmpeg4_version != 2)
yading@10 569 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
yading@10 570 }
yading@10 571 else
yading@10 572 {
yading@10 573 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
yading@10 574 }
yading@10 575
yading@10 576 return 0;
yading@10 577 }
yading@10 578
yading@10 579 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
yading@10 580 {
yading@10 581 int level, pred;
yading@10 582
yading@10 583 if(s->msmpeg4_version<=2){
yading@10 584 if (n < 4) {
yading@10 585 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
yading@10 586 } else {
yading@10 587 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
yading@10 588 }
yading@10 589 if (level < 0)
yading@10 590 return -1;
yading@10 591 level-=256;
yading@10 592 }else{ //FIXME optimize use unified tables & index
yading@10 593 if (n < 4) {
yading@10 594 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
yading@10 595 } else {
yading@10 596 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
yading@10 597 }
yading@10 598 if (level < 0){
yading@10 599 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
yading@10 600 return -1;
yading@10 601 }
yading@10 602
yading@10 603 if (level == DC_MAX) {
yading@10 604 level = get_bits(&s->gb, 8);
yading@10 605 if (get_bits1(&s->gb))
yading@10 606 level = -level;
yading@10 607 } else if (level != 0) {
yading@10 608 if (get_bits1(&s->gb))
yading@10 609 level = -level;
yading@10 610 }
yading@10 611 }
yading@10 612
yading@10 613 if(s->msmpeg4_version==1){
yading@10 614 int32_t *dc_val;
yading@10 615 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
yading@10 616 level += pred;
yading@10 617
yading@10 618 /* update predictor */
yading@10 619 *dc_val= level;
yading@10 620 }else{
yading@10 621 int16_t *dc_val;
yading@10 622 pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
yading@10 623 level += pred;
yading@10 624
yading@10 625 /* update predictor */
yading@10 626 if (n < 4) {
yading@10 627 *dc_val = level * s->y_dc_scale;
yading@10 628 } else {
yading@10 629 *dc_val = level * s->c_dc_scale;
yading@10 630 }
yading@10 631 }
yading@10 632
yading@10 633 return level;
yading@10 634 }
yading@10 635
yading@10 636 //#define ERROR_DETAILS
yading@10 637 int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block,
yading@10 638 int n, int coded, const uint8_t *scan_table)
yading@10 639 {
yading@10 640 int level, i, last, run, run_diff;
yading@10 641 int av_uninit(dc_pred_dir);
yading@10 642 RLTable *rl;
yading@10 643 RL_VLC_ELEM *rl_vlc;
yading@10 644 int qmul, qadd;
yading@10 645
yading@10 646 if (s->mb_intra) {
yading@10 647 qmul=1;
yading@10 648 qadd=0;
yading@10 649
yading@10 650 /* DC coef */
yading@10 651 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
yading@10 652
yading@10 653 if (level < 0){
yading@10 654 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
yading@10 655 if(s->inter_intra_pred) level=0;
yading@10 656 }
yading@10 657 if (n < 4) {
yading@10 658 rl = &ff_rl_table[s->rl_table_index];
yading@10 659 if(level > 256*s->y_dc_scale){
yading@10 660 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
yading@10 661 if(!s->inter_intra_pred) return -1;
yading@10 662 }
yading@10 663 } else {
yading@10 664 rl = &ff_rl_table[3 + s->rl_chroma_table_index];
yading@10 665 if(level > 256*s->c_dc_scale){
yading@10 666 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
yading@10 667 if(!s->inter_intra_pred) return -1;
yading@10 668 }
yading@10 669 }
yading@10 670 block[0] = level;
yading@10 671
yading@10 672 run_diff = s->msmpeg4_version >= 4;
yading@10 673 i = 0;
yading@10 674 if (!coded) {
yading@10 675 goto not_coded;
yading@10 676 }
yading@10 677 if (s->ac_pred) {
yading@10 678 if (dc_pred_dir == 0)
yading@10 679 scan_table = s->intra_v_scantable.permutated; /* left */
yading@10 680 else
yading@10 681 scan_table = s->intra_h_scantable.permutated; /* top */
yading@10 682 } else {
yading@10 683 scan_table = s->intra_scantable.permutated;
yading@10 684 }
yading@10 685 rl_vlc= rl->rl_vlc[0];
yading@10 686 } else {
yading@10 687 qmul = s->qscale << 1;
yading@10 688 qadd = (s->qscale - 1) | 1;
yading@10 689 i = -1;
yading@10 690 rl = &ff_rl_table[3 + s->rl_table_index];
yading@10 691
yading@10 692 if(s->msmpeg4_version==2)
yading@10 693 run_diff = 0;
yading@10 694 else
yading@10 695 run_diff = 1;
yading@10 696
yading@10 697 if (!coded) {
yading@10 698 s->block_last_index[n] = i;
yading@10 699 return 0;
yading@10 700 }
yading@10 701 if(!scan_table)
yading@10 702 scan_table = s->inter_scantable.permutated;
yading@10 703 rl_vlc= rl->rl_vlc[s->qscale];
yading@10 704 }
yading@10 705 {
yading@10 706 OPEN_READER(re, &s->gb);
yading@10 707 for(;;) {
yading@10 708 UPDATE_CACHE(re, &s->gb);
yading@10 709 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
yading@10 710 if (level==0) {
yading@10 711 int cache;
yading@10 712 cache= GET_CACHE(re, &s->gb);
yading@10 713 /* escape */
yading@10 714 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
yading@10 715 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
yading@10 716 /* third escape */
yading@10 717 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
yading@10 718 UPDATE_CACHE(re, &s->gb);
yading@10 719 if(s->msmpeg4_version<=3){
yading@10 720 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
yading@10 721 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
yading@10 722 level= SHOW_SBITS(re, &s->gb, 8);
yading@10 723 SKIP_COUNTER(re, &s->gb, 1+6+8);
yading@10 724 }else{
yading@10 725 int sign;
yading@10 726 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
yading@10 727 if(!s->esc3_level_length){
yading@10 728 int ll;
yading@10 729 av_dlog(s->avctx, "ESC-3 %X at %d %d\n",
yading@10 730 show_bits(&s->gb, 24), s->mb_x, s->mb_y);
yading@10 731 if(s->qscale<8){
yading@10 732 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
yading@10 733 if(ll==0){
yading@10 734 ll= 8+SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
yading@10 735 }
yading@10 736 }else{
yading@10 737 ll=2;
yading@10 738 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
yading@10 739 ll++;
yading@10 740 SKIP_BITS(re, &s->gb, 1);
yading@10 741 }
yading@10 742 if(ll<8) SKIP_BITS(re, &s->gb, 1);
yading@10 743 }
yading@10 744
yading@10 745 s->esc3_level_length= ll;
yading@10 746 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
yading@10 747 UPDATE_CACHE(re, &s->gb);
yading@10 748 }
yading@10 749 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
yading@10 750 SKIP_BITS(re, &s->gb, s->esc3_run_length);
yading@10 751
yading@10 752 sign= SHOW_UBITS(re, &s->gb, 1);
yading@10 753 SKIP_BITS(re, &s->gb, 1);
yading@10 754
yading@10 755 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
yading@10 756 SKIP_BITS(re, &s->gb, s->esc3_level_length);
yading@10 757 if(sign) level= -level;
yading@10 758 }
yading@10 759
yading@10 760 #if 0 // waste of time / this will detect very few errors
yading@10 761 {
yading@10 762 const int abs_level= FFABS(level);
yading@10 763 const int run1= run - rl->max_run[last][abs_level] - run_diff;
yading@10 764 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
yading@10 765 if(abs_level <= rl->max_level[last][run]){
yading@10 766 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
yading@10 767 return DECODING_AC_LOST;
yading@10 768 }
yading@10 769 if(abs_level <= rl->max_level[last][run]*2){
yading@10 770 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
yading@10 771 return DECODING_AC_LOST;
yading@10 772 }
yading@10 773 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
yading@10 774 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
yading@10 775 return DECODING_AC_LOST;
yading@10 776 }
yading@10 777 }
yading@10 778 }
yading@10 779 #endif
yading@10 780 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
yading@10 781 if (level>0) level= level * qmul + qadd;
yading@10 782 else level= level * qmul - qadd;
yading@10 783 #if 0 // waste of time too :(
yading@10 784 if(level>2048 || level<-2048){
yading@10 785 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
yading@10 786 return DECODING_AC_LOST;
yading@10 787 }
yading@10 788 #endif
yading@10 789 i+= run + 1;
yading@10 790 if(last) i+=192;
yading@10 791 #ifdef ERROR_DETAILS
yading@10 792 if(run==66)
yading@10 793 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
yading@10 794 else if((i>62 && i<192) || i>192+63)
yading@10 795 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
yading@10 796 #endif
yading@10 797 } else {
yading@10 798 /* second escape */
yading@10 799 SKIP_BITS(re, &s->gb, 2);
yading@10 800 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
yading@10 801 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
yading@10 802 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 803 LAST_SKIP_BITS(re, &s->gb, 1);
yading@10 804 #ifdef ERROR_DETAILS
yading@10 805 if(run==66)
yading@10 806 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
yading@10 807 else if((i>62 && i<192) || i>192+63)
yading@10 808 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
yading@10 809 #endif
yading@10 810 }
yading@10 811 } else {
yading@10 812 /* first escape */
yading@10 813 SKIP_BITS(re, &s->gb, 1);
yading@10 814 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
yading@10 815 i+= run;
yading@10 816 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
yading@10 817 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 818 LAST_SKIP_BITS(re, &s->gb, 1);
yading@10 819 #ifdef ERROR_DETAILS
yading@10 820 if(run==66)
yading@10 821 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
yading@10 822 else if((i>62 && i<192) || i>192+63)
yading@10 823 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
yading@10 824 #endif
yading@10 825 }
yading@10 826 } else {
yading@10 827 i+= run;
yading@10 828 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
yading@10 829 LAST_SKIP_BITS(re, &s->gb, 1);
yading@10 830 #ifdef ERROR_DETAILS
yading@10 831 if(run==66)
yading@10 832 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
yading@10 833 else if((i>62 && i<192) || i>192+63)
yading@10 834 av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level);
yading@10 835 #endif
yading@10 836 }
yading@10 837 if (i > 62){
yading@10 838 i-= 192;
yading@10 839 if(i&(~63)){
yading@10 840 const int left= get_bits_left(&s->gb);
yading@10 841 if(((i+192 == 64 && level/qmul==-1) || !(s->err_recognition&(AV_EF_BITSTREAM|AV_EF_COMPLIANT))) && left>=0){
yading@10 842 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
yading@10 843 i = 63;
yading@10 844 break;
yading@10 845 }else{
yading@10 846 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
yading@10 847 return -1;
yading@10 848 }
yading@10 849 }
yading@10 850
yading@10 851 block[scan_table[i]] = level;
yading@10 852 break;
yading@10 853 }
yading@10 854
yading@10 855 block[scan_table[i]] = level;
yading@10 856 }
yading@10 857 CLOSE_READER(re, &s->gb);
yading@10 858 }
yading@10 859 not_coded:
yading@10 860 if (s->mb_intra) {
yading@10 861 ff_mpeg4_pred_ac(s, block, n, dc_pred_dir);
yading@10 862 if (s->ac_pred) {
yading@10 863 i = 63; /* XXX: not optimal */
yading@10 864 }
yading@10 865 }
yading@10 866 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
yading@10 867 s->block_last_index[n] = i;
yading@10 868
yading@10 869 return 0;
yading@10 870 }
yading@10 871
yading@10 872 int ff_msmpeg4_decode_motion(MpegEncContext * s,
yading@10 873 int *mx_ptr, int *my_ptr)
yading@10 874 {
yading@10 875 MVTable *mv;
yading@10 876 int code, mx, my;
yading@10 877
yading@10 878 mv = &ff_mv_tables[s->mv_table_index];
yading@10 879
yading@10 880 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
yading@10 881 if (code < 0){
yading@10 882 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
yading@10 883 return -1;
yading@10 884 }
yading@10 885 if (code == mv->n) {
yading@10 886 mx = get_bits(&s->gb, 6);
yading@10 887 my = get_bits(&s->gb, 6);
yading@10 888 } else {
yading@10 889 mx = mv->table_mvx[code];
yading@10 890 my = mv->table_mvy[code];
yading@10 891 }
yading@10 892
yading@10 893 mx += *mx_ptr - 32;
yading@10 894 my += *my_ptr - 32;
yading@10 895 /* WARNING : they do not do exactly modulo encoding */
yading@10 896 if (mx <= -64)
yading@10 897 mx += 64;
yading@10 898 else if (mx >= 64)
yading@10 899 mx -= 64;
yading@10 900
yading@10 901 if (my <= -64)
yading@10 902 my += 64;
yading@10 903 else if (my >= 64)
yading@10 904 my -= 64;
yading@10 905 *mx_ptr = mx;
yading@10 906 *my_ptr = my;
yading@10 907 return 0;
yading@10 908 }
yading@10 909
yading@10 910 AVCodec ff_msmpeg4v1_decoder = {
yading@10 911 .name = "msmpeg4v1",
yading@10 912 .type = AVMEDIA_TYPE_VIDEO,
yading@10 913 .id = AV_CODEC_ID_MSMPEG4V1,
yading@10 914 .priv_data_size = sizeof(MpegEncContext),
yading@10 915 .init = ff_msmpeg4_decode_init,
yading@10 916 .close = ff_h263_decode_end,
yading@10 917 .decode = ff_h263_decode_frame,
yading@10 918 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
yading@10 919 .max_lowres = 3,
yading@10 920 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
yading@10 921 .pix_fmts = ff_pixfmt_list_420,
yading@10 922 };
yading@10 923
yading@10 924 AVCodec ff_msmpeg4v2_decoder = {
yading@10 925 .name = "msmpeg4v2",
yading@10 926 .type = AVMEDIA_TYPE_VIDEO,
yading@10 927 .id = AV_CODEC_ID_MSMPEG4V2,
yading@10 928 .priv_data_size = sizeof(MpegEncContext),
yading@10 929 .init = ff_msmpeg4_decode_init,
yading@10 930 .close = ff_h263_decode_end,
yading@10 931 .decode = ff_h263_decode_frame,
yading@10 932 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
yading@10 933 .max_lowres = 3,
yading@10 934 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
yading@10 935 .pix_fmts = ff_pixfmt_list_420,
yading@10 936 };
yading@10 937
yading@10 938 AVCodec ff_msmpeg4v3_decoder = {
yading@10 939 .name = "msmpeg4",
yading@10 940 .type = AVMEDIA_TYPE_VIDEO,
yading@10 941 .id = AV_CODEC_ID_MSMPEG4V3,
yading@10 942 .priv_data_size = sizeof(MpegEncContext),
yading@10 943 .init = ff_msmpeg4_decode_init,
yading@10 944 .close = ff_h263_decode_end,
yading@10 945 .decode = ff_h263_decode_frame,
yading@10 946 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
yading@10 947 .max_lowres = 3,
yading@10 948 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
yading@10 949 .pix_fmts = ff_pixfmt_list_420,
yading@10 950 };
yading@10 951
yading@10 952 AVCodec ff_wmv1_decoder = {
yading@10 953 .name = "wmv1",
yading@10 954 .type = AVMEDIA_TYPE_VIDEO,
yading@10 955 .id = AV_CODEC_ID_WMV1,
yading@10 956 .priv_data_size = sizeof(MpegEncContext),
yading@10 957 .init = ff_msmpeg4_decode_init,
yading@10 958 .close = ff_h263_decode_end,
yading@10 959 .decode = ff_h263_decode_frame,
yading@10 960 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
yading@10 961 .max_lowres = 3,
yading@10 962 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
yading@10 963 .pix_fmts = ff_pixfmt_list_420,
yading@10 964 };