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