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