comparison h263.c @ 690:a1c69cb685b3 libavcodec

adaptive quantization (lumi/temporal & spatial complexity masking)
author michaelni
date Mon, 23 Sep 2002 14:56:11 +0000
parents c3bdb00a98a9
children 852b5a416161
comparison
equal deleted inserted replaced
689:efcbfbd18864 690:a1c69cb685b3
29 #include "avcodec.h" 29 #include "avcodec.h"
30 #include "mpegvideo.h" 30 #include "mpegvideo.h"
31 #include "h263data.h" 31 #include "h263data.h"
32 #include "mpeg4data.h" 32 #include "mpeg4data.h"
33 33
34 //#undef NDEBUG
35 //#include <assert.h>
36
34 //rounded divison & shift 37 //rounded divison & shift
35 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b)) 38 #define RSHIFT(a,b) ((a) > 0 ? ((a) + (1<<((b)-1)))>>(b) : ((a) + (1<<((b)-1))-1)>>(b))
36 39
40 #if 1
37 #define PRINT_MB_TYPE(a) {} 41 #define PRINT_MB_TYPE(a) {}
38 //#define PRINT_MB_TYPE(a) printf(a) 42 #else
43 #define PRINT_MB_TYPE(a) printf(a)
44 #endif
39 45
40 #define INTRA_MCBPC_VLC_BITS 6 46 #define INTRA_MCBPC_VLC_BITS 6
41 #define INTER_MCBPC_VLC_BITS 6 47 #define INTER_MCBPC_VLC_BITS 6
42 #define CBPY_VLC_BITS 6 48 #define CBPY_VLC_BITS 6
43 #define MV_VLC_BITS 9 49 #define MV_VLC_BITS 9
296 } 302 }
297 303
298 return score0 > score1 ? 1 : 0; 304 return score0 > score1 ? 1 : 0;
299 } 305 }
300 306
307 void ff_clean_mpeg4_qscales(MpegEncContext *s){
308 int i;
309 /* more braindead iso mpeg mess */
310
311 for(i=1; i<s->mb_num; i++){
312 if(s->qscale_table[i] - s->qscale_table[i-1] >2)
313 s->qscale_table[i]= s->qscale_table[i-1]+2;
314 }
315 for(i=s->mb_num-2; i>=0; i--){
316 if(s->qscale_table[i] - s->qscale_table[i+1] >2)
317 s->qscale_table[i]= s->qscale_table[i+1]+2;
318 }
319
320 for(i=1; i<s->mb_num; i++){
321 if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_INTER4V)){
322 s->mb_type[i]&= ~MB_TYPE_INTER4V;
323 s->mb_type[i]|= MB_TYPE_INTER;
324 }
325 }
326
327 if(s->pict_type== B_TYPE){
328 int odd=0;
329 /* ok, come on, this isnt funny anymore, theres more code for handling this mpeg4 mess than
330 for the actual adaptive quantization */
331
332 for(i=0; i<s->mb_num; i++){
333 odd += s->qscale_table[i]&1;
334 }
335
336 if(2*odd > s->mb_num) odd=1;
337 else odd=0;
338
339 for(i=0; i<s->mb_num; i++){
340 if((s->qscale_table[i]&1) != odd)
341 s->qscale_table[i]++;
342 if(s->qscale_table[i] > 31)
343 s->qscale_table[i]= 31;
344 }
345
346 for(i=1; i<s->mb_num; i++){
347 if(s->qscale_table[i] != s->qscale_table[i-1] && (s->mb_type[i]&MB_TYPE_DIRECT)){
348 s->mb_type[i]&= ~MB_TYPE_DIRECT;
349 s->mb_type[i]|= MB_TYPE_BIDIR;
350 }
351 }
352 }
353 }
354
301 void mpeg4_encode_mb(MpegEncContext * s, 355 void mpeg4_encode_mb(MpegEncContext * s,
302 DCTELEM block[6][64], 356 DCTELEM block[6][64],
303 int motion_x, int motion_y) 357 int motion_x, int motion_y)
304 { 358 {
305 int cbpc, cbpy, i, pred_x, pred_y; 359 int cbpc, cbpy, i, pred_x, pred_y;
306 int bits; 360 int bits;
307 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb; 361 PutBitContext * const pb2 = s->data_partitioning ? &s->pb2 : &s->pb;
308 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb; 362 PutBitContext * const tex_pb = s->data_partitioning && s->pict_type!=B_TYPE ? &s->tex_pb : &s->pb;
309 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb; 363 PutBitContext * const dc_pb = s->data_partitioning && s->pict_type!=I_TYPE ? &s->pb2 : &s->pb;
310 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0; 364 const int interleaved_stats= (s->flags&CODEC_FLAG_PASS1) && !s->data_partitioning ? 1 : 0;
365 const int dquant_code[5]= {1,0,9,2,3};
311 366
312 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); 367 // printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
313 if (!s->mb_intra) { 368 if (!s->mb_intra) {
314 /* compute cbp */ 369 /* compute cbp */
315 int cbp = 0; 370 int cbp = 0;
326 s->last_mv[0][0][0]= 381 s->last_mv[0][0][0]=
327 s->last_mv[0][0][1]= 382 s->last_mv[0][0][1]=
328 s->last_mv[1][0][0]= 383 s->last_mv[1][0][0]=
329 s->last_mv[1][0][1]= 0; 384 s->last_mv[1][0][1]= 0;
330 } 385 }
386
387 assert(s->dquant>=-2 && s->dquant<=2);
388 assert((s->dquant&1)==0);
389 assert(mb_type>=0);
331 390
332 /* nothing to do if this MB was skiped in the next P Frame */ 391 /* nothing to do if this MB was skiped in the next P Frame */
333 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ 392 if(s->mbskip_table[s->mb_y * s->mb_width + s->mb_x]){ //FIXME avoid DCT & ...
334 s->skip_count++; 393 s->skip_count++;
335 s->mv[0][0][0]= 394 s->mv[0][0][0]=
336 s->mv[0][0][1]= 395 s->mv[0][0][1]=
337 s->mv[1][0][0]= 396 s->mv[1][0][0]=
338 s->mv[1][0][1]= 0; 397 s->mv[1][0][1]= 0;
339 s->mv_dir= MV_DIR_FORWARD; //doesnt matter 398 s->mv_dir= MV_DIR_FORWARD; //doesnt matter
399 s->qscale -= s->dquant;
340 return; 400 return;
341 } 401 }
342 402
343 if ((cbp | motion_x | motion_y | mb_type) ==0) { 403 if ((cbp | motion_x | motion_y | mb_type) ==0) {
344 /* direct MB with MV={0,0} */ 404 /* direct MB with MV={0,0} */
405 assert(s->dquant==0);
406
345 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */ 407 put_bits(&s->pb, 1, 1); /* mb not coded modb1=1 */
346 408
347 if(interleaved_stats){ 409 if(interleaved_stats){
348 s->misc_bits++; 410 s->misc_bits++;
349 s->last_bits++; 411 s->last_bits++;
354 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */ 416 put_bits(&s->pb, 1, 0); /* mb coded modb1=0 */
355 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge 417 put_bits(&s->pb, 1, cbp ? 0 : 1); /* modb2 */ //FIXME merge
356 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :) 418 put_bits(&s->pb, mb_type+1, 1); // this table is so simple that we dont need it :)
357 if(cbp) put_bits(&s->pb, 6, cbp); 419 if(cbp) put_bits(&s->pb, 6, cbp);
358 420
359 if(cbp && mb_type) 421 if(cbp && mb_type){
360 put_bits(&s->pb, 1, 0); /* no q-scale change */ 422 if(s->dquant)
423 put_bits(&s->pb, 2, (s->dquant>>2)+3);
424 else
425 put_bits(&s->pb, 1, 0);
426 }else
427 s->qscale -= s->dquant;
361 428
362 if(interleaved_stats){ 429 if(interleaved_stats){
363 bits= get_bit_count(&s->pb); 430 bits= get_bit_count(&s->pb);
364 s->misc_bits+= bits - s->last_bits; 431 s->misc_bits+= bits - s->last_bits;
365 s->last_bits=bits; 432 s->last_bits=bits;
419 bits= get_bit_count(&s->pb); 486 bits= get_bit_count(&s->pb);
420 s->p_tex_bits+= bits - s->last_bits; 487 s->p_tex_bits+= bits - s->last_bits;
421 s->last_bits=bits; 488 s->last_bits=bits;
422 } 489 }
423 }else{ /* s->pict_type==B_TYPE */ 490 }else{ /* s->pict_type==B_TYPE */
424 if ((cbp | motion_x | motion_y) == 0 && s->mv_type==MV_TYPE_16X16) { 491 if ((cbp | motion_x | motion_y | s->dquant) == 0 && s->mv_type==MV_TYPE_16X16) {
425 /* check if the B frames can skip it too, as we must skip it if we skip here 492 /* check if the B frames can skip it too, as we must skip it if we skip here
426 why didnt they just compress the skip-mb bits instead of reusing them ?! */ 493 why didnt they just compress the skip-mb bits instead of reusing them ?! */
427 if(s->max_b_frames>0){ 494 if(s->max_b_frames>0){
428 int i; 495 int i;
429 int x,y, offset; 496 int x,y, offset;
468 } 535 }
469 536
470 put_bits(&s->pb, 1, 0); /* mb coded */ 537 put_bits(&s->pb, 1, 0); /* mb coded */
471 if(s->mv_type==MV_TYPE_16X16){ 538 if(s->mv_type==MV_TYPE_16X16){
472 cbpc = cbp & 3; 539 cbpc = cbp & 3;
540 if(s->dquant) cbpc+= 8;
473 put_bits(&s->pb, 541 put_bits(&s->pb,
474 inter_MCBPC_bits[cbpc], 542 inter_MCBPC_bits[cbpc],
475 inter_MCBPC_code[cbpc]); 543 inter_MCBPC_code[cbpc]);
544
476 cbpy = cbp >> 2; 545 cbpy = cbp >> 2;
477 cbpy ^= 0xf; 546 cbpy ^= 0xf;
478 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); 547 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
548 if(s->dquant)
549 put_bits(pb2, 2, dquant_code[s->dquant+2]);
479 550
480 if(interleaved_stats){ 551 if(interleaved_stats){
481 bits= get_bit_count(&s->pb); 552 bits= get_bit_count(&s->pb);
482 s->misc_bits+= bits - s->last_bits; 553 s->misc_bits+= bits - s->last_bits;
483 s->last_bits=bits; 554 s->last_bits=bits;
578 cbp |= 1 << (5 - i); 649 cbp |= 1 << (5 - i);
579 } 650 }
580 651
581 cbpc = cbp & 3; 652 cbpc = cbp & 3;
582 if (s->pict_type == I_TYPE) { 653 if (s->pict_type == I_TYPE) {
654 if(s->dquant) cbpc+=4;
583 put_bits(&s->pb, 655 put_bits(&s->pb,
584 intra_MCBPC_bits[cbpc], 656 intra_MCBPC_bits[cbpc],
585 intra_MCBPC_code[cbpc]); 657 intra_MCBPC_code[cbpc]);
586 } else { 658 } else {
659 if(s->dquant) cbpc+=8;
587 put_bits(&s->pb, 1, 0); /* mb coded */ 660 put_bits(&s->pb, 1, 0); /* mb coded */
588 put_bits(&s->pb, 661 put_bits(&s->pb,
589 inter_MCBPC_bits[cbpc + 4], 662 inter_MCBPC_bits[cbpc + 4],
590 inter_MCBPC_code[cbpc + 4]); 663 inter_MCBPC_code[cbpc + 4]);
591 } 664 }
592 put_bits(pb2, 1, s->ac_pred); 665 put_bits(pb2, 1, s->ac_pred);
593 cbpy = cbp >> 2; 666 cbpy = cbp >> 2;
594 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]); 667 put_bits(pb2, cbpy_tab[cbpy][1], cbpy_tab[cbpy][0]);
668 if(s->dquant)
669 put_bits(dc_pb, 2, dquant_code[s->dquant+2]);
595 670
596 if(interleaved_stats){ 671 if(interleaved_stats){
597 bits= get_bit_count(&s->pb); 672 bits= get_bit_count(&s->pb);
598 s->misc_bits+= bits - s->last_bits; 673 s->misc_bits+= bits - s->last_bits;
599 s->last_bits=bits; 674 s->last_bits=bits;
961 if (val < -l) { 1036 if (val < -l) {
962 val += m; 1037 val += m;
963 } else if (val >= l) { 1038 } else if (val >= l) {
964 val -= m; 1039 val -= m;
965 } 1040 }
1041 assert(val>=-l && val<l);
966 1042
967 if (val >= 0) { 1043 if (val >= 0) {
968 sign = 0; 1044 sign = 0;
969 } else { 1045 } else {
970 val = -val; 1046 val = -val;