MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / modify_qscale

Function modify_qscale

libavcodec/ratecontrol.c:433–502  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

431}
432
433static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
434 RateControlContext *rcc= &s->rc_context;
435 int qmin, qmax;
436 const int pict_type= rce->new_pict_type;
437 const double buffer_size= s->avctx->rc_buffer_size;
438 const double fps= 1/av_q2d(s->avctx->time_base);
439 const double min_rate= s->avctx->rc_min_rate / fps;
440 const double max_rate= s->avctx->rc_max_rate / fps;
441
442 get_qminmax(&qmin, &qmax, s, pict_type);
443
444 /* modulation */
445 if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==FF_P_TYPE)
446 q*= s->avctx->rc_qmod_amp;
447
448//printf("q:%f\n", q);
449 /* buffer overflow/underflow protection */
450 if(buffer_size){
451 double expected_size= rcc->buffer_index;
452 double q_limit;
453
454 if(min_rate){
455 double d= 2*(buffer_size - expected_size)/buffer_size;
456 if(d>1.0) d=1.0;
457 else if(d<0.0001) d=0.0001;
458 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
459
460 q_limit= bits2qp(rce, FFMAX((min_rate - buffer_size + rcc->buffer_index) * s->avctx->rc_min_vbv_overflow_use, 1));
461 if(q > q_limit){
462 if(s->avctx->debug&FF_DEBUG_RC){
463 av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
464 }
465 q= q_limit;
466 }
467 }
468
469 if(max_rate){
470 double d= 2*expected_size/buffer_size;
471 if(d>1.0) d=1.0;
472 else if(d<0.0001) d=0.0001;
473 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
474
475 q_limit= bits2qp(rce, FFMAX(rcc->buffer_index * s->avctx->rc_max_available_vbv_use, 1));
476 if(q < q_limit){
477 if(s->avctx->debug&FF_DEBUG_RC){
478 av_log(s->avctx, AV_LOG_DEBUG, "limiting QP %f -> %f\n", q, q_limit);
479 }
480 q= q_limit;
481 }
482 }
483 }
484//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);
485 if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
486 if (q<qmin) q=qmin;
487 else if(q>qmax) q=qmax;
488 }else{
489 double min2= log(qmin);
490 double max2= log(qmax);

Callers 2

ff_rate_estimate_qscaleFunction · 0.85
init_pass2Function · 0.85

Calls 4

av_q2dFunction · 0.85
get_qminmaxFunction · 0.85
bits2qpFunction · 0.85
av_logFunction · 0.85

Tested by

no test coverage detected