comparison ratecontrol.c @ 1505:010f76d07a27 libavcodec

use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken quality which was 1..31 float is now a 1..FF_LAMBDA_MAX int, and FF_QP2LAMBDA * qp can be used to convert to the new range
author michaelni
date Tue, 07 Oct 2003 11:32:40 +0000
parents c4539ef4d8cb
children 932d306bf1dc
comparison
equal deleted inserted replaced
1504:df7ab60d1ee0 1505:010f76d07a27
36 36
37 static int init_pass2(MpegEncContext *s); 37 static int init_pass2(MpegEncContext *s);
38 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num); 38 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
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:%d 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->current_picture.quality, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits,
44 s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.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;
50 int i; 50 int i;
51 emms_c(); 51 emms_c();
52 52
53 for(i=0; i<5; i++){ 53 for(i=0; i<5; i++){
54 rcc->pred[i].coeff= 7.0; 54 rcc->pred[i].coeff= FF_QP2LAMBDA * 7.0;
55 rcc->pred[i].count= 1.0; 55 rcc->pred[i].count= 1.0;
56 56
57 rcc->pred[i].decay= 0.4; 57 rcc->pred[i].decay= 0.4;
58 rcc->i_cplx_sum [i]= 58 rcc->i_cplx_sum [i]=
59 rcc->p_cplx_sum [i]= 59 rcc->p_cplx_sum [i]=
60 rcc->mv_bits_sum[i]= 60 rcc->mv_bits_sum[i]=
61 rcc->qscale_sum [i]= 61 rcc->qscale_sum [i]=
62 rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such 62 rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such
63 rcc->last_qscale_for[i]=5; 63 rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5;
64 } 64 }
65 rcc->buffer_index= s->avctx->rc_buffer_size/2; 65 rcc->buffer_index= s->avctx->rc_buffer_size/2;
66 66
67 if(s->flags&CODEC_FLAG_PASS2){ 67 if(s->flags&CODEC_FLAG_PASS2){
68 int i; 68 int i;
79 79
80 /* init all to skiped p frames (with b frames we might have a not encoded frame at the end FIXME) */ 80 /* init all to skiped p frames (with b frames we might have a not encoded frame at the end FIXME) */
81 for(i=0; i<rcc->num_entries; i++){ 81 for(i=0; i<rcc->num_entries; i++){
82 RateControlEntry *rce= &rcc->entry[i]; 82 RateControlEntry *rce= &rcc->entry[i];
83 rce->pict_type= rce->new_pict_type=P_TYPE; 83 rce->pict_type= rce->new_pict_type=P_TYPE;
84 rce->qscale= rce->new_qscale=2; 84 rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2;
85 rce->misc_bits= s->mb_num + 10; 85 rce->misc_bits= s->mb_num + 10;
86 rce->mb_var_sum= s->mb_num*100; 86 rce->mb_var_sum= s->mb_num*100;
87 } 87 }
88 88
89 /* read stats */ 89 /* read stats */
138 else rce.pict_type= P_TYPE; 138 else rce.pict_type= P_TYPE;
139 139
140 rce.new_pict_type= rce.pict_type; 140 rce.new_pict_type= rce.pict_type;
141 rce.mc_mb_var_sum= bits*s->mb_num/100000; 141 rce.mc_mb_var_sum= bits*s->mb_num/100000;
142 rce.mb_var_sum = s->mb_num; 142 rce.mb_var_sum = s->mb_num;
143 rce.qscale = 2; 143 rce.qscale = FF_QP2LAMBDA * 2;
144 rce.f_code = 2; 144 rce.f_code = 2;
145 rce.b_code = 1; 145 rce.b_code = 1;
146 rce.misc_bits= 1; 146 rce.misc_bits= 1;
147 147
148 if(s->pict_type== I_TYPE){ 148 if(s->pict_type== I_TYPE){
337 q= last_non_b_q* a->b_quant_factor + a->b_quant_offset; 337 q= last_non_b_q* a->b_quant_factor + a->b_quant_offset;
338 338
339 /* last qscale / qdiff stuff */ 339 /* last qscale / qdiff stuff */
340 if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){ 340 if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
341 double last_q= rcc->last_qscale_for[pict_type]; 341 double last_q= rcc->last_qscale_for[pict_type];
342 342 const int maxdiff= FF_QP2LAMBDA * a->max_qdiff;
343 if (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff; 343
344 else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff; 344 if (q > last_q + maxdiff) q= last_q + maxdiff;
345 else if(q < last_q - maxdiff) q= last_q - maxdiff;
345 } 346 }
346 347
347 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring 348 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring
348 349
349 if(pict_type!=B_TYPE) 350 if(pict_type!=B_TYPE)
354 355
355 /** 356 /**
356 * gets the qmin & qmax for pict_type 357 * gets the qmin & qmax for pict_type
357 */ 358 */
358 static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){ 359 static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
359 int qmin= s->avctx->qmin; 360 int qmin= s->avctx->lmin;
360 int qmax= s->avctx->qmax; 361 int qmax= s->avctx->lmax;
361 362
362 assert(qmin <= qmax); 363 assert(qmin <= qmax);
363 364
364 if(pict_type==B_TYPE){ 365 if(pict_type==B_TYPE){
365 qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5); 366 qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
367 }else if(pict_type==I_TYPE){ 368 }else if(pict_type==I_TYPE){
368 qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); 369 qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
369 qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); 370 qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
370 } 371 }
371 372
372 qmin= clip(qmin, 1, 31); 373 qmin= clip(qmin, 1, FF_LAMBDA_MAX);
373 qmax= clip(qmax, 1, 31); 374 qmax= clip(qmax, 1, FF_LAMBDA_MAX);
374
375 if(qmin==1 && s->avctx->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1
376
377 if(qmin<3 && s->max_qcoeff<=128 && pict_type==I_TYPE) qmin=3; //reduce cliping problems
378 375
379 if(qmax<qmin) qmax= qmin; 376 if(qmax<qmin) qmax= qmin;
380 377
381 *qmin_ret= qmin; 378 *qmin_ret= qmin;
382 *qmax_ret= qmax; 379 *qmax_ret= qmax;
477 const float p_masking = s->avctx->p_masking; 474 const float p_masking = s->avctx->p_masking;
478 float bits_sum= 0.0; 475 float bits_sum= 0.0;
479 float cplx_sum= 0.0; 476 float cplx_sum= 0.0;
480 float cplx_tab[s->mb_num]; 477 float cplx_tab[s->mb_num];
481 float bits_tab[s->mb_num]; 478 float bits_tab[s->mb_num];
482 const int qmin= s->avctx->mb_qmin; 479 const int qmin= s->avctx->lmin;
483 const int qmax= s->avctx->mb_qmax; 480 const int qmax= s->avctx->lmax;
484 Picture * const pic= &s->current_picture; 481 Picture * const pic= &s->current_picture;
485 int last_qscale=0;
486 482
487 for(i=0; i<s->mb_num; i++){ 483 for(i=0; i<s->mb_num; i++){
488 const int mb_xy= s->mb_index2xy[i]; 484 const int mb_xy= s->mb_index2xy[i];
489 float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); 485 float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); //FIXME merge in pow()
490 float spat_cplx= sqrt(pic->mb_var[mb_xy]); 486 float spat_cplx= sqrt(pic->mb_var[mb_xy]);
491 const int lumi= pic->mb_mean[mb_xy]; 487 const int lumi= pic->mb_mean[mb_xy];
492 float bits, cplx, factor; 488 float bits, cplx, factor;
493 489 #if 0
494 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune 490 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
495 if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune 491 if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune
496 492 #endif
493 if(spat_cplx < 4) spat_cplx= 4; //FIXME finetune
494 if(temp_cplx < 4) temp_cplx= 4; //FIXME finetune
495
497 if((s->mb_type[mb_xy]&MB_TYPE_INTRA)){//FIXME hq mode 496 if((s->mb_type[mb_xy]&MB_TYPE_INTRA)){//FIXME hq mode
498 cplx= spat_cplx; 497 cplx= spat_cplx;
499 factor= 1.0 + p_masking; 498 factor= 1.0 + p_masking;
500 }else{ 499 }else{
501 cplx= temp_cplx; 500 cplx= temp_cplx;
541 540
542 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){ 541 if(s->flags&CODEC_FLAG_NORMALIZE_AQP){
543 newq*= bits_sum/cplx_sum; 542 newq*= bits_sum/cplx_sum;
544 } 543 }
545 544
546 if(i && ABS(last_qscale - newq)<0.75) 545 intq= (int)(newq + 0.5);
547 intq= last_qscale;
548 else
549 intq= (int)(newq + 0.5);
550 546
551 if (intq > qmax) intq= qmax; 547 if (intq > qmax) intq= qmax;
552 else if(intq < qmin) intq= qmin; 548 else if(intq < qmin) intq= qmin;
553 //if(i%s->mb_width==0) printf("\n"); 549 //if(i%s->mb_width==0) printf("\n");
554 //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i])); 550 //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));
555 last_qscale= 551 s->lambda_table[mb_xy]= intq;
556 pic->qscale_table[mb_xy]= intq; 552 }
557 } 553 }
558 } 554 //FIXME rd or at least approx for dquant
559 555
560 float ff_rate_estimate_qscale(MpegEncContext *s) 556 float ff_rate_estimate_qscale(MpegEncContext *s)
561 { 557 {
562 float q; 558 float q;
563 int qmin, qmax; 559 int qmin, qmax;
612 }else{ 608 }else{
613 rce->pict_type= 609 rce->pict_type=
614 rce->new_pict_type= pict_type; 610 rce->new_pict_type= pict_type;
615 rce->mc_mb_var_sum= pic->mc_mb_var_sum; 611 rce->mc_mb_var_sum= pic->mc_mb_var_sum;
616 rce->mb_var_sum = pic-> mb_var_sum; 612 rce->mb_var_sum = pic-> mb_var_sum;
617 rce->qscale = 2; 613 rce->qscale = FF_QP2LAMBDA * 2;
618 rce->f_code = s->f_code; 614 rce->f_code = s->f_code;
619 rce->b_code = s->b_code; 615 rce->b_code = s->b_code;
620 rce->misc_bits= 1; 616 rce->misc_bits= 1;
621 617
622 if(picture_number>0) 618 if(picture_number>0)