blob: 23e4c1ec8b4ba786ec4e35454c98c6458380ce3a [file] [log] [blame]
Fabrice Bellardde6d9b62001-07-22 14:18:561/*
2 * MSMPEG4 backend for ffmpeg encoder and decoder
Fabrice Bellardff4ec492002-05-25 22:45:333 * Copyright (c) 2001 Fabrice Bellard.
Michael Niedermayer8f2ab832004-01-10 16:04:554 * Copyright (c) 2002-2004 Michael Niedermayer <[email protected]>
Fabrice Bellardde6d9b62001-07-22 14:18:565 *
Fabrice Bellardff4ec492002-05-25 22:45:336 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
Fabrice Bellardde6d9b62001-07-22 14:18:5610 *
Fabrice Bellardff4ec492002-05-25 22:45:3311 * This library is distributed in the hope that it will be useful,
Fabrice Bellardde6d9b62001-07-22 14:18:5612 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellardff4ec492002-05-25 22:45:3313 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
Fabrice Bellardde6d9b62001-07-22 14:18:5615 *
Fabrice Bellardff4ec492002-05-25 22:45:3316 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Michael Niedermayer92ba5ff2002-05-21 23:13:5719 *
Michael Niedermayer287229e2002-06-02 12:22:3020 * msmpeg4v1 & v2 stuff by Michael Niedermayer <[email protected]>
Fabrice Bellardde6d9b62001-07-22 14:18:5621 */
Michael Niedermayer983e3242003-03-06 11:32:0422
23/**
24 * @file msmpeg4.c
25 * MSMPEG4 backend for ffmpeg encoder and decoder.
26 */
27
Fabrice Bellard6000abf2002-05-18 23:03:2928#include "avcodec.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5629#include "dsputil.h"
30#include "mpegvideo.h"
Michael Niedermayer92ba5ff2002-05-21 23:13:5731
Fabrice Bellardde6d9b62001-07-22 14:18:5632/*
33 * You can also call this codec : MPEG4 with a twist !
34 *
35 * TODO:
36 * - (encoding) select best mv table (two choices)
37 * - (encoding) select best vlc/dc table
Fabrice Bellardde6d9b62001-07-22 14:18:5638 */
39//#define DEBUG
40
Michael Niedermayer08dce7b2002-07-10 20:05:4241#define DC_VLC_BITS 9
42#define CBPY_VLC_BITS 6
43#define INTER_INTRA_VLC_BITS 3
44#define V1_INTRA_CBPC_VLC_BITS 6
45#define V1_INTER_CBPC_VLC_BITS 6
46#define V2_INTRA_CBPC_VLC_BITS 3
47#define V2_MB_TYPE_VLC_BITS 7
48#define MV_VLC_BITS 9
49#define V2_MV_VLC_BITS 9
50#define TEX_VLC_BITS 9
51#define MB_NON_INTRA_VLC_BITS 9
52#define MB_INTRA_VLC_BITS 9
53
Michael Niedermayer05174fd2002-07-22 08:15:2754#define II_BITRATE 128*1024
55#define MBAC_BITRATE 50*1024
56
Michael Niedermayer1457ab52002-12-27 23:51:4657#define DEFAULT_INTER_INDEX 3
58
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4859static uint32_t v2_dc_lum_table[512][2];
60static uint32_t v2_dc_chroma_table[512][2];
Michael Niedermayer84afee32002-04-05 04:09:0461
Michael Niedermayerf5957f32002-06-18 00:49:0062static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
63static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:4664 int n, int coded, const uint8_t *scantable);
Fabrice Bellardde6d9b62001-07-22 14:18:5665static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
66static int msmpeg4_decode_motion(MpegEncContext * s,
67 int *mx_ptr, int *my_ptr);
Michael Niedermayer3825cd12002-04-05 21:04:0968static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
Falk Hüffner20695ec2002-06-03 11:16:1169static void init_h263_dc_for_msmpeg4(void);
Michael Niedermayerde0f2f42002-07-07 08:34:4670static inline void msmpeg4_memsetw(short *tab, int val, int n);
Wolfgang Hesseler76042462003-02-16 23:05:3871#ifdef CONFIG_ENCODERS
Michael Niedermayer62959862002-08-09 00:13:5472static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
Wolfgang Hesseler76042462003-02-16 23:05:3873#endif //CONFIG_ENCODERS
Michael Niedermayer4d2858d2002-10-13 13:16:0474static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
75static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Michael Niedermayer1457ab52002-12-27 23:51:4676static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Fabrice Bellardde6d9b62001-07-22 14:18:5677
anonymous0d33db82005-01-30 16:34:5778/* vc9 externs */
79extern uint8_t wmv3_dc_scale_table[32];
Michael Niedermayer62959862002-08-09 00:13:5480
Fabrice Bellardde6d9b62001-07-22 14:18:5681#ifdef DEBUG
82int intra_count = 0;
83int frame_count = 0;
84#endif
Fabrice Bellardde6d9b62001-07-22 14:18:5685
86#include "msmpeg4data.h"
87
Michael Niedermayer2a250222003-06-22 11:08:2288#ifdef CONFIG_ENCODERS //strangely gcc includes this even if its not references
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4889static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
Michael Niedermayer2a250222003-06-22 11:08:2290#endif //CONFIG_ENCODERS
Michael Niedermayer62959862002-08-09 00:13:5491
Fabrice Bellardde6d9b62001-07-22 14:18:5692#ifdef STATS
93
94const char *st_names[ST_NB] = {
95 "unknown",
96 "dc",
97 "intra_ac",
98 "inter_ac",
99 "intra_mb",
100 "inter_mb",
101 "mv",
102};
103
104int st_current_index = 0;
105unsigned int st_bit_counts[ST_NB];
106unsigned int st_out_bit_counts[ST_NB];
107
108#define set_stat(var) st_current_index = var;
109
110void print_stats(void)
111{
112 unsigned int total;
113 int i;
114
115 printf("Input:\n");
116 total = 0;
117 for(i=0;i<ST_NB;i++)
118 total += st_bit_counts[i];
119 if (total == 0)
120 total = 1;
121 for(i=0;i<ST_NB;i++) {
122 printf("%-10s : %10.1f %5.1f%%\n",
123 st_names[i],
124 (double)st_bit_counts[i] / 8.0,
125 (double)st_bit_counts[i] * 100.0 / total);
126 }
127 printf("%-10s : %10.1f %5.1f%%\n",
128 "total",
129 (double)total / 8.0,
130 100.0);
131
132 printf("Output:\n");
133 total = 0;
134 for(i=0;i<ST_NB;i++)
135 total += st_out_bit_counts[i];
136 if (total == 0)
137 total = 1;
138 for(i=0;i<ST_NB;i++) {
139 printf("%-10s : %10.1f %5.1f%%\n",
140 st_names[i],
141 (double)st_out_bit_counts[i] / 8.0,
142 (double)st_out_bit_counts[i] * 100.0 / total);
143 }
144 printf("%-10s : %10.1f %5.1f%%\n",
145 "total",
146 (double)total / 8.0,
147 100.0);
148}
149
150#else
151
152#define set_stat(var)
153
154#endif
155
Michael Niedermayerf5957f32002-06-18 00:49:00156static void common_init(MpegEncContext * s)
157{
158 static int inited=0;
159
160 switch(s->msmpeg4_version){
161 case 1:
162 case 2:
163 s->y_dc_scale_table=
164 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
165 break;
166 case 3:
167 if(s->workaround_bugs){
168 s->y_dc_scale_table= old_ff_y_dc_scale_table;
169 s->c_dc_scale_table= old_ff_c_dc_scale_table;
170 } else{
171 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
172 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
173 }
174 break;
175 case 4:
Michael Niedermayer1457ab52002-12-27 23:51:46176 case 5:
Michael Niedermayerf5957f32002-06-18 00:49:00177 s->y_dc_scale_table= wmv1_y_dc_scale_table;
178 s->c_dc_scale_table= wmv1_c_dc_scale_table;
179 break;
anonymous0d33db82005-01-30 16:34:57180 case 6:
181 s->y_dc_scale_table= wmv3_dc_scale_table;
182 s->c_dc_scale_table= wmv3_dc_scale_table;
183 break;
184
Michael Niedermayerf5957f32002-06-18 00:49:00185 }
186
Michael Niedermayer2ad15162002-09-29 22:44:22187
Michael Niedermayer1457ab52002-12-27 23:51:46188 if(s->msmpeg4_version>=4){
Michael Niedermayer3d2e8cc2003-05-19 13:30:59189 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]);
190 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
191 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
192 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]);
Michael Niedermayerf5957f32002-06-18 00:49:00193 }
Michael Niedermayer2ad15162002-09-29 22:44:22194 //Note the default tables are set in common_init in mpegvideo.c
Michael Niedermayerf5957f32002-06-18 00:49:00195
196 if(!inited){
Michael Niedermayerf5957f32002-06-18 00:49:00197 inited=1;
198
199 init_h263_dc_for_msmpeg4();
Michael Niedermayerf5957f32002-06-18 00:49:00200 }
201}
202
Wolfgang Hesseler76042462003-02-16 23:05:38203#ifdef CONFIG_ENCODERS
204
Fabrice Bellardde6d9b62001-07-22 14:18:56205/* build the table which associate a (x,y) motion vector to a vlc */
206static void init_mv_table(MVTable *tab)
207{
208 int i, x, y;
209
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48210 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
Fabrice Bellardde6d9b62001-07-22 14:18:56211 /* mark all entries as not used */
212 for(i=0;i<4096;i++)
213 tab->table_mv_index[i] = tab->n;
214
215 for(i=0;i<tab->n;i++) {
216 x = tab->table_mvx[i];
217 y = tab->table_mvy[i];
218 tab->table_mv_index[(x << 6) | y] = i;
219 }
220}
221
222static void code012(PutBitContext *pb, int n)
223{
224 if (n == 0) {
225 put_bits(pb, 1, 0);
226 } else {
227 put_bits(pb, 1, 1);
228 put_bits(pb, 1, (n >= 2));
229 }
230}
231
Michael Niedermayerf5957f32002-06-18 00:49:00232void ff_msmpeg4_encode_init(MpegEncContext *s)
233{
234 static int init_done=0;
235 int i;
236
237 common_init(s);
238 if(s->msmpeg4_version>=4){
239 s->min_qcoeff= -255;
240 s->max_qcoeff= 255;
241 }
242
243 if (!init_done) {
244 /* init various encoding tables */
245 init_done = 1;
246 init_mv_table(&mv_tables[0]);
247 init_mv_table(&mv_tables[1]);
248 for(i=0;i<NB_RL_TABLES;i++)
Burkhard Plaum073c2592004-11-27 18:10:06249 init_rl(&rl_table[i], 1);
Michael Niedermayer62959862002-08-09 00:13:54250
251 for(i=0; i<NB_RL_TABLES; i++){
252 int level;
253 for(level=0; level<=MAX_LEVEL; level++){
254 int run;
255 for(run=0; run<=MAX_RUN; run++){
256 int last;
257 for(last=0; last<2; last++){
Michael Niedermayer060f89b2002-10-27 12:20:58258 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
Michael Niedermayer62959862002-08-09 00:13:54259 }
260 }
261 }
262 }
Michael Niedermayerf5957f32002-06-18 00:49:00263 }
264}
265
266static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
267 int size=0;
268 int code;
269 int run_diff= intra ? 0 : 1;
270
271 code = get_rl_index(rl, last, run, level);
272 size+= rl->table_vlc[code][1];
273 if (code == rl->n) {
274 int level1, run1;
275
276 level1 = level - rl->max_level[last][run];
277 if (level1 < 1)
278 goto esc2;
279 code = get_rl_index(rl, last, run, level1);
280 if (code == rl->n) {
281 esc2:
282 size++;
283 if (level > MAX_LEVEL)
284 goto esc3;
285 run1 = run - rl->max_run[last][level] - run_diff;
286 if (run1 < 0)
287 goto esc3;
288 code = get_rl_index(rl, last, run1, level);
289 if (code == rl->n) {
290 esc3:
291 /* third escape */
292 size+=1+1+6+8;
293 } else {
294 /* second escape */
295 size+= 1+1+ rl->table_vlc[code][1];
296 }
297 } else {
298 /* first escape */
299 size+= 1+1+ rl->table_vlc[code][1];
300 }
301 } else {
302 size++;
303 }
304 return size;
305}
306
307static void find_best_tables(MpegEncContext * s)
308{
309 int i;
310 int best =-1, best_size =9999999;
311 int chroma_best=-1, best_chroma_size=9999999;
Michael Niedermayer62959862002-08-09 00:13:54312
Michael Niedermayerf5957f32002-06-18 00:49:00313 for(i=0; i<3; i++){
314 int level;
315 int chroma_size=0;
316 int size=0;
317
318 if(i>0){// ;)
319 size++;
320 chroma_size++;
321 }
322 for(level=0; level<=MAX_LEVEL; level++){
323 int run;
324 for(run=0; run<=MAX_RUN; run++){
325 int last;
Michael Niedermayer62959862002-08-09 00:13:54326 const int last_size= size + chroma_size;
Michael Niedermayerf5957f32002-06-18 00:49:00327 for(last=0; last<2; last++){
328 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
329 int intra_luma_count = s->ac_stats[1][0][level][run][last];
330 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
Michael Niedermayer62959862002-08-09 00:13:54331
Michael Niedermayerf5957f32002-06-18 00:49:00332 if(s->pict_type==I_TYPE){
Michael Niedermayer060f89b2002-10-27 12:20:58333 size += intra_luma_count *rl_length[i ][level][run][last];
334 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00335 }else{
Michael Niedermayer060f89b2002-10-27 12:20:58336 size+= intra_luma_count *rl_length[i ][level][run][last]
337 +intra_chroma_count*rl_length[i+3][level][run][last]
338 +inter_count *rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00339 }
340 }
Michael Niedermayer62959862002-08-09 00:13:54341 if(last_size == size+chroma_size) break;
Michael Niedermayerf5957f32002-06-18 00:49:00342 }
343 }
344 if(size<best_size){
345 best_size= size;
346 best= i;
347 }
348 if(chroma_size<best_chroma_size){
349 best_chroma_size= chroma_size;
350 chroma_best= i;
351 }
352 }
Michael Niedermayer62959862002-08-09 00:13:54353
Michael Niedermayerf5957f32002-06-18 00:49:00354// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
355// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
356
357 if(s->pict_type==P_TYPE) chroma_best= best;
358
359 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
360
361 s->rl_table_index = best;
362 s->rl_chroma_table_index= chroma_best;
363
364 if(s->pict_type != s->last_non_b_pict_type){
365 s->rl_table_index= 2;
366 if(s->pict_type==I_TYPE)
367 s->rl_chroma_table_index= 1;
368 else
369 s->rl_chroma_table_index= 2;
370 }
371
372}
373
Michael Niedermayer287229e2002-06-02 12:22:30374/* write MSMPEG4 compatible frame header */
Fabrice Bellardde6d9b62001-07-22 14:18:56375void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
376{
Michael Niedermayerf5957f32002-06-18 00:49:00377 find_best_tables(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56378
379 align_put_bits(&s->pb);
Fabrice Bellardde6d9b62001-07-22 14:18:56380 put_bits(&s->pb, 2, s->pict_type - 1);
381
382 put_bits(&s->pb, 5, s->qscale);
Michael Niedermayerf5957f32002-06-18 00:49:00383 if(s->msmpeg4_version<=2){
384 s->rl_table_index = 2;
385 s->rl_chroma_table_index = 2;
386 }
Michael Niedermayer3825cd12002-04-05 21:04:09387
Fabrice Bellardde6d9b62001-07-22 14:18:56388 s->dc_table_index = 1;
389 s->mv_table_index = 1; /* only if P frame */
390 s->use_skip_mb_code = 1; /* only if P frame */
Michael Niedermayerf5957f32002-06-18 00:49:00391 s->per_mb_rl_table = 0;
Michael Niedermayerfc48cba2002-10-20 17:02:41392 if(s->msmpeg4_version==4)
393 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE);
Michael Niedermayer1457ab52002-12-27 23:51:46394//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
Michael Niedermayerf5957f32002-06-18 00:49:00395
Fabrice Bellardde6d9b62001-07-22 14:18:56396 if (s->pict_type == I_TYPE) {
Michael Niedermayerde0f2f42002-07-07 08:34:46397 s->slice_height= s->mb_height/1;
398 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
Michael Niedermayerf5957f32002-06-18 00:49:00399
400 if(s->msmpeg4_version==4){
401 msmpeg4_encode_ext_header(s);
Michael Niedermayer05174fd2002-07-22 08:15:27402 if(s->bit_rate>MBAC_BITRATE)
Michael Niedermayerde0f2f42002-07-07 08:34:46403 put_bits(&s->pb, 1, s->per_mb_rl_table);
Michael Niedermayerf5957f32002-06-18 00:49:00404 }
Fabrice Bellardde6d9b62001-07-22 14:18:56405
Michael Niedermayer287229e2002-06-02 12:22:30406 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00407 if(!s->per_mb_rl_table){
408 code012(&s->pb, s->rl_chroma_table_index);
409 code012(&s->pb, s->rl_table_index);
410 }
Fabrice Bellardde6d9b62001-07-22 14:18:56411
Michael Niedermayer3825cd12002-04-05 21:04:09412 put_bits(&s->pb, 1, s->dc_table_index);
413 }
Fabrice Bellardde6d9b62001-07-22 14:18:56414 } else {
415 put_bits(&s->pb, 1, s->use_skip_mb_code);
416
Michael Niedermayer05174fd2002-07-22 08:15:27417 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
Michael Niedermayerf5957f32002-06-18 00:49:00418 put_bits(&s->pb, 1, s->per_mb_rl_table);
419
Michael Niedermayer287229e2002-06-02 12:22:30420 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00421 if(!s->per_mb_rl_table)
422 code012(&s->pb, s->rl_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56423
Michael Niedermayer3825cd12002-04-05 21:04:09424 put_bits(&s->pb, 1, s->dc_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56425
Michael Niedermayer3825cd12002-04-05 21:04:09426 put_bits(&s->pb, 1, s->mv_table_index);
427 }
Fabrice Bellardde6d9b62001-07-22 14:18:56428 }
429
Michael Niedermayerf5957f32002-06-18 00:49:00430 s->esc3_level_length= 0;
431 s->esc3_run_length= 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56432
433#ifdef DEBUG
434 intra_count = 0;
435 printf("*****frame %d:\n", frame_count++);
436#endif
437}
438
Michael Niedermayerae404842002-01-15 22:22:41439void msmpeg4_encode_ext_header(MpegEncContext * s)
440{
Michael Niedermayer14bea432003-03-12 15:16:19441 put_bits(&s->pb, 5, s->avctx->frame_rate / s->avctx->frame_rate_base); //yes 29.97 -> 29
Michael Niedermayerae404842002-01-15 22:22:41442
Michael Niedermayerb8a78f42002-11-10 11:46:59443 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
Michael Niedermayerae404842002-01-15 22:22:41444
Michael Niedermayer1f9aea92003-04-01 15:38:01445 if(s->msmpeg4_version>=3)
Michael Niedermayer287229e2002-06-02 12:22:30446 put_bits(&s->pb, 1, s->flipflop_rounding);
Michael Niedermayer1f9aea92003-04-01 15:38:01447 else
448 assert(s->flipflop_rounding==0);
Michael Niedermayerae404842002-01-15 22:22:41449}
450
Wolfgang Hesseler76042462003-02-16 23:05:38451#endif //CONFIG_ENCODERS
452
Fabrice Bellardde6d9b62001-07-22 14:18:56453/* predict coded block */
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48454static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56455{
Michael Niedermayerdbbe8992002-03-29 01:53:59456 int xy, wrap, pred, a, b, c;
Fabrice Bellardde6d9b62001-07-22 14:18:56457
Michael Niedermayerdbbe8992002-03-29 01:53:59458 xy = s->block_index[n];
Michael Niedermayer137c8462004-04-16 01:01:45459 wrap = s->b8_stride;
Fabrice Bellardde6d9b62001-07-22 14:18:56460
461 /* B C
462 * A X
463 */
Michael Niedermayerdbbe8992002-03-29 01:53:59464 a = s->coded_block[xy - 1 ];
465 b = s->coded_block[xy - 1 - wrap];
466 c = s->coded_block[xy - wrap];
Fabrice Bellardde6d9b62001-07-22 14:18:56467
468 if (b == c) {
469 pred = a;
470 } else {
471 pred = c;
472 }
473
474 /* store value */
Michael Niedermayerdbbe8992002-03-29 01:53:59475 *coded_block_ptr = &s->coded_block[xy];
Fabrice Bellardde6d9b62001-07-22 14:18:56476
477 return pred;
478}
479
Wolfgang Hesseler76042462003-02-16 23:05:38480#ifdef CONFIG_ENCODERS
481
Fabrice Bellardde6d9b62001-07-22 14:18:56482static void msmpeg4_encode_motion(MpegEncContext * s,
483 int mx, int my)
484{
485 int code;
486 MVTable *mv;
487
488 /* modulo encoding */
489 /* WARNING : you cannot reach all the MVs even with the modulo
490 encoding. This is a somewhat strange compromise they took !!! */
491 if (mx <= -64)
492 mx += 64;
493 else if (mx >= 64)
494 mx -= 64;
495 if (my <= -64)
496 my += 64;
497 else if (my >= 64)
498 my -= 64;
499
500 mx += 32;
501 my += 32;
502#if 0
503 if ((unsigned)mx >= 64 ||
504 (unsigned)my >= 64)
505 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
506#endif
507 mv = &mv_tables[s->mv_table_index];
508
509 code = mv->table_mv_index[(mx << 6) | my];
510 set_stat(ST_MV);
511 put_bits(&s->pb,
512 mv->table_mv_bits[code],
513 mv->table_mv_code[code]);
514 if (code == mv->n) {
515 /* escape : code litterally */
516 put_bits(&s->pb, 6, mx);
517 put_bits(&s->pb, 6, my);
518 }
519}
520
Michael Niedermayerde0f2f42002-07-07 08:34:46521static inline void handle_slices(MpegEncContext *s){
522 if (s->mb_x == 0) {
523 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
Michael Niedermayer28269842003-01-09 11:37:08524 if(s->msmpeg4_version < 4){
Michael Niedermayer4d2858d2002-10-13 13:16:04525 ff_mpeg4_clean_buffers(s);
Michael Niedermayerde0f2f42002-07-07 08:34:46526 }
527 s->first_slice_line = 1;
528 } else {
529 s->first_slice_line = 0;
530 }
531 }
532}
533
Fabrice Bellardde6d9b62001-07-22 14:18:56534void msmpeg4_encode_mb(MpegEncContext * s,
535 DCTELEM block[6][64],
536 int motion_x, int motion_y)
537{
538 int cbp, coded_cbp, i;
539 int pred_x, pred_y;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48540 uint8_t *coded_block;
Fabrice Bellardde6d9b62001-07-22 14:18:56541
Michael Niedermayerde0f2f42002-07-07 08:34:46542 handle_slices(s);
543
Fabrice Bellardde6d9b62001-07-22 14:18:56544 if (!s->mb_intra) {
545 /* compute cbp */
546 set_stat(ST_INTER_MB);
547 cbp = 0;
548 for (i = 0; i < 6; i++) {
549 if (s->block_last_index[i] >= 0)
550 cbp |= 1 << (5 - i);
551 }
552 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
553 /* skip macroblock */
554 put_bits(&s->pb, 1, 1);
Michael Niedermayer4d2a4832003-04-02 09:57:34555 s->last_bits++;
556 s->misc_bits++;
Michael Niedermayera0c83172003-04-25 19:46:00557 s->skip_count++;
Michael Niedermayer4d2a4832003-04-02 09:57:34558
Fabrice Bellardde6d9b62001-07-22 14:18:56559 return;
560 }
561 if (s->use_skip_mb_code)
562 put_bits(&s->pb, 1, 0); /* mb coded */
563
Michael Niedermayer287229e2002-06-02 12:22:30564 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09565 put_bits(&s->pb,
566 v2_mb_type[cbp&3][1],
567 v2_mb_type[cbp&3][0]);
568 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
569 else coded_cbp= cbp;
Fabrice Bellardde6d9b62001-07-22 14:18:56570
Michael Niedermayer3825cd12002-04-05 21:04:09571 put_bits(&s->pb,
572 cbpy_tab[coded_cbp>>2][1],
573 cbpy_tab[coded_cbp>>2][0]);
Michael Niedermayer4d2a4832003-04-02 09:57:34574
575 s->misc_bits += get_bits_diff(s);
576
Michael Niedermayer137c8462004-04-16 01:01:45577 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
Michael Niedermayer3825cd12002-04-05 21:04:09578 msmpeg4v2_encode_motion(s, motion_x - pred_x);
579 msmpeg4v2_encode_motion(s, motion_y - pred_y);
580 }else{
581 put_bits(&s->pb,
582 table_mb_non_intra[cbp + 64][1],
583 table_mb_non_intra[cbp + 64][0]);
584
Michael Niedermayer4d2a4832003-04-02 09:57:34585 s->misc_bits += get_bits_diff(s);
586
Michael Niedermayer3825cd12002-04-05 21:04:09587 /* motion vector */
Michael Niedermayer137c8462004-04-16 01:01:45588 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
Michael Niedermayer3825cd12002-04-05 21:04:09589 msmpeg4_encode_motion(s, motion_x - pred_x,
590 motion_y - pred_y);
591 }
Michael Niedermayer4d2a4832003-04-02 09:57:34592
593 s->mv_bits += get_bits_diff(s);
594
595 for (i = 0; i < 6; i++) {
596 msmpeg4_encode_block(s, block[i], i);
597 }
598 s->p_tex_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56599 } else {
600 /* compute cbp */
601 cbp = 0;
602 coded_cbp = 0;
603 for (i = 0; i < 6; i++) {
604 int val, pred;
605 val = (s->block_last_index[i] >= 1);
606 cbp |= val << (5 - i);
607 if (i < 4) {
608 /* predict value for close blocks only for luma */
609 pred = coded_block_pred(s, i, &coded_block);
610 *coded_block = val;
611 val = val ^ pred;
612 }
613 coded_cbp |= val << (5 - i);
614 }
615#if 0
616 if (coded_cbp)
617 printf("cbp=%x %x\n", cbp, coded_cbp);
618#endif
619
Michael Niedermayer287229e2002-06-02 12:22:30620 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09621 if (s->pict_type == I_TYPE) {
622 put_bits(&s->pb,
623 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
624 } else {
625 if (s->use_skip_mb_code)
626 put_bits(&s->pb, 1, 0); /* mb coded */
627 put_bits(&s->pb,
628 v2_mb_type[(cbp&3) + 4][1],
629 v2_mb_type[(cbp&3) + 4][0]);
630 }
631 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
632 put_bits(&s->pb,
633 cbpy_tab[cbp>>2][1],
634 cbpy_tab[cbp>>2][0]);
635 }else{
636 if (s->pict_type == I_TYPE) {
637 set_stat(ST_INTRA_MB);
638 put_bits(&s->pb,
anonymous0d33db82005-01-30 16:34:57639 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09640 } else {
641 if (s->use_skip_mb_code)
642 put_bits(&s->pb, 1, 0); /* mb coded */
643 put_bits(&s->pb,
644 table_mb_non_intra[cbp][1],
645 table_mb_non_intra[cbp][0]);
646 }
Fabrice Bellardde6d9b62001-07-22 14:18:56647 set_stat(ST_INTRA_MB);
Michael Niedermayer3825cd12002-04-05 21:04:09648 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Michael Niedermayer05174fd2002-07-22 08:15:27649 if(s->inter_intra_pred){
650 s->h263_aic_dir=0;
651 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
652 }
Fabrice Bellardde6d9b62001-07-22 14:18:56653 }
Michael Niedermayer4d2a4832003-04-02 09:57:34654 s->misc_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56655
Michael Niedermayer4d2a4832003-04-02 09:57:34656 for (i = 0; i < 6; i++) {
657 msmpeg4_encode_block(s, block[i], i);
658 }
659 s->i_tex_bits += get_bits_diff(s);
Michael Niedermayera0c83172003-04-25 19:46:00660 s->i_count++;
Fabrice Bellardde6d9b62001-07-22 14:18:56661 }
662}
663
Wolfgang Hesseler76042462003-02-16 23:05:38664#endif //CONFIG_ENCODERS
665
Michael Niedermayerf5957f32002-06-18 00:49:00666static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48667 int32_t **dc_val_ptr)
Michael Niedermayer287229e2002-06-02 12:22:30668{
669 int i;
670
671 if (n < 4) {
672 i= 0;
673 } else {
674 i= n-3;
675 }
676
677 *dc_val_ptr= &s->last_dc[i];
678 return s->last_dc[i];
679}
680
Michael Niedermayerde0f2f42002-07-07 08:34:46681static int get_dc(uint8_t *src, int stride, int scale)
682{
683 int y;
684 int sum=0;
685 for(y=0; y<8; y++){
686 int x;
687 for(x=0; x<8; x++){
688 sum+=src[x + y*stride];
689 }
690 }
BEROd4961b32003-05-14 15:12:13691 return FASTDIV((sum + (scale>>1)), scale);
Michael Niedermayerde0f2f42002-07-07 08:34:46692}
693
Fabrice Bellardde6d9b62001-07-22 14:18:56694/* dir = 0: left, dir = 1: top prediction */
Michael Niedermayerf5957f32002-06-18 00:49:00695static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48696 uint16_t **dc_val_ptr, int *dir_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56697{
Michael Niedermayerdbbe8992002-03-29 01:53:59698 int a, b, c, wrap, pred, scale;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48699 int16_t *dc_val;
Fabrice Bellardde6d9b62001-07-22 14:18:56700
701 /* find prediction */
702 if (n < 4) {
Fabrice Bellardde6d9b62001-07-22 14:18:56703 scale = s->y_dc_scale;
704 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:56705 scale = s->c_dc_scale;
706 }
Michael Niedermayer287229e2002-06-02 12:22:30707
Michael Niedermayerdbbe8992002-03-29 01:53:59708 wrap = s->block_wrap[n];
709 dc_val= s->dc_val[0] + s->block_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56710
711 /* B C
712 * A X
713 */
Michael Niedermayerdbbe8992002-03-29 01:53:59714 a = dc_val[ - 1];
715 b = dc_val[ - 1 - wrap];
716 c = dc_val[ - wrap];
Michael Niedermayer4d2858d2002-10-13 13:16:04717
Michael Niedermayer28269842003-01-09 11:37:08718 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
Michael Niedermayer4d2858d2002-10-13 13:16:04719 b=c=1024;
720 }
Fabrice Bellardde6d9b62001-07-22 14:18:56721
722 /* XXX: the following solution consumes divisions, but it does not
723 necessitate to modify mpegvideo.c. The problem comes from the
724 fact they decided to store the quantized DC (which would lead
725 to problems if Q could vary !) */
Aurelien Jacobs053dea12004-10-11 02:19:29726#if (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC
Michael Niedermayer6f903d82002-01-14 04:34:52727 asm volatile(
728 "movl %3, %%eax \n\t"
729 "shrl $1, %%eax \n\t"
730 "addl %%eax, %2 \n\t"
731 "addl %%eax, %1 \n\t"
732 "addl %0, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23733 "mull %4 \n\t"
734 "movl %%edx, %0 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52735 "movl %1, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23736 "mull %4 \n\t"
737 "movl %%edx, %1 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52738 "movl %2, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23739 "mull %4 \n\t"
740 "movl %%edx, %2 \n\t"
Michael Niedermayerfa778d52002-02-09 00:38:44741 : "+b" (a), "+c" (b), "+D" (c)
742 : "g" (scale), "S" (inverse[scale])
Michael Niedermayer6f903d82002-01-14 04:34:52743 : "%eax", "%edx"
744 );
Zdenek Kabelac320680d2002-01-28 18:06:28745#else
746 /* #elif defined (ARCH_ALPHA) */
Nick Kurshev1e98dff2002-01-20 14:48:02747 /* Divisions are extremely costly on Alpha; optimize the most
Zdenek Kabelac320680d2002-01-28 18:06:28748 common case. But they are costly everywhere...
749 */
Nick Kurshev1e98dff2002-01-20 14:48:02750 if (scale == 8) {
751 a = (a + (8 >> 1)) / 8;
752 b = (b + (8 >> 1)) / 8;
753 c = (c + (8 >> 1)) / 8;
754 } else {
BEROd4961b32003-05-14 15:12:13755 a = FASTDIV((a + (scale >> 1)), scale);
756 b = FASTDIV((b + (scale >> 1)), scale);
757 c = FASTDIV((c + (scale >> 1)), scale);
Nick Kurshev1e98dff2002-01-20 14:48:02758 }
Michael Niedermayer6f903d82002-01-14 04:34:52759#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56760 /* XXX: WARNING: they did not choose the same test as MPEG4. This
761 is very important ! */
Michael Niedermayerbd5e1c72002-06-22 15:52:25762 if(s->msmpeg4_version>3){
Michael Niedermayerde0f2f42002-07-07 08:34:46763 if(s->inter_intra_pred){
764 uint8_t *dest;
765 int wrap;
766
767 if(n==1){
768 pred=a;
769 *dir_ptr = 0;
770 }else if(n==2){
771 pred=c;
772 *dir_ptr = 1;
773 }else if(n==3){
774 if (abs(a - b) < abs(b - c)) {
775 pred = c;
776 *dir_ptr = 1;
777 } else {
778 pred = a;
779 *dir_ptr = 0;
780 }
781 }else{
782 if(n<4){
783 wrap= s->linesize;
Michael Niedermayer1e491e22002-12-04 10:04:03784 dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46785 }else{
Michael Niedermayer0fd90452002-07-15 14:15:10786 wrap= s->uvlinesize;
Michael Niedermayer1e491e22002-12-04 10:04:03787 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46788 }
789 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
790 else a= get_dc(dest-8, wrap, scale*8);
791 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
792 else c= get_dc(dest-8*wrap, wrap, scale*8);
793
794 if (s->h263_aic_dir==0) {
795 pred= a;
796 *dir_ptr = 0;
797 }else if (s->h263_aic_dir==1) {
798 if(n==0){
799 pred= c;
800 *dir_ptr = 1;
801 }else{
802 pred= a;
803 *dir_ptr = 0;
804 }
805 }else if (s->h263_aic_dir==2) {
806 if(n==0){
807 pred= a;
808 *dir_ptr = 0;
809 }else{
810 pred= c;
811 *dir_ptr = 1;
812 }
813 } else {
814 pred= c;
815 *dir_ptr = 1;
816 }
817 }
818 }else{
819 if (abs(a - b) < abs(b - c)) {
820 pred = c;
821 *dir_ptr = 1;
822 } else {
823 pred = a;
824 *dir_ptr = 0;
825 }
Michael Niedermayerbd5e1c72002-06-22 15:52:25826 }
827 }else{
828 if (abs(a - b) <= abs(b - c)) {
829 pred = c;
830 *dir_ptr = 1;
831 } else {
832 pred = a;
833 *dir_ptr = 0;
834 }
Fabrice Bellardde6d9b62001-07-22 14:18:56835 }
836
837 /* update predictor */
Michael Niedermayerdbbe8992002-03-29 01:53:59838 *dc_val_ptr = &dc_val[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56839 return pred;
840}
841
842#define DC_MAX 119
843
844static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
845{
846 int sign, code;
847 int pred;
Fabrice Bellardde6d9b62001-07-22 14:18:56848
Michael Niedermayer287229e2002-06-02 12:22:30849 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48850 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:30851 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
852
853 /* update predictor */
854 *dc_val= level;
855 }else{
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48856 uint16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25857 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56858
Michael Niedermayer287229e2002-06-02 12:22:30859 /* update predictor */
860 if (n < 4) {
861 *dc_val = level * s->y_dc_scale;
862 } else {
863 *dc_val = level * s->c_dc_scale;
864 }
Fabrice Bellardde6d9b62001-07-22 14:18:56865 }
866
867 /* do the prediction */
868 level -= pred;
869
Michael Niedermayer287229e2002-06-02 12:22:30870 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09871 if (n < 4) {
872 put_bits(&s->pb,
873 v2_dc_lum_table[level+256][1],
874 v2_dc_lum_table[level+256][0]);
875 }else{
876 put_bits(&s->pb,
877 v2_dc_chroma_table[level+256][1],
878 v2_dc_chroma_table[level+256][0]);
879 }
880 }else{
881 sign = 0;
882 if (level < 0) {
883 level = -level;
884 sign = 1;
885 }
886 code = level;
887 if (code > DC_MAX)
888 code = DC_MAX;
Fabrice Bellardde6d9b62001-07-22 14:18:56889
Michael Niedermayer3825cd12002-04-05 21:04:09890 if (s->dc_table_index == 0) {
891 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35892 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09893 } else {
anonymous0c040aa2005-01-26 12:01:35894 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09895 }
Fabrice Bellardde6d9b62001-07-22 14:18:56896 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09897 if (n < 4) {
anonymous0c040aa2005-01-26 12:01:35898 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09899 } else {
anonymous0c040aa2005-01-26 12:01:35900 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]);
Michael Niedermayer3825cd12002-04-05 21:04:09901 }
Fabrice Bellardde6d9b62001-07-22 14:18:56902 }
Michael Niedermayer3825cd12002-04-05 21:04:09903
904 if (code == DC_MAX)
905 put_bits(&s->pb, 8, level);
906
907 if (level != 0) {
908 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56909 }
910 }
Fabrice Bellardde6d9b62001-07-22 14:18:56911}
912
913/* Encoding of a block. Very similar to MPEG4 except for a different
914 escape coding (same as H263) and more vlc tables.
915 */
Michael Niedermayerf5957f32002-06-18 00:49:00916static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56917{
918 int level, run, last, i, j, last_index;
919 int last_non_zero, sign, slevel;
920 int code, run_diff, dc_pred_dir;
921 const RLTable *rl;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48922 const uint8_t *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56923
924 if (s->mb_intra) {
925 set_stat(ST_DC);
926 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
927 i = 1;
928 if (n < 4) {
929 rl = &rl_table[s->rl_table_index];
930 } else {
931 rl = &rl_table[3 + s->rl_chroma_table_index];
932 }
933 run_diff = 0;
Michael Niedermayer2ad15162002-09-29 22:44:22934 scantable= s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56935 set_stat(ST_INTRA_AC);
936 } else {
937 i = 0;
938 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30939 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09940 run_diff = 0;
941 else
942 run_diff = 1;
Michael Niedermayer2ad15162002-09-29 22:44:22943 scantable= s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56944 set_stat(ST_INTER_AC);
945 }
946
Michael Niedermayerf5957f32002-06-18 00:49:00947 /* recalculate block_last_index for M$ wmv1 */
Michael Niedermayer1457ab52002-12-27 23:51:46948 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
Michael Niedermayerf5957f32002-06-18 00:49:00949 for(last_index=63; last_index>=0; last_index--){
950 if(block[scantable[last_index]]) break;
951 }
Michael Niedermayer4d2858d2002-10-13 13:16:04952 s->block_last_index[n]= last_index;
Michael Niedermayerf5957f32002-06-18 00:49:00953 }else
954 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56955 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56956 last_non_zero = i - 1;
957 for (; i <= last_index; i++) {
Michael Niedermayerf5957f32002-06-18 00:49:00958 j = scantable[i];
Fabrice Bellardde6d9b62001-07-22 14:18:56959 level = block[j];
960 if (level) {
961 run = i - last_non_zero - 1;
962 last = (i == last_index);
963 sign = 0;
964 slevel = level;
965 if (level < 0) {
966 sign = 1;
967 level = -level;
968 }
Michael Niedermayer62959862002-08-09 00:13:54969
Michael Niedermayerf5957f32002-06-18 00:49:00970 if(level<=MAX_LEVEL && run<=MAX_RUN){
971 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
972 }
973#if 0
974else
975 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
976#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56977 code = get_rl_index(rl, last, run, level);
978 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
979 if (code == rl->n) {
980 int level1, run1;
981
982 level1 = level - rl->max_level[last][run];
983 if (level1 < 1)
984 goto esc2;
985 code = get_rl_index(rl, last, run, level1);
986 if (code == rl->n) {
987 esc2:
988 put_bits(&s->pb, 1, 0);
989 if (level > MAX_LEVEL)
990 goto esc3;
991 run1 = run - rl->max_run[last][level] - run_diff;
992 if (run1 < 0)
993 goto esc3;
994 code = get_rl_index(rl, last, run1, level);
995 if (code == rl->n) {
996 esc3:
997 /* third escape */
998 put_bits(&s->pb, 1, 0);
999 put_bits(&s->pb, 1, last);
Michael Niedermayer1457ab52002-12-27 23:51:461000 if(s->msmpeg4_version>=4){
Michael Niedermayerf5957f32002-06-18 00:49:001001 if(s->esc3_level_length==0){
1002 s->esc3_level_length=8;
1003 s->esc3_run_length= 6;
1004 if(s->qscale<8)
1005 put_bits(&s->pb, 6, 3);
1006 else
1007 put_bits(&s->pb, 8, 3);
1008 }
1009 put_bits(&s->pb, s->esc3_run_length, run);
1010 put_bits(&s->pb, 1, sign);
1011 put_bits(&s->pb, s->esc3_level_length, level);
1012 }else{
1013 put_bits(&s->pb, 6, run);
1014 put_bits(&s->pb, 8, slevel & 0xff);
1015 }
Fabrice Bellardde6d9b62001-07-22 14:18:561016 } else {
1017 /* second escape */
1018 put_bits(&s->pb, 1, 1);
1019 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1020 put_bits(&s->pb, 1, sign);
1021 }
1022 } else {
1023 /* first escape */
1024 put_bits(&s->pb, 1, 1);
1025 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1026 put_bits(&s->pb, 1, sign);
1027 }
1028 } else {
1029 put_bits(&s->pb, 1, sign);
1030 }
1031 last_non_zero = i;
1032 }
1033 }
1034}
1035
1036/****************************************/
1037/* decoding stuff */
1038
Michael Niedermayer1457ab52002-12-27 23:51:461039static VLC mb_non_intra_vlc[4];
anonymous0d33db82005-01-30 16:34:571040VLC ff_msmp4_mb_i_vlc;
1041VLC ff_msmp4_dc_luma_vlc[2];
1042VLC ff_msmp4_dc_chroma_vlc[2];
Michael Niedermayer84afee32002-04-05 04:09:041043static VLC v2_dc_lum_vlc;
1044static VLC v2_dc_chroma_vlc;
1045static VLC cbpy_vlc;
1046static VLC v2_intra_cbpc_vlc;
1047static VLC v2_mb_type_vlc;
1048static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:301049static VLC v1_intra_cbpc_vlc;
1050static VLC v1_inter_cbpc_vlc;
Michael Niedermayerde0f2f42002-07-07 08:34:461051static VLC inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:041052
1053/* this table is practically identical to the one from h263 except that its inverted */
Falk Hüffner20695ec2002-06-03 11:16:111054static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:041055{
Michael Niedermayer84afee32002-04-05 04:09:041056 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:041057
Michael Niedermayer2ed627e2002-04-05 16:51:121058 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:041059 int size, v, l;
1060 /* find number of bits */
1061 size = 0;
1062 v = abs(level);
1063 while (v) {
1064 v >>= 1;
1065 size++;
1066 }
1067
1068 if (level < 0)
1069 l= (-level) ^ ((1 << size) - 1);
1070 else
1071 l= level;
1072
1073 /* luminance h263 */
1074 uni_code= DCtab_lum[size][0];
1075 uni_len = DCtab_lum[size][1];
1076 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1077
1078 if (size > 0) {
1079 uni_code<<=size; uni_code|=l;
1080 uni_len+=size;
1081 if (size > 8){
1082 uni_code<<=1; uni_code|=1;
1083 uni_len++;
1084 }
1085 }
1086 v2_dc_lum_table[level+256][0]= uni_code;
1087 v2_dc_lum_table[level+256][1]= uni_len;
1088
1089 /* chrominance h263 */
1090 uni_code= DCtab_chrom[size][0];
1091 uni_len = DCtab_chrom[size][1];
1092 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1093
1094 if (size > 0) {
1095 uni_code<<=size; uni_code|=l;
1096 uni_len+=size;
1097 if (size > 8){
1098 uni_code<<=1; uni_code|=1;
1099 uni_len++;
1100 }
1101 }
1102 v2_dc_chroma_table[level+256][0]= uni_code;
1103 v2_dc_chroma_table[level+256][1]= uni_len;
1104
1105 }
Michael Niedermayer84afee32002-04-05 04:09:041106}
Fabrice Bellardde6d9b62001-07-22 14:18:561107
1108/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001109int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561110{
Fabrice Bellardd81c5982002-06-06 14:31:181111 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561112 int i;
1113 MVTable *mv;
1114
Michael Niedermayerf5957f32002-06-18 00:49:001115 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561116
Fabrice Bellardd81c5982002-06-06 14:31:181117 if (!done) {
1118 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561119
Fabrice Bellardd81c5982002-06-06 14:31:181120 for(i=0;i<NB_RL_TABLES;i++) {
Burkhard Plaum073c2592004-11-27 18:10:061121 init_rl(&rl_table[i], 1);
1122 init_vlc_rl(&rl_table[i], 1);
Fabrice Bellardd81c5982002-06-06 14:31:181123 }
1124 for(i=0;i<2;i++) {
1125 mv = &mv_tables[i];
Michael Niedermayer08dce7b2002-07-10 20:05:421126 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181127 mv->table_mv_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061128 mv->table_mv_code, 2, 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181129 }
1130
anonymous0d33db82005-01-30 16:34:571131 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351132 &ff_table0_dc_lum[0][1], 8, 4,
1133 &ff_table0_dc_lum[0][0], 8, 4, 1);
anonymous0d33db82005-01-30 16:34:571134 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351135 &ff_table0_dc_chroma[0][1], 8, 4,
1136 &ff_table0_dc_chroma[0][0], 8, 4, 1);
anonymous0d33db82005-01-30 16:34:571137 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351138 &ff_table1_dc_lum[0][1], 8, 4,
1139 &ff_table1_dc_lum[0][0], 8, 4, 1);
anonymous0d33db82005-01-30 16:34:571140 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
anonymous0c040aa2005-01-26 12:01:351141 &ff_table1_dc_chroma[0][1], 8, 4,
1142 &ff_table1_dc_chroma[0][0], 8, 4, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181143
Michael Niedermayer08dce7b2002-07-10 20:05:421144 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181145 &v2_dc_lum_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061146 &v2_dc_lum_table[0][0], 8, 4, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421147 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181148 &v2_dc_chroma_table[0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061149 &v2_dc_chroma_table[0][0], 8, 4, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181150
Michael Niedermayer08dce7b2002-07-10 20:05:421151 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181152 &cbpy_tab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061153 &cbpy_tab[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421154 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181155 &v2_intra_cbpc[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061156 &v2_intra_cbpc[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421157 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181158 &v2_mb_type[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061159 &v2_mb_type[0][0], 2, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421160 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181161 &mvtab[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061162 &mvtab[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181163
Michael Niedermayer1457ab52002-12-27 23:51:461164 for(i=0; i<4; i++){
1165 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
1166 &wmv2_inter_table[i][0][1], 8, 4,
Burkhard Plaum073c2592004-11-27 18:10:061167 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
Michael Niedermayer1457ab52002-12-27 23:51:461168 }
1169
anonymous0d33db82005-01-30 16:34:571170 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
1171 &ff_msmp4_mb_i_table[0][1], 4, 2,
1172 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
Michael Niedermayer287229e2002-06-02 12:22:301173
Michael Niedermayer08dce7b2002-07-10 20:05:421174 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181175 intra_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061176 intra_MCBPC_code, 1, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421177 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181178 inter_MCBPC_bits, 1, 1,
Burkhard Plaum073c2592004-11-27 18:10:061179 inter_MCBPC_code, 1, 1, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461180
Michael Niedermayer08dce7b2002-07-10 20:05:421181 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461182 &table_inter_intra[0][1], 2, 1,
Burkhard Plaum073c2592004-11-27 18:10:061183 &table_inter_intra[0][0], 2, 1, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181184 }
Michael Niedermayer4d2858d2002-10-13 13:16:041185
1186 switch(s->msmpeg4_version){
1187 case 1:
1188 case 2:
1189 s->decode_mb= msmpeg4v12_decode_mb;
1190 break;
1191 case 3:
1192 case 4:
1193 s->decode_mb= msmpeg4v34_decode_mb;
1194 break;
Michael Niedermayer1457ab52002-12-27 23:51:461195 case 5:
1196 s->decode_mb= wmv2_decode_mb;
anonymous0d33db82005-01-30 16:34:571197 case 6:
1198 //FIXME + TODO VC9 decode mb
Michael Niedermayer1457ab52002-12-27 23:51:461199 break;
Michael Niedermayer4d2858d2002-10-13 13:16:041200 }
1201
Michael Niedermayer917f5822002-10-25 16:06:321202 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe
1203
Fabrice Bellardde6d9b62001-07-22 14:18:561204 return 0;
1205}
1206
Michael Niedermayer7f89b6f2002-03-29 02:07:251207int msmpeg4_decode_picture_header(MpegEncContext * s)
1208{
Michael Niedermayerf5957f32002-06-18 00:49:001209 int code;
Michael Niedermayer84afee32002-04-05 04:09:041210
Michael Niedermayere1a9dbf2002-04-06 22:29:371211#if 0
1212{
1213int i;
Michael Niedermayer68f593b2003-01-21 17:34:121214for(i=0; i<s->gb.size_in_bits; i++)
Michael Niedermayere1a9dbf2002-04-06 22:29:371215 printf("%d", get_bits1(&s->gb));
1216// get_bits1(&s->gb);
1217printf("END\n");
1218return -1;
1219}
1220#endif
Michael Niedermayer287229e2002-06-02 12:22:301221
1222 if(s->msmpeg4_version==1){
1223 int start_code, num;
1224 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1225 if(start_code!=0x00000100){
Michel Bardiaux9b879562003-11-03 13:26:221226 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
Michael Niedermayer287229e2002-06-02 12:22:301227 return -1;
1228 }
1229
1230 num= get_bits(&s->gb, 5); // frame number */
1231 }
1232
Michael Niedermayer7f89b6f2002-03-29 02:07:251233 s->pict_type = get_bits(&s->gb, 2) + 1;
1234 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301235 s->pict_type != P_TYPE){
Michel Bardiaux9b879562003-11-03 13:26:221236 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251237 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301238 }
Michael Niedermayerde0f2f42002-07-07 08:34:461239#if 0
1240{
1241 static int had_i=0;
1242 if(s->pict_type == I_TYPE) had_i=1;
1243 if(!had_i) return -1;
1244}
1245#endif
Michael Niedermayer6beeb962003-12-03 16:07:411246 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
Michael Niedermayerae2d2d62003-02-10 22:43:301247 if(s->qscale==0){
Michel Bardiaux9b879562003-11-03 13:26:221248 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
Michael Niedermayerae2d2d62003-02-10 22:43:301249 return -1;
1250 }
Michael Niedermayer7f89b6f2002-03-29 02:07:251251
1252 if (s->pict_type == I_TYPE) {
1253 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301254 if(s->msmpeg4_version==1){
1255 if(code==0 || code>s->mb_height){
Michel Bardiaux9b879562003-11-03 13:26:221256 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301257 return -1;
1258 }
1259
1260 s->slice_height = code;
1261 }else{
1262 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461263 if (code < 0x17){
Michel Bardiaux9b879562003-11-03 13:26:221264 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301265 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461266 }
Michael Niedermayer287229e2002-06-02 12:22:301267
1268 s->slice_height = s->mb_height / (code - 0x16);
1269 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371270
1271 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301272 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371273 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041274 s->rl_chroma_table_index = 2;
1275 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561276
Michael Niedermayer84afee32002-04-05 04:09:041277 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371278 break;
1279 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041280 s->rl_chroma_table_index = decode012(&s->gb);
1281 s->rl_table_index = decode012(&s->gb);
1282
1283 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371284 break;
1285 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001286 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371287
Michael Niedermayer05174fd2002-07-22 08:15:271288 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1289 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461290
Michael Niedermayerf5957f32002-06-18 00:49:001291 if(!s->per_mb_rl_table){
1292 s->rl_chroma_table_index = decode012(&s->gb);
1293 s->rl_table_index = decode012(&s->gb);
1294 }
1295
1296 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461297 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371298 break;
Michael Niedermayer84afee32002-04-05 04:09:041299 }
Fabrice Bellardde6d9b62001-07-22 14:18:561300 s->no_rounding = 1;
Michael Niedermayer80adda82003-07-29 01:45:191301 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Michel Bardiaux9b879562003-11-03 13:26:221302 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371303 s->qscale,
1304 s->rl_chroma_table_index,
1305 s->rl_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001306 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461307 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191308 s->slice_height);
Fabrice Bellardde6d9b62001-07-22 14:18:561309 } else {
Michael Niedermayer287229e2002-06-02 12:22:301310 switch(s->msmpeg4_version){
1311 case 1:
1312 case 2:
1313 if(s->msmpeg4_version==1)
1314 s->use_skip_mb_code = 1;
1315 else
1316 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041317 s->rl_table_index = 2;
1318 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041319 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041320 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301321 break;
1322 case 3:
1323 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041324 s->rl_table_index = decode012(&s->gb);
1325 s->rl_chroma_table_index = s->rl_table_index;
1326
1327 s->dc_table_index = get_bits1(&s->gb);
1328
1329 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301330 break;
Michael Niedermayerf5957f32002-06-18 00:49:001331 case 4:
1332 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461333
Michael Niedermayer05174fd2002-07-22 08:15:271334 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1335 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461336
Michael Niedermayerf5957f32002-06-18 00:49:001337 if(!s->per_mb_rl_table){
1338 s->rl_table_index = decode012(&s->gb);
1339 s->rl_chroma_table_index = s->rl_table_index;
1340 }
1341
1342 s->dc_table_index = get_bits1(&s->gb);
1343
1344 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer05174fd2002-07-22 08:15:271345 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
Michael Niedermayerf5957f32002-06-18 00:49:001346 break;
Michael Niedermayer84afee32002-04-05 04:09:041347 }
Michael Niedermayer80adda82003-07-29 01:45:191348
1349 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
Michel Bardiaux9b879562003-11-03 13:26:221350 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371351 s->use_skip_mb_code,
1352 s->rl_table_index,
1353 s->rl_chroma_table_index,
1354 s->dc_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001355 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461356 s->per_mb_rl_table,
Michael Niedermayer80adda82003-07-29 01:45:191357 s->qscale);
1358
Michael Niedermayerae404842002-01-15 22:22:411359 if(s->flipflop_rounding){
1360 s->no_rounding ^= 1;
1361 }else{
1362 s->no_rounding = 0;
1363 }
Fabrice Bellardde6d9b62001-07-22 14:18:561364 }
Michael Niedermayer1457ab52002-12-27 23:51:461365//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height);
Michael Niedermayerf5957f32002-06-18 00:49:001366
1367 s->esc3_level_length= 0;
1368 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041369
Fabrice Bellardde6d9b62001-07-22 14:18:561370#ifdef DEBUG
1371 printf("*****frame %d:\n", frame_count++);
1372#endif
1373 return 0;
1374}
1375
Michael Niedermayerae404842002-01-15 22:22:411376int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1377{
Michael Niedermayer287229e2002-06-02 12:22:301378 int left= buf_size*8 - get_bits_count(&s->gb);
1379 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411380 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301381 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411382 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011383 int fps;
1384
1385 fps= get_bits(&s->gb, 5);
Michael Niedermayer05174fd2002-07-22 08:15:271386 s->bit_rate= get_bits(&s->gb, 11)*1024;
Michael Niedermayer287229e2002-06-02 12:22:301387 if(s->msmpeg4_version>=3)
1388 s->flipflop_rounding= get_bits1(&s->gb);
1389 else
1390 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011391
Michael Niedermayer05174fd2002-07-22 08:15:271392// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
Michael Niedermayer287229e2002-06-02 12:22:301393 }
1394 else if(left<length+8)
1395 {
1396 s->flipflop_rounding= 0;
Michael Niedermayer62563c32003-08-10 21:11:451397 if(s->msmpeg4_version != 2)
Michel Bardiaux9b879562003-11-03 13:26:221398 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411399 }
1400 else
1401 {
Michel Bardiaux9b879562003-11-03 13:26:221402 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411403 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011404
Michael Niedermayerae404842002-01-15 22:22:411405 return 0;
1406}
1407
Zdenek Kabelaccd4af682002-05-27 16:42:141408static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561409{
1410 int i;
1411 for(i=0;i<n;i++)
1412 tab[i] = val;
1413}
1414
Michael Niedermayer3825cd12002-04-05 21:04:091415static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1416{
1417 int range, bit_size, sign, code, bits;
1418
1419 if (val == 0) {
1420 /* zero vector */
1421 code = 0;
1422 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1423 } else {
1424 bit_size = s->f_code - 1;
1425 range = 1 << bit_size;
1426 if (val <= -64)
1427 val += 64;
1428 else if (val >= 64)
1429 val -= 64;
1430
1431 if (val >= 0) {
1432 sign = 0;
1433 } else {
1434 val = -val;
1435 sign = 1;
1436 }
1437 val--;
1438 code = (val >> bit_size) + 1;
1439 bits = val & (range - 1);
1440
1441 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1442 if (bit_size > 0) {
1443 put_bits(&s->pb, bit_size, bits);
1444 }
1445 }
1446}
1447
Michael Niedermayer84afee32002-04-05 04:09:041448/* this is identical to h263 except that its range is multiplied by 2 */
1449static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1450{
1451 int code, val, sign, shift;
1452
Michael Niedermayer08dce7b2002-07-10 20:05:421453 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301454// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041455 if (code < 0)
1456 return 0xffff;
1457
1458 if (code == 0)
1459 return pred;
1460 sign = get_bits1(&s->gb);
1461 shift = f_code - 1;
BERO05858882003-05-14 01:08:021462 val = code;
1463 if (shift) {
1464 val = (val - 1) << shift;
Michael Niedermayer84afee32002-04-05 04:09:041465 val |= get_bits(&s->gb, shift);
BERO05858882003-05-14 01:08:021466 val++;
1467 }
Michael Niedermayer84afee32002-04-05 04:09:041468 if (sign)
1469 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041470
Michael Niedermayer287229e2002-06-02 12:22:301471 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041472 if (val <= -64)
1473 val += 64;
1474 else if (val >= 64)
1475 val -= 64;
1476
1477 return val;
1478}
1479
Michael Niedermayer4d2858d2002-10-13 13:16:041480static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Michael Niedermayer84afee32002-04-05 04:09:041481{
1482 int cbp, code, i;
Michael Niedermayer4d2858d2002-10-13 13:16:041483
Michael Niedermayer84afee32002-04-05 04:09:041484 if (s->pict_type == P_TYPE) {
1485 if (s->use_skip_mb_code) {
1486 if (get_bits1(&s->gb)) {
1487 /* skip mb */
1488 s->mb_intra = 0;
1489 for(i=0;i<6;i++)
1490 s->block_last_index[i] = -1;
1491 s->mv_dir = MV_DIR_FORWARD;
1492 s->mv_type = MV_TYPE_16X16;
1493 s->mv[0][0][0] = 0;
1494 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111495 s->mb_skipped = 1;
Michael Niedermayer84afee32002-04-05 04:09:041496 return 0;
1497 }
1498 }
1499
Michael Niedermayer287229e2002-06-02 12:22:301500 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421501 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301502 else
Michael Niedermayer08dce7b2002-07-10 20:05:421503 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301504 if(code<0 || code>7){
Michel Bardiaux9b879562003-11-03 13:26:221505 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301506 return -1;
1507 }
1508
Michael Niedermayer84afee32002-04-05 04:09:041509 s->mb_intra = code >>2;
1510
1511 cbp = code & 0x3;
1512 } else {
1513 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301514 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421515 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301516 else
Michael Niedermayer08dce7b2002-07-10 20:05:421517 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301518 if(cbp<0 || cbp>3){
Michel Bardiaux9b879562003-11-03 13:26:221519 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301520 return -1;
1521 }
Michael Niedermayer84afee32002-04-05 04:09:041522 }
1523
1524 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301525 int mx, my, cbpy;
1526
Michael Niedermayer08dce7b2002-07-10 20:05:421527 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301528 if(cbpy<0){
Michel Bardiaux9b879562003-11-03 13:26:221529 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301530 return -1;
1531 }
Michael Niedermayer84afee32002-04-05 04:09:041532
Michael Niedermayer287229e2002-06-02 12:22:301533 cbp|= cbpy<<2;
1534 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Michael Niedermayer84afee32002-04-05 04:09:041535
Michael Niedermayer137c8462004-04-16 01:01:451536 h263_pred_motion(s, 0, 0, &mx, &my);
Michael Niedermayer84afee32002-04-05 04:09:041537 mx= msmpeg4v2_decode_motion(s, mx, 1);
1538 my= msmpeg4v2_decode_motion(s, my, 1);
1539
1540 s->mv_dir = MV_DIR_FORWARD;
1541 s->mv_type = MV_TYPE_16X16;
1542 s->mv[0][0][0] = mx;
1543 s->mv[0][0][1] = my;
1544 } else {
Michael Niedermayer287229e2002-06-02 12:22:301545 if(s->msmpeg4_version==2){
1546 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421547 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301548 } else{
1549 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421550 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301551 if(s->pict_type==P_TYPE) cbp^=0x3C;
1552 }
Michael Niedermayer84afee32002-04-05 04:09:041553 }
1554
1555 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461556 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Michael Niedermayer84afee32002-04-05 04:09:041557 {
Michel Bardiaux9b879562003-11-03 13:26:221558 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
Michael Niedermayer84afee32002-04-05 04:09:041559 return -1;
1560 }
1561 }
1562 return 0;
1563}
1564
Michael Niedermayer4d2858d2002-10-13 13:16:041565static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Fabrice Bellardde6d9b62001-07-22 14:18:561566{
1567 int cbp, code, i;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481568 uint8_t *coded_val;
Michael Niedermayer7bc90902003-04-10 13:18:381569 uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ];
Fabrice Bellardde6d9b62001-07-22 14:18:561570
1571 if (s->pict_type == P_TYPE) {
1572 set_stat(ST_INTER_MB);
1573 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501574 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561575 /* skip mb */
1576 s->mb_intra = 0;
1577 for(i=0;i<6;i++)
1578 s->block_last_index[i] = -1;
1579 s->mv_dir = MV_DIR_FORWARD;
1580 s->mv_type = MV_TYPE_16X16;
1581 s->mv[0][0][0] = 0;
1582 s->mv[0][0][1] = 0;
Mike Melanson160d6792005-04-24 17:21:111583 s->mb_skipped = 1;
Michael Niedermayer7bc90902003-04-10 13:18:381584 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
1585
Fabrice Bellardde6d9b62001-07-22 14:18:561586 return 0;
1587 }
1588 }
1589
Michael Niedermayer1457ab52002-12-27 23:51:461590 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
Fabrice Bellardde6d9b62001-07-22 14:18:561591 if (code < 0)
1592 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541593 //s->mb_intra = (code & 0x40) ? 0 : 1;
1594 s->mb_intra = (~code & 0x40) >> 6;
Fabrice Bellardde6d9b62001-07-22 14:18:561595
1596 cbp = code & 0x3f;
1597 } else {
1598 set_stat(ST_INTRA_MB);
1599 s->mb_intra = 1;
anonymous0d33db82005-01-30 16:34:571600 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561601 if (code < 0)
1602 return -1;
1603 /* predict coded block pattern */
1604 cbp = 0;
1605 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541606 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561607 if (i < 4) {
Zdenek Kabelac38d171e2002-02-18 09:34:541608 int pred = coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561609 val = val ^ pred;
1610 *coded_val = val;
1611 }
1612 cbp |= val << (5 - i);
1613 }
1614 }
1615
1616 if (!s->mb_intra) {
1617 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001618//printf("P at %d %d\n", s->mb_x, s->mb_y);
1619 if(s->per_mb_rl_table && cbp){
1620 s->rl_table_index = decode012(&s->gb);
1621 s->rl_chroma_table_index = s->rl_table_index;
1622 }
Fabrice Bellardde6d9b62001-07-22 14:18:561623 set_stat(ST_MV);
Michael Niedermayer137c8462004-04-16 01:01:451624 h263_pred_motion(s, 0, 0, &mx, &my);
Fabrice Bellardde6d9b62001-07-22 14:18:561625 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1626 return -1;
1627 s->mv_dir = MV_DIR_FORWARD;
1628 s->mv_type = MV_TYPE_16X16;
1629 s->mv[0][0][0] = mx;
1630 s->mv[0][0][1] = my;
Michael Niedermayer7bc90902003-04-10 13:18:381631 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
Fabrice Bellardde6d9b62001-07-22 14:18:561632 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001633//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));
Fabrice Bellardde6d9b62001-07-22 14:18:561634 set_stat(ST_INTRA_MB);
Arpi612476e2001-08-04 00:46:501635 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer7bc90902003-04-10 13:18:381636 *mb_type_ptr = MB_TYPE_INTRA;
Michael Niedermayerde0f2f42002-07-07 08:34:461637 if(s->inter_intra_pred){
Michael Niedermayer08dce7b2002-07-10 20:05:421638 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461639// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1640 }
Michael Niedermayerf5957f32002-06-18 00:49:001641 if(s->per_mb_rl_table && cbp){
1642 s->rl_table_index = decode012(&s->gb);
1643 s->rl_chroma_table_index = s->rl_table_index;
1644 }
Fabrice Bellardde6d9b62001-07-22 14:18:561645 }
1646
1647 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461648 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Zdenek Kabelac38d171e2002-02-18 09:34:541649 {
Michel Bardiaux9b879562003-11-03 13:26:221650 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
Michael Niedermayer287229e2002-06-02 12:22:301651 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541652 }
Fabrice Bellardde6d9b62001-07-22 14:18:561653 }
Michael Niedermayerbd5e1c72002-06-22 15:52:251654
Fabrice Bellardde6d9b62001-07-22 14:18:561655 return 0;
1656}
Michael Niedermayer1a013242002-07-17 09:15:141657//#define ERROR_DETAILS
Michael Niedermayerf5957f32002-06-18 00:49:001658static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:461659 int n, int coded, const uint8_t *scan_table)
Fabrice Bellardde6d9b62001-07-22 14:18:561660{
Michael Niedermayer45a82ed2002-07-13 14:55:121661 int level, i, last, run, run_diff;
Fabrice Bellardde6d9b62001-07-22 14:18:561662 int dc_pred_dir;
1663 RLTable *rl;
Michael Niedermayer45a82ed2002-07-13 14:55:121664 RL_VLC_ELEM *rl_vlc;
Michael Niedermayerbadaf882002-01-13 04:59:371665 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561666
1667 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371668 qmul=1;
1669 qadd=0;
1670
Fabrice Bellardde6d9b62001-07-22 14:18:561671 /* DC coef */
1672 set_stat(ST_DC);
1673 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Michael Niedermayer7bc90902003-04-10 13:18:381674
Michael Niedermayer287229e2002-06-02 12:22:301675 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221676 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461677 if(s->inter_intra_pred) level=0;
1678 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301679 }
Fabrice Bellardde6d9b62001-07-22 14:18:561680 if (n < 4) {
1681 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301682 if(level > 256*s->y_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221683 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461684 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301685 }
Fabrice Bellardde6d9b62001-07-22 14:18:561686 } else {
1687 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301688 if(level > 256*s->c_dc_scale){
Michel Bardiaux9b879562003-11-03 13:26:221689 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461690 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301691 }
Fabrice Bellardde6d9b62001-07-22 14:18:561692 }
Michael Niedermayer287229e2002-06-02 12:22:301693 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371694
Fabrice Bellardde6d9b62001-07-22 14:18:561695 run_diff = 0;
Michael Niedermayer45a82ed2002-07-13 14:55:121696 i = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561697 if (!coded) {
1698 goto not_coded;
1699 }
1700 if (s->ac_pred) {
1701 if (dc_pred_dir == 0)
Michael Niedermayer2ad15162002-09-29 22:44:221702 scan_table = s->intra_v_scantable.permutated; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561703 else
Michael Niedermayer2ad15162002-09-29 22:44:221704 scan_table = s->intra_h_scantable.permutated; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561705 } else {
Michael Niedermayer2ad15162002-09-29 22:44:221706 scan_table = s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561707 }
1708 set_stat(ST_INTRA_AC);
Michael Niedermayer45a82ed2002-07-13 14:55:121709 rl_vlc= rl->rl_vlc[0];
Fabrice Bellardde6d9b62001-07-22 14:18:561710 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371711 qmul = s->qscale << 1;
1712 qadd = (s->qscale - 1) | 1;
Michael Niedermayer45a82ed2002-07-13 14:55:121713 i = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561714 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041715
1716 if(s->msmpeg4_version==2)
1717 run_diff = 0;
1718 else
1719 run_diff = 1;
1720
Fabrice Bellardde6d9b62001-07-22 14:18:561721 if (!coded) {
Michael Niedermayer45a82ed2002-07-13 14:55:121722 s->block_last_index[n] = i;
Fabrice Bellardde6d9b62001-07-22 14:18:561723 return 0;
1724 }
Michael Niedermayer1457ab52002-12-27 23:51:461725 if(!scan_table)
1726 scan_table = s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561727 set_stat(ST_INTER_AC);
Michael Niedermayer45a82ed2002-07-13 14:55:121728 rl_vlc= rl->rl_vlc[s->qscale];
Fabrice Bellardde6d9b62001-07-22 14:18:561729 }
Michael Niedermayer45a82ed2002-07-13 14:55:121730 {
1731 OPEN_READER(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561732 for(;;) {
Michael Niedermayer45a82ed2002-07-13 14:55:121733 UPDATE_CACHE(re, &s->gb);
Michael Niedermayere91f4bf2005-04-18 20:07:481734 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
Michael Niedermayer45a82ed2002-07-13 14:55:121735 if (level==0) {
1736 int cache;
1737 cache= GET_CACHE(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561738 /* escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121739 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1740 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561741 /* third escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121742 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1743 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001744 if(s->msmpeg4_version<=3){
Michael Niedermayer45a82ed2002-07-13 14:55:121745 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1746 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1747 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1748 SKIP_COUNTER(re, &s->gb, 1+6+8);
1749 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001750 int sign;
Michael Niedermayer45a82ed2002-07-13 14:55:121751 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001752 if(!s->esc3_level_length){
1753 int ll;
1754 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1755 if(s->qscale<8){
Michael Niedermayer45a82ed2002-07-13 14:55:121756 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
Michael Niedermayerf5957f32002-06-18 00:49:001757 if(ll==0){
Michel Bardiaux9b879562003-11-03 13:26:221758 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");
Michael Niedermayer45a82ed2002-07-13 14:55:121759 SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001760 ll=8;
1761 }
1762 }else{
1763 ll=2;
Michael Niedermayer45a82ed2002-07-13 14:55:121764 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1765 ll++;
1766 SKIP_BITS(re, &s->gb, 1);
1767 }
Michael Niedermayer05174fd2002-07-22 08:15:271768 if(ll<8) SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001769 }
1770
1771 s->esc3_level_length= ll;
Michael Niedermayer45a82ed2002-07-13 14:55:121772 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001773//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
Michael Niedermayer05174fd2002-07-22 08:15:271774 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001775 }
Michael Niedermayer45a82ed2002-07-13 14:55:121776 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
1777 SKIP_BITS(re, &s->gb, s->esc3_run_length);
1778
1779 sign= SHOW_UBITS(re, &s->gb, 1);
1780 SKIP_BITS(re, &s->gb, 1);
1781
1782 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
1783 SKIP_BITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayerf5957f32002-06-18 00:49:001784 if(sign) level= -level;
1785 }
1786//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301787#if 0 // waste of time / this will detect very few errors
1788 {
1789 const int abs_level= ABS(level);
1790 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1791 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1792 if(abs_level <= rl->max_level[last][run]){
1793 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1794 return DECODING_AC_LOST;
1795 }
1796 if(abs_level <= rl->max_level[last][run]*2){
1797 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1798 return DECODING_AC_LOST;
1799 }
Michael Niedermayerf5957f32002-06-18 00:49:001800 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Michael Niedermayer287229e2002-06-02 12:22:301801 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1802 return DECODING_AC_LOST;
1803 }
1804 }
1805 }
1806#endif
Zdenek Kabelac38d171e2002-02-18 09:34:541807 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1808 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301809 else level= level * qmul - qadd;
1810#if 0 // waste of time too :(
1811 if(level>2048 || level<-2048){
1812 fprintf(stderr, "|level| overflow in 3. esc\n");
1813 return DECODING_AC_LOST;
1814 }
1815#endif
Michael Niedermayer45a82ed2002-07-13 14:55:121816 i+= run + 1;
1817 if(last) i+=192;
Michael Niedermayer1a013242002-07-17 09:15:141818#ifdef ERROR_DETAILS
1819 if(run==66)
1820 fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
1821 else if((i>62 && i<192) || i>192+63)
1822 fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
1823#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561824 } else {
1825 /* second escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121826#if MIN_CACHE_BITS < 23
1827 LAST_SKIP_BITS(re, &s->gb, 2);
1828 UPDATE_CACHE(re, &s->gb);
1829#else
1830 SKIP_BITS(re, &s->gb, 2);
1831#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481832 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121833 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
1834 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1835 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141836#ifdef ERROR_DETAILS
1837 if(run==66)
1838 fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level);
1839 else if((i>62 && i<192) || i>192+63)
1840 fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
1841#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561842 }
1843 } else {
1844 /* first escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121845#if MIN_CACHE_BITS < 22
1846 LAST_SKIP_BITS(re, &s->gb, 1);
1847 UPDATE_CACHE(re, &s->gb);
1848#else
1849 SKIP_BITS(re, &s->gb, 1);
1850#endif
Michael Niedermayere91f4bf2005-04-18 20:07:481851 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
Michael Niedermayer45a82ed2002-07-13 14:55:121852 i+= run;
1853 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1854 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1855 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141856#ifdef ERROR_DETAILS
1857 if(run==66)
1858 fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
1859 else if((i>62 && i<192) || i>192+63)
1860 fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
1861#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561862 }
1863 } else {
Michael Niedermayer45a82ed2002-07-13 14:55:121864 i+= run;
1865 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1866 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141867#ifdef ERROR_DETAILS
1868 if(run==66)
1869 fprintf(stderr, "illegal vlc code level=%d\n", level);
1870 else if((i>62 && i<192) || i>192+63)
1871 fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level);
1872#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561873 }
Michael Niedermayer45a82ed2002-07-13 14:55:121874 if (i > 62){
1875 i-= 192;
1876 if(i&(~63)){
Michael Niedermayer68f593b2003-01-21 17:34:121877 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
Michael Niedermayer4d2858d2002-10-13 13:16:041878 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
Michel Bardiaux9b879562003-11-03 13:26:221879 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
Michael Niedermayer1a013242002-07-17 09:15:141880 break;
1881 }else{
Michel Bardiaux9b879562003-11-03 13:26:221882 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
Michael Niedermayer1a013242002-07-17 09:15:141883 return -1;
1884 }
Michael Niedermayer45a82ed2002-07-13 14:55:121885 }
1886
1887 block[scan_table[i]] = level;
1888 break;
Michael Niedermayerf5957f32002-06-18 00:49:001889 }
Michael Niedermayer287229e2002-06-02 12:22:301890
Michael Niedermayer45a82ed2002-07-13 14:55:121891 block[scan_table[i]] = level;
Fabrice Bellardde6d9b62001-07-22 14:18:561892 }
Michael Niedermayer45a82ed2002-07-13 14:55:121893 CLOSE_READER(re, &s->gb);
1894 }
Fabrice Bellardde6d9b62001-07-22 14:18:561895 not_coded:
1896 if (s->mb_intra) {
1897 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1898 if (s->ac_pred) {
Michael Niedermayer45a82ed2002-07-13 14:55:121899 i = 63; /* XXX: not optimal */
Fabrice Bellardde6d9b62001-07-22 14:18:561900 }
1901 }
Michael Niedermayer1457ab52002-12-27 23:51:461902 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
Michael Niedermayer45a82ed2002-07-13 14:55:121903 s->block_last_index[n] = i;
Michael Niedermayerf5957f32002-06-18 00:49:001904
Fabrice Bellardde6d9b62001-07-22 14:18:561905 return 0;
1906}
1907
1908static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1909{
1910 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561911
Michael Niedermayer287229e2002-06-02 12:22:301912 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041913 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421914 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041915 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421916 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041917 }
Michael Niedermayer2ed627e2002-04-05 16:51:121918 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041919 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041920 level-=256;
1921 }else{ //FIXME optimize use unified tables & index
1922 if (n < 4) {
anonymous0d33db82005-01-30 16:34:571923 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041924 } else {
anonymous0d33db82005-01-30 16:34:571925 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041926 }
Michael Niedermayer287229e2002-06-02 12:22:301927 if (level < 0){
Michel Bardiaux9b879562003-11-03 13:26:221928 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041929 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301930 }
Michael Niedermayer84afee32002-04-05 04:09:041931
1932 if (level == DC_MAX) {
1933 level = get_bits(&s->gb, 8);
1934 if (get_bits1(&s->gb))
1935 level = -level;
1936 } else if (level != 0) {
1937 if (get_bits1(&s->gb))
1938 level = -level;
1939 }
Fabrice Bellardde6d9b62001-07-22 14:18:561940 }
1941
Michael Niedermayer287229e2002-06-02 12:22:301942 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481943 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:301944 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1945 level += pred;
1946
1947 /* update predictor */
1948 *dc_val= level;
1949 }else{
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481950 uint16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251951 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301952 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561953
Michael Niedermayer287229e2002-06-02 12:22:301954 /* update predictor */
1955 if (n < 4) {
1956 *dc_val = level * s->y_dc_scale;
1957 } else {
1958 *dc_val = level * s->c_dc_scale;
1959 }
Fabrice Bellardde6d9b62001-07-22 14:18:561960 }
1961
1962 return level;
1963}
1964
1965static int msmpeg4_decode_motion(MpegEncContext * s,
1966 int *mx_ptr, int *my_ptr)
1967{
1968 MVTable *mv;
1969 int code, mx, my;
1970
1971 mv = &mv_tables[s->mv_table_index];
1972
Michael Niedermayer08dce7b2002-07-10 20:05:421973 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001974 if (code < 0){
Michel Bardiaux9b879562003-11-03 13:26:221975 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561976 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001977 }
Fabrice Bellardde6d9b62001-07-22 14:18:561978 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001979//printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561980 mx = get_bits(&s->gb, 6);
1981 my = get_bits(&s->gb, 6);
1982 } else {
1983 mx = mv->table_mvx[code];
1984 my = mv->table_mvy[code];
1985 }
1986
1987 mx += *mx_ptr - 32;
1988 my += *my_ptr - 32;
1989 /* WARNING : they do not do exactly modulo encoding */
1990 if (mx <= -64)
1991 mx += 64;
1992 else if (mx >= 64)
1993 mx -= 64;
1994
1995 if (my <= -64)
1996 my += 64;
1997 else if (my >= 64)
1998 my -= 64;
1999 *mx_ptr = mx;
2000 *my_ptr = my;
2001 return 0;
2002}
Michael Niedermayer1457ab52002-12-27 23:51:462003
2004/* cleanest way to support it
2005 * there is too much shared between versions so that we cant have 1 file per version & 1 common
2006 * as allmost everything would be in the common file
2007 */
2008#include "wmv2.c"