~diresu/blender/blender-command-port

« back to all changes in this revision

Viewing changes to extern/ffmpeg/libavcodec/msmpeg4.c

  • Committer: theeth
  • Date: 2008-10-14 16:52:04 UTC
  • Revision ID: vcs-imports@canonical.com-20081014165204-r32w2gm6s0osvdhn
copy back trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * MSMPEG4 backend for ffmpeg encoder and decoder
 
3
 * Copyright (c) 2001 Fabrice Bellard.
 
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
 
5
 *
 
6
 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
 
7
 *
 
8
 * This file is part of FFmpeg.
 
9
 *
 
10
 * FFmpeg is free software; you can redistribute it and/or
 
11
 * modify it under the terms of the GNU Lesser General Public
 
12
 * License as published by the Free Software Foundation; either
 
13
 * version 2.1 of the License, or (at your option) any later version.
 
14
 *
 
15
 * FFmpeg is distributed in the hope that it will be useful,
 
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
18
 * Lesser General Public License for more details.
 
19
 *
 
20
 * You should have received a copy of the GNU Lesser General Public
 
21
 * License along with FFmpeg; if not, write to the Free Software
 
22
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
23
 */
 
24
 
 
25
/**
 
26
 * @file msmpeg4.c
 
27
 * MSMPEG4 backend for ffmpeg encoder and decoder.
 
28
 */
 
29
 
 
30
#include "avcodec.h"
 
31
#include "dsputil.h"
 
32
#include "mpegvideo.h"
 
33
 
 
34
/*
 
35
 * You can also call this codec : MPEG4 with a twist !
 
36
 *
 
37
 * TODO:
 
38
 *        - (encoding) select best mv table (two choices)
 
39
 *        - (encoding) select best vlc/dc table
 
40
 */
 
41
//#define DEBUG
 
42
 
 
43
#define DC_VLC_BITS 9
 
44
#define CBPY_VLC_BITS 6
 
45
#define INTER_INTRA_VLC_BITS 3
 
46
#define V1_INTRA_CBPC_VLC_BITS 6
 
47
#define V1_INTER_CBPC_VLC_BITS 6
 
48
#define V2_INTRA_CBPC_VLC_BITS 3
 
49
#define V2_MB_TYPE_VLC_BITS 7
 
50
#define MV_VLC_BITS 9
 
51
#define V2_MV_VLC_BITS 9
 
52
#define TEX_VLC_BITS 9
 
53
#define MB_NON_INTRA_VLC_BITS 9
 
54
#define MB_INTRA_VLC_BITS 9
 
55
 
 
56
#define II_BITRATE 128*1024
 
57
#define MBAC_BITRATE 50*1024
 
58
 
 
59
#define DEFAULT_INTER_INDEX 3
 
60
 
 
61
static uint32_t v2_dc_lum_table[512][2];
 
62
static uint32_t v2_dc_chroma_table[512][2];
 
63
 
 
64
void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
 
65
static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
 
66
                                       int n, int coded, const uint8_t *scantable);
 
67
static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
 
68
static int msmpeg4_decode_motion(MpegEncContext * s,
 
69
                                 int *mx_ptr, int *my_ptr);
 
70
static void init_h263_dc_for_msmpeg4(void);
 
71
static inline void msmpeg4_memsetw(short *tab, int val, int n);
 
72
#ifdef CONFIG_ENCODERS
 
73
static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
 
74
static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
 
75
#endif //CONFIG_ENCODERS
 
76
static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
 
77
static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
 
78
static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
 
79
 
 
80
/* vc1 externs */
 
81
extern uint8_t wmv3_dc_scale_table[32];
 
82
 
 
83
#ifdef DEBUG
 
84
int intra_count = 0;
 
85
int frame_count = 0;
 
86
#endif
 
87
 
 
88
#include "msmpeg4data.h"
 
89
 
 
90
#ifdef CONFIG_ENCODERS //strangely gcc includes this even if it is not references
 
91
static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
 
92
#endif //CONFIG_ENCODERS
 
93
 
 
94
static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 3];
 
95
 
 
96
static void common_init(MpegEncContext * s)
 
97
{
 
98
    static int inited=0;
 
99
 
 
100
    switch(s->msmpeg4_version){
 
101
    case 1:
 
102
    case 2:
 
103
        s->y_dc_scale_table=
 
104
        s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
 
105
        break;
 
106
    case 3:
 
107
        if(s->workaround_bugs){
 
108
            s->y_dc_scale_table= old_ff_y_dc_scale_table;
 
109
            s->c_dc_scale_table= old_ff_c_dc_scale_table;
 
110
        } else{
 
111
            s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
 
112
            s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
 
113
        }
 
114
        break;
 
115
    case 4:
 
116
    case 5:
 
117
        s->y_dc_scale_table= wmv1_y_dc_scale_table;
 
118
        s->c_dc_scale_table= wmv1_c_dc_scale_table;
 
119
        break;
 
120
#if defined(CONFIG_WMV3_DECODER)||defined(CONFIG_VC1_DECODER)
 
121
    case 6:
 
122
        s->y_dc_scale_table= wmv3_dc_scale_table;
 
123
        s->c_dc_scale_table= wmv3_dc_scale_table;
 
124
        break;
 
125
#endif
 
126
 
 
127
    }
 
128
 
 
129
 
 
130
    if(s->msmpeg4_version>=4){
 
131
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable  , wmv1_scantable[1]);
 
132
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
 
133
        ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
 
134
        ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable  , wmv1_scantable[0]);
 
135
    }
 
136
    //Note the default tables are set in common_init in mpegvideo.c
 
137
 
 
138
    if(!inited){
 
139
        inited=1;
 
140
 
 
141
        init_h263_dc_for_msmpeg4();
 
142
    }
 
143
}
 
144
 
 
145
#ifdef CONFIG_ENCODERS
 
146
 
 
147
/* build the table which associate a (x,y) motion vector to a vlc */
 
148
static void init_mv_table(MVTable *tab)
 
149
{
 
150
    int i, x, y;
 
151
 
 
152
    tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
 
153
    /* mark all entries as not used */
 
154
    for(i=0;i<4096;i++)
 
155
        tab->table_mv_index[i] = tab->n;
 
156
 
 
157
    for(i=0;i<tab->n;i++) {
 
158
        x = tab->table_mvx[i];
 
159
        y = tab->table_mvy[i];
 
160
        tab->table_mv_index[(x << 6) | y] = i;
 
161
    }
 
162
}
 
163
 
 
164
void ff_code012(PutBitContext *pb, int n)
 
165
{
 
166
    if (n == 0) {
 
167
        put_bits(pb, 1, 0);
 
168
    } else {
 
169
        put_bits(pb, 1, 1);
 
170
        put_bits(pb, 1, (n >= 2));
 
171
    }
 
172
}
 
173
 
 
174
void ff_msmpeg4_encode_init(MpegEncContext *s)
 
175
{
 
176
    static int init_done=0;
 
177
    int i;
 
178
 
 
179
    common_init(s);
 
180
    if(s->msmpeg4_version>=4){
 
181
        s->min_qcoeff= -255;
 
182
        s->max_qcoeff=  255;
 
183
    }
 
184
 
 
185
    if (!init_done) {
 
186
        /* init various encoding tables */
 
187
        init_done = 1;
 
188
        init_mv_table(&mv_tables[0]);
 
189
        init_mv_table(&mv_tables[1]);
 
190
        for(i=0;i<NB_RL_TABLES;i++)
 
191
            init_rl(&rl_table[i], static_rl_table_store[i]);
 
192
 
 
193
        for(i=0; i<NB_RL_TABLES; i++){
 
194
            int level;
 
195
            for(level=0; level<=MAX_LEVEL; level++){
 
196
                int run;
 
197
                for(run=0; run<=MAX_RUN; run++){
 
198
                    int last;
 
199
                    for(last=0; last<2; last++){
 
200
                        rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[  i], last, run, level, 0);
 
201
                    }
 
202
                }
 
203
            }
 
204
        }
 
205
    }
 
206
}
 
207
 
 
208
static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
 
209
    int size=0;
 
210
    int code;
 
211
    int run_diff= intra ? 0 : 1;
 
212
 
 
213
    code = get_rl_index(rl, last, run, level);
 
214
    size+= rl->table_vlc[code][1];
 
215
    if (code == rl->n) {
 
216
        int level1, run1;
 
217
 
 
218
        level1 = level - rl->max_level[last][run];
 
219
        if (level1 < 1)
 
220
            goto esc2;
 
221
        code = get_rl_index(rl, last, run, level1);
 
222
        if (code == rl->n) {
 
223
            esc2:
 
224
            size++;
 
225
            if (level > MAX_LEVEL)
 
226
                goto esc3;
 
227
            run1 = run - rl->max_run[last][level] - run_diff;
 
228
            if (run1 < 0)
 
229
                goto esc3;
 
230
            code = get_rl_index(rl, last, run1, level);
 
231
            if (code == rl->n) {
 
232
            esc3:
 
233
                /* third escape */
 
234
                size+=1+1+6+8;
 
235
            } else {
 
236
                /* second escape */
 
237
                size+= 1+1+ rl->table_vlc[code][1];
 
238
            }
 
239
        } else {
 
240
            /* first escape */
 
241
            size+= 1+1+ rl->table_vlc[code][1];
 
242
        }
 
243
    } else {
 
244
        size++;
 
245
    }
 
246
    return size;
 
247
}
 
248
 
 
249
void ff_find_best_tables(MpegEncContext * s)
 
250
{
 
251
    int i;
 
252
    int best       =-1, best_size       =9999999;
 
253
    int chroma_best=-1, best_chroma_size=9999999;
 
254
 
 
255
    for(i=0; i<3; i++){
 
256
        int level;
 
257
        int chroma_size=0;
 
258
        int size=0;
 
259
 
 
260
        if(i>0){// ;)
 
261
            size++;
 
262
            chroma_size++;
 
263
        }
 
264
        for(level=0; level<=MAX_LEVEL; level++){
 
265
            int run;
 
266
            for(run=0; run<=MAX_RUN; run++){
 
267
                int last;
 
268
                const int last_size= size + chroma_size;
 
269
                for(last=0; last<2; last++){
 
270
                    int inter_count       = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
 
271
                    int intra_luma_count  = s->ac_stats[1][0][level][run][last];
 
272
                    int intra_chroma_count= s->ac_stats[1][1][level][run][last];
 
273
 
 
274
                    if(s->pict_type==I_TYPE){
 
275
                        size       += intra_luma_count  *rl_length[i  ][level][run][last];
 
276
                        chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
 
277
                    }else{
 
278
                        size+=        intra_luma_count  *rl_length[i  ][level][run][last]
 
279
                                     +intra_chroma_count*rl_length[i+3][level][run][last]
 
280
                                     +inter_count       *rl_length[i+3][level][run][last];
 
281
                    }
 
282
                }
 
283
                if(last_size == size+chroma_size) break;
 
284
            }
 
285
        }
 
286
        if(size<best_size){
 
287
            best_size= size;
 
288
            best= i;
 
289
        }
 
290
        if(chroma_size<best_chroma_size){
 
291
            best_chroma_size= chroma_size;
 
292
            chroma_best= i;
 
293
        }
 
294
    }
 
295
 
 
296
//    printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
 
297
//           s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
 
298
 
 
299
    if(s->pict_type==P_TYPE) chroma_best= best;
 
300
 
 
301
    memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
 
302
 
 
303
    s->rl_table_index       =        best;
 
304
    s->rl_chroma_table_index= chroma_best;
 
305
 
 
306
    if(s->pict_type != s->last_non_b_pict_type){
 
307
        s->rl_table_index= 2;
 
308
        if(s->pict_type==I_TYPE)
 
309
            s->rl_chroma_table_index= 1;
 
310
        else
 
311
            s->rl_chroma_table_index= 2;
 
312
    }
 
313
 
 
314
}
 
315
 
 
316
/* write MSMPEG4 compatible frame header */
 
317
void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
 
318
{
 
319
    ff_find_best_tables(s);
 
320
 
 
321
    align_put_bits(&s->pb);
 
322
    put_bits(&s->pb, 2, s->pict_type - 1);
 
323
 
 
324
    put_bits(&s->pb, 5, s->qscale);
 
325
    if(s->msmpeg4_version<=2){
 
326
        s->rl_table_index = 2;
 
327
        s->rl_chroma_table_index = 2;
 
328
    }
 
329
 
 
330
    s->dc_table_index = 1;
 
331
    s->mv_table_index = 1; /* only if P frame */
 
332
    s->use_skip_mb_code = 1; /* only if P frame */
 
333
    s->per_mb_rl_table = 0;
 
334
    if(s->msmpeg4_version==4)
 
335
        s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE);
 
336
//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
 
337
 
 
338
    if (s->pict_type == I_TYPE) {
 
339
        s->slice_height= s->mb_height/1;
 
340
        put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
 
341
 
 
342
        if(s->msmpeg4_version==4){
 
343
            msmpeg4_encode_ext_header(s);
 
344
            if(s->bit_rate>MBAC_BITRATE)
 
345
                put_bits(&s->pb, 1, s->per_mb_rl_table);
 
346
        }
 
347
 
 
348
        if(s->msmpeg4_version>2){
 
349
            if(!s->per_mb_rl_table){
 
350
                ff_code012(&s->pb, s->rl_chroma_table_index);
 
351
                ff_code012(&s->pb, s->rl_table_index);
 
352
            }
 
353
 
 
354
            put_bits(&s->pb, 1, s->dc_table_index);
 
355
        }
 
356
    } else {
 
357
        put_bits(&s->pb, 1, s->use_skip_mb_code);
 
358
 
 
359
        if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
 
360
            put_bits(&s->pb, 1, s->per_mb_rl_table);
 
361
 
 
362
        if(s->msmpeg4_version>2){
 
363
            if(!s->per_mb_rl_table)
 
364
                ff_code012(&s->pb, s->rl_table_index);
 
365
 
 
366
            put_bits(&s->pb, 1, s->dc_table_index);
 
367
 
 
368
            put_bits(&s->pb, 1, s->mv_table_index);
 
369
        }
 
370
    }
 
371
 
 
372
    s->esc3_level_length= 0;
 
373
    s->esc3_run_length= 0;
 
374
 
 
375
#ifdef DEBUG
 
376
    intra_count = 0;
 
377
    av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
 
378
#endif
 
379
}
 
380
 
 
381
void msmpeg4_encode_ext_header(MpegEncContext * s)
 
382
{
 
383
        put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29
 
384
 
 
385
        put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
 
386
 
 
387
        if(s->msmpeg4_version>=3)
 
388
            put_bits(&s->pb, 1, s->flipflop_rounding);
 
389
        else
 
390
            assert(s->flipflop_rounding==0);
 
391
}
 
392
 
 
393
#endif //CONFIG_ENCODERS
 
394
 
 
395
/* predict coded block */
 
396
static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
 
397
{
 
398
    int xy, wrap, pred, a, b, c;
 
399
 
 
400
    xy = s->block_index[n];
 
401
    wrap = s->b8_stride;
 
402
 
 
403
    /* B C
 
404
     * A X
 
405
     */
 
406
    a = s->coded_block[xy - 1       ];
 
407
    b = s->coded_block[xy - 1 - wrap];
 
408
    c = s->coded_block[xy     - wrap];
 
409
 
 
410
    if (b == c) {
 
411
        pred = a;
 
412
    } else {
 
413
        pred = c;
 
414
    }
 
415
 
 
416
    /* store value */
 
417
    *coded_block_ptr = &s->coded_block[xy];
 
418
 
 
419
    return pred;
 
420
}
 
421
 
 
422
#ifdef CONFIG_ENCODERS
 
423
 
 
424
static void msmpeg4_encode_motion(MpegEncContext * s,
 
425
                                  int mx, int my)
 
426
{
 
427
    int code;
 
428
    MVTable *mv;
 
429
 
 
430
    /* modulo encoding */
 
431
    /* WARNING : you cannot reach all the MVs even with the modulo
 
432
       encoding. This is a somewhat strange compromise they took !!!  */
 
433
    if (mx <= -64)
 
434
        mx += 64;
 
435
    else if (mx >= 64)
 
436
        mx -= 64;
 
437
    if (my <= -64)
 
438
        my += 64;
 
439
    else if (my >= 64)
 
440
        my -= 64;
 
441
 
 
442
    mx += 32;
 
443
    my += 32;
 
444
#if 0
 
445
    if ((unsigned)mx >= 64 ||
 
446
        (unsigned)my >= 64)
 
447
        av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my);
 
448
#endif
 
449
    mv = &mv_tables[s->mv_table_index];
 
450
 
 
451
    code = mv->table_mv_index[(mx << 6) | my];
 
452
    put_bits(&s->pb,
 
453
             mv->table_mv_bits[code],
 
454
             mv->table_mv_code[code]);
 
455
    if (code == mv->n) {
 
456
        /* escape : code literally */
 
457
        put_bits(&s->pb, 6, mx);
 
458
        put_bits(&s->pb, 6, my);
 
459
    }
 
460
}
 
461
 
 
462
static inline void handle_slices(MpegEncContext *s){
 
463
    if (s->mb_x == 0) {
 
464
        if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
 
465
            if(s->msmpeg4_version < 4){
 
466
                ff_mpeg4_clean_buffers(s);
 
467
            }
 
468
            s->first_slice_line = 1;
 
469
        } else {
 
470
            s->first_slice_line = 0;
 
471
        }
 
472
    }
 
473
}
 
474
 
 
475
void msmpeg4_encode_mb(MpegEncContext * s,
 
476
                       DCTELEM block[6][64],
 
477
                       int motion_x, int motion_y)
 
478
{
 
479
    int cbp, coded_cbp, i;
 
480
    int pred_x, pred_y;
 
481
    uint8_t *coded_block;
 
482
 
 
483
    handle_slices(s);
 
484
 
 
485
    if (!s->mb_intra) {
 
486
        /* compute cbp */
 
487
        cbp = 0;
 
488
        for (i = 0; i < 6; i++) {
 
489
            if (s->block_last_index[i] >= 0)
 
490
                cbp |= 1 << (5 - i);
 
491
        }
 
492
        if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
 
493
            /* skip macroblock */
 
494
            put_bits(&s->pb, 1, 1);
 
495
            s->last_bits++;
 
496
            s->misc_bits++;
 
497
            s->skip_count++;
 
498
 
 
499
            return;
 
500
        }
 
501
        if (s->use_skip_mb_code)
 
502
            put_bits(&s->pb, 1, 0);     /* mb coded */
 
503
 
 
504
        if(s->msmpeg4_version<=2){
 
505
            put_bits(&s->pb,
 
506
                     v2_mb_type[cbp&3][1],
 
507
                     v2_mb_type[cbp&3][0]);
 
508
            if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
 
509
            else             coded_cbp= cbp;
 
510
 
 
511
            put_bits(&s->pb,
 
512
                     cbpy_tab[coded_cbp>>2][1],
 
513
                     cbpy_tab[coded_cbp>>2][0]);
 
514
 
 
515
            s->misc_bits += get_bits_diff(s);
 
516
 
 
517
            h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
 
518
            msmpeg4v2_encode_motion(s, motion_x - pred_x);
 
519
            msmpeg4v2_encode_motion(s, motion_y - pred_y);
 
520
        }else{
 
521
            put_bits(&s->pb,
 
522
                     table_mb_non_intra[cbp + 64][1],
 
523
                     table_mb_non_intra[cbp + 64][0]);
 
524
 
 
525
            s->misc_bits += get_bits_diff(s);
 
526
 
 
527
            /* motion vector */
 
528
            h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
 
529
            msmpeg4_encode_motion(s, motion_x - pred_x,
 
530
                                  motion_y - pred_y);
 
531
        }
 
532
 
 
533
        s->mv_bits += get_bits_diff(s);
 
534
 
 
535
        for (i = 0; i < 6; i++) {
 
536
            ff_msmpeg4_encode_block(s, block[i], i);
 
537
        }
 
538
        s->p_tex_bits += get_bits_diff(s);
 
539
    } else {
 
540
        /* compute cbp */
 
541
        cbp = 0;
 
542
        coded_cbp = 0;
 
543
        for (i = 0; i < 6; i++) {
 
544
            int val, pred;
 
545
            val = (s->block_last_index[i] >= 1);
 
546
            cbp |= val << (5 - i);
 
547
            if (i < 4) {
 
548
                /* predict value for close blocks only for luma */
 
549
                pred = coded_block_pred(s, i, &coded_block);
 
550
                *coded_block = val;
 
551
                val = val ^ pred;
 
552
            }
 
553
            coded_cbp |= val << (5 - i);
 
554
        }
 
555
#if 0
 
556
        if (coded_cbp)
 
557
            printf("cbp=%x %x\n", cbp, coded_cbp);
 
558
#endif
 
559
 
 
560
        if(s->msmpeg4_version<=2){
 
561
            if (s->pict_type == I_TYPE) {
 
562
                put_bits(&s->pb,
 
563
                         v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
 
564
            } else {
 
565
                if (s->use_skip_mb_code)
 
566
                    put_bits(&s->pb, 1, 0);     /* mb coded */
 
567
                put_bits(&s->pb,
 
568
                         v2_mb_type[(cbp&3) + 4][1],
 
569
                         v2_mb_type[(cbp&3) + 4][0]);
 
570
            }
 
571
            put_bits(&s->pb, 1, 0);             /* no AC prediction yet */
 
572
            put_bits(&s->pb,
 
573
                     cbpy_tab[cbp>>2][1],
 
574
                     cbpy_tab[cbp>>2][0]);
 
575
        }else{
 
576
            if (s->pict_type == I_TYPE) {
 
577
                put_bits(&s->pb,
 
578
                         ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
 
579
            } else {
 
580
                if (s->use_skip_mb_code)
 
581
                    put_bits(&s->pb, 1, 0);     /* mb coded */
 
582
                put_bits(&s->pb,
 
583
                         table_mb_non_intra[cbp][1],
 
584
                         table_mb_non_intra[cbp][0]);
 
585
            }
 
586
            put_bits(&s->pb, 1, 0);             /* no AC prediction yet */
 
587
            if(s->inter_intra_pred){
 
588
                s->h263_aic_dir=0;
 
589
                put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
 
590
            }
 
591
        }
 
592
        s->misc_bits += get_bits_diff(s);
 
593
 
 
594
        for (i = 0; i < 6; i++) {
 
595
            ff_msmpeg4_encode_block(s, block[i], i);
 
596
        }
 
597
        s->i_tex_bits += get_bits_diff(s);
 
598
        s->i_count++;
 
599
    }
 
600
}
 
601
 
 
602
#endif //CONFIG_ENCODERS
 
603
 
 
604
static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
 
605
                                    int32_t **dc_val_ptr)
 
606
{
 
607
    int i;
 
608
 
 
609
    if (n < 4) {
 
610
        i= 0;
 
611
    } else {
 
612
        i= n-3;
 
613
    }
 
614
 
 
615
    *dc_val_ptr= &s->last_dc[i];
 
616
    return s->last_dc[i];
 
617
}
 
618
 
 
619
static int get_dc(uint8_t *src, int stride, int scale)
 
620
{
 
621
    int y;
 
622
    int sum=0;
 
623
    for(y=0; y<8; y++){
 
624
        int x;
 
625
        for(x=0; x<8; x++){
 
626
            sum+=src[x + y*stride];
 
627
        }
 
628
    }
 
629
    return FASTDIV((sum + (scale>>1)), scale);
 
630
}
 
631
 
 
632
/* dir = 0: left, dir = 1: top prediction */
 
633
static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
 
634
                             int16_t **dc_val_ptr, int *dir_ptr)
 
635
{
 
636
    int a, b, c, wrap, pred, scale;
 
637
    int16_t *dc_val;
 
638
 
 
639
    /* find prediction */
 
640
    if (n < 4) {
 
641
        scale = s->y_dc_scale;
 
642
    } else {
 
643
        scale = s->c_dc_scale;
 
644
    }
 
645
 
 
646
    wrap = s->block_wrap[n];
 
647
    dc_val= s->dc_val[0] + s->block_index[n];
 
648
 
 
649
    /* B C
 
650
     * A X
 
651
     */
 
652
    a = dc_val[ - 1];
 
653
    b = dc_val[ - 1 - wrap];
 
654
    c = dc_val[ - wrap];
 
655
 
 
656
    if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
 
657
        b=c=1024;
 
658
    }
 
659
 
 
660
    /* XXX: the following solution consumes divisions, but it does not
 
661
       necessitate to modify mpegvideo.c. The problem comes from the
 
662
       fact they decided to store the quantized DC (which would lead
 
663
       to problems if Q could vary !) */
 
664
#if (defined(ARCH_X86)) && !defined PIC
 
665
    asm volatile(
 
666
        "movl %3, %%eax         \n\t"
 
667
        "shrl $1, %%eax         \n\t"
 
668
        "addl %%eax, %2         \n\t"
 
669
        "addl %%eax, %1         \n\t"
 
670
        "addl %0, %%eax         \n\t"
 
671
        "mull %4                \n\t"
 
672
        "movl %%edx, %0         \n\t"
 
673
        "movl %1, %%eax         \n\t"
 
674
        "mull %4                \n\t"
 
675
        "movl %%edx, %1         \n\t"
 
676
        "movl %2, %%eax         \n\t"
 
677
        "mull %4                \n\t"
 
678
        "movl %%edx, %2         \n\t"
 
679
        : "+b" (a), "+c" (b), "+D" (c)
 
680
        : "g" (scale), "S" (ff_inverse[scale])
 
681
        : "%eax", "%edx"
 
682
    );
 
683
#else
 
684
    /* #elif defined (ARCH_ALPHA) */
 
685
    /* Divisions are extremely costly on Alpha; optimize the most
 
686
       common case. But they are costly everywhere...
 
687
     */
 
688
    if (scale == 8) {
 
689
        a = (a + (8 >> 1)) / 8;
 
690
        b = (b + (8 >> 1)) / 8;
 
691
        c = (c + (8 >> 1)) / 8;
 
692
    } else {
 
693
        a = FASTDIV((a + (scale >> 1)), scale);
 
694
        b = FASTDIV((b + (scale >> 1)), scale);
 
695
        c = FASTDIV((c + (scale >> 1)), scale);
 
696
    }
 
697
#endif
 
698
    /* XXX: WARNING: they did not choose the same test as MPEG4. This
 
699
       is very important ! */
 
700
    if(s->msmpeg4_version>3){
 
701
        if(s->inter_intra_pred){
 
702
            uint8_t *dest;
 
703
            int wrap;
 
704
 
 
705
            if(n==1){
 
706
                pred=a;
 
707
                *dir_ptr = 0;
 
708
            }else if(n==2){
 
709
                pred=c;
 
710
                *dir_ptr = 1;
 
711
            }else if(n==3){
 
712
                if (abs(a - b) < abs(b - c)) {
 
713
                    pred = c;
 
714
                    *dir_ptr = 1;
 
715
                } else {
 
716
                    pred = a;
 
717
                    *dir_ptr = 0;
 
718
                }
 
719
            }else{
 
720
                if(n<4){
 
721
                    wrap= s->linesize;
 
722
                    dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8*  wrap ) + ((n&1) + 2*s->mb_x) * 8;
 
723
                }else{
 
724
                    wrap= s->uvlinesize;
 
725
                    dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
 
726
                }
 
727
                if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
 
728
                else           a= get_dc(dest-8, wrap, scale*8);
 
729
                if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
 
730
                else           c= get_dc(dest-8*wrap, wrap, scale*8);
 
731
 
 
732
                if (s->h263_aic_dir==0) {
 
733
                    pred= a;
 
734
                    *dir_ptr = 0;
 
735
                }else if (s->h263_aic_dir==1) {
 
736
                    if(n==0){
 
737
                        pred= c;
 
738
                        *dir_ptr = 1;
 
739
                    }else{
 
740
                        pred= a;
 
741
                        *dir_ptr = 0;
 
742
                    }
 
743
                }else if (s->h263_aic_dir==2) {
 
744
                    if(n==0){
 
745
                        pred= a;
 
746
                        *dir_ptr = 0;
 
747
                    }else{
 
748
                        pred= c;
 
749
                        *dir_ptr = 1;
 
750
                    }
 
751
                } else {
 
752
                    pred= c;
 
753
                    *dir_ptr = 1;
 
754
                }
 
755
            }
 
756
        }else{
 
757
            if (abs(a - b) < abs(b - c)) {
 
758
                pred = c;
 
759
                *dir_ptr = 1;
 
760
            } else {
 
761
                pred = a;
 
762
                *dir_ptr = 0;
 
763
            }
 
764
        }
 
765
    }else{
 
766
        if (abs(a - b) <= abs(b - c)) {
 
767
            pred = c;
 
768
            *dir_ptr = 1;
 
769
        } else {
 
770
            pred = a;
 
771
            *dir_ptr = 0;
 
772
        }
 
773
    }
 
774
 
 
775
    /* update predictor */
 
776
    *dc_val_ptr = &dc_val[0];
 
777
    return pred;
 
778
}
 
779
 
 
780
#define DC_MAX 119
 
781
 
 
782
static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
 
783
{
 
784
    int sign, code;
 
785
    int pred, extquant;
 
786
    int extrabits = 0;
 
787
 
 
788
    if(s->msmpeg4_version==1){
 
789
        int32_t *dc_val;
 
790
        pred = msmpeg4v1_pred_dc(s, n, &dc_val);
 
791
 
 
792
        /* update predictor */
 
793
        *dc_val= level;
 
794
    }else{
 
795
        int16_t *dc_val;
 
796
        pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
 
797
 
 
798
        /* update predictor */
 
799
        if (n < 4) {
 
800
            *dc_val = level * s->y_dc_scale;
 
801
        } else {
 
802
            *dc_val = level * s->c_dc_scale;
 
803
        }
 
804
    }
 
805
 
 
806
    /* do the prediction */
 
807
    level -= pred;
 
808
 
 
809
    if(s->msmpeg4_version<=2){
 
810
        if (n < 4) {
 
811
            put_bits(&s->pb,
 
812
                     v2_dc_lum_table[level+256][1],
 
813
                     v2_dc_lum_table[level+256][0]);
 
814
        }else{
 
815
            put_bits(&s->pb,
 
816
                     v2_dc_chroma_table[level+256][1],
 
817
                     v2_dc_chroma_table[level+256][0]);
 
818
        }
 
819
    }else{
 
820
        sign = 0;
 
821
        if (level < 0) {
 
822
            level = -level;
 
823
            sign = 1;
 
824
        }
 
825
        code = level;
 
826
        if (code > DC_MAX)
 
827
            code = DC_MAX;
 
828
        else if( s->msmpeg4_version>=6 ) {
 
829
            if( s->qscale == 1 ) {
 
830
                extquant = (level + 3) & 0x3;
 
831
                code  = ((level+3)>>2);
 
832
            } else if( s->qscale == 2 ) {
 
833
                extquant = (level + 1) & 0x1;
 
834
                code  = ((level+1)>>1);
 
835
            }
 
836
        }
 
837
 
 
838
        if (s->dc_table_index == 0) {
 
839
            if (n < 4) {
 
840
                put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
 
841
            } else {
 
842
                put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
 
843
            }
 
844
        } else {
 
845
            if (n < 4) {
 
846
                put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
 
847
            } else {
 
848
                put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
 
849
            }
 
850
        }
 
851
 
 
852
        if(s->msmpeg4_version>=6 && s->qscale<=2)
 
853
            extrabits = 3 - s->qscale;
 
854
 
 
855
        if (code == DC_MAX)
 
856
            put_bits(&s->pb, 8 + extrabits, level);
 
857
        else if(extrabits > 0)//== VC1 && s->qscale<=2
 
858
            put_bits(&s->pb, extrabits, extquant);
 
859
 
 
860
        if (level != 0) {
 
861
            put_bits(&s->pb, 1, sign);
 
862
        }
 
863
    }
 
864
}
 
865
 
 
866
/* Encoding of a block. Very similar to MPEG4 except for a different
 
867
   escape coding (same as H263) and more vlc tables.
 
868
 */
 
869
void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
 
870
{
 
871
    int level, run, last, i, j, last_index;
 
872
    int last_non_zero, sign, slevel;
 
873
    int code, run_diff, dc_pred_dir;
 
874
    const RLTable *rl;
 
875
    const uint8_t *scantable;
 
876
 
 
877
    if (s->mb_intra) {
 
878
        msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
 
879
        i = 1;
 
880
        if (n < 4) {
 
881
            rl = &rl_table[s->rl_table_index];
 
882
        } else {
 
883
            rl = &rl_table[3 + s->rl_chroma_table_index];
 
884
        }
 
885
        run_diff = s->msmpeg4_version>=4;
 
886
        scantable= s->intra_scantable.permutated;
 
887
    } else {
 
888
        i = 0;
 
889
        rl = &rl_table[3 + s->rl_table_index];
 
890
        if(s->msmpeg4_version<=2)
 
891
            run_diff = 0;
 
892
        else
 
893
            run_diff = 1;
 
894
        scantable= s->inter_scantable.permutated;
 
895
    }
 
896
 
 
897
    /* recalculate block_last_index for M$ wmv1 */
 
898
    if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){
 
899
        for(last_index=63; last_index>=0; last_index--){
 
900
            if(block[scantable[last_index]]) break;
 
901
        }
 
902
        s->block_last_index[n]= last_index;
 
903
    }else
 
904
        last_index = s->block_last_index[n];
 
905
    /* AC coefs */
 
906
    last_non_zero = i - 1;
 
907
    for (; i <= last_index; i++) {
 
908
        j = scantable[i];
 
909
        level = block[j];
 
910
        if (level) {
 
911
            run = i - last_non_zero - 1;
 
912
            last = (i == last_index);
 
913
            sign = 0;
 
914
            slevel = level;
 
915
            if (level < 0) {
 
916
                sign = 1;
 
917
                level = -level;
 
918
            }
 
919
 
 
920
            if(level<=MAX_LEVEL && run<=MAX_RUN){
 
921
                s->ac_stats[s->mb_intra][n>3][level][run][last]++;
 
922
            }
 
923
#if 0
 
924
else
 
925
    s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
 
926
#endif
 
927
            code = get_rl_index(rl, last, run, level);
 
928
            put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
 
929
            if (code == rl->n) {
 
930
                int level1, run1;
 
931
 
 
932
                level1 = level - rl->max_level[last][run];
 
933
                if (level1 < 1)
 
934
                    goto esc2;
 
935
                code = get_rl_index(rl, last, run, level1);
 
936
                if (code == rl->n) {
 
937
                esc2:
 
938
                    put_bits(&s->pb, 1, 0);
 
939
                    if (level > MAX_LEVEL)
 
940
                        goto esc3;
 
941
                    run1 = run - rl->max_run[last][level] - run_diff;
 
942
                    if (run1 < 0)
 
943
                        goto esc3;
 
944
                    code = get_rl_index(rl, last, run1+1, level);
 
945
                    if (s->msmpeg4_version == 4 && code == rl->n)
 
946
                        goto esc3;
 
947
                    code = get_rl_index(rl, last, run1, level);
 
948
                    if (code == rl->n) {
 
949
                    esc3:
 
950
                        /* third escape */
 
951
                        put_bits(&s->pb, 1, 0);
 
952
                        put_bits(&s->pb, 1, last);
 
953
                        if(s->msmpeg4_version>=4){
 
954
                            if(s->esc3_level_length==0){
 
955
                                s->esc3_level_length=8;
 
956
                                s->esc3_run_length= 6;
 
957
                                //ESCLVLSZ + ESCRUNSZ
 
958
                                if(s->qscale<8)
 
959
                                    put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3);
 
960
                                else
 
961
                                    put_bits(&s->pb, 8, 3);
 
962
                            }
 
963
                            put_bits(&s->pb, s->esc3_run_length, run);
 
964
                            put_bits(&s->pb, 1, sign);
 
965
                            put_bits(&s->pb, s->esc3_level_length, level);
 
966
                        }else{
 
967
                            put_bits(&s->pb, 6, run);
 
968
                            put_bits(&s->pb, 8, slevel & 0xff);
 
969
                        }
 
970
                    } else {
 
971
                        /* second escape */
 
972
                        put_bits(&s->pb, 1, 1);
 
973
                        put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
 
974
                        put_bits(&s->pb, 1, sign);
 
975
                    }
 
976
                } else {
 
977
                    /* first escape */
 
978
                    put_bits(&s->pb, 1, 1);
 
979
                    put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
 
980
                    put_bits(&s->pb, 1, sign);
 
981
                }
 
982
            } else {
 
983
                put_bits(&s->pb, 1, sign);
 
984
            }
 
985
            last_non_zero = i;
 
986
        }
 
987
    }
 
988
}
 
989
 
 
990
/****************************************/
 
991
/* decoding stuff */
 
992
 
 
993
static VLC mb_non_intra_vlc[4];
 
994
static VLC v2_dc_lum_vlc;
 
995
static VLC v2_dc_chroma_vlc;
 
996
static VLC cbpy_vlc;
 
997
static VLC v2_intra_cbpc_vlc;
 
998
static VLC v2_mb_type_vlc;
 
999
static VLC v2_mv_vlc;
 
1000
static VLC v1_intra_cbpc_vlc;
 
1001
static VLC v1_inter_cbpc_vlc;
 
1002
static VLC inter_intra_vlc;
 
1003
 
 
1004
/* This table is practically identical to the one from h263
 
1005
 * except that it is inverted. */
 
1006
static void init_h263_dc_for_msmpeg4(void)
 
1007
{
 
1008
        int level, uni_code, uni_len;
 
1009
 
 
1010
        for(level=-256; level<256; level++){
 
1011
            int size, v, l;
 
1012
            /* find number of bits */
 
1013
            size = 0;
 
1014
            v = abs(level);
 
1015
            while (v) {
 
1016
                v >>= 1;
 
1017
                    size++;
 
1018
            }
 
1019
 
 
1020
            if (level < 0)
 
1021
                l= (-level) ^ ((1 << size) - 1);
 
1022
            else
 
1023
                l= level;
 
1024
 
 
1025
            /* luminance h263 */
 
1026
            uni_code= DCtab_lum[size][0];
 
1027
            uni_len = DCtab_lum[size][1];
 
1028
            uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
 
1029
 
 
1030
            if (size > 0) {
 
1031
                uni_code<<=size; uni_code|=l;
 
1032
                uni_len+=size;
 
1033
                if (size > 8){
 
1034
                    uni_code<<=1; uni_code|=1;
 
1035
                    uni_len++;
 
1036
                }
 
1037
            }
 
1038
            v2_dc_lum_table[level+256][0]= uni_code;
 
1039
            v2_dc_lum_table[level+256][1]= uni_len;
 
1040
 
 
1041
            /* chrominance h263 */
 
1042
            uni_code= DCtab_chrom[size][0];
 
1043
            uni_len = DCtab_chrom[size][1];
 
1044
            uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility
 
1045
 
 
1046
            if (size > 0) {
 
1047
                uni_code<<=size; uni_code|=l;
 
1048
                uni_len+=size;
 
1049
                if (size > 8){
 
1050
                    uni_code<<=1; uni_code|=1;
 
1051
                    uni_len++;
 
1052
                }
 
1053
            }
 
1054
            v2_dc_chroma_table[level+256][0]= uni_code;
 
1055
            v2_dc_chroma_table[level+256][1]= uni_len;
 
1056
 
 
1057
        }
 
1058
}
 
1059
 
 
1060
/* init all vlc decoding tables */
 
1061
int ff_msmpeg4_decode_init(MpegEncContext *s)
 
1062
{
 
1063
    static int done = 0;
 
1064
    int i;
 
1065
    MVTable *mv;
 
1066
 
 
1067
    common_init(s);
 
1068
 
 
1069
    if (!done) {
 
1070
        done = 1;
 
1071
 
 
1072
        for(i=0;i<NB_RL_TABLES;i++) {
 
1073
            init_rl(&rl_table[i], static_rl_table_store[i]);
 
1074
            init_vlc_rl(&rl_table[i], 1);
 
1075
        }
 
1076
        for(i=0;i<2;i++) {
 
1077
            mv = &mv_tables[i];
 
1078
            init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
 
1079
                     mv->table_mv_bits, 1, 1,
 
1080
                     mv->table_mv_code, 2, 2, 1);
 
1081
        }
 
1082
 
 
1083
        init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
 
1084
                 &ff_table0_dc_lum[0][1], 8, 4,
 
1085
                 &ff_table0_dc_lum[0][0], 8, 4, 1);
 
1086
        init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
 
1087
                 &ff_table0_dc_chroma[0][1], 8, 4,
 
1088
                 &ff_table0_dc_chroma[0][0], 8, 4, 1);
 
1089
        init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
 
1090
                 &ff_table1_dc_lum[0][1], 8, 4,
 
1091
                 &ff_table1_dc_lum[0][0], 8, 4, 1);
 
1092
        init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
 
1093
                 &ff_table1_dc_chroma[0][1], 8, 4,
 
1094
                 &ff_table1_dc_chroma[0][0], 8, 4, 1);
 
1095
 
 
1096
        init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
 
1097
                 &v2_dc_lum_table[0][1], 8, 4,
 
1098
                 &v2_dc_lum_table[0][0], 8, 4, 1);
 
1099
        init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
 
1100
                 &v2_dc_chroma_table[0][1], 8, 4,
 
1101
                 &v2_dc_chroma_table[0][0], 8, 4, 1);
 
1102
 
 
1103
        init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
 
1104
                 &cbpy_tab[0][1], 2, 1,
 
1105
                 &cbpy_tab[0][0], 2, 1, 1);
 
1106
        init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
 
1107
                 &v2_intra_cbpc[0][1], 2, 1,
 
1108
                 &v2_intra_cbpc[0][0], 2, 1, 1);
 
1109
        init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
 
1110
                 &v2_mb_type[0][1], 2, 1,
 
1111
                 &v2_mb_type[0][0], 2, 1, 1);
 
1112
        init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
 
1113
                 &mvtab[0][1], 2, 1,
 
1114
                 &mvtab[0][0], 2, 1, 1);
 
1115
 
 
1116
        for(i=0; i<4; i++){
 
1117
            init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
 
1118
                     &wmv2_inter_table[i][0][1], 8, 4,
 
1119
                     &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
 
1120
        }
 
1121
 
 
1122
        init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
 
1123
                 &ff_msmp4_mb_i_table[0][1], 4, 2,
 
1124
                 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
 
1125
 
 
1126
        init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
 
1127
                 intra_MCBPC_bits, 1, 1,
 
1128
                 intra_MCBPC_code, 1, 1, 1);
 
1129
        init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
 
1130
                 inter_MCBPC_bits, 1, 1,
 
1131
                 inter_MCBPC_code, 1, 1, 1);
 
1132
 
 
1133
        init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
 
1134
                 &table_inter_intra[0][1], 2, 1,
 
1135
                 &table_inter_intra[0][0], 2, 1, 1);
 
1136
    }
 
1137
 
 
1138
    switch(s->msmpeg4_version){
 
1139
    case 1:
 
1140
    case 2:
 
1141
        s->decode_mb= msmpeg4v12_decode_mb;
 
1142
        break;
 
1143
    case 3:
 
1144
    case 4:
 
1145
        s->decode_mb= msmpeg4v34_decode_mb;
 
1146
        break;
 
1147
    case 5:
 
1148
        s->decode_mb= wmv2_decode_mb;
 
1149
    case 6:
 
1150
        //FIXME + TODO VC1 decode mb
 
1151
        break;
 
1152
    }
 
1153
 
 
1154
    s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
 
1155
 
 
1156
    return 0;
 
1157
}
 
1158
 
 
1159
int msmpeg4_decode_picture_header(MpegEncContext * s)
 
1160
{
 
1161
    int code;
 
1162
 
 
1163
#if 0
 
1164
{
 
1165
int i;
 
1166
for(i=0; i<s->gb.size_in_bits; i++)
 
1167
    av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
 
1168
//    get_bits1(&s->gb);
 
1169
av_log(s->avctx, AV_LOG_DEBUG, "END\n");
 
1170
return -1;
 
1171
}
 
1172
#endif
 
1173
 
 
1174
    if(s->msmpeg4_version==1){
 
1175
        int start_code, num;
 
1176
        start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
 
1177
        if(start_code!=0x00000100){
 
1178
            av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
 
1179
            return -1;
 
1180
        }
 
1181
 
 
1182
        num= get_bits(&s->gb, 5); // frame number */
 
1183
    }
 
1184
 
 
1185
    s->pict_type = get_bits(&s->gb, 2) + 1;
 
1186
    if (s->pict_type != I_TYPE &&
 
1187
        s->pict_type != P_TYPE){
 
1188
        av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
 
1189
        return -1;
 
1190
    }
 
1191
#if 0
 
1192
{
 
1193
    static int had_i=0;
 
1194
    if(s->pict_type == I_TYPE) had_i=1;
 
1195
    if(!had_i) return -1;
 
1196
}
 
1197
#endif
 
1198
    s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
 
1199
    if(s->qscale==0){
 
1200
        av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
 
1201
        return -1;
 
1202
    }
 
1203
 
 
1204
    if (s->pict_type == I_TYPE) {
 
1205
        code = get_bits(&s->gb, 5);
 
1206
        if(s->msmpeg4_version==1){
 
1207
            if(code==0 || code>s->mb_height){
 
1208
                av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
 
1209
                return -1;
 
1210
            }
 
1211
 
 
1212
            s->slice_height = code;
 
1213
        }else{
 
1214
            /* 0x17: one slice, 0x18: two slices, ... */
 
1215
            if (code < 0x17){
 
1216
                av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
 
1217
                return -1;
 
1218
            }
 
1219
 
 
1220
            s->slice_height = s->mb_height / (code - 0x16);
 
1221
        }
 
1222
 
 
1223
        switch(s->msmpeg4_version){
 
1224
        case 1:
 
1225
        case 2:
 
1226
            s->rl_chroma_table_index = 2;
 
1227
            s->rl_table_index = 2;
 
1228
 
 
1229
            s->dc_table_index = 0; //not used
 
1230
            break;
 
1231
        case 3:
 
1232
            s->rl_chroma_table_index = decode012(&s->gb);
 
1233
            s->rl_table_index = decode012(&s->gb);
 
1234
 
 
1235
            s->dc_table_index = get_bits1(&s->gb);
 
1236
            break;
 
1237
        case 4:
 
1238
            msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
 
1239
 
 
1240
            if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
 
1241
            else                           s->per_mb_rl_table= 0;
 
1242
 
 
1243
            if(!s->per_mb_rl_table){
 
1244
                s->rl_chroma_table_index = decode012(&s->gb);
 
1245
                s->rl_table_index = decode012(&s->gb);
 
1246
            }
 
1247
 
 
1248
            s->dc_table_index = get_bits1(&s->gb);
 
1249
            s->inter_intra_pred= 0;
 
1250
            break;
 
1251
        }
 
1252
        s->no_rounding = 1;
 
1253
        if(s->avctx->debug&FF_DEBUG_PICT_INFO)
 
1254
            av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d   \n",
 
1255
                s->qscale,
 
1256
                s->rl_chroma_table_index,
 
1257
                s->rl_table_index,
 
1258
                s->dc_table_index,
 
1259
                s->per_mb_rl_table,
 
1260
                s->slice_height);
 
1261
    } else {
 
1262
        switch(s->msmpeg4_version){
 
1263
        case 1:
 
1264
        case 2:
 
1265
            if(s->msmpeg4_version==1)
 
1266
                s->use_skip_mb_code = 1;
 
1267
            else
 
1268
                s->use_skip_mb_code = get_bits1(&s->gb);
 
1269
            s->rl_table_index = 2;
 
1270
            s->rl_chroma_table_index = s->rl_table_index;
 
1271
            s->dc_table_index = 0; //not used
 
1272
            s->mv_table_index = 0;
 
1273
            break;
 
1274
        case 3:
 
1275
            s->use_skip_mb_code = get_bits1(&s->gb);
 
1276
            s->rl_table_index = decode012(&s->gb);
 
1277
            s->rl_chroma_table_index = s->rl_table_index;
 
1278
 
 
1279
            s->dc_table_index = get_bits1(&s->gb);
 
1280
 
 
1281
            s->mv_table_index = get_bits1(&s->gb);
 
1282
            break;
 
1283
        case 4:
 
1284
            s->use_skip_mb_code = get_bits1(&s->gb);
 
1285
 
 
1286
            if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
 
1287
            else                           s->per_mb_rl_table= 0;
 
1288
 
 
1289
            if(!s->per_mb_rl_table){
 
1290
                s->rl_table_index = decode012(&s->gb);
 
1291
                s->rl_chroma_table_index = s->rl_table_index;
 
1292
            }
 
1293
 
 
1294
            s->dc_table_index = get_bits1(&s->gb);
 
1295
 
 
1296
            s->mv_table_index = get_bits1(&s->gb);
 
1297
            s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
 
1298
            break;
 
1299
        }
 
1300
 
 
1301
        if(s->avctx->debug&FF_DEBUG_PICT_INFO)
 
1302
            av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d   \n",
 
1303
                s->use_skip_mb_code,
 
1304
                s->rl_table_index,
 
1305
                s->rl_chroma_table_index,
 
1306
                s->dc_table_index,
 
1307
                s->mv_table_index,
 
1308
                s->per_mb_rl_table,
 
1309
                s->qscale);
 
1310
 
 
1311
        if(s->flipflop_rounding){
 
1312
            s->no_rounding ^= 1;
 
1313
        }else{
 
1314
            s->no_rounding = 0;
 
1315
        }
 
1316
    }
 
1317
//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
 
1318
 
 
1319
    s->esc3_level_length= 0;
 
1320
    s->esc3_run_length= 0;
 
1321
 
 
1322
#ifdef DEBUG
 
1323
    av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++);
 
1324
#endif
 
1325
    return 0;
 
1326
}
 
1327
 
 
1328
int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
 
1329
{
 
1330
    int left= buf_size*8 - get_bits_count(&s->gb);
 
1331
    int length= s->msmpeg4_version>=3 ? 17 : 16;
 
1332
    /* the alt_bitstream reader could read over the end so we need to check it */
 
1333
    if(left>=length && left<length+8)
 
1334
    {
 
1335
        int fps;
 
1336
 
 
1337
        fps= get_bits(&s->gb, 5);
 
1338
        s->bit_rate= get_bits(&s->gb, 11)*1024;
 
1339
        if(s->msmpeg4_version>=3)
 
1340
            s->flipflop_rounding= get_bits1(&s->gb);
 
1341
        else
 
1342
            s->flipflop_rounding= 0;
 
1343
 
 
1344
//        printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
 
1345
    }
 
1346
    else if(left<length+8)
 
1347
    {
 
1348
        s->flipflop_rounding= 0;
 
1349
        if(s->msmpeg4_version != 2)
 
1350
            av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
 
1351
    }
 
1352
    else
 
1353
    {
 
1354
        av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
 
1355
    }
 
1356
 
 
1357
    return 0;
 
1358
}
 
1359
 
 
1360
static inline void msmpeg4_memsetw(short *tab, int val, int n)
 
1361
{
 
1362
    int i;
 
1363
    for(i=0;i<n;i++)
 
1364
        tab[i] = val;
 
1365
}
 
1366
 
 
1367
#ifdef CONFIG_ENCODERS
 
1368
static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
 
1369
{
 
1370
    int range, bit_size, sign, code, bits;
 
1371
 
 
1372
    if (val == 0) {
 
1373
        /* zero vector */
 
1374
        code = 0;
 
1375
        put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
 
1376
    } else {
 
1377
        bit_size = s->f_code - 1;
 
1378
        range = 1 << bit_size;
 
1379
        if (val <= -64)
 
1380
            val += 64;
 
1381
        else if (val >= 64)
 
1382
            val -= 64;
 
1383
 
 
1384
        if (val >= 0) {
 
1385
            sign = 0;
 
1386
        } else {
 
1387
            val = -val;
 
1388
            sign = 1;
 
1389
        }
 
1390
        val--;
 
1391
        code = (val >> bit_size) + 1;
 
1392
        bits = val & (range - 1);
 
1393
 
 
1394
        put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
 
1395
        if (bit_size > 0) {
 
1396
            put_bits(&s->pb, bit_size, bits);
 
1397
        }
 
1398
    }
 
1399
}
 
1400
#endif
 
1401
 
 
1402
/* This is identical to h263 except that its range is multiplied by 2. */
 
1403
static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
 
1404
{
 
1405
    int code, val, sign, shift;
 
1406
 
 
1407
    code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
 
1408
//     printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
 
1409
    if (code < 0)
 
1410
        return 0xffff;
 
1411
 
 
1412
    if (code == 0)
 
1413
        return pred;
 
1414
    sign = get_bits1(&s->gb);
 
1415
    shift = f_code - 1;
 
1416
    val = code;
 
1417
    if (shift) {
 
1418
        val = (val - 1) << shift;
 
1419
        val |= get_bits(&s->gb, shift);
 
1420
        val++;
 
1421
    }
 
1422
    if (sign)
 
1423
        val = -val;
 
1424
 
 
1425
    val += pred;
 
1426
    if (val <= -64)
 
1427
        val += 64;
 
1428
    else if (val >= 64)
 
1429
        val -= 64;
 
1430
 
 
1431
    return val;
 
1432
}
 
1433
 
 
1434
static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 
1435
{
 
1436
    int cbp, code, i;
 
1437
 
 
1438
    if (s->pict_type == P_TYPE) {
 
1439
        if (s->use_skip_mb_code) {
 
1440
            if (get_bits1(&s->gb)) {
 
1441
                /* skip mb */
 
1442
                s->mb_intra = 0;
 
1443
                for(i=0;i<6;i++)
 
1444
                    s->block_last_index[i] = -1;
 
1445
                s->mv_dir = MV_DIR_FORWARD;
 
1446
                s->mv_type = MV_TYPE_16X16;
 
1447
                s->mv[0][0][0] = 0;
 
1448
                s->mv[0][0][1] = 0;
 
1449
                s->mb_skipped = 1;
 
1450
                return 0;
 
1451
            }
 
1452
        }
 
1453
 
 
1454
        if(s->msmpeg4_version==2)
 
1455
            code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
 
1456
        else
 
1457
            code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
 
1458
        if(code<0 || code>7){
 
1459
            av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
 
1460
            return -1;
 
1461
        }
 
1462
 
 
1463
        s->mb_intra = code >>2;
 
1464
 
 
1465
        cbp = code & 0x3;
 
1466
    } else {
 
1467
        s->mb_intra = 1;
 
1468
        if(s->msmpeg4_version==2)
 
1469
            cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
 
1470
        else
 
1471
            cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
 
1472
        if(cbp<0 || cbp>3){
 
1473
            av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
 
1474
            return -1;
 
1475
        }
 
1476
    }
 
1477
 
 
1478
    if (!s->mb_intra) {
 
1479
        int mx, my, cbpy;
 
1480
 
 
1481
        cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
 
1482
        if(cbpy<0){
 
1483
            av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
 
1484
            return -1;
 
1485
        }
 
1486
 
 
1487
        cbp|= cbpy<<2;
 
1488
        if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
 
1489
 
 
1490
        h263_pred_motion(s, 0, 0, &mx, &my);
 
1491
        mx= msmpeg4v2_decode_motion(s, mx, 1);
 
1492
        my= msmpeg4v2_decode_motion(s, my, 1);
 
1493
 
 
1494
        s->mv_dir = MV_DIR_FORWARD;
 
1495
        s->mv_type = MV_TYPE_16X16;
 
1496
        s->mv[0][0][0] = mx;
 
1497
        s->mv[0][0][1] = my;
 
1498
    } else {
 
1499
        if(s->msmpeg4_version==2){
 
1500
            s->ac_pred = get_bits1(&s->gb);
 
1501
            cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
 
1502
        } else{
 
1503
            s->ac_pred = 0;
 
1504
            cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
 
1505
            if(s->pict_type==P_TYPE) cbp^=0x3C;
 
1506
        }
 
1507
    }
 
1508
 
 
1509
    s->dsp.clear_blocks(s->block[0]);
 
1510
    for (i = 0; i < 6; i++) {
 
1511
        if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
 
1512
        {
 
1513
             av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
 
1514
             return -1;
 
1515
        }
 
1516
    }
 
1517
    return 0;
 
1518
}
 
1519
 
 
1520
static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
 
1521
{
 
1522
    int cbp, code, i;
 
1523
    uint8_t *coded_val;
 
1524
    uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ];
 
1525
 
 
1526
    if (s->pict_type == P_TYPE) {
 
1527
        if (s->use_skip_mb_code) {
 
1528
            if (get_bits1(&s->gb)) {
 
1529
                /* skip mb */
 
1530
                s->mb_intra = 0;
 
1531
                for(i=0;i<6;i++)
 
1532
                    s->block_last_index[i] = -1;
 
1533
                s->mv_dir = MV_DIR_FORWARD;
 
1534
                s->mv_type = MV_TYPE_16X16;
 
1535
                s->mv[0][0][0] = 0;
 
1536
                s->mv[0][0][1] = 0;
 
1537
                s->mb_skipped = 1;
 
1538
                *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
 
1539
 
 
1540
                return 0;
 
1541
            }
 
1542
        }
 
1543
 
 
1544
        code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
 
1545
        if (code < 0)
 
1546
            return -1;
 
1547
        //s->mb_intra = (code & 0x40) ? 0 : 1;
 
1548
        s->mb_intra = (~code & 0x40) >> 6;
 
1549
 
 
1550
        cbp = code & 0x3f;
 
1551
    } else {
 
1552
        s->mb_intra = 1;
 
1553
        code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
 
1554
        if (code < 0)
 
1555
            return -1;
 
1556
        /* predict coded block pattern */
 
1557
        cbp = 0;
 
1558
        for(i=0;i<6;i++) {
 
1559
            int val = ((code >> (5 - i)) & 1);
 
1560
            if (i < 4) {
 
1561
                int pred = coded_block_pred(s, i, &coded_val);
 
1562
                val = val ^ pred;
 
1563
                *coded_val = val;
 
1564
            }
 
1565
            cbp |= val << (5 - i);
 
1566
        }
 
1567
    }
 
1568
 
 
1569
    if (!s->mb_intra) {
 
1570
        int mx, my;
 
1571
//printf("P at %d %d\n", s->mb_x, s->mb_y);
 
1572
        if(s->per_mb_rl_table && cbp){
 
1573
            s->rl_table_index = decode012(&s->gb);
 
1574
            s->rl_chroma_table_index = s->rl_table_index;
 
1575
        }
 
1576
        h263_pred_motion(s, 0, 0, &mx, &my);
 
1577
        if (msmpeg4_decode_motion(s, &mx, &my) < 0)
 
1578
            return -1;
 
1579
        s->mv_dir = MV_DIR_FORWARD;
 
1580
        s->mv_type = MV_TYPE_16X16;
 
1581
        s->mv[0][0][0] = mx;
 
1582
        s->mv[0][0][1] = my;
 
1583
        *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
 
1584
    } else {
 
1585
//printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24));
 
1586
        s->ac_pred = get_bits1(&s->gb);
 
1587
        *mb_type_ptr = MB_TYPE_INTRA;
 
1588
        if(s->inter_intra_pred){
 
1589
            s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
 
1590
//            printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
 
1591
        }
 
1592
        if(s->per_mb_rl_table && cbp){
 
1593
            s->rl_table_index = decode012(&s->gb);
 
1594
            s->rl_chroma_table_index = s->rl_table_index;
 
1595
        }
 
1596
    }
 
1597
 
 
1598
    s->dsp.clear_blocks(s->block[0]);
 
1599
    for (i = 0; i < 6; i++) {
 
1600
        if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
 
1601
        {
 
1602
            av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
 
1603
            return -1;
 
1604
        }
 
1605
    }
 
1606
 
 
1607
    return 0;
 
1608
}
 
1609
//#define ERROR_DETAILS
 
1610
static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
 
1611
                              int n, int coded, const uint8_t *scan_table)
 
1612
{
 
1613
    int level, i, last, run, run_diff;
 
1614
    int dc_pred_dir;
 
1615
    RLTable *rl;
 
1616
    RL_VLC_ELEM *rl_vlc;
 
1617
    int qmul, qadd;
 
1618
 
 
1619
    if (s->mb_intra) {
 
1620
        qmul=1;
 
1621
        qadd=0;
 
1622
 
 
1623
        /* DC coef */
 
1624
        level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
 
1625
 
 
1626
        if (level < 0){
 
1627
            av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
 
1628
            if(s->inter_intra_pred) level=0;
 
1629
            else                    return -1;
 
1630
        }
 
1631
        if (n < 4) {
 
1632
            rl = &rl_table[s->rl_table_index];
 
1633
            if(level > 256*s->y_dc_scale){
 
1634
                av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
 
1635
                if(!s->inter_intra_pred) return -1;
 
1636
            }
 
1637
        } else {
 
1638
            rl = &rl_table[3 + s->rl_chroma_table_index];
 
1639
            if(level > 256*s->c_dc_scale){
 
1640
                av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
 
1641
                if(!s->inter_intra_pred) return -1;
 
1642
            }
 
1643
        }
 
1644
        block[0] = level;
 
1645
 
 
1646
        run_diff = s->msmpeg4_version >= 4;
 
1647
        i = 0;
 
1648
        if (!coded) {
 
1649
            goto not_coded;
 
1650
        }
 
1651
        if (s->ac_pred) {
 
1652
            if (dc_pred_dir == 0)
 
1653
                scan_table = s->intra_v_scantable.permutated; /* left */
 
1654
            else
 
1655
                scan_table = s->intra_h_scantable.permutated; /* top */
 
1656
        } else {
 
1657
            scan_table = s->intra_scantable.permutated;
 
1658
        }
 
1659
        rl_vlc= rl->rl_vlc[0];
 
1660
    } else {
 
1661
        qmul = s->qscale << 1;
 
1662
        qadd = (s->qscale - 1) | 1;
 
1663
        i = -1;
 
1664
        rl = &rl_table[3 + s->rl_table_index];
 
1665
 
 
1666
        if(s->msmpeg4_version==2)
 
1667
            run_diff = 0;
 
1668
        else
 
1669
            run_diff = 1;
 
1670
 
 
1671
        if (!coded) {
 
1672
            s->block_last_index[n] = i;
 
1673
            return 0;
 
1674
        }
 
1675
        if(!scan_table)
 
1676
            scan_table = s->inter_scantable.permutated;
 
1677
        rl_vlc= rl->rl_vlc[s->qscale];
 
1678
    }
 
1679
  {
 
1680
    OPEN_READER(re, &s->gb);
 
1681
    for(;;) {
 
1682
        UPDATE_CACHE(re, &s->gb);
 
1683
        GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
 
1684
        if (level==0) {
 
1685
            int cache;
 
1686
            cache= GET_CACHE(re, &s->gb);
 
1687
            /* escape */
 
1688
            if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
 
1689
                if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
 
1690
                    /* third escape */
 
1691
                    if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
 
1692
                    UPDATE_CACHE(re, &s->gb);
 
1693
                    if(s->msmpeg4_version<=3){
 
1694
                        last=  SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
 
1695
                        run=   SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
 
1696
                        level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
 
1697
                        SKIP_COUNTER(re, &s->gb, 1+6+8);
 
1698
                    }else{
 
1699
                        int sign;
 
1700
                        last=  SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
 
1701
                        if(!s->esc3_level_length){
 
1702
                            int ll;
 
1703
                            //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
 
1704
                            if(s->qscale<8){
 
1705
                                ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
 
1706
                                if(ll==0){
 
1707
                                    if(SHOW_UBITS(re, &s->gb, 1)) av_log(s->avctx, AV_LOG_ERROR, "cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
 
1708
                                    SKIP_BITS(re, &s->gb, 1);
 
1709
                                    ll=8;
 
1710
                                }
 
1711
                            }else{
 
1712
                                ll=2;
 
1713
                                while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
 
1714
                                    ll++;
 
1715
                                    SKIP_BITS(re, &s->gb, 1);
 
1716
                                }
 
1717
                                if(ll<8) SKIP_BITS(re, &s->gb, 1);
 
1718
                            }
 
1719
 
 
1720
                            s->esc3_level_length= ll;
 
1721
                            s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
 
1722
//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
 
1723
                            UPDATE_CACHE(re, &s->gb);
 
1724
                        }
 
1725
                        run=   SHOW_UBITS(re, &s->gb, s->esc3_run_length);
 
1726
                        SKIP_BITS(re, &s->gb, s->esc3_run_length);
 
1727
 
 
1728
                        sign=  SHOW_UBITS(re, &s->gb, 1);
 
1729
                        SKIP_BITS(re, &s->gb, 1);
 
1730
 
 
1731
                        level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
 
1732
                        SKIP_BITS(re, &s->gb, s->esc3_level_length);
 
1733
                        if(sign) level= -level;
 
1734
                    }
 
1735
//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
 
1736
#if 0 // waste of time / this will detect very few errors
 
1737
                    {
 
1738
                        const int abs_level= FFABS(level);
 
1739
                        const int run1= run - rl->max_run[last][abs_level] - run_diff;
 
1740
                        if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
 
1741
                            if(abs_level <= rl->max_level[last][run]){
 
1742
                                av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
 
1743
                                return DECODING_AC_LOST;
 
1744
                            }
 
1745
                            if(abs_level <= rl->max_level[last][run]*2){
 
1746
                                av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
 
1747
                                return DECODING_AC_LOST;
 
1748
                            }
 
1749
                            if(run1>=0 && abs_level <= rl->max_level[last][run1]){
 
1750
                                av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
 
1751
                                return DECODING_AC_LOST;
 
1752
                            }
 
1753
                        }
 
1754
                    }
 
1755
#endif
 
1756
                    //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
 
1757
                    if (level>0) level= level * qmul + qadd;
 
1758
                    else         level= level * qmul - qadd;
 
1759
#if 0 // waste of time too :(
 
1760
                    if(level>2048 || level<-2048){
 
1761
                        av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
 
1762
                        return DECODING_AC_LOST;
 
1763
                    }
 
1764
#endif
 
1765
                    i+= run + 1;
 
1766
                    if(last) i+=192;
 
1767
#ifdef ERROR_DETAILS
 
1768
                if(run==66)
 
1769
                    av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
 
1770
                else if((i>62 && i<192) || i>192+63)
 
1771
                    av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
 
1772
#endif
 
1773
                } else {
 
1774
                    /* second escape */
 
1775
#if MIN_CACHE_BITS < 23
 
1776
                    LAST_SKIP_BITS(re, &s->gb, 2);
 
1777
                    UPDATE_CACHE(re, &s->gb);
 
1778
#else
 
1779
                    SKIP_BITS(re, &s->gb, 2);
 
1780
#endif
 
1781
                    GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
 
1782
                    i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
 
1783
                    level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
 
1784
                    LAST_SKIP_BITS(re, &s->gb, 1);
 
1785
#ifdef ERROR_DETAILS
 
1786
                if(run==66)
 
1787
                    av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
 
1788
                else if((i>62 && i<192) || i>192+63)
 
1789
                    av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
 
1790
#endif
 
1791
                }
 
1792
            } else {
 
1793
                /* first escape */
 
1794
#if MIN_CACHE_BITS < 22
 
1795
                LAST_SKIP_BITS(re, &s->gb, 1);
 
1796
                UPDATE_CACHE(re, &s->gb);
 
1797
#else
 
1798
                SKIP_BITS(re, &s->gb, 1);
 
1799
#endif
 
1800
                GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
 
1801
                i+= run;
 
1802
                level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
 
1803
                level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
 
1804
                LAST_SKIP_BITS(re, &s->gb, 1);
 
1805
#ifdef ERROR_DETAILS
 
1806
                if(run==66)
 
1807
                    av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
 
1808
                else if((i>62 && i<192) || i>192+63)
 
1809
                    av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
 
1810
#endif
 
1811
            }
 
1812
        } else {
 
1813
            i+= run;
 
1814
            level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
 
1815
            LAST_SKIP_BITS(re, &s->gb, 1);
 
1816
#ifdef ERROR_DETAILS
 
1817
                if(run==66)
 
1818
                    av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
 
1819
                else if((i>62 && i<192) || i>192+63)
 
1820
                    av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level);
 
1821
#endif
 
1822
        }
 
1823
        if (i > 62){
 
1824
            i-= 192;
 
1825
            if(i&(~63)){
 
1826
                const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
 
1827
                if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
 
1828
                    av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
 
1829
                    break;
 
1830
                }else{
 
1831
                    av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
 
1832
                    return -1;
 
1833
                }
 
1834
            }
 
1835
 
 
1836
            block[scan_table[i]] = level;
 
1837
            break;
 
1838
        }
 
1839
 
 
1840
        block[scan_table[i]] = level;
 
1841
    }
 
1842
    CLOSE_READER(re, &s->gb);
 
1843
  }
 
1844
 not_coded:
 
1845
    if (s->mb_intra) {
 
1846
        mpeg4_pred_ac(s, block, n, dc_pred_dir);
 
1847
        if (s->ac_pred) {
 
1848
            i = 63; /* XXX: not optimal */
 
1849
        }
 
1850
    }
 
1851
    if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
 
1852
    s->block_last_index[n] = i;
 
1853
 
 
1854
    return 0;
 
1855
}
 
1856
 
 
1857
static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
 
1858
{
 
1859
    int level, pred;
 
1860
 
 
1861
    if(s->msmpeg4_version<=2){
 
1862
        if (n < 4) {
 
1863
            level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
 
1864
        } else {
 
1865
            level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
 
1866
        }
 
1867
        if (level < 0)
 
1868
            return -1;
 
1869
        level-=256;
 
1870
    }else{  //FIXME optimize use unified tables & index
 
1871
        if (n < 4) {
 
1872
            level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
 
1873
        } else {
 
1874
            level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
 
1875
        }
 
1876
        if (level < 0){
 
1877
            av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
 
1878
            return -1;
 
1879
        }
 
1880
 
 
1881
        if (level == DC_MAX) {
 
1882
            level = get_bits(&s->gb, 8);
 
1883
            if (get_bits1(&s->gb))
 
1884
                level = -level;
 
1885
        } else if (level != 0) {
 
1886
            if (get_bits1(&s->gb))
 
1887
                level = -level;
 
1888
        }
 
1889
    }
 
1890
 
 
1891
    if(s->msmpeg4_version==1){
 
1892
        int32_t *dc_val;
 
1893
        pred = msmpeg4v1_pred_dc(s, n, &dc_val);
 
1894
        level += pred;
 
1895
 
 
1896
        /* update predictor */
 
1897
        *dc_val= level;
 
1898
    }else{
 
1899
        int16_t *dc_val;
 
1900
        pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
 
1901
        level += pred;
 
1902
 
 
1903
        /* update predictor */
 
1904
        if (n < 4) {
 
1905
            *dc_val = level * s->y_dc_scale;
 
1906
        } else {
 
1907
            *dc_val = level * s->c_dc_scale;
 
1908
        }
 
1909
    }
 
1910
 
 
1911
    return level;
 
1912
}
 
1913
 
 
1914
static int msmpeg4_decode_motion(MpegEncContext * s,
 
1915
                                 int *mx_ptr, int *my_ptr)
 
1916
{
 
1917
    MVTable *mv;
 
1918
    int code, mx, my;
 
1919
 
 
1920
    mv = &mv_tables[s->mv_table_index];
 
1921
 
 
1922
    code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
 
1923
    if (code < 0){
 
1924
        av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
 
1925
        return -1;
 
1926
    }
 
1927
    if (code == mv->n) {
 
1928
//printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
 
1929
        mx = get_bits(&s->gb, 6);
 
1930
        my = get_bits(&s->gb, 6);
 
1931
    } else {
 
1932
        mx = mv->table_mvx[code];
 
1933
        my = mv->table_mvy[code];
 
1934
    }
 
1935
 
 
1936
    mx += *mx_ptr - 32;
 
1937
    my += *my_ptr - 32;
 
1938
    /* WARNING : they do not do exactly modulo encoding */
 
1939
    if (mx <= -64)
 
1940
        mx += 64;
 
1941
    else if (mx >= 64)
 
1942
        mx -= 64;
 
1943
 
 
1944
    if (my <= -64)
 
1945
        my += 64;
 
1946
    else if (my >= 64)
 
1947
        my -= 64;
 
1948
    *mx_ptr = mx;
 
1949
    *my_ptr = my;
 
1950
    return 0;
 
1951
}
 
1952
 
 
1953
/* cleanest way to support it
 
1954
 * there is too much shared between versions so that we cant have 1 file per version & 1 common
 
1955
 * as allmost everything would be in the common file
 
1956
 */
 
1957
#include "wmv2.c"