Mercurial > libavcodec.hg
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; |