blob: 72481e325e2cecb497e1cc3a26af9477e2b3a6ce [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 */
Michael Niedermayer983e3242003-03-06 11:32:0421
22/**
23 * @file msmpeg4.c
24 * MSMPEG4 backend for ffmpeg encoder and decoder.
25 */
26
Fabrice Bellard6000abf2002-05-18 23:03:2927#include "avcodec.h"
Fabrice Bellardde6d9b62001-07-22 14:18:5628#include "dsputil.h"
29#include "mpegvideo.h"
Michael Niedermayer92ba5ff2002-05-21 23:13:5730
Fabrice Bellardde6d9b62001-07-22 14:18:5631/*
32 * You can also call this codec : MPEG4 with a twist !
33 *
34 * TODO:
35 * - (encoding) select best mv table (two choices)
36 * - (encoding) select best vlc/dc table
Fabrice Bellardde6d9b62001-07-22 14:18:5637 */
38//#define DEBUG
39
Michael Niedermayer08dce7b2002-07-10 20:05:4240#define DC_VLC_BITS 9
41#define CBPY_VLC_BITS 6
42#define INTER_INTRA_VLC_BITS 3
43#define V1_INTRA_CBPC_VLC_BITS 6
44#define V1_INTER_CBPC_VLC_BITS 6
45#define V2_INTRA_CBPC_VLC_BITS 3
46#define V2_MB_TYPE_VLC_BITS 7
47#define MV_VLC_BITS 9
48#define V2_MV_VLC_BITS 9
49#define TEX_VLC_BITS 9
50#define MB_NON_INTRA_VLC_BITS 9
51#define MB_INTRA_VLC_BITS 9
52
Michael Niedermayer05174fd2002-07-22 08:15:2753#define II_BITRATE 128*1024
54#define MBAC_BITRATE 50*1024
55
Michael Niedermayer1457ab52002-12-27 23:51:4656#define DEFAULT_INTER_INDEX 3
57
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4858static uint32_t v2_dc_lum_table[512][2];
59static uint32_t v2_dc_chroma_table[512][2];
Michael Niedermayer84afee32002-04-05 04:09:0460
Wolfgang Hesseler76042462003-02-16 23:05:3861#ifdef CONFIG_ENCODERS
Michael Niedermayerf5957f32002-06-18 00:49:0062static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n);
Wolfgang Hesseler76042462003-02-16 23:05:3863#endif //CONFIG_ENCODERS
Michael Niedermayerf5957f32002-06-18 00:49:0064static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:4665 int n, int coded, const uint8_t *scantable);
Fabrice Bellardde6d9b62001-07-22 14:18:5666static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr);
67static int msmpeg4_decode_motion(MpegEncContext * s,
68 int *mx_ptr, int *my_ptr);
Wolfgang Hesseler76042462003-02-16 23:05:3869#ifdef CONFIG_ENCODERS
Michael Niedermayer3825cd12002-04-05 21:04:0970static void msmpeg4v2_encode_motion(MpegEncContext * s, int val);
Wolfgang Hesseler76042462003-02-16 23:05:3871#endif //CONFIG_ENCODERS
Falk Hüffner20695ec2002-06-03 11:16:1172static void init_h263_dc_for_msmpeg4(void);
Michael Niedermayerde0f2f42002-07-07 08:34:4673static inline void msmpeg4_memsetw(short *tab, int val, int n);
Wolfgang Hesseler76042462003-02-16 23:05:3874#ifdef CONFIG_ENCODERS
Michael Niedermayer62959862002-08-09 00:13:5475static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra);
Wolfgang Hesseler76042462003-02-16 23:05:3876#endif //CONFIG_ENCODERS
Michael Niedermayer4d2858d2002-10-13 13:16:0477static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
78static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Michael Niedermayer1457ab52002-12-27 23:51:4679static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
Fabrice Bellardde6d9b62001-07-22 14:18:5680
Michael Niedermayer62959862002-08-09 00:13:5481
Fabrice Bellardde6d9b62001-07-22 14:18:5682#ifdef DEBUG
83int intra_count = 0;
84int frame_count = 0;
85#endif
Fabrice Bellardde6d9b62001-07-22 14:18:5686
87#include "msmpeg4data.h"
88
Zdenek Kabelac0c1a9ed2003-02-11 16:35:4889static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2];
Michael Niedermayer62959862002-08-09 00:13:5490
Fabrice Bellardde6d9b62001-07-22 14:18:5691#ifdef STATS
92
93const char *st_names[ST_NB] = {
94 "unknown",
95 "dc",
96 "intra_ac",
97 "inter_ac",
98 "intra_mb",
99 "inter_mb",
100 "mv",
101};
102
103int st_current_index = 0;
104unsigned int st_bit_counts[ST_NB];
105unsigned int st_out_bit_counts[ST_NB];
106
107#define set_stat(var) st_current_index = var;
108
109void print_stats(void)
110{
111 unsigned int total;
112 int i;
113
114 printf("Input:\n");
115 total = 0;
116 for(i=0;i<ST_NB;i++)
117 total += st_bit_counts[i];
118 if (total == 0)
119 total = 1;
120 for(i=0;i<ST_NB;i++) {
121 printf("%-10s : %10.1f %5.1f%%\n",
122 st_names[i],
123 (double)st_bit_counts[i] / 8.0,
124 (double)st_bit_counts[i] * 100.0 / total);
125 }
126 printf("%-10s : %10.1f %5.1f%%\n",
127 "total",
128 (double)total / 8.0,
129 100.0);
130
131 printf("Output:\n");
132 total = 0;
133 for(i=0;i<ST_NB;i++)
134 total += st_out_bit_counts[i];
135 if (total == 0)
136 total = 1;
137 for(i=0;i<ST_NB;i++) {
138 printf("%-10s : %10.1f %5.1f%%\n",
139 st_names[i],
140 (double)st_out_bit_counts[i] / 8.0,
141 (double)st_out_bit_counts[i] * 100.0 / total);
142 }
143 printf("%-10s : %10.1f %5.1f%%\n",
144 "total",
145 (double)total / 8.0,
146 100.0);
147}
148
149#else
150
151#define set_stat(var)
152
153#endif
154
Michael Niedermayerf5957f32002-06-18 00:49:00155static void common_init(MpegEncContext * s)
156{
157 static int inited=0;
158
159 switch(s->msmpeg4_version){
160 case 1:
161 case 2:
162 s->y_dc_scale_table=
163 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
164 break;
165 case 3:
166 if(s->workaround_bugs){
167 s->y_dc_scale_table= old_ff_y_dc_scale_table;
168 s->c_dc_scale_table= old_ff_c_dc_scale_table;
169 } else{
170 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table;
171 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table;
172 }
173 break;
174 case 4:
Michael Niedermayer1457ab52002-12-27 23:51:46175 case 5:
Michael Niedermayerf5957f32002-06-18 00:49:00176 s->y_dc_scale_table= wmv1_y_dc_scale_table;
177 s->c_dc_scale_table= wmv1_c_dc_scale_table;
178 break;
179 }
180
Michael Niedermayer2ad15162002-09-29 22:44:22181
Michael Niedermayer1457ab52002-12-27 23:51:46182 if(s->msmpeg4_version>=4){
Michael Niedermayer3d2e8cc2003-05-19 13:30:59183 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]);
184 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]);
185 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]);
186 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]);
Michael Niedermayerf5957f32002-06-18 00:49:00187 }
Michael Niedermayer2ad15162002-09-29 22:44:22188 //Note the default tables are set in common_init in mpegvideo.c
Michael Niedermayerf5957f32002-06-18 00:49:00189
190 if(!inited){
Michael Niedermayerf5957f32002-06-18 00:49:00191 inited=1;
192
193 init_h263_dc_for_msmpeg4();
Michael Niedermayerf5957f32002-06-18 00:49:00194 }
195}
196
Wolfgang Hesseler76042462003-02-16 23:05:38197#ifdef CONFIG_ENCODERS
198
Fabrice Bellardde6d9b62001-07-22 14:18:56199/* build the table which associate a (x,y) motion vector to a vlc */
200static void init_mv_table(MVTable *tab)
201{
202 int i, x, y;
203
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48204 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096);
Fabrice Bellardde6d9b62001-07-22 14:18:56205 /* mark all entries as not used */
206 for(i=0;i<4096;i++)
207 tab->table_mv_index[i] = tab->n;
208
209 for(i=0;i<tab->n;i++) {
210 x = tab->table_mvx[i];
211 y = tab->table_mvy[i];
212 tab->table_mv_index[(x << 6) | y] = i;
213 }
214}
215
216static void code012(PutBitContext *pb, int n)
217{
218 if (n == 0) {
219 put_bits(pb, 1, 0);
220 } else {
221 put_bits(pb, 1, 1);
222 put_bits(pb, 1, (n >= 2));
223 }
224}
225
Michael Niedermayerf5957f32002-06-18 00:49:00226void ff_msmpeg4_encode_init(MpegEncContext *s)
227{
228 static int init_done=0;
229 int i;
230
231 common_init(s);
232 if(s->msmpeg4_version>=4){
233 s->min_qcoeff= -255;
234 s->max_qcoeff= 255;
235 }
236
237 if (!init_done) {
238 /* init various encoding tables */
239 init_done = 1;
240 init_mv_table(&mv_tables[0]);
241 init_mv_table(&mv_tables[1]);
242 for(i=0;i<NB_RL_TABLES;i++)
243 init_rl(&rl_table[i]);
Michael Niedermayer62959862002-08-09 00:13:54244
245 for(i=0; i<NB_RL_TABLES; i++){
246 int level;
247 for(level=0; level<=MAX_LEVEL; level++){
248 int run;
249 for(run=0; run<=MAX_RUN; run++){
250 int last;
251 for(last=0; last<2; last++){
Michael Niedermayer060f89b2002-10-27 12:20:58252 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0);
Michael Niedermayer62959862002-08-09 00:13:54253 }
254 }
255 }
256 }
Michael Niedermayerf5957f32002-06-18 00:49:00257 }
258}
259
260static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){
261 int size=0;
262 int code;
263 int run_diff= intra ? 0 : 1;
264
265 code = get_rl_index(rl, last, run, level);
266 size+= rl->table_vlc[code][1];
267 if (code == rl->n) {
268 int level1, run1;
269
270 level1 = level - rl->max_level[last][run];
271 if (level1 < 1)
272 goto esc2;
273 code = get_rl_index(rl, last, run, level1);
274 if (code == rl->n) {
275 esc2:
276 size++;
277 if (level > MAX_LEVEL)
278 goto esc3;
279 run1 = run - rl->max_run[last][level] - run_diff;
280 if (run1 < 0)
281 goto esc3;
282 code = get_rl_index(rl, last, run1, level);
283 if (code == rl->n) {
284 esc3:
285 /* third escape */
286 size+=1+1+6+8;
287 } else {
288 /* second escape */
289 size+= 1+1+ rl->table_vlc[code][1];
290 }
291 } else {
292 /* first escape */
293 size+= 1+1+ rl->table_vlc[code][1];
294 }
295 } else {
296 size++;
297 }
298 return size;
299}
300
301static void find_best_tables(MpegEncContext * s)
302{
303 int i;
304 int best =-1, best_size =9999999;
305 int chroma_best=-1, best_chroma_size=9999999;
Michael Niedermayer62959862002-08-09 00:13:54306
Michael Niedermayerf5957f32002-06-18 00:49:00307 for(i=0; i<3; i++){
308 int level;
309 int chroma_size=0;
310 int size=0;
311
312 if(i>0){// ;)
313 size++;
314 chroma_size++;
315 }
316 for(level=0; level<=MAX_LEVEL; level++){
317 int run;
318 for(run=0; run<=MAX_RUN; run++){
319 int last;
Michael Niedermayer62959862002-08-09 00:13:54320 const int last_size= size + chroma_size;
Michael Niedermayerf5957f32002-06-18 00:49:00321 for(last=0; last<2; last++){
322 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last];
323 int intra_luma_count = s->ac_stats[1][0][level][run][last];
324 int intra_chroma_count= s->ac_stats[1][1][level][run][last];
Michael Niedermayer62959862002-08-09 00:13:54325
Michael Niedermayerf5957f32002-06-18 00:49:00326 if(s->pict_type==I_TYPE){
Michael Niedermayer060f89b2002-10-27 12:20:58327 size += intra_luma_count *rl_length[i ][level][run][last];
328 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00329 }else{
Michael Niedermayer060f89b2002-10-27 12:20:58330 size+= intra_luma_count *rl_length[i ][level][run][last]
331 +intra_chroma_count*rl_length[i+3][level][run][last]
332 +inter_count *rl_length[i+3][level][run][last];
Michael Niedermayerf5957f32002-06-18 00:49:00333 }
334 }
Michael Niedermayer62959862002-08-09 00:13:54335 if(last_size == size+chroma_size) break;
Michael Niedermayerf5957f32002-06-18 00:49:00336 }
337 }
338 if(size<best_size){
339 best_size= size;
340 best= i;
341 }
342 if(chroma_size<best_chroma_size){
343 best_chroma_size= chroma_size;
344 chroma_best= i;
345 }
346 }
Michael Niedermayer62959862002-08-09 00:13:54347
Michael Niedermayerf5957f32002-06-18 00:49:00348// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n",
349// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size);
350
351 if(s->pict_type==P_TYPE) chroma_best= best;
352
353 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2);
354
355 s->rl_table_index = best;
356 s->rl_chroma_table_index= chroma_best;
357
358 if(s->pict_type != s->last_non_b_pict_type){
359 s->rl_table_index= 2;
360 if(s->pict_type==I_TYPE)
361 s->rl_chroma_table_index= 1;
362 else
363 s->rl_chroma_table_index= 2;
364 }
365
366}
367
Michael Niedermayer287229e2002-06-02 12:22:30368/* write MSMPEG4 compatible frame header */
Fabrice Bellardde6d9b62001-07-22 14:18:56369void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number)
370{
Michael Niedermayerf5957f32002-06-18 00:49:00371 find_best_tables(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56372
373 align_put_bits(&s->pb);
Fabrice Bellardde6d9b62001-07-22 14:18:56374 put_bits(&s->pb, 2, s->pict_type - 1);
375
376 put_bits(&s->pb, 5, s->qscale);
Michael Niedermayerf5957f32002-06-18 00:49:00377 if(s->msmpeg4_version<=2){
378 s->rl_table_index = 2;
379 s->rl_chroma_table_index = 2;
380 }
Michael Niedermayer3825cd12002-04-05 21:04:09381
Fabrice Bellardde6d9b62001-07-22 14:18:56382 s->dc_table_index = 1;
383 s->mv_table_index = 1; /* only if P frame */
384 s->use_skip_mb_code = 1; /* only if P frame */
Michael Niedermayerf5957f32002-06-18 00:49:00385 s->per_mb_rl_table = 0;
Michael Niedermayerfc48cba2002-10-20 17:02:41386 if(s->msmpeg4_version==4)
387 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:46388//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:00389
Fabrice Bellardde6d9b62001-07-22 14:18:56390 if (s->pict_type == I_TYPE) {
Michael Niedermayerde0f2f42002-07-07 08:34:46391 s->slice_height= s->mb_height/1;
392 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height);
Michael Niedermayerf5957f32002-06-18 00:49:00393
394 if(s->msmpeg4_version==4){
395 msmpeg4_encode_ext_header(s);
Michael Niedermayer05174fd2002-07-22 08:15:27396 if(s->bit_rate>MBAC_BITRATE)
Michael Niedermayerde0f2f42002-07-07 08:34:46397 put_bits(&s->pb, 1, s->per_mb_rl_table);
Michael Niedermayerf5957f32002-06-18 00:49:00398 }
Fabrice Bellardde6d9b62001-07-22 14:18:56399
Michael Niedermayer287229e2002-06-02 12:22:30400 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00401 if(!s->per_mb_rl_table){
402 code012(&s->pb, s->rl_chroma_table_index);
403 code012(&s->pb, s->rl_table_index);
404 }
Fabrice Bellardde6d9b62001-07-22 14:18:56405
Michael Niedermayer3825cd12002-04-05 21:04:09406 put_bits(&s->pb, 1, s->dc_table_index);
407 }
Fabrice Bellardde6d9b62001-07-22 14:18:56408 } else {
409 put_bits(&s->pb, 1, s->use_skip_mb_code);
410
Michael Niedermayer05174fd2002-07-22 08:15:27411 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE)
Michael Niedermayerf5957f32002-06-18 00:49:00412 put_bits(&s->pb, 1, s->per_mb_rl_table);
413
Michael Niedermayer287229e2002-06-02 12:22:30414 if(s->msmpeg4_version>2){
Michael Niedermayerf5957f32002-06-18 00:49:00415 if(!s->per_mb_rl_table)
416 code012(&s->pb, s->rl_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56417
Michael Niedermayer3825cd12002-04-05 21:04:09418 put_bits(&s->pb, 1, s->dc_table_index);
Fabrice Bellardde6d9b62001-07-22 14:18:56419
Michael Niedermayer3825cd12002-04-05 21:04:09420 put_bits(&s->pb, 1, s->mv_table_index);
421 }
Fabrice Bellardde6d9b62001-07-22 14:18:56422 }
423
Michael Niedermayerf5957f32002-06-18 00:49:00424 s->esc3_level_length= 0;
425 s->esc3_run_length= 0;
Fabrice Bellardde6d9b62001-07-22 14:18:56426
427#ifdef DEBUG
428 intra_count = 0;
429 printf("*****frame %d:\n", frame_count++);
430#endif
431}
432
Michael Niedermayerae404842002-01-15 22:22:41433void msmpeg4_encode_ext_header(MpegEncContext * s)
434{
Michael Niedermayer14bea432003-03-12 15:16:19435 put_bits(&s->pb, 5, s->avctx->frame_rate / s->avctx->frame_rate_base); //yes 29.97 -> 29
Michael Niedermayerae404842002-01-15 22:22:41436
Michael Niedermayerb8a78f42002-11-10 11:46:59437 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047));
Michael Niedermayerae404842002-01-15 22:22:41438
Michael Niedermayer1f9aea92003-04-01 15:38:01439 if(s->msmpeg4_version>=3)
Michael Niedermayer287229e2002-06-02 12:22:30440 put_bits(&s->pb, 1, s->flipflop_rounding);
Michael Niedermayer1f9aea92003-04-01 15:38:01441 else
442 assert(s->flipflop_rounding==0);
Michael Niedermayerae404842002-01-15 22:22:41443}
444
Wolfgang Hesseler76042462003-02-16 23:05:38445#endif //CONFIG_ENCODERS
446
Fabrice Bellardde6d9b62001-07-22 14:18:56447/* predict coded block */
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48448static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56449{
Michael Niedermayerdbbe8992002-03-29 01:53:59450 int xy, wrap, pred, a, b, c;
Fabrice Bellardde6d9b62001-07-22 14:18:56451
Michael Niedermayerdbbe8992002-03-29 01:53:59452 xy = s->block_index[n];
453 wrap = s->block_wrap[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56454
455 /* B C
456 * A X
457 */
Michael Niedermayerdbbe8992002-03-29 01:53:59458 a = s->coded_block[xy - 1 ];
459 b = s->coded_block[xy - 1 - wrap];
460 c = s->coded_block[xy - wrap];
Fabrice Bellardde6d9b62001-07-22 14:18:56461
462 if (b == c) {
463 pred = a;
464 } else {
465 pred = c;
466 }
467
468 /* store value */
Michael Niedermayerdbbe8992002-03-29 01:53:59469 *coded_block_ptr = &s->coded_block[xy];
Fabrice Bellardde6d9b62001-07-22 14:18:56470
471 return pred;
472}
473
Wolfgang Hesseler76042462003-02-16 23:05:38474#ifdef CONFIG_ENCODERS
475
Fabrice Bellardde6d9b62001-07-22 14:18:56476static void msmpeg4_encode_motion(MpegEncContext * s,
477 int mx, int my)
478{
479 int code;
480 MVTable *mv;
481
482 /* modulo encoding */
483 /* WARNING : you cannot reach all the MVs even with the modulo
484 encoding. This is a somewhat strange compromise they took !!! */
485 if (mx <= -64)
486 mx += 64;
487 else if (mx >= 64)
488 mx -= 64;
489 if (my <= -64)
490 my += 64;
491 else if (my >= 64)
492 my -= 64;
493
494 mx += 32;
495 my += 32;
496#if 0
497 if ((unsigned)mx >= 64 ||
498 (unsigned)my >= 64)
499 fprintf(stderr, "error mx=%d my=%d\n", mx, my);
500#endif
501 mv = &mv_tables[s->mv_table_index];
502
503 code = mv->table_mv_index[(mx << 6) | my];
504 set_stat(ST_MV);
505 put_bits(&s->pb,
506 mv->table_mv_bits[code],
507 mv->table_mv_code[code]);
508 if (code == mv->n) {
509 /* escape : code litterally */
510 put_bits(&s->pb, 6, mx);
511 put_bits(&s->pb, 6, my);
512 }
513}
514
Michael Niedermayerde0f2f42002-07-07 08:34:46515static inline void handle_slices(MpegEncContext *s){
516 if (s->mb_x == 0) {
517 if (s->slice_height && (s->mb_y % s->slice_height) == 0) {
Michael Niedermayer28269842003-01-09 11:37:08518 if(s->msmpeg4_version < 4){
Michael Niedermayer4d2858d2002-10-13 13:16:04519 ff_mpeg4_clean_buffers(s);
Michael Niedermayerde0f2f42002-07-07 08:34:46520 }
521 s->first_slice_line = 1;
522 } else {
523 s->first_slice_line = 0;
524 }
525 }
526}
527
Fabrice Bellardde6d9b62001-07-22 14:18:56528void msmpeg4_encode_mb(MpegEncContext * s,
529 DCTELEM block[6][64],
530 int motion_x, int motion_y)
531{
532 int cbp, coded_cbp, i;
533 int pred_x, pred_y;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48534 uint8_t *coded_block;
Fabrice Bellardde6d9b62001-07-22 14:18:56535
Michael Niedermayerde0f2f42002-07-07 08:34:46536 handle_slices(s);
537
Fabrice Bellardde6d9b62001-07-22 14:18:56538 if (!s->mb_intra) {
539 /* compute cbp */
540 set_stat(ST_INTER_MB);
541 cbp = 0;
542 for (i = 0; i < 6; i++) {
543 if (s->block_last_index[i] >= 0)
544 cbp |= 1 << (5 - i);
545 }
546 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) {
547 /* skip macroblock */
548 put_bits(&s->pb, 1, 1);
Michael Niedermayer4d2a4832003-04-02 09:57:34549 s->last_bits++;
550 s->misc_bits++;
Michael Niedermayera0c83172003-04-25 19:46:00551 s->skip_count++;
Michael Niedermayer4d2a4832003-04-02 09:57:34552
Fabrice Bellardde6d9b62001-07-22 14:18:56553 return;
554 }
555 if (s->use_skip_mb_code)
556 put_bits(&s->pb, 1, 0); /* mb coded */
557
Michael Niedermayer287229e2002-06-02 12:22:30558 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09559 put_bits(&s->pb,
560 v2_mb_type[cbp&3][1],
561 v2_mb_type[cbp&3][0]);
562 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C;
563 else coded_cbp= cbp;
Fabrice Bellardde6d9b62001-07-22 14:18:56564
Michael Niedermayer3825cd12002-04-05 21:04:09565 put_bits(&s->pb,
566 cbpy_tab[coded_cbp>>2][1],
567 cbpy_tab[coded_cbp>>2][0]);
Michael Niedermayer4d2a4832003-04-02 09:57:34568
569 s->misc_bits += get_bits_diff(s);
570
Michael Niedermayer3825cd12002-04-05 21:04:09571 h263_pred_motion(s, 0, &pred_x, &pred_y);
572 msmpeg4v2_encode_motion(s, motion_x - pred_x);
573 msmpeg4v2_encode_motion(s, motion_y - pred_y);
574 }else{
575 put_bits(&s->pb,
576 table_mb_non_intra[cbp + 64][1],
577 table_mb_non_intra[cbp + 64][0]);
578
Michael Niedermayer4d2a4832003-04-02 09:57:34579 s->misc_bits += get_bits_diff(s);
580
Michael Niedermayer3825cd12002-04-05 21:04:09581 /* motion vector */
582 h263_pred_motion(s, 0, &pred_x, &pred_y);
583 msmpeg4_encode_motion(s, motion_x - pred_x,
584 motion_y - pred_y);
585 }
Michael Niedermayer4d2a4832003-04-02 09:57:34586
587 s->mv_bits += get_bits_diff(s);
588
589 for (i = 0; i < 6; i++) {
590 msmpeg4_encode_block(s, block[i], i);
591 }
592 s->p_tex_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56593 } else {
594 /* compute cbp */
595 cbp = 0;
596 coded_cbp = 0;
597 for (i = 0; i < 6; i++) {
598 int val, pred;
599 val = (s->block_last_index[i] >= 1);
600 cbp |= val << (5 - i);
601 if (i < 4) {
602 /* predict value for close blocks only for luma */
603 pred = coded_block_pred(s, i, &coded_block);
604 *coded_block = val;
605 val = val ^ pred;
606 }
607 coded_cbp |= val << (5 - i);
608 }
609#if 0
610 if (coded_cbp)
611 printf("cbp=%x %x\n", cbp, coded_cbp);
612#endif
613
Michael Niedermayer287229e2002-06-02 12:22:30614 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09615 if (s->pict_type == I_TYPE) {
616 put_bits(&s->pb,
617 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]);
618 } else {
619 if (s->use_skip_mb_code)
620 put_bits(&s->pb, 1, 0); /* mb coded */
621 put_bits(&s->pb,
622 v2_mb_type[(cbp&3) + 4][1],
623 v2_mb_type[(cbp&3) + 4][0]);
624 }
625 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
626 put_bits(&s->pb,
627 cbpy_tab[cbp>>2][1],
628 cbpy_tab[cbp>>2][0]);
629 }else{
630 if (s->pict_type == I_TYPE) {
631 set_stat(ST_INTRA_MB);
632 put_bits(&s->pb,
633 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]);
634 } else {
635 if (s->use_skip_mb_code)
636 put_bits(&s->pb, 1, 0); /* mb coded */
637 put_bits(&s->pb,
638 table_mb_non_intra[cbp][1],
639 table_mb_non_intra[cbp][0]);
640 }
Fabrice Bellardde6d9b62001-07-22 14:18:56641 set_stat(ST_INTRA_MB);
Michael Niedermayer3825cd12002-04-05 21:04:09642 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
Michael Niedermayer05174fd2002-07-22 08:15:27643 if(s->inter_intra_pred){
644 s->h263_aic_dir=0;
645 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
646 }
Fabrice Bellardde6d9b62001-07-22 14:18:56647 }
Michael Niedermayer4d2a4832003-04-02 09:57:34648 s->misc_bits += get_bits_diff(s);
Fabrice Bellardde6d9b62001-07-22 14:18:56649
Michael Niedermayer4d2a4832003-04-02 09:57:34650 for (i = 0; i < 6; i++) {
651 msmpeg4_encode_block(s, block[i], i);
652 }
653 s->i_tex_bits += get_bits_diff(s);
Michael Niedermayera0c83172003-04-25 19:46:00654 s->i_count++;
Fabrice Bellardde6d9b62001-07-22 14:18:56655 }
656}
657
Wolfgang Hesseler76042462003-02-16 23:05:38658#endif //CONFIG_ENCODERS
659
Michael Niedermayer92ba5ff2002-05-21 23:13:57660/* old ffmpeg msmpeg4v3 mode */
Zdenek Kabelac5c91a672003-02-10 09:35:32661static void ff_old_msmpeg4_dc_scale(MpegEncContext * s)
Fabrice Bellardde6d9b62001-07-22 14:18:56662{
Michael Niedermayer92ba5ff2002-05-21 23:13:57663 if (s->qscale < 5){
Michael Niedermayer6fb904c2002-01-11 21:27:04664 s->y_dc_scale = 8;
665 s->c_dc_scale = 8;
Michael Niedermayer6fb904c2002-01-11 21:27:04666 }else if (s->qscale < 9){
667 s->y_dc_scale = 2 * s->qscale;
668 s->c_dc_scale = (s->qscale + 13)>>1;
Michael Niedermayer92ba5ff2002-05-21 23:13:57669 }else{
Michael Niedermayer6fb904c2002-01-11 21:27:04670 s->y_dc_scale = s->qscale + 8;
671 s->c_dc_scale = (s->qscale + 13)>>1;
672 }
Fabrice Bellardde6d9b62001-07-22 14:18:56673}
674
Michael Niedermayerf5957f32002-06-18 00:49:00675static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48676 int32_t **dc_val_ptr)
Michael Niedermayer287229e2002-06-02 12:22:30677{
678 int i;
679
680 if (n < 4) {
681 i= 0;
682 } else {
683 i= n-3;
684 }
685
686 *dc_val_ptr= &s->last_dc[i];
687 return s->last_dc[i];
688}
689
Michael Niedermayerde0f2f42002-07-07 08:34:46690static int get_dc(uint8_t *src, int stride, int scale)
691{
692 int y;
693 int sum=0;
694 for(y=0; y<8; y++){
695 int x;
696 for(x=0; x<8; x++){
697 sum+=src[x + y*stride];
698 }
699 }
BEROd4961b32003-05-14 15:12:13700 return FASTDIV((sum + (scale>>1)), scale);
Michael Niedermayerde0f2f42002-07-07 08:34:46701}
702
Fabrice Bellardde6d9b62001-07-22 14:18:56703/* dir = 0: left, dir = 1: top prediction */
Michael Niedermayerf5957f32002-06-18 00:49:00704static inline int msmpeg4_pred_dc(MpegEncContext * s, int n,
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48705 uint16_t **dc_val_ptr, int *dir_ptr)
Fabrice Bellardde6d9b62001-07-22 14:18:56706{
Michael Niedermayerdbbe8992002-03-29 01:53:59707 int a, b, c, wrap, pred, scale;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48708 int16_t *dc_val;
Fabrice Bellardde6d9b62001-07-22 14:18:56709
710 /* find prediction */
711 if (n < 4) {
Fabrice Bellardde6d9b62001-07-22 14:18:56712 scale = s->y_dc_scale;
713 } else {
Fabrice Bellardde6d9b62001-07-22 14:18:56714 scale = s->c_dc_scale;
715 }
Michael Niedermayer287229e2002-06-02 12:22:30716
Michael Niedermayerdbbe8992002-03-29 01:53:59717 wrap = s->block_wrap[n];
718 dc_val= s->dc_val[0] + s->block_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56719
720 /* B C
721 * A X
722 */
Michael Niedermayerdbbe8992002-03-29 01:53:59723 a = dc_val[ - 1];
724 b = dc_val[ - 1 - wrap];
725 c = dc_val[ - wrap];
Michael Niedermayer4d2858d2002-10-13 13:16:04726
Michael Niedermayer28269842003-01-09 11:37:08727 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){
Michael Niedermayer4d2858d2002-10-13 13:16:04728 b=c=1024;
729 }
Fabrice Bellardde6d9b62001-07-22 14:18:56730
731 /* XXX: the following solution consumes divisions, but it does not
732 necessitate to modify mpegvideo.c. The problem comes from the
733 fact they decided to store the quantized DC (which would lead
734 to problems if Q could vary !) */
Zdenek Kabelac320680d2002-01-28 18:06:28735#if defined ARCH_X86 && !defined PIC
Michael Niedermayer6f903d82002-01-14 04:34:52736 asm volatile(
737 "movl %3, %%eax \n\t"
738 "shrl $1, %%eax \n\t"
739 "addl %%eax, %2 \n\t"
740 "addl %%eax, %1 \n\t"
741 "addl %0, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23742 "mull %4 \n\t"
743 "movl %%edx, %0 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52744 "movl %1, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23745 "mull %4 \n\t"
746 "movl %%edx, %1 \n\t"
Michael Niedermayer6f903d82002-01-14 04:34:52747 "movl %2, %%eax \n\t"
Michael Niedermayer6fe84b42002-02-05 22:51:23748 "mull %4 \n\t"
749 "movl %%edx, %2 \n\t"
Michael Niedermayerfa778d52002-02-09 00:38:44750 : "+b" (a), "+c" (b), "+D" (c)
751 : "g" (scale), "S" (inverse[scale])
Michael Niedermayer6f903d82002-01-14 04:34:52752 : "%eax", "%edx"
753 );
Zdenek Kabelac320680d2002-01-28 18:06:28754#else
755 /* #elif defined (ARCH_ALPHA) */
Nick Kurshev1e98dff2002-01-20 14:48:02756 /* Divisions are extremely costly on Alpha; optimize the most
Zdenek Kabelac320680d2002-01-28 18:06:28757 common case. But they are costly everywhere...
758 */
Nick Kurshev1e98dff2002-01-20 14:48:02759 if (scale == 8) {
760 a = (a + (8 >> 1)) / 8;
761 b = (b + (8 >> 1)) / 8;
762 c = (c + (8 >> 1)) / 8;
763 } else {
BEROd4961b32003-05-14 15:12:13764 a = FASTDIV((a + (scale >> 1)), scale);
765 b = FASTDIV((b + (scale >> 1)), scale);
766 c = FASTDIV((c + (scale >> 1)), scale);
Nick Kurshev1e98dff2002-01-20 14:48:02767 }
Michael Niedermayer6f903d82002-01-14 04:34:52768#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56769 /* XXX: WARNING: they did not choose the same test as MPEG4. This
770 is very important ! */
Michael Niedermayerbd5e1c72002-06-22 15:52:25771 if(s->msmpeg4_version>3){
Michael Niedermayerde0f2f42002-07-07 08:34:46772 if(s->inter_intra_pred){
773 uint8_t *dest;
774 int wrap;
775
776 if(n==1){
777 pred=a;
778 *dir_ptr = 0;
779 }else if(n==2){
780 pred=c;
781 *dir_ptr = 1;
782 }else if(n==3){
783 if (abs(a - b) < abs(b - c)) {
784 pred = c;
785 *dir_ptr = 1;
786 } else {
787 pred = a;
788 *dir_ptr = 0;
789 }
790 }else{
791 if(n<4){
792 wrap= s->linesize;
Michael Niedermayer1e491e22002-12-04 10:04:03793 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:46794 }else{
Michael Niedermayer0fd90452002-07-15 14:15:10795 wrap= s->uvlinesize;
Michael Niedermayer1e491e22002-12-04 10:04:03796 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8;
Michael Niedermayerde0f2f42002-07-07 08:34:46797 }
798 if(s->mb_x==0) a= (1024 + (scale>>1))/scale;
799 else a= get_dc(dest-8, wrap, scale*8);
800 if(s->mb_y==0) c= (1024 + (scale>>1))/scale;
801 else c= get_dc(dest-8*wrap, wrap, scale*8);
802
803 if (s->h263_aic_dir==0) {
804 pred= a;
805 *dir_ptr = 0;
806 }else if (s->h263_aic_dir==1) {
807 if(n==0){
808 pred= c;
809 *dir_ptr = 1;
810 }else{
811 pred= a;
812 *dir_ptr = 0;
813 }
814 }else if (s->h263_aic_dir==2) {
815 if(n==0){
816 pred= a;
817 *dir_ptr = 0;
818 }else{
819 pred= c;
820 *dir_ptr = 1;
821 }
822 } else {
823 pred= c;
824 *dir_ptr = 1;
825 }
826 }
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 }
Michael Niedermayerbd5e1c72002-06-22 15:52:25835 }
836 }else{
837 if (abs(a - b) <= abs(b - c)) {
838 pred = c;
839 *dir_ptr = 1;
840 } else {
841 pred = a;
842 *dir_ptr = 0;
843 }
Fabrice Bellardde6d9b62001-07-22 14:18:56844 }
845
846 /* update predictor */
Michael Niedermayerdbbe8992002-03-29 01:53:59847 *dc_val_ptr = &dc_val[0];
Fabrice Bellardde6d9b62001-07-22 14:18:56848 return pred;
849}
850
851#define DC_MAX 119
852
Wolfgang Hesseler76042462003-02-16 23:05:38853#ifdef CONFIG_ENCODERS
854
Fabrice Bellardde6d9b62001-07-22 14:18:56855static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr)
856{
857 int sign, code;
858 int pred;
Fabrice Bellardde6d9b62001-07-22 14:18:56859
Michael Niedermayer287229e2002-06-02 12:22:30860 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48861 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:30862 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
863
864 /* update predictor */
865 *dc_val= level;
866 }else{
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48867 uint16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:25868 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Fabrice Bellardde6d9b62001-07-22 14:18:56869
Michael Niedermayer287229e2002-06-02 12:22:30870 /* update predictor */
871 if (n < 4) {
872 *dc_val = level * s->y_dc_scale;
873 } else {
874 *dc_val = level * s->c_dc_scale;
875 }
Fabrice Bellardde6d9b62001-07-22 14:18:56876 }
877
878 /* do the prediction */
879 level -= pred;
880
Michael Niedermayer287229e2002-06-02 12:22:30881 if(s->msmpeg4_version<=2){
Michael Niedermayer3825cd12002-04-05 21:04:09882 if (n < 4) {
883 put_bits(&s->pb,
884 v2_dc_lum_table[level+256][1],
885 v2_dc_lum_table[level+256][0]);
886 }else{
887 put_bits(&s->pb,
888 v2_dc_chroma_table[level+256][1],
889 v2_dc_chroma_table[level+256][0]);
890 }
891 }else{
892 sign = 0;
893 if (level < 0) {
894 level = -level;
895 sign = 1;
896 }
897 code = level;
898 if (code > DC_MAX)
899 code = DC_MAX;
Fabrice Bellardde6d9b62001-07-22 14:18:56900
Michael Niedermayer3825cd12002-04-05 21:04:09901 if (s->dc_table_index == 0) {
902 if (n < 4) {
903 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]);
904 } else {
905 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]);
906 }
Fabrice Bellardde6d9b62001-07-22 14:18:56907 } else {
Michael Niedermayer3825cd12002-04-05 21:04:09908 if (n < 4) {
909 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]);
910 } else {
911 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]);
912 }
Fabrice Bellardde6d9b62001-07-22 14:18:56913 }
Michael Niedermayer3825cd12002-04-05 21:04:09914
915 if (code == DC_MAX)
916 put_bits(&s->pb, 8, level);
917
918 if (level != 0) {
919 put_bits(&s->pb, 1, sign);
Fabrice Bellardde6d9b62001-07-22 14:18:56920 }
921 }
Fabrice Bellardde6d9b62001-07-22 14:18:56922}
923
924/* Encoding of a block. Very similar to MPEG4 except for a different
925 escape coding (same as H263) and more vlc tables.
926 */
Michael Niedermayerf5957f32002-06-18 00:49:00927static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:56928{
929 int level, run, last, i, j, last_index;
930 int last_non_zero, sign, slevel;
931 int code, run_diff, dc_pred_dir;
932 const RLTable *rl;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:48933 const uint8_t *scantable;
Fabrice Bellardde6d9b62001-07-22 14:18:56934
935 if (s->mb_intra) {
936 set_stat(ST_DC);
937 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir);
938 i = 1;
939 if (n < 4) {
940 rl = &rl_table[s->rl_table_index];
941 } else {
942 rl = &rl_table[3 + s->rl_chroma_table_index];
943 }
944 run_diff = 0;
Michael Niedermayer2ad15162002-09-29 22:44:22945 scantable= s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56946 set_stat(ST_INTRA_AC);
947 } else {
948 i = 0;
949 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:30950 if(s->msmpeg4_version<=2)
Michael Niedermayer3825cd12002-04-05 21:04:09951 run_diff = 0;
952 else
953 run_diff = 1;
Michael Niedermayer2ad15162002-09-29 22:44:22954 scantable= s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:56955 set_stat(ST_INTER_AC);
956 }
957
Michael Niedermayerf5957f32002-06-18 00:49:00958 /* recalculate block_last_index for M$ wmv1 */
Michael Niedermayer1457ab52002-12-27 23:51:46959 if(s->msmpeg4_version>=4 && s->block_last_index[n]>0){
Michael Niedermayerf5957f32002-06-18 00:49:00960 for(last_index=63; last_index>=0; last_index--){
961 if(block[scantable[last_index]]) break;
962 }
Michael Niedermayer4d2858d2002-10-13 13:16:04963 s->block_last_index[n]= last_index;
Michael Niedermayerf5957f32002-06-18 00:49:00964 }else
965 last_index = s->block_last_index[n];
Fabrice Bellardde6d9b62001-07-22 14:18:56966 /* AC coefs */
Fabrice Bellardde6d9b62001-07-22 14:18:56967 last_non_zero = i - 1;
968 for (; i <= last_index; i++) {
Michael Niedermayerf5957f32002-06-18 00:49:00969 j = scantable[i];
Fabrice Bellardde6d9b62001-07-22 14:18:56970 level = block[j];
971 if (level) {
972 run = i - last_non_zero - 1;
973 last = (i == last_index);
974 sign = 0;
975 slevel = level;
976 if (level < 0) {
977 sign = 1;
978 level = -level;
979 }
Michael Niedermayer62959862002-08-09 00:13:54980
Michael Niedermayerf5957f32002-06-18 00:49:00981 if(level<=MAX_LEVEL && run<=MAX_RUN){
982 s->ac_stats[s->mb_intra][n>3][level][run][last]++;
983 }
984#if 0
985else
986 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like
987#endif
Fabrice Bellardde6d9b62001-07-22 14:18:56988 code = get_rl_index(rl, last, run, level);
989 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
990 if (code == rl->n) {
991 int level1, run1;
992
993 level1 = level - rl->max_level[last][run];
994 if (level1 < 1)
995 goto esc2;
996 code = get_rl_index(rl, last, run, level1);
997 if (code == rl->n) {
998 esc2:
999 put_bits(&s->pb, 1, 0);
1000 if (level > MAX_LEVEL)
1001 goto esc3;
1002 run1 = run - rl->max_run[last][level] - run_diff;
1003 if (run1 < 0)
1004 goto esc3;
1005 code = get_rl_index(rl, last, run1, level);
1006 if (code == rl->n) {
1007 esc3:
1008 /* third escape */
1009 put_bits(&s->pb, 1, 0);
1010 put_bits(&s->pb, 1, last);
Michael Niedermayer1457ab52002-12-27 23:51:461011 if(s->msmpeg4_version>=4){
Michael Niedermayerf5957f32002-06-18 00:49:001012 if(s->esc3_level_length==0){
1013 s->esc3_level_length=8;
1014 s->esc3_run_length= 6;
1015 if(s->qscale<8)
1016 put_bits(&s->pb, 6, 3);
1017 else
1018 put_bits(&s->pb, 8, 3);
1019 }
1020 put_bits(&s->pb, s->esc3_run_length, run);
1021 put_bits(&s->pb, 1, sign);
1022 put_bits(&s->pb, s->esc3_level_length, level);
1023 }else{
1024 put_bits(&s->pb, 6, run);
1025 put_bits(&s->pb, 8, slevel & 0xff);
1026 }
Fabrice Bellardde6d9b62001-07-22 14:18:561027 } else {
1028 /* second escape */
1029 put_bits(&s->pb, 1, 1);
1030 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1031 put_bits(&s->pb, 1, sign);
1032 }
1033 } else {
1034 /* first escape */
1035 put_bits(&s->pb, 1, 1);
1036 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]);
1037 put_bits(&s->pb, 1, sign);
1038 }
1039 } else {
1040 put_bits(&s->pb, 1, sign);
1041 }
1042 last_non_zero = i;
1043 }
1044 }
1045}
1046
Wolfgang Hesseler76042462003-02-16 23:05:381047#endif //CONFIG_ENCODERS
1048
Fabrice Bellardde6d9b62001-07-22 14:18:561049/****************************************/
1050/* decoding stuff */
1051
Michael Niedermayer1457ab52002-12-27 23:51:461052static VLC mb_non_intra_vlc[4];
Fabrice Bellardde6d9b62001-07-22 14:18:561053static VLC mb_intra_vlc;
1054static VLC dc_lum_vlc[2];
1055static VLC dc_chroma_vlc[2];
Michael Niedermayer84afee32002-04-05 04:09:041056static VLC v2_dc_lum_vlc;
1057static VLC v2_dc_chroma_vlc;
1058static VLC cbpy_vlc;
1059static VLC v2_intra_cbpc_vlc;
1060static VLC v2_mb_type_vlc;
1061static VLC v2_mv_vlc;
Michael Niedermayer287229e2002-06-02 12:22:301062static VLC v1_intra_cbpc_vlc;
1063static VLC v1_inter_cbpc_vlc;
Michael Niedermayerde0f2f42002-07-07 08:34:461064static VLC inter_intra_vlc;
Michael Niedermayer84afee32002-04-05 04:09:041065
1066/* this table is practically identical to the one from h263 except that its inverted */
Falk Hüffner20695ec2002-06-03 11:16:111067static void init_h263_dc_for_msmpeg4(void)
Michael Niedermayer84afee32002-04-05 04:09:041068{
Michael Niedermayer84afee32002-04-05 04:09:041069 int level, uni_code, uni_len;
Michael Niedermayer84afee32002-04-05 04:09:041070
Michael Niedermayer2ed627e2002-04-05 16:51:121071 for(level=-256; level<256; level++){
Michael Niedermayer84afee32002-04-05 04:09:041072 int size, v, l;
1073 /* find number of bits */
1074 size = 0;
1075 v = abs(level);
1076 while (v) {
1077 v >>= 1;
1078 size++;
1079 }
1080
1081 if (level < 0)
1082 l= (-level) ^ ((1 << size) - 1);
1083 else
1084 l= level;
1085
1086 /* luminance h263 */
1087 uni_code= DCtab_lum[size][0];
1088 uni_len = DCtab_lum[size][1];
1089 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1090
1091 if (size > 0) {
1092 uni_code<<=size; uni_code|=l;
1093 uni_len+=size;
1094 if (size > 8){
1095 uni_code<<=1; uni_code|=1;
1096 uni_len++;
1097 }
1098 }
1099 v2_dc_lum_table[level+256][0]= uni_code;
1100 v2_dc_lum_table[level+256][1]= uni_len;
1101
1102 /* chrominance h263 */
1103 uni_code= DCtab_chrom[size][0];
1104 uni_len = DCtab_chrom[size][1];
1105 uni_code ^= (1<<uni_len)-1; //M$ doesnt like compatibility
1106
1107 if (size > 0) {
1108 uni_code<<=size; uni_code|=l;
1109 uni_len+=size;
1110 if (size > 8){
1111 uni_code<<=1; uni_code|=1;
1112 uni_len++;
1113 }
1114 }
1115 v2_dc_chroma_table[level+256][0]= uni_code;
1116 v2_dc_chroma_table[level+256][1]= uni_len;
1117
1118 }
Michael Niedermayer84afee32002-04-05 04:09:041119}
Fabrice Bellardde6d9b62001-07-22 14:18:561120
1121/* init all vlc decoding tables */
Michael Niedermayerf5957f32002-06-18 00:49:001122int ff_msmpeg4_decode_init(MpegEncContext *s)
Fabrice Bellardde6d9b62001-07-22 14:18:561123{
Fabrice Bellardd81c5982002-06-06 14:31:181124 static int done = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561125 int i;
1126 MVTable *mv;
1127
Michael Niedermayerf5957f32002-06-18 00:49:001128 common_init(s);
Fabrice Bellardde6d9b62001-07-22 14:18:561129
Fabrice Bellardd81c5982002-06-06 14:31:181130 if (!done) {
1131 done = 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561132
Fabrice Bellardd81c5982002-06-06 14:31:181133 for(i=0;i<NB_RL_TABLES;i++) {
1134 init_rl(&rl_table[i]);
1135 init_vlc_rl(&rl_table[i]);
1136 }
1137 for(i=0;i<2;i++) {
1138 mv = &mv_tables[i];
Michael Niedermayer08dce7b2002-07-10 20:05:421139 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1,
Fabrice Bellardd81c5982002-06-06 14:31:181140 mv->table_mv_bits, 1, 1,
1141 mv->table_mv_code, 2, 2);
1142 }
1143
Michael Niedermayer08dce7b2002-07-10 20:05:421144 init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181145 &table0_dc_lum[0][1], 8, 4,
1146 &table0_dc_lum[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421147 init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181148 &table0_dc_chroma[0][1], 8, 4,
1149 &table0_dc_chroma[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421150 init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181151 &table1_dc_lum[0][1], 8, 4,
1152 &table1_dc_lum[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421153 init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120,
Fabrice Bellardd81c5982002-06-06 14:31:181154 &table1_dc_chroma[0][1], 8, 4,
1155 &table1_dc_chroma[0][0], 8, 4);
1156
Michael Niedermayer08dce7b2002-07-10 20:05:421157 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181158 &v2_dc_lum_table[0][1], 8, 4,
1159 &v2_dc_lum_table[0][0], 8, 4);
Michael Niedermayer08dce7b2002-07-10 20:05:421160 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
Fabrice Bellardd81c5982002-06-06 14:31:181161 &v2_dc_chroma_table[0][1], 8, 4,
1162 &v2_dc_chroma_table[0][0], 8, 4);
1163
Michael Niedermayer08dce7b2002-07-10 20:05:421164 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16,
Fabrice Bellardd81c5982002-06-06 14:31:181165 &cbpy_tab[0][1], 2, 1,
1166 &cbpy_tab[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421167 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
Fabrice Bellardd81c5982002-06-06 14:31:181168 &v2_intra_cbpc[0][1], 2, 1,
1169 &v2_intra_cbpc[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421170 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181171 &v2_mb_type[0][1], 2, 1,
1172 &v2_mb_type[0][0], 2, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421173 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
Fabrice Bellardd81c5982002-06-06 14:31:181174 &mvtab[0][1], 2, 1,
1175 &mvtab[0][0], 2, 1);
1176
Michael Niedermayer1457ab52002-12-27 23:51:461177 for(i=0; i<4; i++){
1178 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128,
1179 &wmv2_inter_table[i][0][1], 8, 4,
1180 &wmv2_inter_table[i][0][0], 8, 4); //FIXME name?
1181 }
1182
Michael Niedermayer08dce7b2002-07-10 20:05:421183 init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64,
Fabrice Bellardd81c5982002-06-06 14:31:181184 &table_mb_intra[0][1], 4, 2,
1185 &table_mb_intra[0][0], 4, 2);
Michael Niedermayer287229e2002-06-02 12:22:301186
Michael Niedermayer08dce7b2002-07-10 20:05:421187 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
Fabrice Bellardd81c5982002-06-06 14:31:181188 intra_MCBPC_bits, 1, 1,
1189 intra_MCBPC_code, 1, 1);
Michael Niedermayer08dce7b2002-07-10 20:05:421190 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25,
Fabrice Bellardd81c5982002-06-06 14:31:181191 inter_MCBPC_bits, 1, 1,
1192 inter_MCBPC_code, 1, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461193
Michael Niedermayer08dce7b2002-07-10 20:05:421194 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
Michael Niedermayerde0f2f42002-07-07 08:34:461195 &table_inter_intra[0][1], 2, 1,
1196 &table_inter_intra[0][0], 2, 1);
Fabrice Bellardd81c5982002-06-06 14:31:181197 }
Michael Niedermayer4d2858d2002-10-13 13:16:041198
1199 switch(s->msmpeg4_version){
1200 case 1:
1201 case 2:
1202 s->decode_mb= msmpeg4v12_decode_mb;
1203 break;
1204 case 3:
1205 case 4:
1206 s->decode_mb= msmpeg4v34_decode_mb;
1207 break;
Michael Niedermayer1457ab52002-12-27 23:51:461208 case 5:
1209 s->decode_mb= wmv2_decode_mb;
1210 break;
Michael Niedermayer4d2858d2002-10-13 13:16:041211 }
1212
Michael Niedermayer917f5822002-10-25 16:06:321213 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame isnt a keyframe
1214
Fabrice Bellardde6d9b62001-07-22 14:18:561215 return 0;
1216}
1217
1218static int decode012(GetBitContext *gb)
1219{
1220 int n;
Arpi612476e2001-08-04 00:46:501221 n = get_bits1(gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561222 if (n == 0)
1223 return 0;
1224 else
Arpi612476e2001-08-04 00:46:501225 return get_bits1(gb) + 1;
Fabrice Bellardde6d9b62001-07-22 14:18:561226}
1227
Michael Niedermayer7f89b6f2002-03-29 02:07:251228int msmpeg4_decode_picture_header(MpegEncContext * s)
1229{
Michael Niedermayerf5957f32002-06-18 00:49:001230 int code;
Michael Niedermayer84afee32002-04-05 04:09:041231
Michael Niedermayere1a9dbf2002-04-06 22:29:371232#if 0
1233{
1234int i;
Michael Niedermayer68f593b2003-01-21 17:34:121235for(i=0; i<s->gb.size_in_bits; i++)
Michael Niedermayere1a9dbf2002-04-06 22:29:371236 printf("%d", get_bits1(&s->gb));
1237// get_bits1(&s->gb);
1238printf("END\n");
1239return -1;
1240}
1241#endif
Michael Niedermayer287229e2002-06-02 12:22:301242
1243 if(s->msmpeg4_version==1){
1244 int start_code, num;
1245 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16);
1246 if(start_code!=0x00000100){
1247 fprintf(stderr, "invalid startcode\n");
1248 return -1;
1249 }
1250
1251 num= get_bits(&s->gb, 5); // frame number */
1252 }
1253
Michael Niedermayer7f89b6f2002-03-29 02:07:251254 s->pict_type = get_bits(&s->gb, 2) + 1;
1255 if (s->pict_type != I_TYPE &&
Michael Niedermayer287229e2002-06-02 12:22:301256 s->pict_type != P_TYPE){
1257 fprintf(stderr, "invalid picture type\n");
Michael Niedermayer7f89b6f2002-03-29 02:07:251258 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301259 }
Michael Niedermayerde0f2f42002-07-07 08:34:461260#if 0
1261{
1262 static int had_i=0;
1263 if(s->pict_type == I_TYPE) had_i=1;
1264 if(!had_i) return -1;
1265}
1266#endif
Michael Niedermayer7f89b6f2002-03-29 02:07:251267 s->qscale = get_bits(&s->gb, 5);
Michael Niedermayerae2d2d62003-02-10 22:43:301268 if(s->qscale==0){
1269 fprintf(stderr, "invalid qscale\n");
1270 return -1;
1271 }
Michael Niedermayer7f89b6f2002-03-29 02:07:251272
1273 if (s->pict_type == I_TYPE) {
1274 code = get_bits(&s->gb, 5);
Michael Niedermayer287229e2002-06-02 12:22:301275 if(s->msmpeg4_version==1){
1276 if(code==0 || code>s->mb_height){
1277 fprintf(stderr, "invalid slice height %d\n", code);
1278 return -1;
1279 }
1280
1281 s->slice_height = code;
1282 }else{
1283 /* 0x17: one slice, 0x18: two slices, ... */
Michael Niedermayerde0f2f42002-07-07 08:34:461284 if (code < 0x17){
1285 fprintf(stderr, "error, slice code was %X\n", code);
Michael Niedermayer287229e2002-06-02 12:22:301286 return -1;
Michael Niedermayerde0f2f42002-07-07 08:34:461287 }
Michael Niedermayer287229e2002-06-02 12:22:301288
1289 s->slice_height = s->mb_height / (code - 0x16);
1290 }
Michael Niedermayere1a9dbf2002-04-06 22:29:371291
1292 switch(s->msmpeg4_version){
Michael Niedermayer287229e2002-06-02 12:22:301293 case 1:
Michael Niedermayere1a9dbf2002-04-06 22:29:371294 case 2:
Michael Niedermayer84afee32002-04-05 04:09:041295 s->rl_chroma_table_index = 2;
1296 s->rl_table_index = 2;
Fabrice Bellardde6d9b62001-07-22 14:18:561297
Michael Niedermayer84afee32002-04-05 04:09:041298 s->dc_table_index = 0; //not used
Michael Niedermayere1a9dbf2002-04-06 22:29:371299 break;
1300 case 3:
Michael Niedermayer84afee32002-04-05 04:09:041301 s->rl_chroma_table_index = decode012(&s->gb);
1302 s->rl_table_index = decode012(&s->gb);
1303
1304 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayere1a9dbf2002-04-06 22:29:371305 break;
1306 case 4:
Michael Niedermayerf5957f32002-06-18 00:49:001307 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
Michael Niedermayere1a9dbf2002-04-06 22:29:371308
Michael Niedermayer05174fd2002-07-22 08:15:271309 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1310 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461311
Michael Niedermayerf5957f32002-06-18 00:49:001312 if(!s->per_mb_rl_table){
1313 s->rl_chroma_table_index = decode012(&s->gb);
1314 s->rl_table_index = decode012(&s->gb);
1315 }
1316
1317 s->dc_table_index = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461318 s->inter_intra_pred= 0;
Michael Niedermayere1a9dbf2002-04-06 22:29:371319 break;
Michael Niedermayer84afee32002-04-05 04:09:041320 }
Fabrice Bellardde6d9b62001-07-22 14:18:561321 s->no_rounding = 1;
Michael Niedermayerde0f2f42002-07-07 08:34:461322/* printf("qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371323 s->qscale,
1324 s->rl_chroma_table_index,
1325 s->rl_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001326 s->dc_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461327 s->per_mb_rl_table,
1328 s->slice_height);*/
Fabrice Bellardde6d9b62001-07-22 14:18:561329 } else {
Michael Niedermayer287229e2002-06-02 12:22:301330 switch(s->msmpeg4_version){
1331 case 1:
1332 case 2:
1333 if(s->msmpeg4_version==1)
1334 s->use_skip_mb_code = 1;
1335 else
1336 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041337 s->rl_table_index = 2;
1338 s->rl_chroma_table_index = s->rl_table_index;
Michael Niedermayer84afee32002-04-05 04:09:041339 s->dc_table_index = 0; //not used
Michael Niedermayer84afee32002-04-05 04:09:041340 s->mv_table_index = 0;
Michael Niedermayer287229e2002-06-02 12:22:301341 break;
1342 case 3:
1343 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayer84afee32002-04-05 04:09:041344 s->rl_table_index = decode012(&s->gb);
1345 s->rl_chroma_table_index = s->rl_table_index;
1346
1347 s->dc_table_index = get_bits1(&s->gb);
1348
1349 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer287229e2002-06-02 12:22:301350 break;
Michael Niedermayerf5957f32002-06-18 00:49:001351 case 4:
1352 s->use_skip_mb_code = get_bits1(&s->gb);
Michael Niedermayerde0f2f42002-07-07 08:34:461353
Michael Niedermayer05174fd2002-07-22 08:15:271354 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
1355 else s->per_mb_rl_table= 0;
Michael Niedermayerde0f2f42002-07-07 08:34:461356
Michael Niedermayerf5957f32002-06-18 00:49:001357 if(!s->per_mb_rl_table){
1358 s->rl_table_index = decode012(&s->gb);
1359 s->rl_chroma_table_index = s->rl_table_index;
1360 }
1361
1362 s->dc_table_index = get_bits1(&s->gb);
1363
1364 s->mv_table_index = get_bits1(&s->gb);
Michael Niedermayer05174fd2002-07-22 08:15:271365 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
Michael Niedermayerf5957f32002-06-18 00:49:001366 break;
Michael Niedermayer84afee32002-04-05 04:09:041367 }
Michael Niedermayerde0f2f42002-07-07 08:34:461368/* printf("skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
Michael Niedermayerbadaf882002-01-13 04:59:371369 s->use_skip_mb_code,
1370 s->rl_table_index,
1371 s->rl_chroma_table_index,
1372 s->dc_table_index,
Michael Niedermayerf5957f32002-06-18 00:49:001373 s->mv_table_index,
Michael Niedermayerde0f2f42002-07-07 08:34:461374 s->per_mb_rl_table,
1375 s->qscale);*/
Michael Niedermayerae404842002-01-15 22:22:411376 if(s->flipflop_rounding){
1377 s->no_rounding ^= 1;
1378 }else{
1379 s->no_rounding = 0;
1380 }
Fabrice Bellardde6d9b62001-07-22 14:18:561381 }
Michael Niedermayer1457ab52002-12-27 23:51:461382//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:001383
1384 s->esc3_level_length= 0;
1385 s->esc3_run_length= 0;
Michael Niedermayer84afee32002-04-05 04:09:041386
Fabrice Bellardde6d9b62001-07-22 14:18:561387#ifdef DEBUG
1388 printf("*****frame %d:\n", frame_count++);
1389#endif
1390 return 0;
1391}
1392
Michael Niedermayerae404842002-01-15 22:22:411393int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
1394{
Michael Niedermayer287229e2002-06-02 12:22:301395 int left= buf_size*8 - get_bits_count(&s->gb);
1396 int length= s->msmpeg4_version>=3 ? 17 : 16;
Michael Niedermayerae404842002-01-15 22:22:411397 /* the alt_bitstream reader could read over the end so we need to check it */
Michael Niedermayer287229e2002-06-02 12:22:301398 if(left>=length && left<length+8)
Michael Niedermayerae404842002-01-15 22:22:411399 {
Michael Niedermayer2b9ab1d2002-02-22 19:19:011400 int fps;
1401
1402 fps= get_bits(&s->gb, 5);
Michael Niedermayer05174fd2002-07-22 08:15:271403 s->bit_rate= get_bits(&s->gb, 11)*1024;
Michael Niedermayer287229e2002-06-02 12:22:301404 if(s->msmpeg4_version>=3)
1405 s->flipflop_rounding= get_bits1(&s->gb);
1406 else
1407 s->flipflop_rounding= 0;
Michael Niedermayer2b9ab1d2002-02-22 19:19:011408
Michael Niedermayer05174fd2002-07-22 08:15:271409// printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding);
Michael Niedermayer287229e2002-06-02 12:22:301410 }
1411 else if(left<length+8)
1412 {
1413 s->flipflop_rounding= 0;
1414 printf("ext header missing, %d left\n", left);
Michael Niedermayerae404842002-01-15 22:22:411415 }
1416 else
1417 {
Michael Niedermayer287229e2002-06-02 12:22:301418 fprintf(stderr, "I frame too long, ignoring ext header\n");
Michael Niedermayerae404842002-01-15 22:22:411419 }
Michael Niedermayer2b9ab1d2002-02-22 19:19:011420
Michael Niedermayerae404842002-01-15 22:22:411421 return 0;
1422}
1423
Zdenek Kabelaccd4af682002-05-27 16:42:141424static inline void msmpeg4_memsetw(short *tab, int val, int n)
Fabrice Bellardde6d9b62001-07-22 14:18:561425{
1426 int i;
1427 for(i=0;i<n;i++)
1428 tab[i] = val;
1429}
1430
Wolfgang Hesseler76042462003-02-16 23:05:381431#ifdef CONFIG_ENCODERS
1432
Michael Niedermayer3825cd12002-04-05 21:04:091433static void msmpeg4v2_encode_motion(MpegEncContext * s, int val)
1434{
1435 int range, bit_size, sign, code, bits;
1436
1437 if (val == 0) {
1438 /* zero vector */
1439 code = 0;
1440 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]);
1441 } else {
1442 bit_size = s->f_code - 1;
1443 range = 1 << bit_size;
1444 if (val <= -64)
1445 val += 64;
1446 else if (val >= 64)
1447 val -= 64;
1448
1449 if (val >= 0) {
1450 sign = 0;
1451 } else {
1452 val = -val;
1453 sign = 1;
1454 }
1455 val--;
1456 code = (val >> bit_size) + 1;
1457 bits = val & (range - 1);
1458
1459 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign);
1460 if (bit_size > 0) {
1461 put_bits(&s->pb, bit_size, bits);
1462 }
1463 }
1464}
1465
Wolfgang Hesseler76042462003-02-16 23:05:381466#endif //CONFIG_ENCODERS
1467
Michael Niedermayer84afee32002-04-05 04:09:041468/* this is identical to h263 except that its range is multiplied by 2 */
1469static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
1470{
1471 int code, val, sign, shift;
1472
Michael Niedermayer08dce7b2002-07-10 20:05:421473 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
Michael Niedermayer287229e2002-06-02 12:22:301474// printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
Michael Niedermayer84afee32002-04-05 04:09:041475 if (code < 0)
1476 return 0xffff;
1477
1478 if (code == 0)
1479 return pred;
1480 sign = get_bits1(&s->gb);
1481 shift = f_code - 1;
BERO05858882003-05-14 01:08:021482 val = code;
1483 if (shift) {
1484 val = (val - 1) << shift;
Michael Niedermayer84afee32002-04-05 04:09:041485 val |= get_bits(&s->gb, shift);
BERO05858882003-05-14 01:08:021486 val++;
1487 }
Michael Niedermayer84afee32002-04-05 04:09:041488 if (sign)
1489 val = -val;
Michael Niedermayer84afee32002-04-05 04:09:041490
Michael Niedermayer287229e2002-06-02 12:22:301491 val += pred;
Michael Niedermayer84afee32002-04-05 04:09:041492 if (val <= -64)
1493 val += 64;
1494 else if (val >= 64)
1495 val -= 64;
1496
1497 return val;
1498}
1499
Michael Niedermayer4d2858d2002-10-13 13:16:041500static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Michael Niedermayer84afee32002-04-05 04:09:041501{
1502 int cbp, code, i;
Michael Niedermayer4d2858d2002-10-13 13:16:041503
Michael Niedermayer84afee32002-04-05 04:09:041504 if (s->pict_type == P_TYPE) {
1505 if (s->use_skip_mb_code) {
1506 if (get_bits1(&s->gb)) {
1507 /* skip mb */
1508 s->mb_intra = 0;
1509 for(i=0;i<6;i++)
1510 s->block_last_index[i] = -1;
1511 s->mv_dir = MV_DIR_FORWARD;
1512 s->mv_type = MV_TYPE_16X16;
1513 s->mv[0][0][0] = 0;
1514 s->mv[0][0][1] = 0;
1515 s->mb_skiped = 1;
1516 return 0;
1517 }
1518 }
1519
Michael Niedermayer287229e2002-06-02 12:22:301520 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421521 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301522 else
Michael Niedermayer08dce7b2002-07-10 20:05:421523 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3);
Michael Niedermayer287229e2002-06-02 12:22:301524 if(code<0 || code>7){
1525 fprintf(stderr, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
1526 return -1;
1527 }
1528
Michael Niedermayer84afee32002-04-05 04:09:041529 s->mb_intra = code >>2;
1530
1531 cbp = code & 0x3;
1532 } else {
1533 s->mb_intra = 1;
Michael Niedermayer287229e2002-06-02 12:22:301534 if(s->msmpeg4_version==2)
Michael Niedermayer08dce7b2002-07-10 20:05:421535 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301536 else
Michael Niedermayer08dce7b2002-07-10 20:05:421537 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301538 if(cbp<0 || cbp>3){
1539 fprintf(stderr, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1540 return -1;
1541 }
Michael Niedermayer84afee32002-04-05 04:09:041542 }
1543
1544 if (!s->mb_intra) {
Michael Niedermayer287229e2002-06-02 12:22:301545 int mx, my, cbpy;
1546
Michael Niedermayer08dce7b2002-07-10 20:05:421547 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
Michael Niedermayer287229e2002-06-02 12:22:301548 if(cbpy<0){
1549 fprintf(stderr, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
1550 return -1;
1551 }
Michael Niedermayer84afee32002-04-05 04:09:041552
Michael Niedermayer287229e2002-06-02 12:22:301553 cbp|= cbpy<<2;
1554 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
Michael Niedermayer84afee32002-04-05 04:09:041555
1556 h263_pred_motion(s, 0, &mx, &my);
1557 mx= msmpeg4v2_decode_motion(s, mx, 1);
1558 my= msmpeg4v2_decode_motion(s, my, 1);
1559
1560 s->mv_dir = MV_DIR_FORWARD;
1561 s->mv_type = MV_TYPE_16X16;
1562 s->mv[0][0][0] = mx;
1563 s->mv[0][0][1] = my;
1564 } else {
Michael Niedermayer287229e2002-06-02 12:22:301565 if(s->msmpeg4_version==2){
1566 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer08dce7b2002-07-10 20:05:421567 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301568 } else{
1569 s->ac_pred = 0;
Michael Niedermayer08dce7b2002-07-10 20:05:421570 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
Michael Niedermayer287229e2002-06-02 12:22:301571 if(s->pict_type==P_TYPE) cbp^=0x3C;
1572 }
Michael Niedermayer84afee32002-04-05 04:09:041573 }
1574
1575 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461576 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Michael Niedermayer84afee32002-04-05 04:09:041577 {
Michael Niedermayer287229e2002-06-02 12:22:301578 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
Michael Niedermayer84afee32002-04-05 04:09:041579 return -1;
1580 }
1581 }
1582 return 0;
1583}
1584
Michael Niedermayer4d2858d2002-10-13 13:16:041585static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
Fabrice Bellardde6d9b62001-07-22 14:18:561586{
1587 int cbp, code, i;
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481588 uint8_t *coded_val;
Michael Niedermayer7bc90902003-04-10 13:18:381589 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:561590
1591 if (s->pict_type == P_TYPE) {
1592 set_stat(ST_INTER_MB);
1593 if (s->use_skip_mb_code) {
Arpi612476e2001-08-04 00:46:501594 if (get_bits1(&s->gb)) {
Fabrice Bellardde6d9b62001-07-22 14:18:561595 /* skip mb */
1596 s->mb_intra = 0;
1597 for(i=0;i<6;i++)
1598 s->block_last_index[i] = -1;
1599 s->mv_dir = MV_DIR_FORWARD;
1600 s->mv_type = MV_TYPE_16X16;
1601 s->mv[0][0][0] = 0;
1602 s->mv[0][0][1] = 0;
Fabrice Bellard3bb4e232001-07-24 20:43:411603 s->mb_skiped = 1;
Michael Niedermayer7bc90902003-04-10 13:18:381604 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
1605
Fabrice Bellardde6d9b62001-07-22 14:18:561606 return 0;
1607 }
1608 }
1609
Michael Niedermayer1457ab52002-12-27 23:51:461610 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:561611 if (code < 0)
1612 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541613 //s->mb_intra = (code & 0x40) ? 0 : 1;
1614 s->mb_intra = (~code & 0x40) >> 6;
Fabrice Bellardde6d9b62001-07-22 14:18:561615
1616 cbp = code & 0x3f;
1617 } else {
1618 set_stat(ST_INTRA_MB);
1619 s->mb_intra = 1;
Michael Niedermayer08dce7b2002-07-10 20:05:421620 code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2);
Fabrice Bellardde6d9b62001-07-22 14:18:561621 if (code < 0)
1622 return -1;
1623 /* predict coded block pattern */
1624 cbp = 0;
1625 for(i=0;i<6;i++) {
Zdenek Kabelac38d171e2002-02-18 09:34:541626 int val = ((code >> (5 - i)) & 1);
Fabrice Bellardde6d9b62001-07-22 14:18:561627 if (i < 4) {
Zdenek Kabelac38d171e2002-02-18 09:34:541628 int pred = coded_block_pred(s, i, &coded_val);
Fabrice Bellardde6d9b62001-07-22 14:18:561629 val = val ^ pred;
1630 *coded_val = val;
1631 }
1632 cbp |= val << (5 - i);
1633 }
1634 }
1635
1636 if (!s->mb_intra) {
1637 int mx, my;
Michael Niedermayerf5957f32002-06-18 00:49:001638//printf("P at %d %d\n", s->mb_x, s->mb_y);
1639 if(s->per_mb_rl_table && cbp){
1640 s->rl_table_index = decode012(&s->gb);
1641 s->rl_chroma_table_index = s->rl_table_index;
1642 }
Fabrice Bellardde6d9b62001-07-22 14:18:561643 set_stat(ST_MV);
1644 h263_pred_motion(s, 0, &mx, &my);
1645 if (msmpeg4_decode_motion(s, &mx, &my) < 0)
1646 return -1;
1647 s->mv_dir = MV_DIR_FORWARD;
1648 s->mv_type = MV_TYPE_16X16;
1649 s->mv[0][0][0] = mx;
1650 s->mv[0][0][1] = my;
Michael Niedermayer7bc90902003-04-10 13:18:381651 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
Fabrice Bellardde6d9b62001-07-22 14:18:561652 } else {
Michael Niedermayerf5957f32002-06-18 00:49:001653//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:561654 set_stat(ST_INTRA_MB);
Arpi612476e2001-08-04 00:46:501655 s->ac_pred = get_bits1(&s->gb);
Michael Niedermayer7bc90902003-04-10 13:18:381656 *mb_type_ptr = MB_TYPE_INTRA;
Michael Niedermayerde0f2f42002-07-07 08:34:461657 if(s->inter_intra_pred){
Michael Niedermayer08dce7b2002-07-10 20:05:421658 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
Michael Niedermayerde0f2f42002-07-07 08:34:461659// printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
1660 }
Michael Niedermayerf5957f32002-06-18 00:49:001661 if(s->per_mb_rl_table && cbp){
1662 s->rl_table_index = decode012(&s->gb);
1663 s->rl_chroma_table_index = s->rl_table_index;
1664 }
Fabrice Bellardde6d9b62001-07-22 14:18:561665 }
1666
1667 for (i = 0; i < 6; i++) {
Michael Niedermayer1457ab52002-12-27 23:51:461668 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
Zdenek Kabelac38d171e2002-02-18 09:34:541669 {
Michael Niedermayer287229e2002-06-02 12:22:301670 fprintf(stderr,"\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
1671 return -1;
Zdenek Kabelac38d171e2002-02-18 09:34:541672 }
Fabrice Bellardde6d9b62001-07-22 14:18:561673 }
Michael Niedermayerbd5e1c72002-06-22 15:52:251674
Fabrice Bellardde6d9b62001-07-22 14:18:561675 return 0;
1676}
Michael Niedermayer1a013242002-07-17 09:15:141677//#define ERROR_DETAILS
Michael Niedermayerf5957f32002-06-18 00:49:001678static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block,
Michael Niedermayer1457ab52002-12-27 23:51:461679 int n, int coded, const uint8_t *scan_table)
Fabrice Bellardde6d9b62001-07-22 14:18:561680{
Michael Niedermayer45a82ed2002-07-13 14:55:121681 int level, i, last, run, run_diff;
Fabrice Bellardde6d9b62001-07-22 14:18:561682 int dc_pred_dir;
1683 RLTable *rl;
Michael Niedermayer45a82ed2002-07-13 14:55:121684 RL_VLC_ELEM *rl_vlc;
Michael Niedermayerbadaf882002-01-13 04:59:371685 int qmul, qadd;
Fabrice Bellardde6d9b62001-07-22 14:18:561686
1687 if (s->mb_intra) {
Michael Niedermayerbadaf882002-01-13 04:59:371688 qmul=1;
1689 qadd=0;
1690
Fabrice Bellardde6d9b62001-07-22 14:18:561691 /* DC coef */
1692 set_stat(ST_DC);
1693 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
Michael Niedermayer7bc90902003-04-10 13:18:381694
Michael Niedermayer287229e2002-06-02 12:22:301695 if (level < 0){
Michael Niedermayerbd5e1c72002-06-22 15:52:251696 fprintf(stderr, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461697 if(s->inter_intra_pred) level=0;
1698 else return -1;
Michael Niedermayer287229e2002-06-02 12:22:301699 }
Fabrice Bellardde6d9b62001-07-22 14:18:561700 if (n < 4) {
1701 rl = &rl_table[s->rl_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301702 if(level > 256*s->y_dc_scale){
Michael Niedermayerbd5e1c72002-06-22 15:52:251703 fprintf(stderr, "dc overflow+ L qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461704 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301705 }
Fabrice Bellardde6d9b62001-07-22 14:18:561706 } else {
1707 rl = &rl_table[3 + s->rl_chroma_table_index];
Michael Niedermayer287229e2002-06-02 12:22:301708 if(level > 256*s->c_dc_scale){
Michael Niedermayerbd5e1c72002-06-22 15:52:251709 fprintf(stderr, "dc overflow+ C qscale: %d//\n", s->qscale);
Michael Niedermayerde0f2f42002-07-07 08:34:461710 if(!s->inter_intra_pred) return -1;
Michael Niedermayer287229e2002-06-02 12:22:301711 }
Fabrice Bellardde6d9b62001-07-22 14:18:561712 }
Michael Niedermayer287229e2002-06-02 12:22:301713 block[0] = level;
Michael Niedermayerbadaf882002-01-13 04:59:371714
Fabrice Bellardde6d9b62001-07-22 14:18:561715 run_diff = 0;
Michael Niedermayer45a82ed2002-07-13 14:55:121716 i = 0;
Fabrice Bellardde6d9b62001-07-22 14:18:561717 if (!coded) {
1718 goto not_coded;
1719 }
1720 if (s->ac_pred) {
1721 if (dc_pred_dir == 0)
Michael Niedermayer2ad15162002-09-29 22:44:221722 scan_table = s->intra_v_scantable.permutated; /* left */
Fabrice Bellardde6d9b62001-07-22 14:18:561723 else
Michael Niedermayer2ad15162002-09-29 22:44:221724 scan_table = s->intra_h_scantable.permutated; /* top */
Fabrice Bellardde6d9b62001-07-22 14:18:561725 } else {
Michael Niedermayer2ad15162002-09-29 22:44:221726 scan_table = s->intra_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561727 }
1728 set_stat(ST_INTRA_AC);
Michael Niedermayer45a82ed2002-07-13 14:55:121729 rl_vlc= rl->rl_vlc[0];
Fabrice Bellardde6d9b62001-07-22 14:18:561730 } else {
Michael Niedermayerbadaf882002-01-13 04:59:371731 qmul = s->qscale << 1;
1732 qadd = (s->qscale - 1) | 1;
Michael Niedermayer45a82ed2002-07-13 14:55:121733 i = -1;
Fabrice Bellardde6d9b62001-07-22 14:18:561734 rl = &rl_table[3 + s->rl_table_index];
Michael Niedermayer84afee32002-04-05 04:09:041735
1736 if(s->msmpeg4_version==2)
1737 run_diff = 0;
1738 else
1739 run_diff = 1;
1740
Fabrice Bellardde6d9b62001-07-22 14:18:561741 if (!coded) {
Michael Niedermayer45a82ed2002-07-13 14:55:121742 s->block_last_index[n] = i;
Fabrice Bellardde6d9b62001-07-22 14:18:561743 return 0;
1744 }
Michael Niedermayer1457ab52002-12-27 23:51:461745 if(!scan_table)
1746 scan_table = s->inter_scantable.permutated;
Fabrice Bellardde6d9b62001-07-22 14:18:561747 set_stat(ST_INTER_AC);
Michael Niedermayer45a82ed2002-07-13 14:55:121748 rl_vlc= rl->rl_vlc[s->qscale];
Fabrice Bellardde6d9b62001-07-22 14:18:561749 }
Michael Niedermayer45a82ed2002-07-13 14:55:121750 {
1751 OPEN_READER(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561752 for(;;) {
Michael Niedermayer45a82ed2002-07-13 14:55:121753 UPDATE_CACHE(re, &s->gb);
1754 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1755 if (level==0) {
1756 int cache;
1757 cache= GET_CACHE(re, &s->gb);
Fabrice Bellardde6d9b62001-07-22 14:18:561758 /* escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121759 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
1760 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
Fabrice Bellardde6d9b62001-07-22 14:18:561761 /* third escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121762 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
1763 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001764 if(s->msmpeg4_version<=3){
Michael Niedermayer45a82ed2002-07-13 14:55:121765 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
1766 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
1767 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8);
1768 SKIP_COUNTER(re, &s->gb, 1+6+8);
1769 }else{
Michael Niedermayerf5957f32002-06-18 00:49:001770 int sign;
Michael Niedermayer45a82ed2002-07-13 14:55:121771 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001772 if(!s->esc3_level_length){
1773 int ll;
1774 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y);
1775 if(s->qscale<8){
Michael Niedermayer45a82ed2002-07-13 14:55:121776 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
Michael Niedermayerf5957f32002-06-18 00:49:001777 if(ll==0){
Michael Niedermayer45a82ed2002-07-13 14:55:121778 if(SHOW_UBITS(re, &s->gb, 1)) printf("cool a new vlc code ,contact the ffmpeg developers and upload the file\n");
1779 SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001780 ll=8;
1781 }
1782 }else{
1783 ll=2;
Michael Niedermayer45a82ed2002-07-13 14:55:121784 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
1785 ll++;
1786 SKIP_BITS(re, &s->gb, 1);
1787 }
Michael Niedermayer05174fd2002-07-22 08:15:271788 if(ll<8) SKIP_BITS(re, &s->gb, 1);
Michael Niedermayerf5957f32002-06-18 00:49:001789 }
1790
1791 s->esc3_level_length= ll;
Michael Niedermayer45a82ed2002-07-13 14:55:121792 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001793//printf("level length:%d, run length: %d\n", ll, s->esc3_run_length);
Michael Niedermayer05174fd2002-07-22 08:15:271794 UPDATE_CACHE(re, &s->gb);
Michael Niedermayerf5957f32002-06-18 00:49:001795 }
Michael Niedermayer45a82ed2002-07-13 14:55:121796 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
1797 SKIP_BITS(re, &s->gb, s->esc3_run_length);
1798
1799 sign= SHOW_UBITS(re, &s->gb, 1);
1800 SKIP_BITS(re, &s->gb, 1);
1801
1802 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
1803 SKIP_BITS(re, &s->gb, s->esc3_level_length);
Michael Niedermayerf5957f32002-06-18 00:49:001804 if(sign) level= -level;
1805 }
1806//printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y);
Michael Niedermayer287229e2002-06-02 12:22:301807#if 0 // waste of time / this will detect very few errors
1808 {
1809 const int abs_level= ABS(level);
1810 const int run1= run - rl->max_run[last][abs_level] - run_diff;
1811 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
1812 if(abs_level <= rl->max_level[last][run]){
1813 fprintf(stderr, "illegal 3. esc, vlc encoding possible\n");
1814 return DECODING_AC_LOST;
1815 }
1816 if(abs_level <= rl->max_level[last][run]*2){
1817 fprintf(stderr, "illegal 3. esc, esc 1 encoding possible\n");
1818 return DECODING_AC_LOST;
1819 }
Michael Niedermayerf5957f32002-06-18 00:49:001820 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
Michael Niedermayer287229e2002-06-02 12:22:301821 fprintf(stderr, "illegal 3. esc, esc 2 encoding possible\n");
1822 return DECODING_AC_LOST;
1823 }
1824 }
1825 }
1826#endif
Zdenek Kabelac38d171e2002-02-18 09:34:541827 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
1828 if (level>0) level= level * qmul + qadd;
Michael Niedermayer287229e2002-06-02 12:22:301829 else level= level * qmul - qadd;
1830#if 0 // waste of time too :(
1831 if(level>2048 || level<-2048){
1832 fprintf(stderr, "|level| overflow in 3. esc\n");
1833 return DECODING_AC_LOST;
1834 }
1835#endif
Michael Niedermayer45a82ed2002-07-13 14:55:121836 i+= run + 1;
1837 if(last) i+=192;
Michael Niedermayer1a013242002-07-17 09:15:141838#ifdef ERROR_DETAILS
1839 if(run==66)
1840 fprintf(stderr, "illegal vlc code in ESC3 level=%d\n", level);
1841 else if((i>62 && i<192) || i>192+63)
1842 fprintf(stderr, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
1843#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561844 } else {
1845 /* second escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121846#if MIN_CACHE_BITS < 23
1847 LAST_SKIP_BITS(re, &s->gb, 2);
1848 UPDATE_CACHE(re, &s->gb);
1849#else
1850 SKIP_BITS(re, &s->gb, 2);
1851#endif
1852 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1853 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //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 ESC2 level=%d\n", level);
1859 else if((i>62 && i<192) || i>192+63)
1860 fprintf(stderr, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
1861#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561862 }
1863 } else {
1864 /* first escape */
Michael Niedermayer45a82ed2002-07-13 14:55:121865#if MIN_CACHE_BITS < 22
1866 LAST_SKIP_BITS(re, &s->gb, 1);
1867 UPDATE_CACHE(re, &s->gb);
1868#else
1869 SKIP_BITS(re, &s->gb, 1);
1870#endif
1871 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2);
1872 i+= run;
1873 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
1874 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1875 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141876#ifdef ERROR_DETAILS
1877 if(run==66)
1878 fprintf(stderr, "illegal vlc code in ESC1 level=%d\n", level);
1879 else if((i>62 && i<192) || i>192+63)
1880 fprintf(stderr, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
1881#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561882 }
1883 } else {
Michael Niedermayer45a82ed2002-07-13 14:55:121884 i+= run;
1885 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
1886 LAST_SKIP_BITS(re, &s->gb, 1);
Michael Niedermayer1a013242002-07-17 09:15:141887#ifdef ERROR_DETAILS
1888 if(run==66)
1889 fprintf(stderr, "illegal vlc code level=%d\n", level);
1890 else if((i>62 && i<192) || i>192+63)
1891 fprintf(stderr, "run overflow i=%d run=%d level=%d\n", i, run, level);
1892#endif
Fabrice Bellardde6d9b62001-07-22 14:18:561893 }
Michael Niedermayer45a82ed2002-07-13 14:55:121894 if (i > 62){
1895 i-= 192;
1896 if(i&(~63)){
Michael Niedermayer68f593b2003-01-21 17:34:121897 const int left= s->gb.size_in_bits - get_bits_count(&s->gb);
Michael Niedermayer4d2858d2002-10-13 13:16:041898 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){
Michael Niedermayer1a013242002-07-17 09:15:141899 fprintf(stderr, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
1900 break;
1901 }else{
1902 fprintf(stderr, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
1903 return -1;
1904 }
Michael Niedermayer45a82ed2002-07-13 14:55:121905 }
1906
1907 block[scan_table[i]] = level;
1908 break;
Michael Niedermayerf5957f32002-06-18 00:49:001909 }
Michael Niedermayer287229e2002-06-02 12:22:301910
Michael Niedermayer45a82ed2002-07-13 14:55:121911 block[scan_table[i]] = level;
Fabrice Bellardde6d9b62001-07-22 14:18:561912 }
Michael Niedermayer45a82ed2002-07-13 14:55:121913 CLOSE_READER(re, &s->gb);
1914 }
Fabrice Bellardde6d9b62001-07-22 14:18:561915 not_coded:
1916 if (s->mb_intra) {
1917 mpeg4_pred_ac(s, block, n, dc_pred_dir);
1918 if (s->ac_pred) {
Michael Niedermayer45a82ed2002-07-13 14:55:121919 i = 63; /* XXX: not optimal */
Fabrice Bellardde6d9b62001-07-22 14:18:561920 }
1921 }
Michael Niedermayer1457ab52002-12-27 23:51:461922 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
Michael Niedermayer45a82ed2002-07-13 14:55:121923 s->block_last_index[n] = i;
Michael Niedermayerf5957f32002-06-18 00:49:001924
Fabrice Bellardde6d9b62001-07-22 14:18:561925 return 0;
1926}
1927
1928static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
1929{
1930 int level, pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561931
Michael Niedermayer287229e2002-06-02 12:22:301932 if(s->msmpeg4_version<=2){
Michael Niedermayer84afee32002-04-05 04:09:041933 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421934 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041935 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421936 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041937 }
Michael Niedermayer2ed627e2002-04-05 16:51:121938 if (level < 0)
Michael Niedermayer84afee32002-04-05 04:09:041939 return -1;
Michael Niedermayer84afee32002-04-05 04:09:041940 level-=256;
1941 }else{ //FIXME optimize use unified tables & index
1942 if (n < 4) {
Michael Niedermayer08dce7b2002-07-10 20:05:421943 level = get_vlc2(&s->gb, dc_lum_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041944 } else {
Michael Niedermayer08dce7b2002-07-10 20:05:421945 level = get_vlc2(&s->gb, dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
Michael Niedermayer84afee32002-04-05 04:09:041946 }
Michael Niedermayer287229e2002-06-02 12:22:301947 if (level < 0){
1948 fprintf(stderr, "illegal dc vlc\n");
Michael Niedermayer84afee32002-04-05 04:09:041949 return -1;
Michael Niedermayer287229e2002-06-02 12:22:301950 }
Michael Niedermayer84afee32002-04-05 04:09:041951
1952 if (level == DC_MAX) {
1953 level = get_bits(&s->gb, 8);
1954 if (get_bits1(&s->gb))
1955 level = -level;
1956 } else if (level != 0) {
1957 if (get_bits1(&s->gb))
1958 level = -level;
1959 }
Fabrice Bellardde6d9b62001-07-22 14:18:561960 }
1961
Michael Niedermayer287229e2002-06-02 12:22:301962 if(s->msmpeg4_version==1){
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481963 int32_t *dc_val;
Michael Niedermayer287229e2002-06-02 12:22:301964 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
1965 level += pred;
1966
1967 /* update predictor */
1968 *dc_val= level;
1969 }else{
Zdenek Kabelac0c1a9ed2003-02-11 16:35:481970 uint16_t *dc_val;
Michael Niedermayerbd5e1c72002-06-22 15:52:251971 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
Michael Niedermayer287229e2002-06-02 12:22:301972 level += pred;
Fabrice Bellardde6d9b62001-07-22 14:18:561973
Michael Niedermayer287229e2002-06-02 12:22:301974 /* update predictor */
1975 if (n < 4) {
1976 *dc_val = level * s->y_dc_scale;
1977 } else {
1978 *dc_val = level * s->c_dc_scale;
1979 }
Fabrice Bellardde6d9b62001-07-22 14:18:561980 }
1981
1982 return level;
1983}
1984
1985static int msmpeg4_decode_motion(MpegEncContext * s,
1986 int *mx_ptr, int *my_ptr)
1987{
1988 MVTable *mv;
1989 int code, mx, my;
1990
1991 mv = &mv_tables[s->mv_table_index];
1992
Michael Niedermayer08dce7b2002-07-10 20:05:421993 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
Michael Niedermayerf5957f32002-06-18 00:49:001994 if (code < 0){
1995 fprintf(stderr, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
Fabrice Bellardde6d9b62001-07-22 14:18:561996 return -1;
Michael Niedermayerf5957f32002-06-18 00:49:001997 }
Fabrice Bellardde6d9b62001-07-22 14:18:561998 if (code == mv->n) {
Michael Niedermayerf5957f32002-06-18 00:49:001999//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:562000 mx = get_bits(&s->gb, 6);
2001 my = get_bits(&s->gb, 6);
2002 } else {
2003 mx = mv->table_mvx[code];
2004 my = mv->table_mvy[code];
2005 }
2006
2007 mx += *mx_ptr - 32;
2008 my += *my_ptr - 32;
2009 /* WARNING : they do not do exactly modulo encoding */
2010 if (mx <= -64)
2011 mx += 64;
2012 else if (mx >= 64)
2013 mx -= 64;
2014
2015 if (my <= -64)
2016 my += 64;
2017 else if (my >= 64)
2018 my -= 64;
2019 *mx_ptr = mx;
2020 *my_ptr = my;
2021 return 0;
2022}
Michael Niedermayer1457ab52002-12-27 23:51:462023
2024/* cleanest way to support it
2025 * there is too much shared between versions so that we cant have 1 file per version & 1 common
2026 * as allmost everything would be in the common file
2027 */
2028#include "wmv2.c"