1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Rate control for video encoders 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci/** 24cabdff1aSopenharmony_ci * @file 25cabdff1aSopenharmony_ci * Rate control for video encoders. 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 29cabdff1aSopenharmony_ci#include "libavutil/internal.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "avcodec.h" 32cabdff1aSopenharmony_ci#include "ratecontrol.h" 33cabdff1aSopenharmony_ci#include "mpegutils.h" 34cabdff1aSopenharmony_ci#include "mpegvideoenc.h" 35cabdff1aSopenharmony_ci#include "libavutil/eval.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_civoid ff_write_pass1_stats(MpegEncContext *s) 38cabdff1aSopenharmony_ci{ 39cabdff1aSopenharmony_ci snprintf(s->avctx->stats_out, 256, 40cabdff1aSopenharmony_ci "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d " 41cabdff1aSopenharmony_ci "fcode:%d bcode:%d mc-var:%"PRId64" var:%"PRId64" icount:%d skipcount:%d hbits:%d;\n", 42cabdff1aSopenharmony_ci s->current_picture_ptr->f->display_picture_number, 43cabdff1aSopenharmony_ci s->current_picture_ptr->f->coded_picture_number, 44cabdff1aSopenharmony_ci s->pict_type, 45cabdff1aSopenharmony_ci s->current_picture.f->quality, 46cabdff1aSopenharmony_ci s->i_tex_bits, 47cabdff1aSopenharmony_ci s->p_tex_bits, 48cabdff1aSopenharmony_ci s->mv_bits, 49cabdff1aSopenharmony_ci s->misc_bits, 50cabdff1aSopenharmony_ci s->f_code, 51cabdff1aSopenharmony_ci s->b_code, 52cabdff1aSopenharmony_ci s->current_picture.mc_mb_var_sum, 53cabdff1aSopenharmony_ci s->current_picture.mb_var_sum, 54cabdff1aSopenharmony_ci s->i_count, s->skip_count, 55cabdff1aSopenharmony_ci s->header_bits); 56cabdff1aSopenharmony_ci} 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_cistatic double get_fps(AVCodecContext *avctx) 59cabdff1aSopenharmony_ci{ 60cabdff1aSopenharmony_ci return 1.0 / av_q2d(avctx->time_base) / FFMAX(avctx->ticks_per_frame, 1); 61cabdff1aSopenharmony_ci} 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistatic inline double qp2bits(RateControlEntry *rce, double qp) 64cabdff1aSopenharmony_ci{ 65cabdff1aSopenharmony_ci if (qp <= 0.0) { 66cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "qp<=0.0\n"); 67cabdff1aSopenharmony_ci } 68cabdff1aSopenharmony_ci return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits + 1) / qp; 69cabdff1aSopenharmony_ci} 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_cistatic inline double bits2qp(RateControlEntry *rce, double bits) 72cabdff1aSopenharmony_ci{ 73cabdff1aSopenharmony_ci if (bits < 0.9) { 74cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "bits<0.9\n"); 75cabdff1aSopenharmony_ci } 76cabdff1aSopenharmony_ci return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits + 1) / bits; 77cabdff1aSopenharmony_ci} 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_cistatic double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, double q) 80cabdff1aSopenharmony_ci{ 81cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 82cabdff1aSopenharmony_ci AVCodecContext *a = s->avctx; 83cabdff1aSopenharmony_ci const int pict_type = rce->new_pict_type; 84cabdff1aSopenharmony_ci const double last_p_q = rcc->last_qscale_for[AV_PICTURE_TYPE_P]; 85cabdff1aSopenharmony_ci const double last_non_b_q = rcc->last_qscale_for[rcc->last_non_b_pict_type]; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci if (pict_type == AV_PICTURE_TYPE_I && 88cabdff1aSopenharmony_ci (a->i_quant_factor > 0.0 || rcc->last_non_b_pict_type == AV_PICTURE_TYPE_P)) 89cabdff1aSopenharmony_ci q = last_p_q * FFABS(a->i_quant_factor) + a->i_quant_offset; 90cabdff1aSopenharmony_ci else if (pict_type == AV_PICTURE_TYPE_B && 91cabdff1aSopenharmony_ci a->b_quant_factor > 0.0) 92cabdff1aSopenharmony_ci q = last_non_b_q * a->b_quant_factor + a->b_quant_offset; 93cabdff1aSopenharmony_ci if (q < 1) 94cabdff1aSopenharmony_ci q = 1; 95cabdff1aSopenharmony_ci 96cabdff1aSopenharmony_ci /* last qscale / qdiff stuff */ 97cabdff1aSopenharmony_ci if (rcc->last_non_b_pict_type == pict_type || pict_type != AV_PICTURE_TYPE_I) { 98cabdff1aSopenharmony_ci double last_q = rcc->last_qscale_for[pict_type]; 99cabdff1aSopenharmony_ci const int maxdiff = FF_QP2LAMBDA * a->max_qdiff; 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci if (q > last_q + maxdiff) 102cabdff1aSopenharmony_ci q = last_q + maxdiff; 103cabdff1aSopenharmony_ci else if (q < last_q - maxdiff) 104cabdff1aSopenharmony_ci q = last_q - maxdiff; 105cabdff1aSopenharmony_ci } 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci rcc->last_qscale_for[pict_type] = q; // Note we cannot do that after blurring 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci if (pict_type != AV_PICTURE_TYPE_B) 110cabdff1aSopenharmony_ci rcc->last_non_b_pict_type = pict_type; 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci return q; 113cabdff1aSopenharmony_ci} 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci/** 116cabdff1aSopenharmony_ci * Get the qmin & qmax for pict_type. 117cabdff1aSopenharmony_ci */ 118cabdff1aSopenharmony_cistatic void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type) 119cabdff1aSopenharmony_ci{ 120cabdff1aSopenharmony_ci int qmin = s->lmin; 121cabdff1aSopenharmony_ci int qmax = s->lmax; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci av_assert0(qmin <= qmax); 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci switch (pict_type) { 126cabdff1aSopenharmony_ci case AV_PICTURE_TYPE_B: 127cabdff1aSopenharmony_ci qmin = (int)(qmin * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset + 0.5); 128cabdff1aSopenharmony_ci qmax = (int)(qmax * FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset + 0.5); 129cabdff1aSopenharmony_ci break; 130cabdff1aSopenharmony_ci case AV_PICTURE_TYPE_I: 131cabdff1aSopenharmony_ci qmin = (int)(qmin * FFABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset + 0.5); 132cabdff1aSopenharmony_ci qmax = (int)(qmax * FFABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset + 0.5); 133cabdff1aSopenharmony_ci break; 134cabdff1aSopenharmony_ci } 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci qmin = av_clip(qmin, 1, FF_LAMBDA_MAX); 137cabdff1aSopenharmony_ci qmax = av_clip(qmax, 1, FF_LAMBDA_MAX); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci if (qmax < qmin) 140cabdff1aSopenharmony_ci qmax = qmin; 141cabdff1aSopenharmony_ci 142cabdff1aSopenharmony_ci *qmin_ret = qmin; 143cabdff1aSopenharmony_ci *qmax_ret = qmax; 144cabdff1aSopenharmony_ci} 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_cistatic double modify_qscale(MpegEncContext *s, RateControlEntry *rce, 147cabdff1aSopenharmony_ci double q, int frame_num) 148cabdff1aSopenharmony_ci{ 149cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 150cabdff1aSopenharmony_ci const double buffer_size = s->avctx->rc_buffer_size; 151cabdff1aSopenharmony_ci const double fps = get_fps(s->avctx); 152cabdff1aSopenharmony_ci const double min_rate = s->avctx->rc_min_rate / fps; 153cabdff1aSopenharmony_ci const double max_rate = s->avctx->rc_max_rate / fps; 154cabdff1aSopenharmony_ci const int pict_type = rce->new_pict_type; 155cabdff1aSopenharmony_ci int qmin, qmax; 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci get_qminmax(&qmin, &qmax, s, pict_type); 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci /* modulation */ 160cabdff1aSopenharmony_ci if (s->rc_qmod_freq && 161cabdff1aSopenharmony_ci frame_num % s->rc_qmod_freq == 0 && 162cabdff1aSopenharmony_ci pict_type == AV_PICTURE_TYPE_P) 163cabdff1aSopenharmony_ci q *= s->rc_qmod_amp; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci /* buffer overflow/underflow protection */ 166cabdff1aSopenharmony_ci if (buffer_size) { 167cabdff1aSopenharmony_ci double expected_size = rcc->buffer_index; 168cabdff1aSopenharmony_ci double q_limit; 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci if (min_rate) { 171cabdff1aSopenharmony_ci double d = 2 * (buffer_size - expected_size) / buffer_size; 172cabdff1aSopenharmony_ci if (d > 1.0) 173cabdff1aSopenharmony_ci d = 1.0; 174cabdff1aSopenharmony_ci else if (d < 0.0001) 175cabdff1aSopenharmony_ci d = 0.0001; 176cabdff1aSopenharmony_ci q *= pow(d, 1.0 / s->rc_buffer_aggressivity); 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci q_limit = bits2qp(rce, 179cabdff1aSopenharmony_ci FFMAX((min_rate - buffer_size + rcc->buffer_index) * 180cabdff1aSopenharmony_ci s->avctx->rc_min_vbv_overflow_use, 1)); 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci if (q > q_limit) { 183cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_RC) 184cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 185cabdff1aSopenharmony_ci "limiting QP %f -> %f\n", q, q_limit); 186cabdff1aSopenharmony_ci q = q_limit; 187cabdff1aSopenharmony_ci } 188cabdff1aSopenharmony_ci } 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci if (max_rate) { 191cabdff1aSopenharmony_ci double d = 2 * expected_size / buffer_size; 192cabdff1aSopenharmony_ci if (d > 1.0) 193cabdff1aSopenharmony_ci d = 1.0; 194cabdff1aSopenharmony_ci else if (d < 0.0001) 195cabdff1aSopenharmony_ci d = 0.0001; 196cabdff1aSopenharmony_ci q /= pow(d, 1.0 / s->rc_buffer_aggressivity); 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_ci q_limit = bits2qp(rce, 199cabdff1aSopenharmony_ci FFMAX(rcc->buffer_index * 200cabdff1aSopenharmony_ci s->avctx->rc_max_available_vbv_use, 201cabdff1aSopenharmony_ci 1)); 202cabdff1aSopenharmony_ci if (q < q_limit) { 203cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_RC) 204cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 205cabdff1aSopenharmony_ci "limiting QP %f -> %f\n", q, q_limit); 206cabdff1aSopenharmony_ci q = q_limit; 207cabdff1aSopenharmony_ci } 208cabdff1aSopenharmony_ci } 209cabdff1aSopenharmony_ci } 210cabdff1aSopenharmony_ci ff_dlog(s, "q:%f max:%f min:%f size:%f index:%f agr:%f\n", 211cabdff1aSopenharmony_ci q, max_rate, min_rate, buffer_size, rcc->buffer_index, 212cabdff1aSopenharmony_ci s->rc_buffer_aggressivity); 213cabdff1aSopenharmony_ci if (s->rc_qsquish == 0.0 || qmin == qmax) { 214cabdff1aSopenharmony_ci if (q < qmin) 215cabdff1aSopenharmony_ci q = qmin; 216cabdff1aSopenharmony_ci else if (q > qmax) 217cabdff1aSopenharmony_ci q = qmax; 218cabdff1aSopenharmony_ci } else { 219cabdff1aSopenharmony_ci double min2 = log(qmin); 220cabdff1aSopenharmony_ci double max2 = log(qmax); 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci q = log(q); 223cabdff1aSopenharmony_ci q = (q - min2) / (max2 - min2) - 0.5; 224cabdff1aSopenharmony_ci q *= -4.0; 225cabdff1aSopenharmony_ci q = 1.0 / (1.0 + exp(q)); 226cabdff1aSopenharmony_ci q = q * (max2 - min2) + min2; 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci q = exp(q); 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci return q; 232cabdff1aSopenharmony_ci} 233cabdff1aSopenharmony_ci 234cabdff1aSopenharmony_ci/** 235cabdff1aSopenharmony_ci * Modify the bitrate curve from pass1 for one frame. 236cabdff1aSopenharmony_ci */ 237cabdff1aSopenharmony_cistatic double get_qscale(MpegEncContext *s, RateControlEntry *rce, 238cabdff1aSopenharmony_ci double rate_factor, int frame_num) 239cabdff1aSopenharmony_ci{ 240cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 241cabdff1aSopenharmony_ci AVCodecContext *a = s->avctx; 242cabdff1aSopenharmony_ci const int pict_type = rce->new_pict_type; 243cabdff1aSopenharmony_ci const double mb_num = s->mb_num; 244cabdff1aSopenharmony_ci double q, bits; 245cabdff1aSopenharmony_ci int i; 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci double const_values[] = { 248cabdff1aSopenharmony_ci M_PI, 249cabdff1aSopenharmony_ci M_E, 250cabdff1aSopenharmony_ci rce->i_tex_bits * rce->qscale, 251cabdff1aSopenharmony_ci rce->p_tex_bits * rce->qscale, 252cabdff1aSopenharmony_ci (rce->i_tex_bits + rce->p_tex_bits) * (double)rce->qscale, 253cabdff1aSopenharmony_ci rce->mv_bits / mb_num, 254cabdff1aSopenharmony_ci rce->pict_type == AV_PICTURE_TYPE_B ? (rce->f_code + rce->b_code) * 0.5 : rce->f_code, 255cabdff1aSopenharmony_ci rce->i_count / mb_num, 256cabdff1aSopenharmony_ci rce->mc_mb_var_sum / mb_num, 257cabdff1aSopenharmony_ci rce->mb_var_sum / mb_num, 258cabdff1aSopenharmony_ci rce->pict_type == AV_PICTURE_TYPE_I, 259cabdff1aSopenharmony_ci rce->pict_type == AV_PICTURE_TYPE_P, 260cabdff1aSopenharmony_ci rce->pict_type == AV_PICTURE_TYPE_B, 261cabdff1aSopenharmony_ci rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type], 262cabdff1aSopenharmony_ci a->qcompress, 263cabdff1aSopenharmony_ci rcc->i_cplx_sum[AV_PICTURE_TYPE_I] / (double)rcc->frame_count[AV_PICTURE_TYPE_I], 264cabdff1aSopenharmony_ci rcc->i_cplx_sum[AV_PICTURE_TYPE_P] / (double)rcc->frame_count[AV_PICTURE_TYPE_P], 265cabdff1aSopenharmony_ci rcc->p_cplx_sum[AV_PICTURE_TYPE_P] / (double)rcc->frame_count[AV_PICTURE_TYPE_P], 266cabdff1aSopenharmony_ci rcc->p_cplx_sum[AV_PICTURE_TYPE_B] / (double)rcc->frame_count[AV_PICTURE_TYPE_B], 267cabdff1aSopenharmony_ci (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type], 268cabdff1aSopenharmony_ci 0 269cabdff1aSopenharmony_ci }; 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci bits = av_expr_eval(rcc->rc_eq_eval, const_values, rce); 272cabdff1aSopenharmony_ci if (isnan(bits)) { 273cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error evaluating rc_eq \"%s\"\n", s->rc_eq); 274cabdff1aSopenharmony_ci return -1; 275cabdff1aSopenharmony_ci } 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci rcc->pass1_rc_eq_output_sum += bits; 278cabdff1aSopenharmony_ci bits *= rate_factor; 279cabdff1aSopenharmony_ci if (bits < 0.0) 280cabdff1aSopenharmony_ci bits = 0.0; 281cabdff1aSopenharmony_ci bits += 1.0; // avoid 1/0 issues 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci /* user override */ 284cabdff1aSopenharmony_ci for (i = 0; i < s->avctx->rc_override_count; i++) { 285cabdff1aSopenharmony_ci RcOverride *rco = s->avctx->rc_override; 286cabdff1aSopenharmony_ci if (rco[i].start_frame > frame_num) 287cabdff1aSopenharmony_ci continue; 288cabdff1aSopenharmony_ci if (rco[i].end_frame < frame_num) 289cabdff1aSopenharmony_ci continue; 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci if (rco[i].qscale) 292cabdff1aSopenharmony_ci bits = qp2bits(rce, rco[i].qscale); // FIXME move at end to really force it? 293cabdff1aSopenharmony_ci else 294cabdff1aSopenharmony_ci bits *= rco[i].quality_factor; 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci q = bits2qp(rce, bits); 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci /* I/B difference */ 300cabdff1aSopenharmony_ci if (pict_type == AV_PICTURE_TYPE_I && s->avctx->i_quant_factor < 0.0) 301cabdff1aSopenharmony_ci q = -q * s->avctx->i_quant_factor + s->avctx->i_quant_offset; 302cabdff1aSopenharmony_ci else if (pict_type == AV_PICTURE_TYPE_B && s->avctx->b_quant_factor < 0.0) 303cabdff1aSopenharmony_ci q = -q * s->avctx->b_quant_factor + s->avctx->b_quant_offset; 304cabdff1aSopenharmony_ci if (q < 1) 305cabdff1aSopenharmony_ci q = 1; 306cabdff1aSopenharmony_ci 307cabdff1aSopenharmony_ci return q; 308cabdff1aSopenharmony_ci} 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_cistatic int init_pass2(MpegEncContext *s) 311cabdff1aSopenharmony_ci{ 312cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 313cabdff1aSopenharmony_ci AVCodecContext *a = s->avctx; 314cabdff1aSopenharmony_ci int i, toobig; 315cabdff1aSopenharmony_ci double fps = get_fps(s->avctx); 316cabdff1aSopenharmony_ci double complexity[5] = { 0 }; // approximate bits at quant=1 317cabdff1aSopenharmony_ci uint64_t const_bits[5] = { 0 }; // quantizer independent bits 318cabdff1aSopenharmony_ci uint64_t all_const_bits; 319cabdff1aSopenharmony_ci uint64_t all_available_bits = (uint64_t)(s->bit_rate * 320cabdff1aSopenharmony_ci (double)rcc->num_entries / fps); 321cabdff1aSopenharmony_ci double rate_factor = 0; 322cabdff1aSopenharmony_ci double step; 323cabdff1aSopenharmony_ci const int filter_size = (int)(a->qblur * 4) | 1; 324cabdff1aSopenharmony_ci double expected_bits = 0; // init to silence gcc warning 325cabdff1aSopenharmony_ci double *qscale, *blurred_qscale, qscale_sum; 326cabdff1aSopenharmony_ci 327cabdff1aSopenharmony_ci /* find complexity & const_bits & decide the pict_types */ 328cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries; i++) { 329cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 330cabdff1aSopenharmony_ci 331cabdff1aSopenharmony_ci rce->new_pict_type = rce->pict_type; 332cabdff1aSopenharmony_ci rcc->i_cplx_sum[rce->pict_type] += rce->i_tex_bits * rce->qscale; 333cabdff1aSopenharmony_ci rcc->p_cplx_sum[rce->pict_type] += rce->p_tex_bits * rce->qscale; 334cabdff1aSopenharmony_ci rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits; 335cabdff1aSopenharmony_ci rcc->frame_count[rce->pict_type]++; 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci complexity[rce->new_pict_type] += (rce->i_tex_bits + rce->p_tex_bits) * 338cabdff1aSopenharmony_ci (double)rce->qscale; 339cabdff1aSopenharmony_ci const_bits[rce->new_pict_type] += rce->mv_bits + rce->misc_bits; 340cabdff1aSopenharmony_ci } 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci all_const_bits = const_bits[AV_PICTURE_TYPE_I] + 343cabdff1aSopenharmony_ci const_bits[AV_PICTURE_TYPE_P] + 344cabdff1aSopenharmony_ci const_bits[AV_PICTURE_TYPE_B]; 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ci if (all_available_bits < all_const_bits) { 347cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "requested bitrate is too low\n"); 348cabdff1aSopenharmony_ci return -1; 349cabdff1aSopenharmony_ci } 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci qscale = av_malloc_array(rcc->num_entries, sizeof(double)); 352cabdff1aSopenharmony_ci blurred_qscale = av_malloc_array(rcc->num_entries, sizeof(double)); 353cabdff1aSopenharmony_ci if (!qscale || !blurred_qscale) { 354cabdff1aSopenharmony_ci av_free(qscale); 355cabdff1aSopenharmony_ci av_free(blurred_qscale); 356cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 357cabdff1aSopenharmony_ci } 358cabdff1aSopenharmony_ci toobig = 0; 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_ci for (step = 256 * 256; step > 0.0000001; step *= 0.5) { 361cabdff1aSopenharmony_ci expected_bits = 0; 362cabdff1aSopenharmony_ci rate_factor += step; 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci rcc->buffer_index = s->avctx->rc_buffer_size / 2; 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci /* find qscale */ 367cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries; i++) { 368cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_ci qscale[i] = get_qscale(s, &rcc->entry[i], rate_factor, i); 371cabdff1aSopenharmony_ci rcc->last_qscale_for[rce->pict_type] = qscale[i]; 372cabdff1aSopenharmony_ci } 373cabdff1aSopenharmony_ci av_assert0(filter_size % 2 == 1); 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_ci /* fixed I/B QP relative to P mode */ 376cabdff1aSopenharmony_ci for (i = FFMAX(0, rcc->num_entries - 300); i < rcc->num_entries; i++) { 377cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci qscale[i] = get_diff_limited_q(s, rce, qscale[i]); 380cabdff1aSopenharmony_ci } 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci for (i = rcc->num_entries - 1; i >= 0; i--) { 383cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci qscale[i] = get_diff_limited_q(s, rce, qscale[i]); 386cabdff1aSopenharmony_ci } 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_ci /* smooth curve */ 389cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries; i++) { 390cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 391cabdff1aSopenharmony_ci const int pict_type = rce->new_pict_type; 392cabdff1aSopenharmony_ci int j; 393cabdff1aSopenharmony_ci double q = 0.0, sum = 0.0; 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci for (j = 0; j < filter_size; j++) { 396cabdff1aSopenharmony_ci int index = i + j - filter_size / 2; 397cabdff1aSopenharmony_ci double d = index - i; 398cabdff1aSopenharmony_ci double coeff = a->qblur == 0 ? 1.0 : exp(-d * d / (a->qblur * a->qblur)); 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci if (index < 0 || index >= rcc->num_entries) 401cabdff1aSopenharmony_ci continue; 402cabdff1aSopenharmony_ci if (pict_type != rcc->entry[index].new_pict_type) 403cabdff1aSopenharmony_ci continue; 404cabdff1aSopenharmony_ci q += qscale[index] * coeff; 405cabdff1aSopenharmony_ci sum += coeff; 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci blurred_qscale[i] = q / sum; 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci /* find expected bits */ 411cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries; i++) { 412cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 413cabdff1aSopenharmony_ci double bits; 414cabdff1aSopenharmony_ci 415cabdff1aSopenharmony_ci rce->new_qscale = modify_qscale(s, rce, blurred_qscale[i], i); 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci bits = qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits; 418cabdff1aSopenharmony_ci bits += 8 * ff_vbv_update(s, bits); 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci rce->expected_bits = expected_bits; 421cabdff1aSopenharmony_ci expected_bits += bits; 422cabdff1aSopenharmony_ci } 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_ci ff_dlog(s->avctx, 425cabdff1aSopenharmony_ci "expected_bits: %f all_available_bits: %d rate_factor: %f\n", 426cabdff1aSopenharmony_ci expected_bits, (int)all_available_bits, rate_factor); 427cabdff1aSopenharmony_ci if (expected_bits > all_available_bits) { 428cabdff1aSopenharmony_ci rate_factor -= step; 429cabdff1aSopenharmony_ci ++toobig; 430cabdff1aSopenharmony_ci } 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci av_free(qscale); 433cabdff1aSopenharmony_ci av_free(blurred_qscale); 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci /* check bitrate calculations and print info */ 436cabdff1aSopenharmony_ci qscale_sum = 0.0; 437cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries; i++) { 438cabdff1aSopenharmony_ci ff_dlog(s, "[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n", 439cabdff1aSopenharmony_ci i, 440cabdff1aSopenharmony_ci rcc->entry[i].new_qscale, 441cabdff1aSopenharmony_ci rcc->entry[i].new_qscale / FF_QP2LAMBDA); 442cabdff1aSopenharmony_ci qscale_sum += av_clip(rcc->entry[i].new_qscale / FF_QP2LAMBDA, 443cabdff1aSopenharmony_ci s->avctx->qmin, s->avctx->qmax); 444cabdff1aSopenharmony_ci } 445cabdff1aSopenharmony_ci av_assert0(toobig <= 40); 446cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 447cabdff1aSopenharmony_ci "[lavc rc] requested bitrate: %"PRId64" bps expected bitrate: %"PRId64" bps\n", 448cabdff1aSopenharmony_ci s->bit_rate, 449cabdff1aSopenharmony_ci (int64_t)(expected_bits / ((double)all_available_bits / s->bit_rate))); 450cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 451cabdff1aSopenharmony_ci "[lavc rc] estimated target average qp: %.3f\n", 452cabdff1aSopenharmony_ci (float)qscale_sum / rcc->num_entries); 453cabdff1aSopenharmony_ci if (toobig == 0) { 454cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_INFO, 455cabdff1aSopenharmony_ci "[lavc rc] Using all of requested bitrate is not " 456cabdff1aSopenharmony_ci "necessary for this video with these parameters.\n"); 457cabdff1aSopenharmony_ci } else if (toobig == 40) { 458cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 459cabdff1aSopenharmony_ci "[lavc rc] Error: bitrate too low for this video " 460cabdff1aSopenharmony_ci "with these parameters.\n"); 461cabdff1aSopenharmony_ci return -1; 462cabdff1aSopenharmony_ci } else if (fabs(expected_bits / all_available_bits - 1.0) > 0.01) { 463cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 464cabdff1aSopenharmony_ci "[lavc rc] Error: 2pass curve failed to converge\n"); 465cabdff1aSopenharmony_ci return -1; 466cabdff1aSopenharmony_ci } 467cabdff1aSopenharmony_ci 468cabdff1aSopenharmony_ci return 0; 469cabdff1aSopenharmony_ci} 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ciav_cold int ff_rate_control_init(MpegEncContext *s) 472cabdff1aSopenharmony_ci{ 473cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 474cabdff1aSopenharmony_ci int i, res; 475cabdff1aSopenharmony_ci static const char * const const_names[] = { 476cabdff1aSopenharmony_ci "PI", 477cabdff1aSopenharmony_ci "E", 478cabdff1aSopenharmony_ci "iTex", 479cabdff1aSopenharmony_ci "pTex", 480cabdff1aSopenharmony_ci "tex", 481cabdff1aSopenharmony_ci "mv", 482cabdff1aSopenharmony_ci "fCode", 483cabdff1aSopenharmony_ci "iCount", 484cabdff1aSopenharmony_ci "mcVar", 485cabdff1aSopenharmony_ci "var", 486cabdff1aSopenharmony_ci "isI", 487cabdff1aSopenharmony_ci "isP", 488cabdff1aSopenharmony_ci "isB", 489cabdff1aSopenharmony_ci "avgQP", 490cabdff1aSopenharmony_ci "qComp", 491cabdff1aSopenharmony_ci "avgIITex", 492cabdff1aSopenharmony_ci "avgPITex", 493cabdff1aSopenharmony_ci "avgPPTex", 494cabdff1aSopenharmony_ci "avgBPTex", 495cabdff1aSopenharmony_ci "avgTex", 496cabdff1aSopenharmony_ci NULL 497cabdff1aSopenharmony_ci }; 498cabdff1aSopenharmony_ci static double (* const func1[])(void *, double) = { 499cabdff1aSopenharmony_ci (double (*)(void *, double)) bits2qp, 500cabdff1aSopenharmony_ci (double (*)(void *, double)) qp2bits, 501cabdff1aSopenharmony_ci NULL 502cabdff1aSopenharmony_ci }; 503cabdff1aSopenharmony_ci static const char * const func1_names[] = { 504cabdff1aSopenharmony_ci "bits2qp", 505cabdff1aSopenharmony_ci "qp2bits", 506cabdff1aSopenharmony_ci NULL 507cabdff1aSopenharmony_ci }; 508cabdff1aSopenharmony_ci emms_c(); 509cabdff1aSopenharmony_ci 510cabdff1aSopenharmony_ci if (!s->avctx->rc_max_available_vbv_use && s->avctx->rc_buffer_size) { 511cabdff1aSopenharmony_ci if (s->avctx->rc_max_rate) { 512cabdff1aSopenharmony_ci s->avctx->rc_max_available_vbv_use = av_clipf(s->avctx->rc_max_rate/(s->avctx->rc_buffer_size*get_fps(s->avctx)), 1.0/3, 1.0); 513cabdff1aSopenharmony_ci } else 514cabdff1aSopenharmony_ci s->avctx->rc_max_available_vbv_use = 1.0; 515cabdff1aSopenharmony_ci } 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_ci res = av_expr_parse(&rcc->rc_eq_eval, 518cabdff1aSopenharmony_ci s->rc_eq ? s->rc_eq : "tex^qComp", 519cabdff1aSopenharmony_ci const_names, func1_names, func1, 520cabdff1aSopenharmony_ci NULL, NULL, 0, s->avctx); 521cabdff1aSopenharmony_ci if (res < 0) { 522cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Error parsing rc_eq \"%s\"\n", s->rc_eq); 523cabdff1aSopenharmony_ci return res; 524cabdff1aSopenharmony_ci } 525cabdff1aSopenharmony_ci 526cabdff1aSopenharmony_ci for (i = 0; i < 5; i++) { 527cabdff1aSopenharmony_ci rcc->pred[i].coeff = FF_QP2LAMBDA * 7.0; 528cabdff1aSopenharmony_ci rcc->pred[i].count = 1.0; 529cabdff1aSopenharmony_ci rcc->pred[i].decay = 0.4; 530cabdff1aSopenharmony_ci 531cabdff1aSopenharmony_ci rcc->i_cplx_sum [i] = 532cabdff1aSopenharmony_ci rcc->p_cplx_sum [i] = 533cabdff1aSopenharmony_ci rcc->mv_bits_sum[i] = 534cabdff1aSopenharmony_ci rcc->qscale_sum [i] = 535cabdff1aSopenharmony_ci rcc->frame_count[i] = 1; // 1 is better because of 1/0 and such 536cabdff1aSopenharmony_ci 537cabdff1aSopenharmony_ci rcc->last_qscale_for[i] = FF_QP2LAMBDA * 5; 538cabdff1aSopenharmony_ci } 539cabdff1aSopenharmony_ci rcc->buffer_index = s->avctx->rc_initial_buffer_occupancy; 540cabdff1aSopenharmony_ci if (!rcc->buffer_index) 541cabdff1aSopenharmony_ci rcc->buffer_index = s->avctx->rc_buffer_size * 3 / 4; 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_ci if (s->avctx->flags & AV_CODEC_FLAG_PASS2) { 544cabdff1aSopenharmony_ci int i; 545cabdff1aSopenharmony_ci char *p; 546cabdff1aSopenharmony_ci 547cabdff1aSopenharmony_ci /* find number of pics */ 548cabdff1aSopenharmony_ci p = s->avctx->stats_in; 549cabdff1aSopenharmony_ci for (i = -1; p; i++) 550cabdff1aSopenharmony_ci p = strchr(p + 1, ';'); 551cabdff1aSopenharmony_ci i += s->max_b_frames; 552cabdff1aSopenharmony_ci if (i <= 0 || i >= INT_MAX / sizeof(RateControlEntry)) 553cabdff1aSopenharmony_ci return -1; 554cabdff1aSopenharmony_ci rcc->entry = av_mallocz(i * sizeof(RateControlEntry)); 555cabdff1aSopenharmony_ci if (!rcc->entry) 556cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 557cabdff1aSopenharmony_ci rcc->num_entries = i; 558cabdff1aSopenharmony_ci 559cabdff1aSopenharmony_ci /* init all to skipped P-frames 560cabdff1aSopenharmony_ci * (with B-frames we might have a not encoded frame at the end FIXME) */ 561cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries; i++) { 562cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[i]; 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci rce->pict_type = rce->new_pict_type = AV_PICTURE_TYPE_P; 565cabdff1aSopenharmony_ci rce->qscale = rce->new_qscale = FF_QP2LAMBDA * 2; 566cabdff1aSopenharmony_ci rce->misc_bits = s->mb_num + 10; 567cabdff1aSopenharmony_ci rce->mb_var_sum = s->mb_num * 100; 568cabdff1aSopenharmony_ci } 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci /* read stats */ 571cabdff1aSopenharmony_ci p = s->avctx->stats_in; 572cabdff1aSopenharmony_ci for (i = 0; i < rcc->num_entries - s->max_b_frames; i++) { 573cabdff1aSopenharmony_ci RateControlEntry *rce; 574cabdff1aSopenharmony_ci int picture_number; 575cabdff1aSopenharmony_ci int e; 576cabdff1aSopenharmony_ci char *next; 577cabdff1aSopenharmony_ci 578cabdff1aSopenharmony_ci next = strchr(p, ';'); 579cabdff1aSopenharmony_ci if (next) { 580cabdff1aSopenharmony_ci (*next) = 0; // sscanf is unbelievably slow on looong strings // FIXME copy / do not write 581cabdff1aSopenharmony_ci next++; 582cabdff1aSopenharmony_ci } 583cabdff1aSopenharmony_ci e = sscanf(p, " in:%d ", &picture_number); 584cabdff1aSopenharmony_ci 585cabdff1aSopenharmony_ci av_assert0(picture_number >= 0); 586cabdff1aSopenharmony_ci av_assert0(picture_number < rcc->num_entries); 587cabdff1aSopenharmony_ci rce = &rcc->entry[picture_number]; 588cabdff1aSopenharmony_ci 589cabdff1aSopenharmony_ci e += sscanf(p, " in:%*d out:%*d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%"SCNd64" var:%"SCNd64" icount:%d skipcount:%d hbits:%d", 590cabdff1aSopenharmony_ci &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, 591cabdff1aSopenharmony_ci &rce->mv_bits, &rce->misc_bits, 592cabdff1aSopenharmony_ci &rce->f_code, &rce->b_code, 593cabdff1aSopenharmony_ci &rce->mc_mb_var_sum, &rce->mb_var_sum, 594cabdff1aSopenharmony_ci &rce->i_count, &rce->skip_count, &rce->header_bits); 595cabdff1aSopenharmony_ci if (e != 14) { 596cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 597cabdff1aSopenharmony_ci "statistics are damaged at line %d, parser out=%d\n", 598cabdff1aSopenharmony_ci i, e); 599cabdff1aSopenharmony_ci return -1; 600cabdff1aSopenharmony_ci } 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_ci p = next; 603cabdff1aSopenharmony_ci } 604cabdff1aSopenharmony_ci 605cabdff1aSopenharmony_ci if (init_pass2(s) < 0) { 606cabdff1aSopenharmony_ci ff_rate_control_uninit(s); 607cabdff1aSopenharmony_ci return -1; 608cabdff1aSopenharmony_ci } 609cabdff1aSopenharmony_ci } 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci if (!(s->avctx->flags & AV_CODEC_FLAG_PASS2)) { 612cabdff1aSopenharmony_ci rcc->short_term_qsum = 0.001; 613cabdff1aSopenharmony_ci rcc->short_term_qcount = 0.001; 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_ci rcc->pass1_rc_eq_output_sum = 0.001; 616cabdff1aSopenharmony_ci rcc->pass1_wanted_bits = 0.001; 617cabdff1aSopenharmony_ci 618cabdff1aSopenharmony_ci if (s->avctx->qblur > 1.0) { 619cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "qblur too large\n"); 620cabdff1aSopenharmony_ci return -1; 621cabdff1aSopenharmony_ci } 622cabdff1aSopenharmony_ci /* init stuff with the user specified complexity */ 623cabdff1aSopenharmony_ci if (s->rc_initial_cplx) { 624cabdff1aSopenharmony_ci for (i = 0; i < 60 * 30; i++) { 625cabdff1aSopenharmony_ci double bits = s->rc_initial_cplx * (i / 10000.0 + 1.0) * s->mb_num; 626cabdff1aSopenharmony_ci RateControlEntry rce; 627cabdff1aSopenharmony_ci 628cabdff1aSopenharmony_ci if (i % ((s->gop_size + 3) / 4) == 0) 629cabdff1aSopenharmony_ci rce.pict_type = AV_PICTURE_TYPE_I; 630cabdff1aSopenharmony_ci else if (i % (s->max_b_frames + 1)) 631cabdff1aSopenharmony_ci rce.pict_type = AV_PICTURE_TYPE_B; 632cabdff1aSopenharmony_ci else 633cabdff1aSopenharmony_ci rce.pict_type = AV_PICTURE_TYPE_P; 634cabdff1aSopenharmony_ci 635cabdff1aSopenharmony_ci rce.new_pict_type = rce.pict_type; 636cabdff1aSopenharmony_ci rce.mc_mb_var_sum = bits * s->mb_num / 100000; 637cabdff1aSopenharmony_ci rce.mb_var_sum = s->mb_num; 638cabdff1aSopenharmony_ci 639cabdff1aSopenharmony_ci rce.qscale = FF_QP2LAMBDA * 2; 640cabdff1aSopenharmony_ci rce.f_code = 2; 641cabdff1aSopenharmony_ci rce.b_code = 1; 642cabdff1aSopenharmony_ci rce.misc_bits = 1; 643cabdff1aSopenharmony_ci 644cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_I) { 645cabdff1aSopenharmony_ci rce.i_count = s->mb_num; 646cabdff1aSopenharmony_ci rce.i_tex_bits = bits; 647cabdff1aSopenharmony_ci rce.p_tex_bits = 0; 648cabdff1aSopenharmony_ci rce.mv_bits = 0; 649cabdff1aSopenharmony_ci } else { 650cabdff1aSopenharmony_ci rce.i_count = 0; // FIXME we do know this approx 651cabdff1aSopenharmony_ci rce.i_tex_bits = 0; 652cabdff1aSopenharmony_ci rce.p_tex_bits = bits * 0.9; 653cabdff1aSopenharmony_ci rce.mv_bits = bits * 0.1; 654cabdff1aSopenharmony_ci } 655cabdff1aSopenharmony_ci rcc->i_cplx_sum[rce.pict_type] += rce.i_tex_bits * rce.qscale; 656cabdff1aSopenharmony_ci rcc->p_cplx_sum[rce.pict_type] += rce.p_tex_bits * rce.qscale; 657cabdff1aSopenharmony_ci rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits; 658cabdff1aSopenharmony_ci rcc->frame_count[rce.pict_type]++; 659cabdff1aSopenharmony_ci 660cabdff1aSopenharmony_ci get_qscale(s, &rce, rcc->pass1_wanted_bits / rcc->pass1_rc_eq_output_sum, i); 661cabdff1aSopenharmony_ci 662cabdff1aSopenharmony_ci // FIXME misbehaves a little for variable fps 663cabdff1aSopenharmony_ci rcc->pass1_wanted_bits += s->bit_rate / get_fps(s->avctx); 664cabdff1aSopenharmony_ci } 665cabdff1aSopenharmony_ci } 666cabdff1aSopenharmony_ci } 667cabdff1aSopenharmony_ci 668cabdff1aSopenharmony_ci return 0; 669cabdff1aSopenharmony_ci} 670cabdff1aSopenharmony_ci 671cabdff1aSopenharmony_ciav_cold void ff_rate_control_uninit(MpegEncContext *s) 672cabdff1aSopenharmony_ci{ 673cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 674cabdff1aSopenharmony_ci emms_c(); 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci av_expr_free(rcc->rc_eq_eval); 677cabdff1aSopenharmony_ci av_freep(&rcc->entry); 678cabdff1aSopenharmony_ci} 679cabdff1aSopenharmony_ci 680cabdff1aSopenharmony_ciint ff_vbv_update(MpegEncContext *s, int frame_size) 681cabdff1aSopenharmony_ci{ 682cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 683cabdff1aSopenharmony_ci const double fps = get_fps(s->avctx); 684cabdff1aSopenharmony_ci const int buffer_size = s->avctx->rc_buffer_size; 685cabdff1aSopenharmony_ci const double min_rate = s->avctx->rc_min_rate / fps; 686cabdff1aSopenharmony_ci const double max_rate = s->avctx->rc_max_rate / fps; 687cabdff1aSopenharmony_ci 688cabdff1aSopenharmony_ci ff_dlog(s, "%d %f %d %f %f\n", 689cabdff1aSopenharmony_ci buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate); 690cabdff1aSopenharmony_ci 691cabdff1aSopenharmony_ci if (buffer_size) { 692cabdff1aSopenharmony_ci int left; 693cabdff1aSopenharmony_ci 694cabdff1aSopenharmony_ci rcc->buffer_index -= frame_size; 695cabdff1aSopenharmony_ci if (rcc->buffer_index < 0) { 696cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "rc buffer underflow\n"); 697cabdff1aSopenharmony_ci if (frame_size > max_rate && s->qscale == s->avctx->qmax) { 698cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "max bitrate possibly too small or try trellis with large lmax or increase qmax\n"); 699cabdff1aSopenharmony_ci } 700cabdff1aSopenharmony_ci rcc->buffer_index = 0; 701cabdff1aSopenharmony_ci } 702cabdff1aSopenharmony_ci 703cabdff1aSopenharmony_ci left = buffer_size - rcc->buffer_index - 1; 704cabdff1aSopenharmony_ci rcc->buffer_index += av_clip(left, min_rate, max_rate); 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci if (rcc->buffer_index > buffer_size) { 707cabdff1aSopenharmony_ci int stuffing = ceil((rcc->buffer_index - buffer_size) / 8); 708cabdff1aSopenharmony_ci 709cabdff1aSopenharmony_ci if (stuffing < 4 && s->codec_id == AV_CODEC_ID_MPEG4) 710cabdff1aSopenharmony_ci stuffing = 4; 711cabdff1aSopenharmony_ci rcc->buffer_index -= 8 * stuffing; 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_RC) 714cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing); 715cabdff1aSopenharmony_ci 716cabdff1aSopenharmony_ci return stuffing; 717cabdff1aSopenharmony_ci } 718cabdff1aSopenharmony_ci } 719cabdff1aSopenharmony_ci return 0; 720cabdff1aSopenharmony_ci} 721cabdff1aSopenharmony_ci 722cabdff1aSopenharmony_cistatic double predict_size(Predictor *p, double q, double var) 723cabdff1aSopenharmony_ci{ 724cabdff1aSopenharmony_ci return p->coeff * var / (q * p->count); 725cabdff1aSopenharmony_ci} 726cabdff1aSopenharmony_ci 727cabdff1aSopenharmony_cistatic void update_predictor(Predictor *p, double q, double var, double size) 728cabdff1aSopenharmony_ci{ 729cabdff1aSopenharmony_ci double new_coeff = size * q / (var + 1); 730cabdff1aSopenharmony_ci if (var < 10) 731cabdff1aSopenharmony_ci return; 732cabdff1aSopenharmony_ci 733cabdff1aSopenharmony_ci p->count *= p->decay; 734cabdff1aSopenharmony_ci p->coeff *= p->decay; 735cabdff1aSopenharmony_ci p->count++; 736cabdff1aSopenharmony_ci p->coeff += new_coeff; 737cabdff1aSopenharmony_ci} 738cabdff1aSopenharmony_ci 739cabdff1aSopenharmony_cistatic void adaptive_quantization(MpegEncContext *s, double q) 740cabdff1aSopenharmony_ci{ 741cabdff1aSopenharmony_ci int i; 742cabdff1aSopenharmony_ci const float lumi_masking = s->avctx->lumi_masking / (128.0 * 128.0); 743cabdff1aSopenharmony_ci const float dark_masking = s->avctx->dark_masking / (128.0 * 128.0); 744cabdff1aSopenharmony_ci const float temp_cplx_masking = s->avctx->temporal_cplx_masking; 745cabdff1aSopenharmony_ci const float spatial_cplx_masking = s->avctx->spatial_cplx_masking; 746cabdff1aSopenharmony_ci const float p_masking = s->avctx->p_masking; 747cabdff1aSopenharmony_ci const float border_masking = s->border_masking; 748cabdff1aSopenharmony_ci float bits_sum = 0.0; 749cabdff1aSopenharmony_ci float cplx_sum = 0.0; 750cabdff1aSopenharmony_ci float *cplx_tab = s->cplx_tab; 751cabdff1aSopenharmony_ci float *bits_tab = s->bits_tab; 752cabdff1aSopenharmony_ci const int qmin = s->avctx->mb_lmin; 753cabdff1aSopenharmony_ci const int qmax = s->avctx->mb_lmax; 754cabdff1aSopenharmony_ci Picture *const pic = &s->current_picture; 755cabdff1aSopenharmony_ci const int mb_width = s->mb_width; 756cabdff1aSopenharmony_ci const int mb_height = s->mb_height; 757cabdff1aSopenharmony_ci 758cabdff1aSopenharmony_ci for (i = 0; i < s->mb_num; i++) { 759cabdff1aSopenharmony_ci const int mb_xy = s->mb_index2xy[i]; 760cabdff1aSopenharmony_ci float temp_cplx = sqrt(pic->mc_mb_var[mb_xy]); // FIXME merge in pow() 761cabdff1aSopenharmony_ci float spat_cplx = sqrt(pic->mb_var[mb_xy]); 762cabdff1aSopenharmony_ci const int lumi = pic->mb_mean[mb_xy]; 763cabdff1aSopenharmony_ci float bits, cplx, factor; 764cabdff1aSopenharmony_ci int mb_x = mb_xy % s->mb_stride; 765cabdff1aSopenharmony_ci int mb_y = mb_xy / s->mb_stride; 766cabdff1aSopenharmony_ci int mb_distance; 767cabdff1aSopenharmony_ci float mb_factor = 0.0; 768cabdff1aSopenharmony_ci if (spat_cplx < 4) 769cabdff1aSopenharmony_ci spat_cplx = 4; // FIXME fine-tune 770cabdff1aSopenharmony_ci if (temp_cplx < 4) 771cabdff1aSopenharmony_ci temp_cplx = 4; // FIXME fine-tune 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ci if ((s->mb_type[mb_xy] & CANDIDATE_MB_TYPE_INTRA)) { // FIXME hq mode 774cabdff1aSopenharmony_ci cplx = spat_cplx; 775cabdff1aSopenharmony_ci factor = 1.0 + p_masking; 776cabdff1aSopenharmony_ci } else { 777cabdff1aSopenharmony_ci cplx = temp_cplx; 778cabdff1aSopenharmony_ci factor = pow(temp_cplx, -temp_cplx_masking); 779cabdff1aSopenharmony_ci } 780cabdff1aSopenharmony_ci factor *= pow(spat_cplx, -spatial_cplx_masking); 781cabdff1aSopenharmony_ci 782cabdff1aSopenharmony_ci if (lumi > 127) 783cabdff1aSopenharmony_ci factor *= (1.0 - (lumi - 128) * (lumi - 128) * lumi_masking); 784cabdff1aSopenharmony_ci else 785cabdff1aSopenharmony_ci factor *= (1.0 - (lumi - 128) * (lumi - 128) * dark_masking); 786cabdff1aSopenharmony_ci 787cabdff1aSopenharmony_ci if (mb_x < mb_width / 5) { 788cabdff1aSopenharmony_ci mb_distance = mb_width / 5 - mb_x; 789cabdff1aSopenharmony_ci mb_factor = (float)mb_distance / (float)(mb_width / 5); 790cabdff1aSopenharmony_ci } else if (mb_x > 4 * mb_width / 5) { 791cabdff1aSopenharmony_ci mb_distance = mb_x - 4 * mb_width / 5; 792cabdff1aSopenharmony_ci mb_factor = (float)mb_distance / (float)(mb_width / 5); 793cabdff1aSopenharmony_ci } 794cabdff1aSopenharmony_ci if (mb_y < mb_height / 5) { 795cabdff1aSopenharmony_ci mb_distance = mb_height / 5 - mb_y; 796cabdff1aSopenharmony_ci mb_factor = FFMAX(mb_factor, 797cabdff1aSopenharmony_ci (float)mb_distance / (float)(mb_height / 5)); 798cabdff1aSopenharmony_ci } else if (mb_y > 4 * mb_height / 5) { 799cabdff1aSopenharmony_ci mb_distance = mb_y - 4 * mb_height / 5; 800cabdff1aSopenharmony_ci mb_factor = FFMAX(mb_factor, 801cabdff1aSopenharmony_ci (float)mb_distance / (float)(mb_height / 5)); 802cabdff1aSopenharmony_ci } 803cabdff1aSopenharmony_ci 804cabdff1aSopenharmony_ci factor *= 1.0 - border_masking * mb_factor; 805cabdff1aSopenharmony_ci 806cabdff1aSopenharmony_ci if (factor < 0.00001) 807cabdff1aSopenharmony_ci factor = 0.00001; 808cabdff1aSopenharmony_ci 809cabdff1aSopenharmony_ci bits = cplx * factor; 810cabdff1aSopenharmony_ci cplx_sum += cplx; 811cabdff1aSopenharmony_ci bits_sum += bits; 812cabdff1aSopenharmony_ci cplx_tab[i] = cplx; 813cabdff1aSopenharmony_ci bits_tab[i] = bits; 814cabdff1aSopenharmony_ci } 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_ci /* handle qmin/qmax clipping */ 817cabdff1aSopenharmony_ci if (s->mpv_flags & FF_MPV_FLAG_NAQ) { 818cabdff1aSopenharmony_ci float factor = bits_sum / cplx_sum; 819cabdff1aSopenharmony_ci for (i = 0; i < s->mb_num; i++) { 820cabdff1aSopenharmony_ci float newq = q * cplx_tab[i] / bits_tab[i]; 821cabdff1aSopenharmony_ci newq *= factor; 822cabdff1aSopenharmony_ci 823cabdff1aSopenharmony_ci if (newq > qmax) { 824cabdff1aSopenharmony_ci bits_sum -= bits_tab[i]; 825cabdff1aSopenharmony_ci cplx_sum -= cplx_tab[i] * q / qmax; 826cabdff1aSopenharmony_ci } else if (newq < qmin) { 827cabdff1aSopenharmony_ci bits_sum -= bits_tab[i]; 828cabdff1aSopenharmony_ci cplx_sum -= cplx_tab[i] * q / qmin; 829cabdff1aSopenharmony_ci } 830cabdff1aSopenharmony_ci } 831cabdff1aSopenharmony_ci if (bits_sum < 0.001) 832cabdff1aSopenharmony_ci bits_sum = 0.001; 833cabdff1aSopenharmony_ci if (cplx_sum < 0.001) 834cabdff1aSopenharmony_ci cplx_sum = 0.001; 835cabdff1aSopenharmony_ci } 836cabdff1aSopenharmony_ci 837cabdff1aSopenharmony_ci for (i = 0; i < s->mb_num; i++) { 838cabdff1aSopenharmony_ci const int mb_xy = s->mb_index2xy[i]; 839cabdff1aSopenharmony_ci float newq = q * cplx_tab[i] / bits_tab[i]; 840cabdff1aSopenharmony_ci int intq; 841cabdff1aSopenharmony_ci 842cabdff1aSopenharmony_ci if (s->mpv_flags & FF_MPV_FLAG_NAQ) { 843cabdff1aSopenharmony_ci newq *= bits_sum / cplx_sum; 844cabdff1aSopenharmony_ci } 845cabdff1aSopenharmony_ci 846cabdff1aSopenharmony_ci intq = (int)(newq + 0.5); 847cabdff1aSopenharmony_ci 848cabdff1aSopenharmony_ci if (intq > qmax) 849cabdff1aSopenharmony_ci intq = qmax; 850cabdff1aSopenharmony_ci else if (intq < qmin) 851cabdff1aSopenharmony_ci intq = qmin; 852cabdff1aSopenharmony_ci s->lambda_table[mb_xy] = intq; 853cabdff1aSopenharmony_ci } 854cabdff1aSopenharmony_ci} 855cabdff1aSopenharmony_ci 856cabdff1aSopenharmony_civoid ff_get_2pass_fcode(MpegEncContext *s) 857cabdff1aSopenharmony_ci{ 858cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 859cabdff1aSopenharmony_ci RateControlEntry *rce = &rcc->entry[s->picture_number]; 860cabdff1aSopenharmony_ci 861cabdff1aSopenharmony_ci s->f_code = rce->f_code; 862cabdff1aSopenharmony_ci s->b_code = rce->b_code; 863cabdff1aSopenharmony_ci} 864cabdff1aSopenharmony_ci 865cabdff1aSopenharmony_ci// FIXME rd or at least approx for dquant 866cabdff1aSopenharmony_ci 867cabdff1aSopenharmony_cifloat ff_rate_estimate_qscale(MpegEncContext *s, int dry_run) 868cabdff1aSopenharmony_ci{ 869cabdff1aSopenharmony_ci float q; 870cabdff1aSopenharmony_ci int qmin, qmax; 871cabdff1aSopenharmony_ci float br_compensation; 872cabdff1aSopenharmony_ci double diff; 873cabdff1aSopenharmony_ci double short_term_q; 874cabdff1aSopenharmony_ci double fps; 875cabdff1aSopenharmony_ci int picture_number = s->picture_number; 876cabdff1aSopenharmony_ci int64_t wanted_bits; 877cabdff1aSopenharmony_ci RateControlContext *rcc = &s->rc_context; 878cabdff1aSopenharmony_ci AVCodecContext *a = s->avctx; 879cabdff1aSopenharmony_ci RateControlEntry local_rce, *rce; 880cabdff1aSopenharmony_ci double bits; 881cabdff1aSopenharmony_ci double rate_factor; 882cabdff1aSopenharmony_ci int64_t var; 883cabdff1aSopenharmony_ci const int pict_type = s->pict_type; 884cabdff1aSopenharmony_ci Picture * const pic = &s->current_picture; 885cabdff1aSopenharmony_ci emms_c(); 886cabdff1aSopenharmony_ci 887cabdff1aSopenharmony_ci get_qminmax(&qmin, &qmax, s, pict_type); 888cabdff1aSopenharmony_ci 889cabdff1aSopenharmony_ci fps = get_fps(s->avctx); 890cabdff1aSopenharmony_ci /* update predictors */ 891cabdff1aSopenharmony_ci if (picture_number > 2 && !dry_run) { 892cabdff1aSopenharmony_ci const int64_t last_var = 893cabdff1aSopenharmony_ci s->last_pict_type == AV_PICTURE_TYPE_I ? rcc->last_mb_var_sum 894cabdff1aSopenharmony_ci : rcc->last_mc_mb_var_sum; 895cabdff1aSopenharmony_ci av_assert1(s->frame_bits >= s->stuffing_bits); 896cabdff1aSopenharmony_ci update_predictor(&rcc->pred[s->last_pict_type], 897cabdff1aSopenharmony_ci rcc->last_qscale, 898cabdff1aSopenharmony_ci sqrt(last_var), 899cabdff1aSopenharmony_ci s->frame_bits - s->stuffing_bits); 900cabdff1aSopenharmony_ci } 901cabdff1aSopenharmony_ci 902cabdff1aSopenharmony_ci if (s->avctx->flags & AV_CODEC_FLAG_PASS2) { 903cabdff1aSopenharmony_ci av_assert0(picture_number >= 0); 904cabdff1aSopenharmony_ci if (picture_number >= rcc->num_entries) { 905cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "Input is longer than 2-pass log file\n"); 906cabdff1aSopenharmony_ci return -1; 907cabdff1aSopenharmony_ci } 908cabdff1aSopenharmony_ci rce = &rcc->entry[picture_number]; 909cabdff1aSopenharmony_ci wanted_bits = rce->expected_bits; 910cabdff1aSopenharmony_ci } else { 911cabdff1aSopenharmony_ci Picture *dts_pic; 912cabdff1aSopenharmony_ci rce = &local_rce; 913cabdff1aSopenharmony_ci 914cabdff1aSopenharmony_ci /* FIXME add a dts field to AVFrame and ensure it is set and use it 915cabdff1aSopenharmony_ci * here instead of reordering but the reordering is simpler for now 916cabdff1aSopenharmony_ci * until H.264 B-pyramid must be handled. */ 917cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) 918cabdff1aSopenharmony_ci dts_pic = s->current_picture_ptr; 919cabdff1aSopenharmony_ci else 920cabdff1aSopenharmony_ci dts_pic = s->last_picture_ptr; 921cabdff1aSopenharmony_ci 922cabdff1aSopenharmony_ci if (!dts_pic || dts_pic->f->pts == AV_NOPTS_VALUE) 923cabdff1aSopenharmony_ci wanted_bits = (uint64_t)(s->bit_rate * (double)picture_number / fps); 924cabdff1aSopenharmony_ci else 925cabdff1aSopenharmony_ci wanted_bits = (uint64_t)(s->bit_rate * (double)dts_pic->f->pts / fps); 926cabdff1aSopenharmony_ci } 927cabdff1aSopenharmony_ci 928cabdff1aSopenharmony_ci diff = s->total_bits - wanted_bits; 929cabdff1aSopenharmony_ci br_compensation = (a->bit_rate_tolerance - diff) / a->bit_rate_tolerance; 930cabdff1aSopenharmony_ci if (br_compensation <= 0.0) 931cabdff1aSopenharmony_ci br_compensation = 0.001; 932cabdff1aSopenharmony_ci 933cabdff1aSopenharmony_ci var = pict_type == AV_PICTURE_TYPE_I ? pic->mb_var_sum : pic->mc_mb_var_sum; 934cabdff1aSopenharmony_ci 935cabdff1aSopenharmony_ci short_term_q = 0; /* avoid warning */ 936cabdff1aSopenharmony_ci if (s->avctx->flags & AV_CODEC_FLAG_PASS2) { 937cabdff1aSopenharmony_ci if (pict_type != AV_PICTURE_TYPE_I) 938cabdff1aSopenharmony_ci av_assert0(pict_type == rce->new_pict_type); 939cabdff1aSopenharmony_ci 940cabdff1aSopenharmony_ci q = rce->new_qscale / br_compensation; 941cabdff1aSopenharmony_ci ff_dlog(s, "%f %f %f last:%d var:%"PRId64" type:%d//\n", q, rce->new_qscale, 942cabdff1aSopenharmony_ci br_compensation, s->frame_bits, var, pict_type); 943cabdff1aSopenharmony_ci } else { 944cabdff1aSopenharmony_ci rce->pict_type = 945cabdff1aSopenharmony_ci rce->new_pict_type = pict_type; 946cabdff1aSopenharmony_ci rce->mc_mb_var_sum = pic->mc_mb_var_sum; 947cabdff1aSopenharmony_ci rce->mb_var_sum = pic->mb_var_sum; 948cabdff1aSopenharmony_ci rce->qscale = FF_QP2LAMBDA * 2; 949cabdff1aSopenharmony_ci rce->f_code = s->f_code; 950cabdff1aSopenharmony_ci rce->b_code = s->b_code; 951cabdff1aSopenharmony_ci rce->misc_bits = 1; 952cabdff1aSopenharmony_ci 953cabdff1aSopenharmony_ci bits = predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var)); 954cabdff1aSopenharmony_ci if (pict_type == AV_PICTURE_TYPE_I) { 955cabdff1aSopenharmony_ci rce->i_count = s->mb_num; 956cabdff1aSopenharmony_ci rce->i_tex_bits = bits; 957cabdff1aSopenharmony_ci rce->p_tex_bits = 0; 958cabdff1aSopenharmony_ci rce->mv_bits = 0; 959cabdff1aSopenharmony_ci } else { 960cabdff1aSopenharmony_ci rce->i_count = 0; // FIXME we do know this approx 961cabdff1aSopenharmony_ci rce->i_tex_bits = 0; 962cabdff1aSopenharmony_ci rce->p_tex_bits = bits * 0.9; 963cabdff1aSopenharmony_ci rce->mv_bits = bits * 0.1; 964cabdff1aSopenharmony_ci } 965cabdff1aSopenharmony_ci rcc->i_cplx_sum[pict_type] += rce->i_tex_bits * rce->qscale; 966cabdff1aSopenharmony_ci rcc->p_cplx_sum[pict_type] += rce->p_tex_bits * rce->qscale; 967cabdff1aSopenharmony_ci rcc->mv_bits_sum[pict_type] += rce->mv_bits; 968cabdff1aSopenharmony_ci rcc->frame_count[pict_type]++; 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_ci rate_factor = rcc->pass1_wanted_bits / 971cabdff1aSopenharmony_ci rcc->pass1_rc_eq_output_sum * br_compensation; 972cabdff1aSopenharmony_ci 973cabdff1aSopenharmony_ci q = get_qscale(s, rce, rate_factor, picture_number); 974cabdff1aSopenharmony_ci if (q < 0) 975cabdff1aSopenharmony_ci return -1; 976cabdff1aSopenharmony_ci 977cabdff1aSopenharmony_ci av_assert0(q > 0.0); 978cabdff1aSopenharmony_ci q = get_diff_limited_q(s, rce, q); 979cabdff1aSopenharmony_ci av_assert0(q > 0.0); 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_ci // FIXME type dependent blur like in 2-pass 982cabdff1aSopenharmony_ci if (pict_type == AV_PICTURE_TYPE_P || s->intra_only) { 983cabdff1aSopenharmony_ci rcc->short_term_qsum *= a->qblur; 984cabdff1aSopenharmony_ci rcc->short_term_qcount *= a->qblur; 985cabdff1aSopenharmony_ci 986cabdff1aSopenharmony_ci rcc->short_term_qsum += q; 987cabdff1aSopenharmony_ci rcc->short_term_qcount++; 988cabdff1aSopenharmony_ci q = short_term_q = rcc->short_term_qsum / rcc->short_term_qcount; 989cabdff1aSopenharmony_ci } 990cabdff1aSopenharmony_ci av_assert0(q > 0.0); 991cabdff1aSopenharmony_ci 992cabdff1aSopenharmony_ci q = modify_qscale(s, rce, q, picture_number); 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_ci rcc->pass1_wanted_bits += s->bit_rate / fps; 995cabdff1aSopenharmony_ci 996cabdff1aSopenharmony_ci av_assert0(q > 0.0); 997cabdff1aSopenharmony_ci } 998cabdff1aSopenharmony_ci 999cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_RC) { 1000cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 1001cabdff1aSopenharmony_ci "%c qp:%d<%2.1f<%d %d want:%"PRId64" total:%"PRId64" comp:%f st_q:%2.2f " 1002cabdff1aSopenharmony_ci "size:%d var:%"PRId64"/%"PRId64" br:%"PRId64" fps:%d\n", 1003cabdff1aSopenharmony_ci av_get_picture_type_char(pict_type), 1004cabdff1aSopenharmony_ci qmin, q, qmax, picture_number, 1005cabdff1aSopenharmony_ci wanted_bits / 1000, s->total_bits / 1000, 1006cabdff1aSopenharmony_ci br_compensation, short_term_q, s->frame_bits, 1007cabdff1aSopenharmony_ci pic->mb_var_sum, pic->mc_mb_var_sum, 1008cabdff1aSopenharmony_ci s->bit_rate / 1000, (int)fps); 1009cabdff1aSopenharmony_ci } 1010cabdff1aSopenharmony_ci 1011cabdff1aSopenharmony_ci if (q < qmin) 1012cabdff1aSopenharmony_ci q = qmin; 1013cabdff1aSopenharmony_ci else if (q > qmax) 1014cabdff1aSopenharmony_ci q = qmax; 1015cabdff1aSopenharmony_ci 1016cabdff1aSopenharmony_ci if (s->adaptive_quant) 1017cabdff1aSopenharmony_ci adaptive_quantization(s, q); 1018cabdff1aSopenharmony_ci else 1019cabdff1aSopenharmony_ci q = (int)(q + 0.5); 1020cabdff1aSopenharmony_ci 1021cabdff1aSopenharmony_ci if (!dry_run) { 1022cabdff1aSopenharmony_ci rcc->last_qscale = q; 1023cabdff1aSopenharmony_ci rcc->last_mc_mb_var_sum = pic->mc_mb_var_sum; 1024cabdff1aSopenharmony_ci rcc->last_mb_var_sum = pic->mb_var_sum; 1025cabdff1aSopenharmony_ci } 1026cabdff1aSopenharmony_ci return q; 1027cabdff1aSopenharmony_ci} 1028