Mercurial > libavcodec.hg
comparison msmpeg4.c @ 310:49e73229a5e6 libavcodec
msmpeg4v2 encoding
author | michaelni |
---|---|
date | Fri, 05 Apr 2002 21:04:09 +0000 |
parents | 32485ad4cc4e |
children | ac677a84d5df |
comparison
equal
deleted
inserted
replaced
309:32485ad4cc4e | 310:49e73229a5e6 |
---|---|
50 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | 50 static int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
51 int n, int coded); | 51 int n, int coded); |
52 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); | 52 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
53 static int msmpeg4_decode_motion(MpegEncContext * s, | 53 static int msmpeg4_decode_motion(MpegEncContext * s, |
54 int *mx_ptr, int *my_ptr); | 54 int *mx_ptr, int *my_ptr); |
55 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); | |
56 static void init_h263_dc_for_msmpeg4(); | |
57 | |
55 | 58 |
56 extern UINT32 inverse[256]; | 59 extern UINT32 inverse[256]; |
57 | 60 |
58 #ifdef DEBUG | 61 #ifdef DEBUG |
59 int intra_count = 0; | 62 int intra_count = 0; |
166 put_bits(&s->pb, 2, s->pict_type - 1); | 169 put_bits(&s->pb, 2, s->pict_type - 1); |
167 | 170 |
168 put_bits(&s->pb, 5, s->qscale); | 171 put_bits(&s->pb, 5, s->qscale); |
169 | 172 |
170 s->rl_table_index = 2; | 173 s->rl_table_index = 2; |
171 s->rl_chroma_table_index = 1; /* only for I frame */ | 174 if(s->msmpeg4_version==2) |
175 s->rl_chroma_table_index = 2; /* only for I frame */ | |
176 else | |
177 s->rl_chroma_table_index = 1; /* only for I frame */ | |
178 | |
172 s->dc_table_index = 1; | 179 s->dc_table_index = 1; |
173 s->mv_table_index = 1; /* only if P frame */ | 180 s->mv_table_index = 1; /* only if P frame */ |
174 s->use_skip_mb_code = 1; /* only if P frame */ | 181 s->use_skip_mb_code = 1; /* only if P frame */ |
175 | 182 |
176 if (s->pict_type == I_TYPE) { | 183 if (s->pict_type == I_TYPE) { |
177 put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */ | 184 put_bits(&s->pb, 5, 0x17); /* indicate only one "slice" */ |
178 | 185 |
179 code012(&s->pb, s->rl_chroma_table_index); | 186 if(s->msmpeg4_version!=2){ |
180 code012(&s->pb, s->rl_table_index); | 187 code012(&s->pb, s->rl_chroma_table_index); |
181 | 188 code012(&s->pb, s->rl_table_index); |
182 put_bits(&s->pb, 1, s->dc_table_index); | 189 |
190 put_bits(&s->pb, 1, s->dc_table_index); | |
191 } | |
183 s->no_rounding = 1; | 192 s->no_rounding = 1; |
184 } else { | 193 } else { |
185 put_bits(&s->pb, 1, s->use_skip_mb_code); | 194 put_bits(&s->pb, 1, s->use_skip_mb_code); |
186 | 195 |
187 s->rl_chroma_table_index = s->rl_table_index; | 196 s->rl_chroma_table_index = s->rl_table_index; |
188 code012(&s->pb, s->rl_table_index); | 197 if(s->msmpeg4_version!=2){ |
189 | 198 code012(&s->pb, s->rl_table_index); |
190 put_bits(&s->pb, 1, s->dc_table_index); | 199 |
191 | 200 put_bits(&s->pb, 1, s->dc_table_index); |
192 put_bits(&s->pb, 1, s->mv_table_index); | 201 |
193 | 202 put_bits(&s->pb, 1, s->mv_table_index); |
203 } | |
204 | |
194 if(s->flipflop_rounding){ | 205 if(s->flipflop_rounding){ |
195 s->no_rounding ^= 1; | 206 s->no_rounding ^= 1; |
196 }else{ | 207 }else{ |
197 s->no_rounding = 0; | 208 s->no_rounding = 0; |
198 } | 209 } |
203 init_done = 1; | 214 init_done = 1; |
204 init_mv_table(&mv_tables[0]); | 215 init_mv_table(&mv_tables[0]); |
205 init_mv_table(&mv_tables[1]); | 216 init_mv_table(&mv_tables[1]); |
206 for(i=0;i<NB_RL_TABLES;i++) | 217 for(i=0;i<NB_RL_TABLES;i++) |
207 init_rl(&rl_table[i]); | 218 init_rl(&rl_table[i]); |
219 | |
220 init_h263_dc_for_msmpeg4(); | |
208 } | 221 } |
209 | 222 |
210 #ifdef DEBUG | 223 #ifdef DEBUG |
211 intra_count = 0; | 224 intra_count = 0; |
212 printf("*****frame %d:\n", frame_count++); | 225 printf("*****frame %d:\n", frame_count++); |
313 return; | 326 return; |
314 } | 327 } |
315 if (s->use_skip_mb_code) | 328 if (s->use_skip_mb_code) |
316 put_bits(&s->pb, 1, 0); /* mb coded */ | 329 put_bits(&s->pb, 1, 0); /* mb coded */ |
317 | 330 |
318 put_bits(&s->pb, | 331 if(s->msmpeg4_version==2){ |
319 table_mb_non_intra[cbp + 64][1], | 332 put_bits(&s->pb, |
320 table_mb_non_intra[cbp + 64][0]); | 333 v2_mb_type[cbp&3][1], |
321 | 334 v2_mb_type[cbp&3][0]); |
322 /* motion vector */ | 335 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C; |
323 h263_pred_motion(s, 0, &pred_x, &pred_y); | 336 else coded_cbp= cbp; |
324 msmpeg4_encode_motion(s, motion_x - pred_x, | 337 |
325 motion_y - pred_y); | 338 put_bits(&s->pb, |
339 cbpy_tab[coded_cbp>>2][1], | |
340 cbpy_tab[coded_cbp>>2][0]); | |
341 | |
342 h263_pred_motion(s, 0, &pred_x, &pred_y); | |
343 msmpeg4v2_encode_motion(s, motion_x - pred_x); | |
344 msmpeg4v2_encode_motion(s, motion_y - pred_y); | |
345 }else{ | |
346 put_bits(&s->pb, | |
347 table_mb_non_intra[cbp + 64][1], | |
348 table_mb_non_intra[cbp + 64][0]); | |
349 | |
350 /* motion vector */ | |
351 h263_pred_motion(s, 0, &pred_x, &pred_y); | |
352 msmpeg4_encode_motion(s, motion_x - pred_x, | |
353 motion_y - pred_y); | |
354 } | |
326 } else { | 355 } else { |
327 /* compute cbp */ | 356 /* compute cbp */ |
328 cbp = 0; | 357 cbp = 0; |
329 coded_cbp = 0; | 358 coded_cbp = 0; |
330 for (i = 0; i < 6; i++) { | 359 for (i = 0; i < 6; i++) { |
342 #if 0 | 371 #if 0 |
343 if (coded_cbp) | 372 if (coded_cbp) |
344 printf("cbp=%x %x\n", cbp, coded_cbp); | 373 printf("cbp=%x %x\n", cbp, coded_cbp); |
345 #endif | 374 #endif |
346 | 375 |
347 if (s->pict_type == I_TYPE) { | 376 if(s->msmpeg4_version==2){ |
377 if (s->pict_type == I_TYPE) { | |
378 put_bits(&s->pb, | |
379 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]); | |
380 } else { | |
381 if (s->use_skip_mb_code) | |
382 put_bits(&s->pb, 1, 0); /* mb coded */ | |
383 put_bits(&s->pb, | |
384 v2_mb_type[(cbp&3) + 4][1], | |
385 v2_mb_type[(cbp&3) + 4][0]); | |
386 } | |
387 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | |
388 put_bits(&s->pb, | |
389 cbpy_tab[cbp>>2][1], | |
390 cbpy_tab[cbp>>2][0]); | |
391 }else{ | |
392 if (s->pict_type == I_TYPE) { | |
393 set_stat(ST_INTRA_MB); | |
394 put_bits(&s->pb, | |
395 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]); | |
396 } else { | |
397 if (s->use_skip_mb_code) | |
398 put_bits(&s->pb, 1, 0); /* mb coded */ | |
399 put_bits(&s->pb, | |
400 table_mb_non_intra[cbp][1], | |
401 table_mb_non_intra[cbp][0]); | |
402 } | |
348 set_stat(ST_INTRA_MB); | 403 set_stat(ST_INTRA_MB); |
349 put_bits(&s->pb, | 404 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ |
350 table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]); | 405 } |
351 } else { | |
352 if (s->use_skip_mb_code) | |
353 put_bits(&s->pb, 1, 0); /* mb coded */ | |
354 put_bits(&s->pb, | |
355 table_mb_non_intra[cbp][1], | |
356 table_mb_non_intra[cbp][0]); | |
357 } | |
358 set_stat(ST_INTRA_MB); | |
359 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | |
360 } | 406 } |
361 | 407 |
362 for (i = 0; i < 6; i++) { | 408 for (i = 0; i < 6; i++) { |
363 msmpeg4_encode_block(s, block[i], i); | 409 msmpeg4_encode_block(s, block[i], i); |
364 } | 410 } |
474 } | 520 } |
475 | 521 |
476 /* do the prediction */ | 522 /* do the prediction */ |
477 level -= pred; | 523 level -= pred; |
478 | 524 |
479 sign = 0; | 525 if(s->msmpeg4_version==2){ |
480 if (level < 0) { | |
481 level = -level; | |
482 sign = 1; | |
483 } | |
484 | |
485 code = level; | |
486 if (code > DC_MAX) | |
487 code = DC_MAX; | |
488 | |
489 if (s->dc_table_index == 0) { | |
490 if (n < 4) { | 526 if (n < 4) { |
491 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]); | 527 put_bits(&s->pb, |
528 v2_dc_lum_table[level+256][1], | |
529 v2_dc_lum_table[level+256][0]); | |
530 }else{ | |
531 put_bits(&s->pb, | |
532 v2_dc_chroma_table[level+256][1], | |
533 v2_dc_chroma_table[level+256][0]); | |
534 } | |
535 }else{ | |
536 sign = 0; | |
537 if (level < 0) { | |
538 level = -level; | |
539 sign = 1; | |
540 } | |
541 code = level; | |
542 if (code > DC_MAX) | |
543 code = DC_MAX; | |
544 | |
545 if (s->dc_table_index == 0) { | |
546 if (n < 4) { | |
547 put_bits(&s->pb, table0_dc_lum[code][1], table0_dc_lum[code][0]); | |
548 } else { | |
549 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]); | |
550 } | |
492 } else { | 551 } else { |
493 put_bits(&s->pb, table0_dc_chroma[code][1], table0_dc_chroma[code][0]); | 552 if (n < 4) { |
494 } | 553 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]); |
495 } else { | 554 } else { |
496 if (n < 4) { | 555 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]); |
497 put_bits(&s->pb, table1_dc_lum[code][1], table1_dc_lum[code][0]); | 556 } |
498 } else { | 557 } |
499 put_bits(&s->pb, table1_dc_chroma[code][1], table1_dc_chroma[code][0]); | 558 |
500 } | 559 if (code == DC_MAX) |
501 } | 560 put_bits(&s->pb, 8, level); |
502 | 561 |
503 if (code == DC_MAX) | 562 if (level != 0) { |
504 put_bits(&s->pb, 8, level); | 563 put_bits(&s->pb, 1, sign); |
505 | 564 } |
506 if (level != 0) { | |
507 put_bits(&s->pb, 1, sign); | |
508 } | 565 } |
509 } | 566 } |
510 | 567 |
511 /* Encoding of a block. Very similar to MPEG4 except for a different | 568 /* Encoding of a block. Very similar to MPEG4 except for a different |
512 escape coding (same as H263) and more vlc tables. | 569 escape coding (same as H263) and more vlc tables. |
530 run_diff = 0; | 587 run_diff = 0; |
531 set_stat(ST_INTRA_AC); | 588 set_stat(ST_INTRA_AC); |
532 } else { | 589 } else { |
533 i = 0; | 590 i = 0; |
534 rl = &rl_table[3 + s->rl_table_index]; | 591 rl = &rl_table[3 + s->rl_table_index]; |
535 run_diff = 1; | 592 if(s->msmpeg4_version==2) |
593 run_diff = 0; | |
594 else | |
595 run_diff = 1; | |
536 set_stat(ST_INTER_AC); | 596 set_stat(ST_INTER_AC); |
537 } | 597 } |
538 | 598 |
539 /* AC coefs */ | 599 /* AC coefs */ |
540 last_index = s->block_last_index[n]; | 600 last_index = s->block_last_index[n]; |
849 static inline void memsetw(short *tab, int val, int n) | 909 static inline void memsetw(short *tab, int val, int n) |
850 { | 910 { |
851 int i; | 911 int i; |
852 for(i=0;i<n;i++) | 912 for(i=0;i<n;i++) |
853 tab[i] = val; | 913 tab[i] = val; |
914 } | |
915 | |
916 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) | |
917 { | |
918 int range, bit_size, sign, code, bits; | |
919 | |
920 if (val == 0) { | |
921 /* zero vector */ | |
922 code = 0; | |
923 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]); | |
924 } else { | |
925 bit_size = s->f_code - 1; | |
926 range = 1 << bit_size; | |
927 if (val <= -64) | |
928 val += 64; | |
929 else if (val >= 64) | |
930 val -= 64; | |
931 | |
932 if (val >= 0) { | |
933 sign = 0; | |
934 } else { | |
935 val = -val; | |
936 sign = 1; | |
937 } | |
938 val--; | |
939 code = (val >> bit_size) + 1; | |
940 bits = val & (range - 1); | |
941 | |
942 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); | |
943 if (bit_size > 0) { | |
944 put_bits(&s->pb, bit_size, bits); | |
945 } | |
946 } | |
854 } | 947 } |
855 | 948 |
856 /* this is identical to h263 except that its range is multiplied by 2 */ | 949 /* this is identical to h263 except that its range is multiplied by 2 */ |
857 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) | 950 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) |
858 { | 951 { |