blob: a17890d527af4aaaf89e476113466eba4ac289cb [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.
Fabrice Bellardde6d9b62001-07-22 14:18:564 *
Fabrice Bellardff4ec492002-05-25 22:45:335 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
Fabrice Bellardde6d9b62001-07-22 14:18:569 *
Fabrice Bellardff4ec492002-05-25 22:45:3310 * This library is distributed in the hope that it will be useful,
Fabrice Bellardde6d9b62001-07-22 14:18:5611 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Fabrice Bellardff4ec492002-05-25 22:45:3312 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
Fabrice Bellardde6d9b62001-07-22 14:18:5614 *
Fabrice Bellardff4ec492002-05-25 22:45:3315 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Michael Niedermayer92ba5ff2002-05-21 23:13:5718 *
Michael Niedermayer287229e2002-06-02 12:22:3019 * msmpeg4v1 & v2 stuff by Michael Niedermayer <[email protected]>
Fabrice Bellardde6d9b62001-07-22 14:18:5620 */
Fabrice Bellard6000abf2002-05-18 23:03:2921#include "avcodec.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5622#include "dsputil.h"
23#include "mpegvideo.h"
Michael Niedermayerbd5e1c72002-06-22 15:52:2524//#define PRINT_MB
Michael Niedermayer92ba5ff2002-05-21 23:13:5725
Fabrice Bellardde6d9b62001-07-22 14:18:5626/*
27 * You can also call this codec : MPEG4 with a twist !
28 *
29 * TODO:
30 * - (encoding) select best mv table (two choices)
31 * - (encoding) select best vlc/dc table
Fabrice Bellardde6d9b62001-07-22 14:18:5632 */
33//#define DEBUG
34
Michael Niedermayer08dce7b2002-07-10 20:05:4235#define DC_VLC_BITS 9
36#define CBPY_VLC_BITS 6
37#define INTER_INTRA_VLC_BITS 3
38#define V1_INTRA_CBPC_VLC_BITS 6
39#define V1_INTER_CBPC_VLC_BITS 6
40#define V2_INTRA_CBPC_VLC_BITS 3
41#define V2_MB_TYPE_VLC_BITS 7
42#define MV_VLC_BITS 9
43#define V2_MV_VLC_BITS 9
44#define TEX_VLC_BITS 9
45#define MB_NON_INTRA_VLC_BITS 9
46#define MB_INTRA_VLC_BITS 9
47
Michael Niedermayer05174fd2002-07-22 08:15:2748#define II_BITRATE 128*1024
49#define MBAC_BITRATE 50*1024
50
Michael Niedermayer1457ab52002-12-27 23:51:4651#define DEFAULT_INTER_INDEX 3
52
Michael Niedermayer84afee32002-04-05 04:09:0453static UINT32 v2_dc_lum_table[512][2];
54static UINT32 v2_dc_chroma_table[512][2];
55
Michael Niedermayerf5957f32002-06-18 00:49:0056static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
57static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:4658 int n, int coded, const uint8_t *scantable);
Fabrice Bellardde6d9b62001-07-22 14:18:5659static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
60static int msmpeg4_decode_motion(MpegEncContext * s,
61 int *mx_ptr, int *my_ptr);
Michael Niedermayer3825cd12002-04-05 21:04:0962static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
Falk Hüffner20695ec2002-06-03 11:16:1163static void init_h263_dc_for_msmpeg4(void);
Michael Niedermayerde0f2f42002-07-07 08:34:4664static inline void msmpeg4_memsetw(short *tab, int val, int n);
Michael Niedermayer62959862002-08-09 00:13:5465static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
Michael Niedermayer4d2858d2002-10-13 13:16:0466static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
67static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Michael Niedermayer1457ab52002-12-27 23:51:4668static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Fabrice Bellardde6d9b62001-07-22 14:18:5669
Michael Niedermayer6fe84b42002-02-05 22:51:2370extern UINT32 inverse[256];
71
Michael Niedermayer62959862002-08-09 00:13:5472
Fabrice Bellardde6d9b62001-07-22 14:18:5673#ifdef DEBUG
74int intra_count = 0;
75int frame_count = 0;
76#endif
Fabrice Bellardde6d9b62001-07-22 14:18:5677
78#include "msmpeg4data.h"
79
Michael Niedermayer060f89b2002-10-27 12:20:5880static UINT8 rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
Michael Niedermayer62959862002-08-09 00:13:5481
Fabrice Bellardde6d9b62001-07-22 14:18:5682#ifdef STATS
83
84const char *st_names[ST_NB] = {
85 "unknown",
86 "dc",
87 "intra_ac",
88 "inter_ac",
89 "intra_mb",
90 "inter_mb",
91 "mv",
92};
93
94int st_current_index = 0;
95unsigned int st_bit_counts[ST_NB];
96unsigned int st_out_bit_counts[ST_NB];
97
98#define set_stat(var) st_current_index = var;
99
100void print_stats(void)
101{
102 unsigned int total;
103 int i;
104
105 printf("Input:\n");
106 total = 0;
107 for(i=0;i<ST_NB;i++)
108 total += st_bit_counts[i];
109 if (total == 0)
110 total = 1;
111 for(i=0;i<ST_NB;i++) {
112 printf("%-10s : %10.1f %5.1f%%\n",
113 st_names[i],
114 (double)st_bit_counts[i] / 8.0,
115 (double)st_bit_counts[i] * 100.0 / total);
116 }
117 printf("%-10s : %10.1f %5.1f%%\n",
118 "total",
119 (double)total / 8.0,
120 100.0);
121
122 printf("Output:\n");
123 total = 0;
124 for(i=0;i<ST_NB;i++)
125 total += st_out_bit_counts[i];
126 if (total == 0)
127 total = 1;
128 for(i=0;i<ST_NB;i++) {
129 printf("%-10s : %10.1f %5.1f%%\n",
130 st_names[i],
131 (double)st_out_bit_counts[i] / 8.0,
132 (double)st_out_bit_counts[i] * 100.0 / total);
133 }
134 printf("%-10s : %10.1f %5.1f%%\n",
135 "total",
136 (double)total / 8.0,
137 100.0);
138}
139
140#else
141
142#define set_stat(var)
143
144#endif
145
Michael Niedermayerf5957f32002-06-18 00:49:00146static void common_init(MpegEncContext * s)
147{
148 static int inited=0;
149
150 switch(s->msmpeg4_version){
151 case 1:
152 case 2:
153 s->y_dc_scale_table=
154 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
155 break;
156 case 3:
157 if(s->workaround_bugs){
158 s->y_dc_scale_table= old_ff_y_dc_scale_table;
159 s->c_dc_scale_table= old_ff_c_dc_scale_table;
160 } else{
161 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
162 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
163 }
164 break;
165 case 4:
Michael Niedermayer1457ab52002-12-27 23:51:46166 case 5:
Michael Niedermayerf5957f32002-06-18 00:49:00167 s->y_dc_scale_table= wmv1_y_dc_scale_table;
168 s->c_dc_scale_table= wmv1_c_dc_scale_table;
169 break;
170 }
171
Michael Niedermayer2ad15162002-09-29 22:44:22172
Michael Niedermayer1457ab52002-12-27 23:51:46173 if(s->msmpeg4_version>=4){
Michael Niedermayer2ad15162002-09-29 22:44:22174 ff_init_scantable(s, &s->intra_scantable , wmv1_scantable[1]);
175 ff_init_scantable(s, &s->intra_h_scantable, wmv1_scantable[2]);
176 ff_init_scantable(s, &s->intra_v_scantable, wmv1_scantable[3]);
177 ff_init_scantable(s, &s->inter_scantable , wmv1_scantable[0]);
Michael Niedermayerf5957f32002-06-18 00:49:00178 }
Michael Niedermayer2ad15162002-09-29 22:44:22179 //Note the default tables are set in common_init in mpegvideo.c
Michael Niedermayerf5957f32002-06-18 00:49:00180
181 if(!inited){
Michael Niedermayerf5957f32002-06-18 00:49:00182 inited=1;
183
184 init_h263_dc_for_msmpeg4();
Michael Niedermayerf5957f32002-06-18 00:49:00185 }
186}
187
Fabrice Bellardde6d9b62001-07-22 14:18:56188/* build the table which associate a (x,y) motion vector to a vlc */
189static void init_mv_table(MVTable *tab)
190{
191 int i, x, y;
192
Fabrice Bellard6000abf2002-05-18 23:03:29193 tab->table_mv_index = av_malloc(sizeof(UINT16) * 4096);
Fabrice Bellardde6d9b62001-07-22 14:18:56194 /* mark all entries as not used */
195 for(i=0;i<4096;i++)
196 tab->table_mv_index[i] = tab->n;
197
198 for(i=0;i<tab->n;i++) {
199 x = tab->table_mvx[i];
200 y = tab->table_mvy[i];
201 tab->table_mv_index[(x << 6) | y] = i;
202 }
203}
204
205static void code012(PutBitContext *pb, int n)
206{
207 if (n == 0) {
208 put_bits(pb, 1, 0);
209 } else {
210 put_bits(pb, 1, 1);
211 put_bits(pb, 1, (n >= 2));
212 }
213}
214
Michael Niedermayerf5957f32002-06-18 00:49:00215void ff_msmpeg4_encode_init(MpegEncContext *s)
216{
217 static int init_done=0;
218 int i;
219
220 common_init(s);
221 if(s->msmpeg4_version>=4){
222 s->min_qcoeff= -255;
223 s->max_qcoeff= 255;
224 }
225
226 if (!init_done) {
227 /* init various encoding tables */
228 init_done = 1;
229 init_mv_table(&mv_tables[0]);
230 init_mv_table(&mv_tables[1]);
231 for(i=0;i<NB_RL_TABLES;i++)
232 init_rl(&rl_table[i]);
Michael Niedermayer62959862002-08-09 00:13:54233
234 for(i=0; i<NB_RL_TABLES; i++){
235 int level;
236 for(level=0; level<=MAX_LEVEL; level++){
237 int run;
238 for(run=0; run<=MAX_RUN; run++){
239 int last;
240 for(last=0; last<2; last++){
Michael Niedermayer060f89b2002-10-27 12:20:58241 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
Michael Niedermayer62959862002-08-09 00:13:54242 }
243 }
244 }
245 }
Michael Niedermayerf5957f32002-06-18 00:49:00246 }
247}
248
249static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
250 int size=0;
251 int code;
252 int run_diff= intra ? 0 : 1;
253
254 code = get_rl_index(rl, last, run, level);
255 size+= rl->table_vlc[code][1];
256 if (code == rl->n) {
257 int level1, run1;
258
259 level1 = level - rl->max_level[last][run];
260 if (level1 < 1)
261 goto esc2;
262 code = get_rl_index(rl, last, run, level1);
263 if (code == rl->n) {
264 esc2:
265 size++;
266 if (level > MAX_LEVEL)
267 goto esc3;
268 run1 = run - rl->max_run[last][level] - run_diff;
269 if (run1 < 0)
270 goto esc3;
271 code = get_rl_index(rl, last, run1, level);
272 if (code == rl->n) {
273 esc3:
274 /* third escape */
275 size+=1+1+6+8;
276 } else {
277 /* second escape */
278 size+= 1+1+ rl->table_vlc[code][1];
279 }
280 } else {
281 /* first escape */
282 size+= 1+1+ rl->table_vlc[code][1];
283 }
284 } else {
285 size++;
286 }
287 return size;
288}
289
290static void find_best_tables(MpegEncContext * s)
291{
292 int i;
293 int best =-1, best_size =9999999;
294 int chroma_best=-1, best_chroma_size=9999999;
Michael Niedermayer62959862002-08-09 00:13:54295
Michael Niedermayerf5957f32002-06-18 00:49:00296 for(i=0; i<3; i++){
297 int level;
298 int chroma_size=0;
299 int size=0;
300
301 if(i>0){// ;)
302 size++;
303 chroma_size++;
304 }
305 for(level=0; level<=MAX_LEVEL; level++){
306 int run;
307 for(run=0; run<=MAX_RUN; run++){
308 int last;
Michael Niedermayer62959862002-08-09 00:13:54309 const int last_size= size + chroma_size;
Michael Niedermayerf5957f32002-06-18 00:49:00310 for(last=0; last<2; last++){
311 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
312 int intra_luma_count = s->ac_stats[1][0][level][run][last];
313 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
Michael Niedermayer62959862002-08-09 00:13:54314
Michael Niedermayerf5957f32002-06-18 00:49:00315 if(s->pict_type==I_TYPE){
Michael Niedermayer060f89b2002-10-27 12:20:58316 size += intra_luma_count *rl_length[i ][level][run][last];
317 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00318 }else{
Michael Niedermayer060f89b2002-10-27 12:20:58319 size+= intra_luma_count *rl_length[i ][level][run][last]
320 +intra_chroma_count*rl_length[i+3][level][run][last]
321 +inter_count *rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00322 }
323 }
Michael Niedermayer62959862002-08-09 00:13:54324 if(last_size == size+chroma_size) break;
Michael Niedermayerf5957f32002-06-18 00:49:00325 }
326 }
327 if(size<best_size){
328 best_size= size;
329 best= i;
330 }
331 if(chroma_size<best_chroma_size){
332 best_chroma_size= chroma_size;
333 chroma_best= i;
334 }
335 }
Michael Niedermayer62959862002-08-09 00:13:54336
Michael Niedermayerf5957f32002-06-18 00:49:00337// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
338// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
339
340 if(s->pict_type==P_TYPE) chroma_best= best;
341
342 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
343
344 s->rl_table_index = best;
345 s->rl_chroma_table_index= chroma_best;
346
347 if(s->pict_type != s->last_non_b_pict_type){
348 s->rl_table_index= 2;
349 if(s->pict_type==I_TYPE)
350 s->rl_chroma_table_index= 1;
351 else
352 s->rl_chroma_table_index= 2;
353 }
354
355}
356
Michael Niedermayer287229e2002-06-02 12:22:30357/* write MSMPEG4 compatible frame header */
Fabrice Bellardde6d9b62001-07-22 14:18:56358void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
359{
Michael Niedermayerf5957f32002-06-18 00:49:00360 find_best_tables(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56361
362 align_put_bits(&s->pb);
Fabrice Bellardde6d9b62001-07-22 14:18:56363 put_bits(&s->pb, 2, s->pict_type - 1);
364
365 put_bits(&s->pb, 5, s->qscale);
Michael Niedermayerf5957f32002-06-18 00:49:00366 if(s->msmpeg4_version<=2){
367 s->rl_table_index = 2;
368 s->rl_chroma_table_index = 2;
369 }
Michael Niedermayer3825cd12002-04-05 21:04:09370
Fabrice Bellardde6d9b62001-07-22 14:18:56371 s->dc_table_index = 1;
372 s->mv_table_index = 1; /* only if P frame */
373 s->use_skip_mb_code = 1; /* only if P frame */
Michael Niedermayerf5957f32002-06-18 00:49:00374 s->per_mb_rl_table = 0;
Michael Niedermayerfc48cba2002-10-20 17:02:41375 if(s->msmpeg4_version==4)
376 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:46377//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:00378
Fabrice Bellardde6d9b62001-07-22 14:18:56379 if (s->pict_type == I_TYPE) {
Michael Niedermayerde0f2f42002-07-07 08:34:46380 s->slice_height= s->mb_height/1;
381 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
Michael Niedermayerf5957f32002-06-18 00:49:00382
383 if(s->msmpeg4_version==4){
384 msmpeg4_encode_ext_header(s);
Michael Niedermayer05174fd2002-07-22 08:15:27385 if(s->bit_rate>MBAC_BITRATE)
Michael Niedermayerde0f2f42002-07-07 08:34:46386 put_bits(&s->pb, 1, s->per_mb_rl_table);
Michael Niedermayerf5957f32002-06-18 00:49:00387 }
Fabrice Bellardde6d9b62001-07-22 14:18:56388
Michael Niedermayer287229e2002-06-02 12:22:30389 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00390 if(!s->per_mb_rl_table){
391 code012(&s->pb, s->rl_chroma_table_index);
392 code012(&s->pb, s->rl_table_index);
393 }
Fabrice Bellardde6d9b62001-07-22 14:18:56394
Michael Niedermayer3825cd12002-04-05 21:04:09395 put_bits(&s->pb, 1, s->dc_table_index);
396 }
Fabrice Bellardde6d9b62001-07-22 14:18:56397 } else {
398 put_bits(&s->pb, 1, s->use_skip_mb_code);
399
Michael Niedermayer05174fd2002-07-22 08:15:27400 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
Michael Niedermayerf5957f32002-06-18 00:49:00401 put_bits(&s->pb, 1, s->per_mb_rl_table);
402
Michael Niedermayer287229e2002-06-02 12:22:30403 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00404 if(!s->per_mb_rl_table)
405 code012(&s->pb, s->rl_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56406
Michael Niedermayer3825cd12002-04-05 21:04:09407 put_bits(&s->pb, 1, s->dc_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56408
Michael Niedermayer3825cd12002-04-05 21:04:09409 put_bits(&s->pb, 1, s->mv_table_index);
410 }
Fabrice Bellardde6d9b62001-07-22 14:18:56411 }
412
Michael Niedermayerf5957f32002-06-18 00:49:00413 s->esc3_level_length= 0;
414 s->esc3_run_length= 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56415
416#ifdef DEBUG
417 intra_count = 0;
418 printf("*****frame %d:\n", frame_count++);
419#endif
420}
421
Michael Niedermayerae404842002-01-15 22:22:41422void msmpeg4_encode_ext_header(MpegEncContext * s)
423{
Michael Niedermayer2b9ab1d2002-02-22 19:19:01424 put_bits(&s->pb, 5, s->frame_rate / FRAME_RATE_BASE); //yes 29.97 -> 29
Michael Niedermayerae404842002-01-15 22:22:41425
Michael Niedermayerb8a78f42002-11-10 11:46:59426 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
Michael Niedermayerae404842002-01-15 22:22:41427
Michael Niedermayer287229e2002-06-02 12:22:30428 if(s->msmpeg4_version<3)
429 s->flipflop_rounding=0;
430 else{
431 s->flipflop_rounding=1;
432 put_bits(&s->pb, 1, s->flipflop_rounding);
433 }
Michael Niedermayerae404842002-01-15 22:22:41434}
435
Fabrice Bellardde6d9b62001-07-22 14:18:56436/* predict coded block */
437static inline int coded_block_pred(MpegEncContext * s, int n, UINT8 **coded_block_ptr)
438{
Michael Niedermayerdbbe8992002-03-29 01:53:59439 int xy, wrap, pred, a, b, c;
Fabrice Bellardde6d9b62001-07-22 14:18:56440
Michael Niedermayerdbbe8992002-03-29 01:53:59441 xy = s->block_index[n];
442 wrap = s->block_wrap[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56443
444 /* B C
445 * A X
446 */
Michael Niedermayerdbbe8992002-03-29 01:53:59447 a = s->coded_block[xy - 1 ];
448 b = s->coded_block[xy - 1 - wrap];
449 c = s->coded_block[xy - wrap];
Fabrice Bellardde6d9b62001-07-22 14:18:56450
451 if (b == c) {
452 pred = a;
453 } else {
454 pred = c;
455 }
456
457 /* store value */
Michael Niedermayerdbbe8992002-03-29 01:53:59458 *coded_block_ptr = &s->coded_block[xy];
Fabrice Bellardde6d9b62001-07-22 14:18:56459
460 return pred;
461}
462
463static void msmpeg4_encode_motion(MpegEncContext * s,
464 int mx, int my)
465{
466 int code;
467 MVTable *mv;
468
469 /* modulo encoding */
470 /* WARNING : you cannot reach all the MVs even with the modulo
471 encoding. This is a somewhat strange compromise they took !!! */
472 if (mx <= -64)
473 mx += 64;
474 else if (mx >= 64)
475 mx -= 64;
476 if (my <= -64)
477 my += 64;
478 else if (my >= 64)
479 my -= 64;
480
481 mx += 32;
482 my += 32;
483#if 0
484 if ((unsigned)mx >= 64 ||
485 (unsigned)my >= 64)
486 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
487#endif
488 mv = &mv_tables[s->mv_table_index];
489
490 code = mv->table_mv_index[(mx << 6) | my];
491 set_stat(ST_MV);
492 put_bits(&s->pb,
493 mv->table_mv_bits[code],
494 mv->table_mv_code[code]);
495 if (code == mv->n) {
496 /* escape : code litterally */
497 put_bits(&s->pb, 6, mx);
498 put_bits(&s->pb, 6, my);
499 }
500}
501
Michael Niedermayerde0f2f42002-07-07 08:34:46502static inline void handle_slices(MpegEncContext *s){
503 if (s->mb_x == 0) {
504 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
Michael Niedermayer28269842003-01-09 11:37:08505 if(s->msmpeg4_version < 4){
Michael Niedermayer4d2858d2002-10-13 13:16:04506 ff_mpeg4_clean_buffers(s);
Michael Niedermayerde0f2f42002-07-07 08:34:46507 }
508 s->first_slice_line = 1;
509 } else {
510 s->first_slice_line = 0;
511 }
512 }
513}
514
Fabrice Bellardde6d9b62001-07-22 14:18:56515void msmpeg4_encode_mb(MpegEncContext * s,
516 DCTELEM block[6][64],
517 int motion_x, int motion_y)
518{
519 int cbp, coded_cbp, i;
520 int pred_x, pred_y;
521 UINT8 *coded_block;
522
Michael Niedermayerde0f2f42002-07-07 08:34:46523 handle_slices(s);
524
Fabrice Bellardde6d9b62001-07-22 14:18:56525 if (!s->mb_intra) {
526 /* compute cbp */
527 set_stat(ST_INTER_MB);
528 cbp = 0;
529 for (i = 0; i < 6; i++) {
530 if (s->block_last_index[i] >= 0)
531 cbp |= 1 << (5 - i);
532 }
533 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
534 /* skip macroblock */
535 put_bits(&s->pb, 1, 1);
536 return;
537 }
538 if (s->use_skip_mb_code)
539 put_bits(&s->pb, 1, 0); /* mb coded */
540
Michael Niedermayer287229e2002-06-02 12:22:30541 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09542 put_bits(&s->pb,
543 v2_mb_type[cbp&3][1],
544 v2_mb_type[cbp&3][0]);
545 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
546 else coded_cbp= cbp;
Fabrice Bellardde6d9b62001-07-22 14:18:56547
Michael Niedermayer3825cd12002-04-05 21:04:09548 put_bits(&s->pb,
549 cbpy_tab[coded_cbp>>2][1],
550 cbpy_tab[coded_cbp>>2][0]);
551
552 h263_pred_motion(s, 0, &pred_x, &pred_y);
553 msmpeg4v2_encode_motion(s, motion_x - pred_x);
554 msmpeg4v2_encode_motion(s, motion_y - pred_y);
555 }else{
556 put_bits(&s->pb,
557 table_mb_non_intra[cbp + 64][1],
558 table_mb_non_intra[cbp + 64][0]);
559
560 /* motion vector */
561 h263_pred_motion(s, 0, &pred_x, &pred_y);
562 msmpeg4_encode_motion(s, motion_x - pred_x,
563 motion_y - pred_y);
564 }
Fabrice Bellardde6d9b62001-07-22 14:18:56565 } else {
566 /* compute cbp */
567 cbp = 0;
568 coded_cbp = 0;
569 for (i = 0; i < 6; i++) {
570 int val, pred;
571 val = (s->block_last_index[i] >= 1);
572 cbp |= val << (5 - i);
573 if (i < 4) {
574 /* predict value for close blocks only for luma */
575 pred = coded_block_pred(s, i, &coded_block);
576 *coded_block = val;
577 val = val ^ pred;
578 }
579 coded_cbp |= val << (5 - i);
580 }
581#if 0
582 if (coded_cbp)
583 printf("cbp=%x %x\n", cbp, coded_cbp);
584#endif
585
Michael Niedermayer287229e2002-06-02 12:22:30586 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09587 if (s->pict_type == I_TYPE) {
588 put_bits(&s->pb,
589 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
590 } else {
591 if (s->use_skip_mb_code)
592 put_bits(&s->pb, 1, 0); /* mb coded */
593 put_bits(&s->pb,
594 v2_mb_type[(cbp&3) + 4][1],
595 v2_mb_type[(cbp&3) + 4][0]);
596 }
597 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
598 put_bits(&s->pb,
599 cbpy_tab[cbp>>2][1],
600 cbpy_tab[cbp>>2][0]);
601 }else{
602 if (s->pict_type == I_TYPE) {
603 set_stat(ST_INTRA_MB);
604 put_bits(&s->pb,
605 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
606 } else {
607 if (s->use_skip_mb_code)
608 put_bits(&s->pb, 1, 0); /* mb coded */
609 put_bits(&s->pb,
610 table_mb_non_intra[cbp][1],
611 table_mb_non_intra[cbp][0]);
612 }
Fabrice Bellardde6d9b62001-07-22 14:18:56613 set_stat(ST_INTRA_MB);
Michael Niedermayer3825cd12002-04-05 21:04:09614 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Michael Niedermayer05174fd2002-07-22 08:15:27615 if(s->inter_intra_pred){
616 s->h263_aic_dir=0;
617 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
618 }
Fabrice Bellardde6d9b62001-07-22 14:18:56619 }
Fabrice Bellardde6d9b62001-07-22 14:18:56620 }
621
622 for (i = 0; i < 6; i++) {
623 msmpeg4_encode_block(s, block[i], i);
624 }
625}
626
Michael Niedermayer92ba5ff2002-05-21 23:13:57627/* old ffmpeg msmpeg4v3 mode */
Zdenek Kabelac5c91a672003-02-10 09:35:32628static void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
Fabrice Bellardde6d9b62001-07-22 14:18:56629{
Michael Niedermayer92ba5ff2002-05-21 23:13:57630 if (s->qscale < 5){
Michael Niedermayer6fb904c2002-01-11 21:27:04631 s->y_dc_scale = 8;
632 s->c_dc_scale = 8;
Michael Niedermayer6fb904c2002-01-11 21:27:04633 }else if (s->qscale < 9){
634 s->y_dc_scale = 2 * s->qscale;
635 s->c_dc_scale = (s->qscale + 13)>>1;
Michael Niedermayer92ba5ff2002-05-21 23:13:57636 }else{
Michael Niedermayer6fb904c2002-01-11 21:27:04637 s->y_dc_scale = s->qscale + 8;
638 s->c_dc_scale = (s->qscale + 13)>>1;
639 }
Fabrice Bellardde6d9b62001-07-22 14:18:56640}
641
Michael Niedermayerf5957f32002-06-18 00:49:00642static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
643 INT32 **dc_val_ptr)
Michael Niedermayer287229e2002-06-02 12:22:30644{
645 int i;
646
647 if (n < 4) {
648 i= 0;
649 } else {
650 i= n-3;
651 }
652
653 *dc_val_ptr= &s->last_dc[i];
654 return s->last_dc[i];
655}
656
Michael Niedermayerde0f2f42002-07-07 08:34:46657static int get_dc(uint8_t *src, int stride, int scale)
658{
659 int y;
660 int sum=0;
661 for(y=0; y<8; y++){
662 int x;
663 for(x=0; x<8; x++){
664 sum+=src[x + y*stride];
665 }
666 }
667 return (sum + (scale>>1))/scale;
668}
669
Fabrice Bellardde6d9b62001-07-22 14:18:56670/* dir = 0: left, dir = 1: top prediction */
Michael Niedermayerf5957f32002-06-18 00:49:00671static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
672 UINT16 **dc_val_ptr, int *dir_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56673{
Michael Niedermayerdbbe8992002-03-29 01:53:59674 int a, b, c, wrap, pred, scale;
Fabrice Bellard98be9752001-08-06 00:47:50675 INT16 *dc_val;
Fabrice Bellardde6d9b62001-07-22 14:18:56676
677 /* find prediction */
678 if (n < 4) {
Fabrice Bellardde6d9b62001-07-22 14:18:56679 scale = s->y_dc_scale;
680 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:56681 scale = s->c_dc_scale;
682 }
Michael Niedermayer287229e2002-06-02 12:22:30683
Michael Niedermayerdbbe8992002-03-29 01:53:59684 wrap = s->block_wrap[n];
685 dc_val= s->dc_val[0] + s->block_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56686
687 /* B C
688 * A X
689 */
Michael Niedermayerdbbe8992002-03-29 01:53:59690 a = dc_val[ - 1];
691 b = dc_val[ - 1 - wrap];
692 c = dc_val[ - wrap];
Michael Niedermayer4d2858d2002-10-13 13:16:04693
Michael Niedermayer28269842003-01-09 11:37:08694 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
Michael Niedermayer4d2858d2002-10-13 13:16:04695 b=c=1024;
696 }
Fabrice Bellardde6d9b62001-07-22 14:18:56697
698 /* XXX: the following solution consumes divisions, but it does not
699 necessitate to modify mpegvideo.c. The problem comes from the
700 fact they decided to store the quantized DC (which would lead
701 to problems if Q could vary !) */
Zdenek Kabelac320680d2002-01-28 18:06:28702#if defined ARCH_X86 && !defined PIC
Michael Niedermayer6f903d82002-01-14 04:34:52703 asm volatile(
704 "movl %3, %%eax \n\t"
705 "shrl $1, %%eax \n\t"
706 "addl %%eax, %2 \n\t"
707 "addl %%eax, %1 \n\t"
708 "addl %0, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23709 "mull %4 \n\t"
710 "movl %%edx, %0 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52711 "movl %1, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23712 "mull %4 \n\t"
713 "movl %%edx, %1 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52714 "movl %2, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23715 "mull %4 \n\t"
716 "movl %%edx, %2 \n\t"
Michael Niedermayerfa778d52002-02-09 00:38:44717 : "+b" (a), "+c" (b), "+D" (c)
718 : "g" (scale), "S" (inverse[scale])
Michael Niedermayer6f903d82002-01-14 04:34:52719 : "%eax", "%edx"
720 );
Zdenek Kabelac320680d2002-01-28 18:06:28721#else
722 /* #elif defined (ARCH_ALPHA) */
Nick Kurshev1e98dff2002-01-20 14:48:02723 /* Divisions are extremely costly on Alpha; optimize the most
Zdenek Kabelac320680d2002-01-28 18:06:28724 common case. But they are costly everywhere...
725 */
Nick Kurshev1e98dff2002-01-20 14:48:02726 if (scale == 8) {
727 a = (a + (8 >> 1)) / 8;
728 b = (b + (8 >> 1)) / 8;
729 c = (c + (8 >> 1)) / 8;
730 } else {
731 a = (a + (scale >> 1)) / scale;
732 b = (b + (scale >> 1)) / scale;
733 c = (c + (scale >> 1)) / scale;
734 }
Michael Niedermayer6f903d82002-01-14 04:34:52735#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56736 /* XXX: WARNING: they did not choose the same test as MPEG4. This
737 is very important ! */
Michael Niedermayerbd5e1c72002-06-22 15:52:25738 if(s->msmpeg4_version>3){
Michael Niedermayerde0f2f42002-07-07 08:34:46739 if(s->inter_intra_pred){
740 uint8_t *dest;
741 int wrap;
742
743 if(n==1){
744 pred=a;
745 *dir_ptr = 0;
746 }else if(n==2){
747 pred=c;
748 *dir_ptr = 1;
749 }else if(n==3){
750 if (abs(a - b) < abs(b - c)) {
751 pred = c;
752 *dir_ptr = 1;
753 } else {
754 pred = a;
755 *dir_ptr = 0;
756 }
757 }else{
758 if(n<4){
759 wrap= s->linesize;
Michael Niedermayer1e491e22002-12-04 10:04:03760 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:46761 }else{
Michael Niedermayer0fd90452002-07-15 14:15:10762 wrap= s->uvlinesize;
Michael Niedermayer1e491e22002-12-04 10:04:03763 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46764 }
765 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
766 else a= get_dc(dest-8, wrap, scale*8);
767 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
768 else c= get_dc(dest-8*wrap, wrap, scale*8);
769
770 if (s->h263_aic_dir==0) {
771 pred= a;
772 *dir_ptr = 0;
773 }else if (s->h263_aic_dir==1) {
774 if(n==0){
775 pred= c;
776 *dir_ptr = 1;
777 }else{
778 pred= a;
779 *dir_ptr = 0;
780 }
781 }else if (s->h263_aic_dir==2) {
782 if(n==0){
783 pred= a;
784 *dir_ptr = 0;
785 }else{
786 pred= c;
787 *dir_ptr = 1;
788 }
789 } else {
790 pred= c;
791 *dir_ptr = 1;
792 }
793 }
794 }else{
795 if (abs(a - b) < abs(b - c)) {
796 pred = c;
797 *dir_ptr = 1;
798 } else {
799 pred = a;
800 *dir_ptr = 0;
801 }
Michael Niedermayerbd5e1c72002-06-22 15:52:25802 }
803 }else{
804 if (abs(a - b) <= abs(b - c)) {
805 pred = c;
806 *dir_ptr = 1;
807 } else {
808 pred = a;
809 *dir_ptr = 0;
810 }
Fabrice Bellardde6d9b62001-07-22 14:18:56811 }
812
813 /* update predictor */
Michael Niedermayerdbbe8992002-03-29 01:53:59814 *dc_val_ptr = &dc_val[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56815 return pred;
816}
817
818#define DC_MAX 119
819
820static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
821{
822 int sign, code;
823 int pred;
Fabrice Bellardde6d9b62001-07-22 14:18:56824
Michael Niedermayer287229e2002-06-02 12:22:30825 if(s->msmpeg4_version==1){
826 INT32 *dc_val;
827 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
828
829 /* update predictor */
830 *dc_val= level;
831 }else{
Michael Niedermayerf5957f32002-06-18 00:49:00832 UINT16 *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25833 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56834
Michael Niedermayer287229e2002-06-02 12:22:30835 /* update predictor */
836 if (n < 4) {
837 *dc_val = level * s->y_dc_scale;
838 } else {
839 *dc_val = level * s->c_dc_scale;
840 }
Fabrice Bellardde6d9b62001-07-22 14:18:56841 }
842
843 /* do the prediction */
844 level -= pred;
845
Michael Niedermayer287229e2002-06-02 12:22:30846 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09847 if (n < 4) {
848 put_bits(&s->pb,
849 v2_dc_lum_table[level+256][1],
850 v2_dc_lum_table[level+256][0]);
851 }else{
852 put_bits(&s->pb,
853 v2_dc_chroma_table[level+256][1],
854 v2_dc_chroma_table[level+256][0]);
855 }
856 }else{
857 sign = 0;
858 if (level < 0) {
859 level = -level;
860 sign = 1;
861 }
862 code = level;
863 if (code > DC_MAX)
864 code = DC_MAX;
Fabrice Bellardde6d9b62001-07-22 14:18:56865
Michael Niedermayer3825cd12002-04-05 21:04:09866 if (s->dc_table_index == 0) {
867 if (n < 4) {
868 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
869 } else {
870 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
871 }
Fabrice Bellardde6d9b62001-07-22 14:18:56872 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09873 if (n < 4) {
874 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
875 } else {
876 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
877 }
Fabrice Bellardde6d9b62001-07-22 14:18:56878 }
Michael Niedermayer3825cd12002-04-05 21:04:09879
880 if (code == DC_MAX)
881 put_bits(&s->pb, 8, level);
882
883 if (level != 0) {
884 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56885 }
886 }
Fabrice Bellardde6d9b62001-07-22 14:18:56887}
888
889/* Encoding of a block. Very similar to MPEG4 except for a different
890 escape coding (same as H263) and more vlc tables.
891 */
Michael Niedermayerf5957f32002-06-18 00:49:00892static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56893{
894 int level, run, last, i, j, last_index;
895 int last_non_zero, sign, slevel;
896 int code, run_diff, dc_pred_dir;
897 const RLTable *rl;
Michael Niedermayerf5957f32002-06-18 00:49:00898 const UINT8 *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56899
900 if (s->mb_intra) {
901 set_stat(ST_DC);
902 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
903 i = 1;
904 if (n < 4) {
905 rl = &rl_table[s->rl_table_index];
906 } else {
907 rl = &rl_table[3 + s->rl_chroma_table_index];
908 }
909 run_diff = 0;
Michael Niedermayer2ad15162002-09-29 22:44:22910 scantable= s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56911 set_stat(ST_INTRA_AC);
912 } else {
913 i = 0;
914 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30915 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09916 run_diff = 0;
917 else
918 run_diff = 1;
Michael Niedermayer2ad15162002-09-29 22:44:22919 scantable= s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56920 set_stat(ST_INTER_AC);
921 }
922
Michael Niedermayerf5957f32002-06-18 00:49:00923 /* recalculate block_last_index for M$ wmv1 */
Michael Niedermayer1457ab52002-12-27 23:51:46924 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
Michael Niedermayerf5957f32002-06-18 00:49:00925 for(last_index=63; last_index>=0; last_index--){
926 if(block[scantable[last_index]]) break;
927 }
Michael Niedermayer4d2858d2002-10-13 13:16:04928 s->block_last_index[n]= last_index;
Michael Niedermayerf5957f32002-06-18 00:49:00929 }else
930 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56931 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56932 last_non_zero = i - 1;
933 for (; i <= last_index; i++) {
Michael Niedermayerf5957f32002-06-18 00:49:00934 j = scantable[i];
Fabrice Bellardde6d9b62001-07-22 14:18:56935 level = block[j];
936 if (level) {
937 run = i - last_non_zero - 1;
938 last = (i == last_index);
939 sign = 0;
940 slevel = level;
941 if (level < 0) {
942 sign = 1;
943 level = -level;
944 }
Michael Niedermayer62959862002-08-09 00:13:54945
Michael Niedermayerf5957f32002-06-18 00:49:00946 if(level<=MAX_LEVEL && run<=MAX_RUN){
947 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
948 }
949#if 0
950else
951 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
952#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56953 code = get_rl_index(rl, last, run, level);
954 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
955 if (code == rl->n) {
956 int level1, run1;
957
958 level1 = level - rl->max_level[last][run];
959 if (level1 < 1)
960 goto esc2;
961 code = get_rl_index(rl, last, run, level1);
962 if (code == rl->n) {
963 esc2:
964 put_bits(&s->pb, 1, 0);
965 if (level > MAX_LEVEL)
966 goto esc3;
967 run1 = run - rl->max_run[last][level] - run_diff;
968 if (run1 < 0)
969 goto esc3;
970 code = get_rl_index(rl, last, run1, level);
971 if (code == rl->n) {
972 esc3:
973 /* third escape */
974 put_bits(&s->pb, 1, 0);
975 put_bits(&s->pb, 1, last);
Michael Niedermayer1457ab52002-12-27 23:51:46976 if(s->msmpeg4_version>=4){
Michael Niedermayerf5957f32002-06-18 00:49:00977 if(s->esc3_level_length==0){
978 s->esc3_level_length=8;
979 s->esc3_run_length= 6;
980 if(s->qscale<8)
981 put_bits(&s->pb, 6, 3);
982 else
983 put_bits(&s->pb, 8, 3);
984 }
985 put_bits(&s->pb, s->esc3_run_length, run);
986 put_bits(&s->pb, 1, sign);
987 put_bits(&s->pb, s->esc3_level_length, level);
988 }else{
989 put_bits(&s->pb, 6, run);
990 put_bits(&s->pb, 8, slevel & 0xff);
991 }
Fabrice Bellardde6d9b62001-07-22 14:18:56992 } else {
993 /* second escape */
994 put_bits(&s->pb, 1, 1);
995 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
996 put_bits(&s->pb, 1, sign);
997 }
998 } else {
999 /* first escape */
1000 put_bits(&s->pb, 1, 1);
1001 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1002 put_bits(&s->pb, 1, sign);
1003 }
1004 } else {
1005 put_bits(&s->pb, 1, sign);
1006 }
1007 last_non_zero = i;
1008 }
1009 }
1010}
1011
1012/****************************************/
1013/* decoding stuff */
1014
Michael Niedermayer1457ab52002-12-27 23:51:461015static VLC mb_non_intra_vlc[4];
Fabrice Bellardde6d9b62001-07-22 14:18:561016static VLC mb_intra_vlc;
1017static VLC dc_lum_vlc[2];
1018static VLC dc_chroma_vlc[2];
Michael Niedermayer84afee32002-04-05 04:09:041019static VLC v2_dc_lum_vlc;
1020static VLC v2_dc_chroma_vlc;
1021static VLC cbpy_vlc;
1022static VLC v2_intra_cbpc_vlc;
1023static VLC v2_mb_type_vlc;
1024static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:301025static VLC v1_intra_cbpc_vlc;
1026static VLC v1_inter_cbpc_vlc;
Michael Niedermayerde0f2f42002-07-07 08:34:461027static VLC inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:041028
1029/* this table is practically identical to the one from h263 except that its inverted */
Falk Hüffner20695ec2002-06-03 11:16:111030static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:041031{
Michael Niedermayer84afee32002-04-05 04:09:041032 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:041033
Michael Niedermayer2ed627e2002-04-05 16:51:121034 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:041035 int size, v, l;
1036 /* find number of bits */
1037 size = 0;
1038 v = abs(level);
1039 while (v) {
1040 v >>= 1;
1041 size++;
1042 }
1043
1044 if (level < 0)
1045 l= (-level) ^ ((1 << size) - 1);
1046 else
1047 l= level;
1048
1049 /* luminance h263 */
1050 uni_code= DCtab_lum[size][0];
1051 uni_len = DCtab_lum[size][1];
1052 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1053
1054 if (size > 0) {
1055 uni_code<<=size; uni_code|=l;
1056 uni_len+=size;
1057 if (size > 8){
1058 uni_code<<=1; uni_code|=1;
1059 uni_len++;
1060 }
1061 }
1062 v2_dc_lum_table[level+256][0]= uni_code;
1063 v2_dc_lum_table[level+256][1]= uni_len;
1064
1065 /* chrominance h263 */
1066 uni_code= DCtab_chrom[size][0];
1067 uni_len = DCtab_chrom[size][1];
1068 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1069
1070 if (size > 0) {
1071 uni_code<<=size; uni_code|=l;
1072 uni_len+=size;
1073 if (size > 8){
1074 uni_code<<=1; uni_code|=1;
1075 uni_len++;
1076 }
1077 }
1078 v2_dc_chroma_table[level+256][0]= uni_code;
1079 v2_dc_chroma_table[level+256][1]= uni_len;
1080
1081 }
Michael Niedermayer84afee32002-04-05 04:09:041082}
Fabrice Bellardde6d9b62001-07-22 14:18:561083
1084/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001085int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561086{
Fabrice Bellardd81c5982002-06-06 14:31:181087 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561088 int i;
1089 MVTable *mv;
1090
Michael Niedermayerf5957f32002-06-18 00:49:001091 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561092
Fabrice Bellardd81c5982002-06-06 14:31:181093 if (!done) {
1094 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561095
Fabrice Bellardd81c5982002-06-06 14:31:181096 for(i=0;i<NB_RL_TABLES;i++) {
1097 init_rl(&rl_table[i]);
1098 init_vlc_rl(&rl_table[i]);
1099 }
1100 for(i=0;i<2;i++) {
1101 mv = &mv_tables[i];
Michael Niedermayer08dce7b2002-07-10 20:05:421102 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181103 mv->table_mv_bits, 1, 1,
1104 mv->table_mv_code, 2, 2);
1105 }
1106
Michael Niedermayer08dce7b2002-07-10 20:05:421107 init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181108 &table0_dc_lum[0][1], 8, 4,
1109 &table0_dc_lum[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421110 init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181111 &table0_dc_chroma[0][1], 8, 4,
1112 &table0_dc_chroma[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421113 init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181114 &table1_dc_lum[0][1], 8, 4,
1115 &table1_dc_lum[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421116 init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181117 &table1_dc_chroma[0][1], 8, 4,
1118 &table1_dc_chroma[0][0], 8, 4);
1119
Michael Niedermayer08dce7b2002-07-10 20:05:421120 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181121 &v2_dc_lum_table[0][1], 8, 4,
1122 &v2_dc_lum_table[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421123 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181124 &v2_dc_chroma_table[0][1], 8, 4,
1125 &v2_dc_chroma_table[0][0], 8, 4);
1126
Michael Niedermayer08dce7b2002-07-10 20:05:421127 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181128 &cbpy_tab[0][1], 2, 1,
1129 &cbpy_tab[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421130 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181131 &v2_intra_cbpc[0][1], 2, 1,
1132 &v2_intra_cbpc[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421133 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181134 &v2_mb_type[0][1], 2, 1,
1135 &v2_mb_type[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421136 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181137 &mvtab[0][1], 2, 1,
1138 &mvtab[0][0], 2, 1);
1139
Michael Niedermayer1457ab52002-12-27 23:51:461140 for(i=0; i<4; i++){
1141 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
1142 &wmv2_inter_table[i][0][1], 8, 4,
1143 &wmv2_inter_table[i][0][0], 8, 4); //FIXME name?
1144 }
1145
Michael Niedermayer08dce7b2002-07-10 20:05:421146 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
Fabrice Bellardd81c5982002-06-06 14:31:181147 &table_mb_intra[0][1], 4, 2,
1148 &table_mb_intra[0][0], 4, 2);
Michael Niedermayer287229e2002-06-02 12:22:301149
Michael Niedermayer08dce7b2002-07-10 20:05:421150 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181151 intra_MCBPC_bits, 1, 1,
1152 intra_MCBPC_code, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421153 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181154 inter_MCBPC_bits, 1, 1,
1155 inter_MCBPC_code, 1, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461156
Michael Niedermayer08dce7b2002-07-10 20:05:421157 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461158 &table_inter_intra[0][1], 2, 1,
1159 &table_inter_intra[0][0], 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181160 }
Michael Niedermayer4d2858d2002-10-13 13:16:041161
1162 switch(s->msmpeg4_version){
1163 case 1:
1164 case 2:
1165 s->decode_mb= msmpeg4v12_decode_mb;
1166 break;
1167 case 3:
1168 case 4:
1169 s->decode_mb= msmpeg4v34_decode_mb;
1170 break;
Michael Niedermayer1457ab52002-12-27 23:51:461171 case 5:
1172 s->decode_mb= wmv2_decode_mb;
1173 break;
Michael Niedermayer4d2858d2002-10-13 13:16:041174 }
1175
Michael Niedermayer917f5822002-10-25 16:06:321176 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe
1177
Fabrice Bellardde6d9b62001-07-22 14:18:561178 return 0;
1179}
1180
1181static int decode012(GetBitContext *gb)
1182{
1183 int n;
Arpi612476e2001-08-04 00:46:501184 n = get_bits1(gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561185 if (n == 0)
1186 return 0;
1187 else
Arpi612476e2001-08-04 00:46:501188 return get_bits1(gb) + 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561189}
1190
Michael Niedermayer7f89b6f2002-03-29 02:07:251191int msmpeg4_decode_picture_header(MpegEncContext * s)
1192{
Michael Niedermayerf5957f32002-06-18 00:49:001193 int code;
Michael Niedermayer84afee32002-04-05 04:09:041194
Michael Niedermayere1a9dbf2002-04-06 22:29:371195#if 0
1196{
1197int i;
Michael Niedermayer68f593b2003-01-21 17:34:121198for(i=0; i<s->gb.size_in_bits; i++)
Michael Niedermayere1a9dbf2002-04-06 22:29:371199 printf("%d", get_bits1(&s->gb));
1200// get_bits1(&s->gb);
1201printf("END\n");
1202return -1;
1203}
1204#endif
Michael Niedermayer287229e2002-06-02 12:22:301205
1206 if(s->msmpeg4_version==1){
1207 int start_code, num;
1208 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1209 if(start_code!=0x00000100){
1210 fprintf(stderr, "invalid startcode\n");
1211 return -1;
1212 }
1213
1214 num= get_bits(&s->gb, 5); // frame number */
1215 }
1216
Michael Niedermayer7f89b6f2002-03-29 02:07:251217 s->pict_type = get_bits(&s->gb, 2) + 1;
1218 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301219 s->pict_type != P_TYPE){
1220 fprintf(stderr, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251221 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301222 }
Michael Niedermayerde0f2f42002-07-07 08:34:461223#if 0
1224{
1225 static int had_i=0;
1226 if(s->pict_type == I_TYPE) had_i=1;
1227 if(!had_i) return -1;
1228}
1229#endif
Michael Niedermayer7f89b6f2002-03-29 02:07:251230 s->qscale = get_bits(&s->gb, 5);
Michael Niedermayerae2d2d62003-02-10 22:43:301231 if(s->qscale==0){
1232 fprintf(stderr, "invalid qscale\n");
1233 return -1;
1234 }
Michael Niedermayer7f89b6f2002-03-29 02:07:251235
1236 if (s->pict_type == I_TYPE) {
1237 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301238 if(s->msmpeg4_version==1){
1239 if(code==0 || code>s->mb_height){
1240 fprintf(stderr, "invalid slice height %d\n", code);
1241 return -1;
1242 }
1243
1244 s->slice_height = code;
1245 }else{
1246 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461247 if (code < 0x17){
1248 fprintf(stderr, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301249 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461250 }
Michael Niedermayer287229e2002-06-02 12:22:301251
1252 s->slice_height = s->mb_height / (code - 0x16);
1253 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371254
1255 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301256 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371257 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041258 s->rl_chroma_table_index = 2;
1259 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561260
Michael Niedermayer84afee32002-04-05 04:09:041261 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371262 break;
1263 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041264 s->rl_chroma_table_index = decode012(&s->gb);
1265 s->rl_table_index = decode012(&s->gb);
1266
1267 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371268 break;
1269 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001270 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371271
Michael Niedermayer05174fd2002-07-22 08:15:271272 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1273 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461274
Michael Niedermayerf5957f32002-06-18 00:49:001275 if(!s->per_mb_rl_table){
1276 s->rl_chroma_table_index = decode012(&s->gb);
1277 s->rl_table_index = decode012(&s->gb);
1278 }
1279
1280 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461281 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371282 break;
Michael Niedermayer84afee32002-04-05 04:09:041283 }
Fabrice Bellardde6d9b62001-07-22 14:18:561284 s->no_rounding = 1;
Michael Niedermayerde0f2f42002-07-07 08:34:461285/* printf("qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371286 s->qscale,
1287 s->rl_chroma_table_index,
1288 s->rl_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001289 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461290 s->per_mb_rl_table,
1291 s->slice_height);*/
Fabrice Bellardde6d9b62001-07-22 14:18:561292 } else {
Michael Niedermayer287229e2002-06-02 12:22:301293 switch(s->msmpeg4_version){
1294 case 1:
1295 case 2:
1296 if(s->msmpeg4_version==1)
1297 s->use_skip_mb_code = 1;
1298 else
1299 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041300 s->rl_table_index = 2;
1301 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041302 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041303 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301304 break;
1305 case 3:
1306 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041307 s->rl_table_index = decode012(&s->gb);
1308 s->rl_chroma_table_index = s->rl_table_index;
1309
1310 s->dc_table_index = get_bits1(&s->gb);
1311
1312 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301313 break;
Michael Niedermayerf5957f32002-06-18 00:49:001314 case 4:
1315 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461316
Michael Niedermayer05174fd2002-07-22 08:15:271317 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1318 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461319
Michael Niedermayerf5957f32002-06-18 00:49:001320 if(!s->per_mb_rl_table){
1321 s->rl_table_index = decode012(&s->gb);
1322 s->rl_chroma_table_index = s->rl_table_index;
1323 }
1324
1325 s->dc_table_index = get_bits1(&s->gb);
1326
1327 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer05174fd2002-07-22 08:15:271328 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
Michael Niedermayerf5957f32002-06-18 00:49:001329 break;
Michael Niedermayer84afee32002-04-05 04:09:041330 }
Michael Niedermayerde0f2f42002-07-07 08:34:461331/* printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371332 s->use_skip_mb_code,
1333 s->rl_table_index,
1334 s->rl_chroma_table_index,
1335 s->dc_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001336 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461337 s->per_mb_rl_table,
1338 s->qscale);*/
Michael Niedermayerae404842002-01-15 22:22:411339 if(s->flipflop_rounding){
1340 s->no_rounding ^= 1;
1341 }else{
1342 s->no_rounding = 0;
1343 }
Fabrice Bellardde6d9b62001-07-22 14:18:561344 }
Michael Niedermayer1457ab52002-12-27 23:51:461345//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:001346
1347 s->esc3_level_length= 0;
1348 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041349
Fabrice Bellardde6d9b62001-07-22 14:18:561350#ifdef DEBUG
1351 printf("*****frame %d:\n", frame_count++);
1352#endif
1353 return 0;
1354}
1355
Michael Niedermayerae404842002-01-15 22:22:411356int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1357{
Michael Niedermayer287229e2002-06-02 12:22:301358 int left= buf_size*8 - get_bits_count(&s->gb);
1359 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411360 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301361 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411362 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011363 int fps;
1364
1365 fps= get_bits(&s->gb, 5);
Michael Niedermayer05174fd2002-07-22 08:15:271366 s->bit_rate= get_bits(&s->gb, 11)*1024;
Michael Niedermayer287229e2002-06-02 12:22:301367 if(s->msmpeg4_version>=3)
1368 s->flipflop_rounding= get_bits1(&s->gb);
1369 else
1370 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011371
Michael Niedermayer05174fd2002-07-22 08:15:271372// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
Michael Niedermayer287229e2002-06-02 12:22:301373 }
1374 else if(left<length+8)
1375 {
1376 s->flipflop_rounding= 0;
1377 printf("ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411378 }
1379 else
1380 {
Michael Niedermayer287229e2002-06-02 12:22:301381 fprintf(stderr, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411382 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011383
Michael Niedermayerae404842002-01-15 22:22:411384 return 0;
1385}
1386
Zdenek Kabelaccd4af682002-05-27 16:42:141387static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561388{
1389 int i;
1390 for(i=0;i<n;i++)
1391 tab[i] = val;
1392}
1393
Michael Niedermayer3825cd12002-04-05 21:04:091394static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1395{
1396 int range, bit_size, sign, code, bits;
1397
1398 if (val == 0) {
1399 /* zero vector */
1400 code = 0;
1401 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1402 } else {
1403 bit_size = s->f_code - 1;
1404 range = 1 << bit_size;
1405 if (val <= -64)
1406 val += 64;
1407 else if (val >= 64)
1408 val -= 64;
1409
1410 if (val >= 0) {
1411 sign = 0;
1412 } else {
1413 val = -val;
1414 sign = 1;
1415 }
1416 val--;
1417 code = (val >> bit_size) + 1;
1418 bits = val & (range - 1);
1419
1420 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1421 if (bit_size > 0) {
1422 put_bits(&s->pb, bit_size, bits);
1423 }
1424 }
1425}
1426
Michael Niedermayer84afee32002-04-05 04:09:041427/* this is identical to h263 except that its range is multiplied by 2 */
1428static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1429{
1430 int code, val, sign, shift;
1431
Michael Niedermayer08dce7b2002-07-10 20:05:421432 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301433// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041434 if (code < 0)
1435 return 0xffff;
1436
1437 if (code == 0)
1438 return pred;
1439 sign = get_bits1(&s->gb);
1440 shift = f_code - 1;
1441 val = (code - 1) << shift;
1442 if (shift > 0)
1443 val |= get_bits(&s->gb, shift);
1444 val++;
1445 if (sign)
1446 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041447
Michael Niedermayer287229e2002-06-02 12:22:301448 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041449 if (val <= -64)
1450 val += 64;
1451 else if (val >= 64)
1452 val -= 64;
1453
1454 return val;
1455}
1456
Michael Niedermayer4d2858d2002-10-13 13:16:041457static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Michael Niedermayer84afee32002-04-05 04:09:041458{
1459 int cbp, code, i;
Michael Niedermayer4d2858d2002-10-13 13:16:041460
1461 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
1462
Michael Niedermayer84afee32002-04-05 04:09:041463 if (s->pict_type == P_TYPE) {
1464 if (s->use_skip_mb_code) {
1465 if (get_bits1(&s->gb)) {
1466 /* skip mb */
1467 s->mb_intra = 0;
1468 for(i=0;i<6;i++)
1469 s->block_last_index[i] = -1;
1470 s->mv_dir = MV_DIR_FORWARD;
1471 s->mv_type = MV_TYPE_16X16;
1472 s->mv[0][0][0] = 0;
1473 s->mv[0][0][1] = 0;
1474 s->mb_skiped = 1;
1475 return 0;
1476 }
1477 }
1478
Michael Niedermayer287229e2002-06-02 12:22:301479 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421480 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301481 else
Michael Niedermayer08dce7b2002-07-10 20:05:421482 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301483 if(code<0 || code>7){
1484 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1485 return -1;
1486 }
1487
Michael Niedermayer84afee32002-04-05 04:09:041488 s->mb_intra = code >>2;
1489
1490 cbp = code & 0x3;
1491 } else {
1492 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301493 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421494 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301495 else
Michael Niedermayer08dce7b2002-07-10 20:05:421496 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301497 if(cbp<0 || cbp>3){
1498 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1499 return -1;
1500 }
Michael Niedermayer84afee32002-04-05 04:09:041501 }
1502
1503 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301504 int mx, my, cbpy;
1505
Michael Niedermayer08dce7b2002-07-10 20:05:421506 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301507 if(cbpy<0){
1508 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1509 return -1;
1510 }
Michael Niedermayer84afee32002-04-05 04:09:041511
Michael Niedermayer287229e2002-06-02 12:22:301512 cbp|= cbpy<<2;
1513 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Michael Niedermayer84afee32002-04-05 04:09:041514
1515 h263_pred_motion(s, 0, &mx, &my);
1516 mx= msmpeg4v2_decode_motion(s, mx, 1);
1517 my= msmpeg4v2_decode_motion(s, my, 1);
1518
1519 s->mv_dir = MV_DIR_FORWARD;
1520 s->mv_type = MV_TYPE_16X16;
1521 s->mv[0][0][0] = mx;
1522 s->mv[0][0][1] = my;
1523 } else {
Michael Niedermayer287229e2002-06-02 12:22:301524 if(s->msmpeg4_version==2){
1525 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421526 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301527 } else{
1528 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421529 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301530 if(s->pict_type==P_TYPE) cbp^=0x3C;
1531 }
Michael Niedermayer84afee32002-04-05 04:09:041532 }
1533
1534 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461535 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Michael Niedermayer84afee32002-04-05 04:09:041536 {
Michael Niedermayer287229e2002-06-02 12:22:301537 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
Michael Niedermayer84afee32002-04-05 04:09:041538 return -1;
1539 }
1540 }
1541 return 0;
1542}
1543
Michael Niedermayer4d2858d2002-10-13 13:16:041544static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Fabrice Bellardde6d9b62001-07-22 14:18:561545{
1546 int cbp, code, i;
Fabrice Bellardde6d9b62001-07-22 14:18:561547 UINT8 *coded_val;
1548
Michael Niedermayerbd5e1c72002-06-22 15:52:251549#ifdef PRINT_MB
1550if(s->mb_x==0){
1551 printf("\n");
1552 if(s->mb_y==0) printf("\n");
1553}
1554#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561555
Michael Niedermayer4d2858d2002-10-13 13:16:041556 s->error_status_table[s->mb_x + s->mb_y*s->mb_width]= 0;
Michael Niedermayer84afee32002-04-05 04:09:041557
Fabrice Bellardde6d9b62001-07-22 14:18:561558 if (s->pict_type == P_TYPE) {
1559 set_stat(ST_INTER_MB);
1560 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501561 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561562 /* skip mb */
1563 s->mb_intra = 0;
1564 for(i=0;i<6;i++)
1565 s->block_last_index[i] = -1;
1566 s->mv_dir = MV_DIR_FORWARD;
1567 s->mv_type = MV_TYPE_16X16;
1568 s->mv[0][0][0] = 0;
1569 s->mv[0][0][1] = 0;
Fabrice Bellard3bb4e232001-07-24 20:43:411570 s->mb_skiped = 1;
Michael Niedermayerbd5e1c72002-06-22 15:52:251571#ifdef PRINT_MB
1572printf("S ");
1573#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561574 return 0;
1575 }
1576 }
1577
Michael Niedermayer1457ab52002-12-27 23:51:461578 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:561579 if (code < 0)
1580 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541581 //s->mb_intra = (code & 0x40) ? 0 : 1;
1582 s->mb_intra = (~code & 0x40) >> 6;
Fabrice Bellardde6d9b62001-07-22 14:18:561583
1584 cbp = code & 0x3f;
1585 } else {
1586 set_stat(ST_INTRA_MB);
1587 s->mb_intra = 1;
Michael Niedermayer08dce7b2002-07-10 20:05:421588 code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561589 if (code < 0)
1590 return -1;
1591 /* predict coded block pattern */
1592 cbp = 0;
1593 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541594 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561595 if (i < 4) {
Zdenek Kabelac38d171e2002-02-18 09:34:541596 int pred = coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561597 val = val ^ pred;
1598 *coded_val = val;
1599 }
1600 cbp |= val << (5 - i);
1601 }
1602 }
1603
1604 if (!s->mb_intra) {
1605 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001606//printf("P at %d %d\n", s->mb_x, s->mb_y);
1607 if(s->per_mb_rl_table && cbp){
1608 s->rl_table_index = decode012(&s->gb);
1609 s->rl_chroma_table_index = s->rl_table_index;
1610 }
Fabrice Bellardde6d9b62001-07-22 14:18:561611 set_stat(ST_MV);
1612 h263_pred_motion(s, 0, &mx, &my);
1613 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1614 return -1;
1615 s->mv_dir = MV_DIR_FORWARD;
1616 s->mv_type = MV_TYPE_16X16;
1617 s->mv[0][0][0] = mx;
1618 s->mv[0][0][1] = my;
Michael Niedermayerbd5e1c72002-06-22 15:52:251619#ifdef PRINT_MB
1620printf("P ");
1621#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561622 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001623//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:561624 set_stat(ST_INTRA_MB);
Arpi612476e2001-08-04 00:46:501625 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayerbd5e1c72002-06-22 15:52:251626#ifdef PRINT_MB
1627printf("%c", s->ac_pred ? 'A' : 'I');
1628#endif
Michael Niedermayerde0f2f42002-07-07 08:34:461629 if(s->inter_intra_pred){
Michael Niedermayer08dce7b2002-07-10 20:05:421630 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461631// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1632 }
Michael Niedermayerf5957f32002-06-18 00:49:001633 if(s->per_mb_rl_table && cbp){
1634 s->rl_table_index = decode012(&s->gb);
1635 s->rl_chroma_table_index = s->rl_table_index;
1636 }
Fabrice Bellardde6d9b62001-07-22 14:18:561637 }
1638
1639 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461640 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Zdenek Kabelac38d171e2002-02-18 09:34:541641 {
Michael Niedermayer287229e2002-06-02 12:22:301642 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1643 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541644 }
Fabrice Bellardde6d9b62001-07-22 14:18:561645 }
Michael Niedermayerbd5e1c72002-06-22 15:52:251646
Fabrice Bellardde6d9b62001-07-22 14:18:561647 return 0;
1648}
Michael Niedermayer1a013242002-07-17 09:15:141649//#define ERROR_DETAILS
Michael Niedermayerf5957f32002-06-18 00:49:001650static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:461651 int n, int coded, const uint8_t *scan_table)
Fabrice Bellardde6d9b62001-07-22 14:18:561652{
Michael Niedermayer45a82ed2002-07-13 14:55:121653 int level, i, last, run, run_diff;
Fabrice Bellardde6d9b62001-07-22 14:18:561654 int dc_pred_dir;
1655 RLTable *rl;
Michael Niedermayer45a82ed2002-07-13 14:55:121656 RL_VLC_ELEM *rl_vlc;
Michael Niedermayerbadaf882002-01-13 04:59:371657 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561658
1659 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371660 qmul=1;
1661 qadd=0;
1662
Fabrice Bellardde6d9b62001-07-22 14:18:561663 /* DC coef */
1664 set_stat(ST_DC);
1665 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Michael Niedermayerbd5e1c72002-06-22 15:52:251666#ifdef PRINT_MB
1667{
1668 static int c;
1669 if(n==0) c=0;
1670 if(n==4) printf("%X", c);
1671 c+= c +dc_pred_dir;
1672}
1673#endif
Michael Niedermayer287229e2002-06-02 12:22:301674 if (level < 0){
Michael Niedermayerbd5e1c72002-06-22 15:52:251675 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461676 if(s->inter_intra_pred) level=0;
1677 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301678 }
Fabrice Bellardde6d9b62001-07-22 14:18:561679 if (n < 4) {
1680 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301681 if(level > 256*s->y_dc_scale){
Michael Niedermayerbd5e1c72002-06-22 15:52:251682 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461683 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301684 }
Fabrice Bellardde6d9b62001-07-22 14:18:561685 } else {
1686 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301687 if(level > 256*s->c_dc_scale){
Michael Niedermayerbd5e1c72002-06-22 15:52:251688 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461689 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301690 }
Fabrice Bellardde6d9b62001-07-22 14:18:561691 }
Michael Niedermayer287229e2002-06-02 12:22:301692 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371693
Fabrice Bellardde6d9b62001-07-22 14:18:561694 run_diff = 0;
Michael Niedermayer45a82ed2002-07-13 14:55:121695 i = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561696 if (!coded) {
1697 goto not_coded;
1698 }
1699 if (s->ac_pred) {
1700 if (dc_pred_dir == 0)
Michael Niedermayer2ad15162002-09-29 22:44:221701 scan_table = s->intra_v_scantable.permutated; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561702 else
Michael Niedermayer2ad15162002-09-29 22:44:221703 scan_table = s->intra_h_scantable.permutated; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561704 } else {
Michael Niedermayer2ad15162002-09-29 22:44:221705 scan_table = s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561706 }
1707 set_stat(ST_INTRA_AC);
Michael Niedermayer45a82ed2002-07-13 14:55:121708 rl_vlc= rl->rl_vlc[0];
Fabrice Bellardde6d9b62001-07-22 14:18:561709 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371710 qmul = s->qscale << 1;
1711 qadd = (s->qscale - 1) | 1;
Michael Niedermayer45a82ed2002-07-13 14:55:121712 i = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561713 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041714
1715 if(s->msmpeg4_version==2)
1716 run_diff = 0;
1717 else
1718 run_diff = 1;
1719
Fabrice Bellardde6d9b62001-07-22 14:18:561720 if (!coded) {
Michael Niedermayer45a82ed2002-07-13 14:55:121721 s->block_last_index[n] = i;
Fabrice Bellardde6d9b62001-07-22 14:18:561722 return 0;
1723 }
Michael Niedermayer1457ab52002-12-27 23:51:461724 if(!scan_table)
1725 scan_table = s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561726 set_stat(ST_INTER_AC);
Michael Niedermayer45a82ed2002-07-13 14:55:121727 rl_vlc= rl->rl_vlc[s->qscale];
Fabrice Bellardde6d9b62001-07-22 14:18:561728 }
Michael Niedermayer45a82ed2002-07-13 14:55:121729 {
1730 OPEN_READER(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561731 for(;;) {
Michael Niedermayer45a82ed2002-07-13 14:55:121732 UPDATE_CACHE(re, &s->gb);
1733 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1734 if (level==0) {
1735 int cache;
1736 cache= GET_CACHE(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561737 /* escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121738 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1739 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561740 /* third escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121741 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1742 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001743 if(s->msmpeg4_version<=3){
Michael Niedermayer45a82ed2002-07-13 14:55:121744 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1745 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1746 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1747 SKIP_COUNTER(re, &s->gb, 1+6+8);
1748 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001749 int sign;
Michael Niedermayer45a82ed2002-07-13 14:55:121750 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001751 if(!s->esc3_level_length){
1752 int ll;
1753 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1754 if(s->qscale<8){
Michael Niedermayer45a82ed2002-07-13 14:55:121755 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
Michael Niedermayerf5957f32002-06-18 00:49:001756 if(ll==0){
Michael Niedermayer45a82ed2002-07-13 14:55:121757 if(SHOW_UBITS(re, &s->gb, 1)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
1758 SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001759 ll=8;
1760 }
1761 }else{
1762 ll=2;
Michael Niedermayer45a82ed2002-07-13 14:55:121763 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1764 ll++;
1765 SKIP_BITS(re, &s->gb, 1);
1766 }
Michael Niedermayer05174fd2002-07-22 08:15:271767 if(ll<8) SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001768 }
1769
1770 s->esc3_level_length= ll;
Michael Niedermayer45a82ed2002-07-13 14:55:121771 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001772//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
Michael Niedermayer05174fd2002-07-22 08:15:271773 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001774 }
Michael Niedermayer45a82ed2002-07-13 14:55:121775 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
1776 SKIP_BITS(re, &s->gb, s->esc3_run_length);
1777
1778 sign= SHOW_UBITS(re, &s->gb, 1);
1779 SKIP_BITS(re, &s->gb, 1);
1780
1781 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
1782 SKIP_BITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayerf5957f32002-06-18 00:49:001783 if(sign) level= -level;
1784 }
1785//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301786#if 0 // waste of time / this will detect very few errors
1787 {
1788 const int abs_level= ABS(level);
1789 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1790 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1791 if(abs_level <= rl->max_level[last][run]){
1792 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1793 return DECODING_AC_LOST;
1794 }
1795 if(abs_level <= rl->max_level[last][run]*2){
1796 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1797 return DECODING_AC_LOST;
1798 }
Michael Niedermayerf5957f32002-06-18 00:49:001799 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Michael Niedermayer287229e2002-06-02 12:22:301800 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1801 return DECODING_AC_LOST;
1802 }
1803 }
1804 }
1805#endif
Zdenek Kabelac38d171e2002-02-18 09:34:541806 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1807 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301808 else level= level * qmul - qadd;
1809#if 0 // waste of time too :(
1810 if(level>2048 || level<-2048){
1811 fprintf(stderr, "|level| overflow in 3. esc\n");
1812 return DECODING_AC_LOST;
1813 }
1814#endif
Michael Niedermayer45a82ed2002-07-13 14:55:121815 i+= run + 1;
1816 if(last) i+=192;
Michael Niedermayer1a013242002-07-17 09:15:141817#ifdef ERROR_DETAILS
1818 if(run==66)
1819 fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
1820 else if((i>62 && i<192) || i>192+63)
1821 fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
1822#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561823 } else {
1824 /* second escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121825#if MIN_CACHE_BITS < 23
1826 LAST_SKIP_BITS(re, &s->gb, 2);
1827 UPDATE_CACHE(re, &s->gb);
1828#else
1829 SKIP_BITS(re, &s->gb, 2);
1830#endif
1831 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1832 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
1833 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1834 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141835#ifdef ERROR_DETAILS
1836 if(run==66)
1837 fprintf(stderr, "illegal vlc code in ESC2 level=%d\n", level);
1838 else if((i>62 && i<192) || i>192+63)
1839 fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
1840#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561841 }
1842 } else {
1843 /* first escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121844#if MIN_CACHE_BITS < 22
1845 LAST_SKIP_BITS(re, &s->gb, 1);
1846 UPDATE_CACHE(re, &s->gb);
1847#else
1848 SKIP_BITS(re, &s->gb, 1);
1849#endif
1850 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1851 i+= run;
1852 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1853 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1854 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141855#ifdef ERROR_DETAILS
1856 if(run==66)
1857 fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
1858 else if((i>62 && i<192) || i>192+63)
1859 fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
1860#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561861 }
1862 } else {
Michael Niedermayer45a82ed2002-07-13 14:55:121863 i+= run;
1864 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1865 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141866#ifdef ERROR_DETAILS
1867 if(run==66)
1868 fprintf(stderr, "illegal vlc code level=%d\n", level);
1869 else if((i>62 && i<192) || i>192+63)
1870 fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level);
1871#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561872 }
Michael Niedermayer45a82ed2002-07-13 14:55:121873 if (i > 62){
1874 i-= 192;
1875 if(i&(~63)){
Michael Niedermayer68f593b2003-01-21 17:34:121876 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
Michael Niedermayer4d2858d2002-10-13 13:16:041877 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
Michael Niedermayer1a013242002-07-17 09:15:141878 fprintf(stderr, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
1879 break;
1880 }else{
1881 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1882 return -1;
1883 }
Michael Niedermayer45a82ed2002-07-13 14:55:121884 }
1885
1886 block[scan_table[i]] = level;
1887 break;
Michael Niedermayerf5957f32002-06-18 00:49:001888 }
Michael Niedermayer287229e2002-06-02 12:22:301889
Michael Niedermayer45a82ed2002-07-13 14:55:121890 block[scan_table[i]] = level;
Fabrice Bellardde6d9b62001-07-22 14:18:561891 }
Michael Niedermayer45a82ed2002-07-13 14:55:121892 CLOSE_READER(re, &s->gb);
1893 }
Fabrice Bellardde6d9b62001-07-22 14:18:561894 not_coded:
1895 if (s->mb_intra) {
1896 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1897 if (s->ac_pred) {
Michael Niedermayer45a82ed2002-07-13 14:55:121898 i = 63; /* XXX: not optimal */
Fabrice Bellardde6d9b62001-07-22 14:18:561899 }
1900 }
Michael Niedermayer1457ab52002-12-27 23:51:461901 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
Michael Niedermayer45a82ed2002-07-13 14:55:121902 s->block_last_index[n] = i;
Michael Niedermayerf5957f32002-06-18 00:49:001903
Fabrice Bellardde6d9b62001-07-22 14:18:561904 return 0;
1905}
1906
1907static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1908{
1909 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561910
Michael Niedermayer287229e2002-06-02 12:22:301911 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041912 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421913 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041914 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421915 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041916 }
Michael Niedermayer2ed627e2002-04-05 16:51:121917 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041918 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041919 level-=256;
1920 }else{ //FIXME optimize use unified tables & index
1921 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421922 level = get_vlc2(&s->gb, dc_lum_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041923 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421924 level = get_vlc2(&s->gb, dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041925 }
Michael Niedermayer287229e2002-06-02 12:22:301926 if (level < 0){
1927 fprintf(stderr, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041928 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301929 }
Michael Niedermayer84afee32002-04-05 04:09:041930
1931 if (level == DC_MAX) {
1932 level = get_bits(&s->gb, 8);
1933 if (get_bits1(&s->gb))
1934 level = -level;
1935 } else if (level != 0) {
1936 if (get_bits1(&s->gb))
1937 level = -level;
1938 }
Fabrice Bellardde6d9b62001-07-22 14:18:561939 }
1940
Michael Niedermayer287229e2002-06-02 12:22:301941 if(s->msmpeg4_version==1){
1942 INT32 *dc_val;
1943 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1944 level += pred;
1945
1946 /* update predictor */
1947 *dc_val= level;
1948 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001949 UINT16 *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251950 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301951 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561952
Michael Niedermayer287229e2002-06-02 12:22:301953 /* update predictor */
1954 if (n < 4) {
1955 *dc_val = level * s->y_dc_scale;
1956 } else {
1957 *dc_val = level * s->c_dc_scale;
1958 }
Fabrice Bellardde6d9b62001-07-22 14:18:561959 }
1960
1961 return level;
1962}
1963
1964static int msmpeg4_decode_motion(MpegEncContext * s,
1965 int *mx_ptr, int *my_ptr)
1966{
1967 MVTable *mv;
1968 int code, mx, my;
1969
1970 mv = &mv_tables[s->mv_table_index];
1971
Michael Niedermayer08dce7b2002-07-10 20:05:421972 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001973 if (code < 0){
1974 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561975 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001976 }
Fabrice Bellardde6d9b62001-07-22 14:18:561977 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001978//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:561979 mx = get_bits(&s->gb, 6);
1980 my = get_bits(&s->gb, 6);
1981 } else {
1982 mx = mv->table_mvx[code];
1983 my = mv->table_mvy[code];
1984 }
1985
1986 mx += *mx_ptr - 32;
1987 my += *my_ptr - 32;
1988 /* WARNING : they do not do exactly modulo encoding */
1989 if (mx <= -64)
1990 mx += 64;
1991 else if (mx >= 64)
1992 mx -= 64;
1993
1994 if (my <= -64)
1995 my += 64;
1996 else if (my >= 64)
1997 my -= 64;
1998 *mx_ptr = mx;
1999 *my_ptr = my;
2000 return 0;
2001}
Michael Niedermayer1457ab52002-12-27 23:51:462002
2003/* cleanest way to support it
2004 * there is too much shared between versions so that we cant have 1 file per version & 1 common
2005 * as allmost everything would be in the common file
2006 */
2007#include "wmv2.c"