Mercurial > libavcodec.hg
comparison ratecontrol.c @ 903:22ee74da2cd3 libavcodec
cleanup
adding AVVideoFrame
moving quality, pict_type, key_frame, qscale_table, ... to AVVideoFrame
removing obsolete variables in AVCodecContext
skiping of MBs in b frames
correctly initalizing AVCodecContext
picture buffer cleanup
| author | michaelni |
|---|---|
| date | Wed, 04 Dec 2002 10:04:03 +0000 |
| parents | f3c369b8ddca |
| children | 75ee49a4a516 |
comparison
equal
deleted
inserted
replaced
| 902:6acc8394960d | 903:22ee74da2cd3 |
|---|---|
| 39 | 39 |
| 40 void ff_write_pass1_stats(MpegEncContext *s){ | 40 void ff_write_pass1_stats(MpegEncContext *s){ |
| 41 sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", | 41 sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", |
| 42 s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type, | 42 s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type, |
| 43 s->frame_qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, | 43 s->frame_qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, |
| 44 s->f_code, s->b_code, s->mc_mb_var_sum, s->mb_var_sum, s->i_count); | 44 s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count); |
| 45 } | 45 } |
| 46 | 46 |
| 47 int ff_rate_control_init(MpegEncContext *s) | 47 int ff_rate_control_init(MpegEncContext *s) |
| 48 { | 48 { |
| 49 RateControlContext *rcc= &s->rc_context; | 49 RateControlContext *rcc= &s->rc_context; |
| 473 float cplx_sum= 0.0; | 473 float cplx_sum= 0.0; |
| 474 float cplx_tab[s->mb_num]; | 474 float cplx_tab[s->mb_num]; |
| 475 float bits_tab[s->mb_num]; | 475 float bits_tab[s->mb_num]; |
| 476 const int qmin= 2; //s->avctx->mb_qmin; | 476 const int qmin= 2; //s->avctx->mb_qmin; |
| 477 const int qmax= 31; //s->avctx->mb_qmax; | 477 const int qmax= 31; //s->avctx->mb_qmax; |
| 478 Picture * const pic= &s->current_picture; | |
| 478 | 479 |
| 479 for(i=0; i<s->mb_num; i++){ | 480 for(i=0; i<s->mb_num; i++){ |
| 480 float temp_cplx= sqrt(s->mc_mb_var[i]); | 481 float temp_cplx= sqrt(pic->mc_mb_var[i]); |
| 481 float spat_cplx= sqrt(s->mb_var[i]); | 482 float spat_cplx= sqrt(pic->mb_var[i]); |
| 482 const int lumi= s->mb_mean[i]; | 483 const int lumi= pic->mb_mean[i]; |
| 483 float bits, cplx, factor; | 484 float bits, cplx, factor; |
| 484 | 485 |
| 485 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune | 486 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune |
| 486 if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune | 487 if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune |
| 487 | 488 |
| 531 | 532 |
| 532 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){ | 533 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){ |
| 533 newq*= bits_sum/cplx_sum; | 534 newq*= bits_sum/cplx_sum; |
| 534 } | 535 } |
| 535 | 536 |
| 536 if(i && ABS(s->qscale_table[i-1] - newq)<0.75) | 537 if(i && ABS(pic->qscale_table[i-1] - newq)<0.75) |
| 537 intq= s->qscale_table[i-1]; | 538 intq= pic->qscale_table[i-1]; |
| 538 else | 539 else |
| 539 intq= (int)(newq + 0.5); | 540 intq= (int)(newq + 0.5); |
| 540 | 541 |
| 541 if (intq > qmax) intq= qmax; | 542 if (intq > qmax) intq= qmax; |
| 542 else if(intq < qmin) intq= qmin; | 543 else if(intq < qmin) intq= qmin; |
| 543 //if(i%s->mb_width==0) printf("\n"); | 544 //if(i%s->mb_width==0) printf("\n"); |
| 544 //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i])); | 545 //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i])); |
| 545 s->qscale_table[i]= intq; | 546 pic->qscale_table[i]= intq; |
| 546 } | 547 } |
| 547 } | 548 } |
| 548 | 549 |
| 549 float ff_rate_estimate_qscale(MpegEncContext *s) | 550 float ff_rate_estimate_qscale(MpegEncContext *s) |
| 550 { | 551 { |
| 560 RateControlEntry local_rce, *rce; | 561 RateControlEntry local_rce, *rce; |
| 561 double bits; | 562 double bits; |
| 562 double rate_factor; | 563 double rate_factor; |
| 563 int var; | 564 int var; |
| 564 const int pict_type= s->pict_type; | 565 const int pict_type= s->pict_type; |
| 566 Picture * const pic= &s->current_picture; | |
| 565 emms_c(); | 567 emms_c(); |
| 566 | 568 |
| 567 get_qminmax(&qmin, &qmax, s, pict_type); | 569 get_qminmax(&qmin, &qmax, s, pict_type); |
| 568 | 570 |
| 569 fps= (double)s->frame_rate / FRAME_RATE_BASE; | 571 fps= (double)s->frame_rate / FRAME_RATE_BASE; |
| 586 | 588 |
| 587 diff= s->total_bits - wanted_bits; | 589 diff= s->total_bits - wanted_bits; |
| 588 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance; | 590 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance; |
| 589 if(br_compensation<=0.0) br_compensation=0.001; | 591 if(br_compensation<=0.0) br_compensation=0.001; |
| 590 | 592 |
| 591 var= pict_type == I_TYPE ? s->mb_var_sum : s->mc_mb_var_sum; | 593 var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum; |
| 592 | 594 |
| 593 if(s->flags&CODEC_FLAG_PASS2){ | 595 if(s->flags&CODEC_FLAG_PASS2){ |
| 594 if(pict_type!=I_TYPE) | 596 if(pict_type!=I_TYPE) |
| 595 assert(pict_type == rce->new_pict_type); | 597 assert(pict_type == rce->new_pict_type); |
| 596 | 598 |
| 597 q= rce->new_qscale / br_compensation; | 599 q= rce->new_qscale / br_compensation; |
| 598 //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type); | 600 //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type); |
| 599 }else{ | 601 }else{ |
| 600 rce->pict_type= | 602 rce->pict_type= |
| 601 rce->new_pict_type= pict_type; | 603 rce->new_pict_type= pict_type; |
| 602 rce->mc_mb_var_sum= s->mc_mb_var_sum; | 604 rce->mc_mb_var_sum= pic->mc_mb_var_sum; |
| 603 rce->mb_var_sum = s-> mb_var_sum; | 605 rce->mb_var_sum = pic-> mb_var_sum; |
| 604 rce->qscale = 2; | 606 rce->qscale = 2; |
| 605 rce->f_code = s->f_code; | 607 rce->f_code = s->f_code; |
| 606 rce->b_code = s->b_code; | 608 rce->b_code = s->b_code; |
| 607 rce->misc_bits= 1; | 609 rce->misc_bits= 1; |
| 608 | 610 |
| 661 | 663 |
| 662 if (q<qmin) q=qmin; | 664 if (q<qmin) q=qmin; |
| 663 else if(q>qmax) q=qmax; | 665 else if(q>qmax) q=qmax; |
| 664 | 666 |
| 665 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits); | 667 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits); |
| 666 | 668 |
| 667 //printf("%f %f %f\n", q, br_compensation, short_term_q); | 669 //printf("diff:%d comp:%f st_q:%f last_size:%d type:%d\n", (int)diff, br_compensation, |
| 668 | |
| 669 //printf("q:%d diff:%d comp:%f st_q:%f last_size:%d type:%d\n", qscale, (int)diff, br_compensation, | |
| 670 // short_term_q, s->frame_bits, pict_type); | 670 // short_term_q, s->frame_bits, pict_type); |
| 671 //printf("%d %d\n", s->bit_rate, (int)fps); | 671 //printf("%d %d\n", s->bit_rate, (int)fps); |
| 672 | 672 |
| 673 if(s->adaptive_quant) | 673 if(s->adaptive_quant) |
| 674 adaptive_quantization(s, q); | 674 adaptive_quantization(s, q); |
| 675 else | 675 else |
| 676 q= (int)(q + 0.5); | 676 q= (int)(q + 0.5); |
| 677 | 677 |
| 678 rcc->last_qscale= q; | 678 rcc->last_qscale= q; |
| 679 rcc->last_mc_mb_var_sum= s->mc_mb_var_sum; | 679 rcc->last_mc_mb_var_sum= pic->mc_mb_var_sum; |
| 680 rcc->last_mb_var_sum= s->mb_var_sum; | 680 rcc->last_mb_var_sum= pic->mb_var_sum; |
| 681 #if 0 | |
| 682 { | |
| 683 static int mvsum=0, texsum=0; | |
| 684 mvsum += s->mv_bits; | |
| 685 texsum += s->i_tex_bits + s->p_tex_bits; | |
| 686 printf("%d %d//\n\n", mvsum, texsum); | |
| 687 } | |
| 688 #endif | |
| 681 return q; | 689 return q; |
| 682 } | 690 } |
| 683 | 691 |
| 684 //---------------------------------------------- | 692 //---------------------------------------------- |
| 685 // 2-Pass code | 693 // 2-Pass code |
