Mercurial > libavcodec.hg
comparison ratecontrol.c @ 679:3d2da9b44cd8 libavcodec
better min/max rate handling
cleanup
| author | michaelni |
|---|---|
| date | Wed, 18 Sep 2002 18:28:11 +0000 |
| parents | 9c7a661a9fbe |
| children | a1c69cb685b3 |
comparison
equal
deleted
inserted
replaced
| 678:9c7a661a9fbe | 679:3d2da9b44cd8 |
|---|---|
| 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]=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 rcc->next_non_b_qscale=10; | |
| 68 rcc->next_p_qscale=10; | |
| 69 | |
| 70 if(s->flags&CODEC_FLAG_PASS2){ | 67 if(s->flags&CODEC_FLAG_PASS2){ |
| 71 int i; | 68 int i; |
| 72 char *p; | 69 char *p; |
| 73 | 70 |
| 74 /* find number of pics */ | 71 /* find number of pics */ |
| 229 RateControlContext *rcc= &s->rc_context; | 226 RateControlContext *rcc= &s->rc_context; |
| 230 double q, bits; | 227 double q, bits; |
| 231 const int pict_type= rce->new_pict_type; | 228 const int pict_type= rce->new_pict_type; |
| 232 const double mb_num= s->mb_num; | 229 const double mb_num= s->mb_num; |
| 233 int i; | 230 int i; |
| 234 const double last_q= rcc->last_qscale_for[pict_type]; | |
| 235 | 231 |
| 236 double const_values[]={ | 232 double const_values[]={ |
| 237 M_PI, | 233 M_PI, |
| 238 M_E, | 234 M_E, |
| 239 rce->i_tex_bits*rce->qscale, | 235 rce->i_tex_bits*rce->qscale, |
| 322 /* I/B difference */ | 318 /* I/B difference */ |
| 323 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0) | 319 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0) |
| 324 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset; | 320 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset; |
| 325 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0) | 321 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0) |
| 326 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset; | 322 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset; |
| 327 | 323 |
| 324 return q; | |
| 325 } | |
| 326 | |
| 327 static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, double q){ | |
| 328 RateControlContext *rcc= &s->rc_context; | |
| 329 AVCodecContext *a= s->avctx; | |
| 330 const int pict_type= rce->new_pict_type; | |
| 331 const double last_p_q = rcc->last_qscale_for[P_TYPE]; | |
| 332 const double last_non_b_q= rcc->last_qscale_for[rcc->last_non_b_pict_type]; | |
| 333 | |
| 334 if (pict_type==I_TYPE && (a->i_quant_factor>0.0 || rcc->last_non_b_pict_type==P_TYPE)) | |
| 335 q= last_p_q *ABS(a->i_quant_factor) + a->i_quant_offset; | |
| 336 else if(pict_type==B_TYPE && a->b_quant_factor>0.0) | |
| 337 q= last_non_b_q* a->b_quant_factor + a->b_quant_offset; | |
| 338 | |
| 328 /* last qscale / qdiff stuff */ | 339 /* last qscale / qdiff stuff */ |
| 329 if (q > last_q + s->max_qdiff) q= last_q + s->max_qdiff; | 340 if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){ |
| 330 else if(q < last_q - s->max_qdiff) q= last_q - s->max_qdiff; | 341 double last_q= rcc->last_qscale_for[pict_type]; |
| 342 if (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff; | |
| 343 else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff; | |
| 344 } | |
| 331 | 345 |
| 332 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring | 346 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring |
| 333 | 347 |
| 348 if(pict_type!=B_TYPE) | |
| 349 rcc->last_non_b_pict_type= pict_type; | |
| 350 | |
| 334 return q; | 351 return q; |
| 335 } | 352 } |
| 336 | 353 |
| 337 /** | 354 /** |
| 338 * gets the qmin & qmax for pict_type | 355 * gets the qmin & qmax for pict_type |
| 378 | 395 |
| 379 bits= qp2bits(rce, q); | 396 bits= qp2bits(rce, q); |
| 380 //printf("q:%f\n", q); | 397 //printf("q:%f\n", q); |
| 381 /* buffer overflow/underflow protection */ | 398 /* buffer overflow/underflow protection */ |
| 382 if(buffer_size){ | 399 if(buffer_size){ |
| 383 double expected_size= rcc->buffer_index - bits; | 400 double expected_size= rcc->buffer_index; |
| 384 | 401 |
| 385 if(min_rate){ | 402 if(min_rate){ |
| 386 double d= 2*(buffer_size - (expected_size + min_rate))/buffer_size; | 403 double d= 2*(buffer_size - expected_size)/buffer_size; |
| 387 if(d>1.0) d=1.0; | 404 if(d>1.0) d=1.0; |
| 388 else if(d<0.0001) d=0.0001; | 405 else if(d<0.0001) d=0.0001; |
| 389 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); | 406 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); |
| 407 | |
| 408 q= MIN(q, bits2qp(rce, MAX((min_rate - buffer_size + rcc->buffer_index)*2, 1))); | |
| 390 } | 409 } |
| 391 | 410 |
| 392 if(max_rate){ | 411 if(max_rate){ |
| 393 double d= 2*expected_size/buffer_size; | 412 double d= 2*expected_size/buffer_size; |
| 394 if(d>1.0) d=1.0; | 413 if(d>1.0) d=1.0; |
| 395 else if(d<0.0001) d=0.0001; | 414 else if(d<0.0001) d=0.0001; |
| 396 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); | 415 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity); |
| 416 | |
| 417 q= MAX(q, bits2qp(rce, MAX(rcc->buffer_index/2, 1))); | |
| 397 } | 418 } |
| 398 } | 419 } |
| 399 //printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity); | 420 //printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity); |
| 400 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){ | 421 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){ |
| 401 if (q<qmin) q=qmin; | 422 if (q<qmin) q=qmin; |
| 527 | 548 |
| 528 q= get_qscale(s, rce, rate_factor, picture_number); | 549 q= get_qscale(s, rce, rate_factor, picture_number); |
| 529 | 550 |
| 530 assert(q>0.0); | 551 assert(q>0.0); |
| 531 //printf("%f ", q); | 552 //printf("%f ", q); |
| 532 if (pict_type==I_TYPE && s->avctx->i_quant_factor>0.0) | 553 q= get_diff_limited_q(s, rce, q); |
| 533 q= rcc->next_p_qscale*s->avctx->i_quant_factor + s->avctx->i_quant_offset; | |
| 534 else if(pict_type==B_TYPE && s->avctx->b_quant_factor>0.0) | |
| 535 q= rcc->next_non_b_qscale*s->avctx->b_quant_factor + s->avctx->b_quant_offset; | |
| 536 //printf("%f ", q); | 554 //printf("%f ", q); |
| 537 assert(q>0.0); | 555 assert(q>0.0); |
| 538 | 556 |
| 539 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass | 557 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass |
| 540 rcc->short_term_qsum*=s->qblur; | 558 rcc->short_term_qsum*=s->qblur; |
| 551 q= modify_qscale(s, rce, q, picture_number); | 569 q= modify_qscale(s, rce, q, picture_number); |
| 552 | 570 |
| 553 rcc->pass1_wanted_bits+= s->bit_rate/fps; | 571 rcc->pass1_wanted_bits+= s->bit_rate/fps; |
| 554 | 572 |
| 555 assert(q>0.0); | 573 assert(q>0.0); |
| 556 | |
| 557 if(pict_type != B_TYPE) rcc->next_non_b_qscale= q; | |
| 558 if(pict_type == P_TYPE) rcc->next_p_qscale= q; | |
| 559 } | 574 } |
| 560 //printf("qmin:%d, qmax:%d, q:%f\n", qmin, qmax, q); | 575 //printf("qmin:%d, qmax:%d, q:%f\n", qmin, qmax, q); |
| 561 | 576 |
| 562 | 577 |
| 563 if (q<qmin) q=qmin; | 578 if (q<qmin) q=qmin; |
| 564 else if(q>qmax) q=qmax; | 579 else if(q>qmax) q=qmax; |
| 565 | 580 |
| 566 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits); | 581 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits); |
| 567 | 582 |
| 568 | |
| 569 //printf("%f %f %f\n", q, br_compensation, short_term_q); | 583 //printf("%f %f %f\n", q, br_compensation, short_term_q); |
| 570 qscale= (int)(q + 0.5); | 584 qscale= (int)(q + 0.5); |
| 571 //printf("%d ", qscale); | 585 |
| 572 | 586 //printf("q:%d diff:%d comp:%f st_q:%f last_size:%d type:%d\n", qscale, (int)diff, br_compensation, |
| 573 //printf("q:%d diff:%d comp:%f st_q:%f last_size:%d\n", qscale, (int)diff, br_compensation, | 587 // short_term_q, s->frame_bits, pict_type); |
| 574 // short_term_q, s->frame_bits); | |
| 575 //printf("%d %d\n", s->bit_rate, (int)fps); | 588 //printf("%d %d\n", s->bit_rate, (int)fps); |
| 576 | 589 |
| 577 rcc->last_qscale= qscale; | 590 rcc->last_qscale= qscale; |
| 578 rcc->last_mc_mb_var_sum= s->mc_mb_var_sum; | 591 rcc->last_mc_mb_var_sum= s->mc_mb_var_sum; |
| 579 rcc->last_mb_var_sum= s->mb_var_sum; | 592 rcc->last_mb_var_sum= s->mb_var_sum; |
| 691 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i); | 704 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i); |
| 692 } | 705 } |
| 693 assert(filter_size%2==1); | 706 assert(filter_size%2==1); |
| 694 | 707 |
| 695 /* fixed I/B QP relative to P mode */ | 708 /* fixed I/B QP relative to P mode */ |
| 696 rcc->next_non_b_qscale= 10; | |
| 697 rcc->next_p_qscale= 10; | |
| 698 for(i=rcc->num_entries-1; i>=0; i--){ | 709 for(i=rcc->num_entries-1; i>=0; i--){ |
| 699 RateControlEntry *rce= &rcc->entry[i]; | 710 RateControlEntry *rce= &rcc->entry[i]; |
| 700 const int pict_type= rce->new_pict_type; | 711 |
| 701 | 712 qscale[i]= get_diff_limited_q(s, rce, qscale[i]); |
| 702 if (pict_type==I_TYPE && s->avctx->i_quant_factor>0.0) | |
| 703 qscale[i]= rcc->next_p_qscale*s->avctx->i_quant_factor + s->avctx->i_quant_offset; | |
| 704 else if(pict_type==B_TYPE && s->avctx->b_quant_factor>0.0) | |
| 705 qscale[i]= rcc->next_non_b_qscale*s->avctx->b_quant_factor + s->avctx->b_quant_offset; | |
| 706 | |
| 707 if(pict_type!=B_TYPE) | |
| 708 rcc->next_non_b_qscale= qscale[i]; | |
| 709 if(pict_type==P_TYPE) | |
| 710 rcc->next_p_qscale= qscale[i]; | |
| 711 } | 713 } |
| 712 | 714 |
| 713 /* smooth curve */ | 715 /* smooth curve */ |
| 714 for(i=0; i<rcc->num_entries; i++){ | 716 for(i=0; i<rcc->num_entries; i++){ |
| 715 RateControlEntry *rce= &rcc->entry[i]; | 717 RateControlEntry *rce= &rcc->entry[i]; |
