comparison ratecontrol.c @ 612:c0005de2be59 libavcodec

new ratecontrol code
author michaelni
date Sun, 25 Aug 2002 21:19:50 +0000
parents ba3e863aa316
children 459a715f0661
comparison
equal deleted inserted replaced
611:3214d3f4519e 612:c0005de2be59
15 * 15 *
16 * You should have received a copy of the GNU Lesser General Public 16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software 17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */ 19 */
20 #include <math.h>
21 #include "common.h"
20 #include "avcodec.h" 22 #include "avcodec.h"
21 #include "dsputil.h" 23 #include "dsputil.h"
22 #include "mpegvideo.h" 24 #include "mpegvideo.h"
23 25
24 #define STATS_FILE "lavc_stats.txt" 26 #undef NDEBUG // allways check asserts, the speed effect is far too small to disable them
27 #include <assert.h>
25 28
26 static int init_pass2(MpegEncContext *s); 29 static int init_pass2(MpegEncContext *s);
30 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
27 31
28 void ff_write_pass1_stats(MpegEncContext *s){ 32 void ff_write_pass1_stats(MpegEncContext *s){
29 RateControlContext *rcc= &s->rc_context; 33 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",
30 // fprintf(c->stats_file, "type:%d q:%d icount:%d pcount:%d scount:%d itex:%d ptex%d mv:%d misc:%d fcode:%d bcode:%d\")
31 fprintf(rcc->stats_file, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d\n",
32 s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type, 34 s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type,
33 s->qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, s->f_code, s->b_code); 35 s->qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits,
36 s->f_code, s->b_code, s->mc_mb_var_sum, s->mb_var_sum, s->i_count);
34 } 37 }
35 38
36 int ff_rate_control_init(MpegEncContext *s) 39 int ff_rate_control_init(MpegEncContext *s)
37 { 40 {
38 RateControlContext *rcc= &s->rc_context; 41 RateControlContext *rcc= &s->rc_context;
42 int i;
39 emms_c(); 43 emms_c();
40 44
41 if(s->flags&CODEC_FLAG_PASS1){ 45 for(i=0; i<5; i++){
42 rcc->stats_file= fopen(STATS_FILE, "w"); 46 rcc->pred[i].coeff= 7.0;
43 if(!rcc->stats_file){ 47 rcc->pred[i].count= 1.0;
44 fprintf(stderr, "failed to open " STATS_FILE "\n"); 48
45 return -1; 49 rcc->pred[i].decay= 0.4;
46 } 50 rcc->i_cplx_sum [i]=
47 } else if(s->flags&CODEC_FLAG_PASS2){ 51 rcc->p_cplx_sum [i]=
48 int size; 52 rcc->mv_bits_sum[i]=
53 rcc->qscale_sum [i]=
54 rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such
55 rcc->last_qscale_for[i]=5;
56 }
57 rcc->buffer_index= s->avctx->rc_buffer_size/2;
58
59 rcc->next_non_b_qscale=10;
60 rcc->next_p_qscale=10;
61
62 if(s->flags&CODEC_FLAG_PASS2){
49 int i; 63 int i;
50 64 char *p;
51 rcc->stats_file= fopen(STATS_FILE, "r"); 65
52 if(!rcc->stats_file){ 66 /* find number of pics */
53 fprintf(stderr, "failed to open " STATS_FILE "\n"); 67 p= s->avctx->stats_in;
54 return -1; 68 for(i=-1; p; i++){
55 } 69 p= strchr(p+1, ';');
56 70 }
57 /* find number of pics without reading the file twice :) */ 71 i+= s->max_b_frames;
58 fseek(rcc->stats_file, 0, SEEK_END); 72 rcc->entry = (RateControlEntry*)av_mallocz(i*sizeof(RateControlEntry));
59 size= ftell(rcc->stats_file); 73 rcc->num_entries= i;
60 fseek(rcc->stats_file, 0, SEEK_SET); 74
61 75 /* init all to skiped p frames (with b frames we might have a not encoded frame at the end FIXME) */
62 size/= 64; // we need at least 64 byte to store a line ... 76 for(i=0; i<rcc->num_entries; i++){
63 rcc->entry = (RateControlEntry*)av_mallocz(size*sizeof(RateControlEntry)); 77 RateControlEntry *rce= &rcc->entry[i];
64 78 rce->pict_type= rce->new_pict_type=P_TYPE;
65 for(i=0; !feof(rcc->stats_file); i++){ 79 rce->qscale= rce->new_qscale=2;
80 rce->misc_bits= s->mb_num + 10;
81 rce->mb_var_sum= s->mb_num*100;
82 }
83
84 /* read stats */
85 p= s->avctx->stats_in;
86 for(i=0; i<rcc->num_entries - s->max_b_frames; i++){
66 RateControlEntry *rce; 87 RateControlEntry *rce;
67 int picture_number; 88 int picture_number;
68 int e; 89 int e;
69 90 char *next;
70 e= fscanf(rcc->stats_file, "in:%d ", &picture_number); 91
92 next= strchr(p, ';');
93 if(next){
94 (*next)=0; //sscanf in unbelieavle slow on looong strings //FIXME copy / dont write
95 next++;
96 }
97 e= sscanf(p, " in:%d ", &picture_number);
98
99 assert(picture_number >= 0);
100 assert(picture_number < rcc->num_entries);
71 rce= &rcc->entry[picture_number]; 101 rce= &rcc->entry[picture_number];
72 e+=fscanf(rcc->stats_file, "out:%*d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%*d bcode:%*d\n", 102
73 &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits); 103 e+=sscanf(p, " 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",
74 if(e!=7){ 104 &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits,
75 fprintf(stderr, STATS_FILE " is damaged\n"); 105 &rce->f_code, &rce->b_code, &rce->mc_mb_var_sum, &rce->mb_var_sum, &rce->i_count);
106 if(e!=12){
107 fprintf(stderr, "statistics are damaged at line %d, parser out=%d\n", i, e);
76 return -1; 108 return -1;
77 } 109 }
78 } 110 p= next;
79 rcc->num_entries= i; 111 }
80 112
81 if(init_pass2(s) < 0) return -1; 113 if(init_pass2(s) < 0) return -1;
82 } 114 }
83 115
84 /* no 2pass stuff, just normal 1-pass */ 116 if(!(s->flags&CODEC_FLAG_PASS2)){
85 //initial values, they dont really matter as they will be totally different within a few frames 117
86 s->i_pred.coeff= s->p_pred.coeff= 7.0; 118 rcc->short_term_qsum=0.001;
87 s->i_pred.count= s->p_pred.count= 1.0; 119 rcc->short_term_qcount=0.001;
88 120
89 s->i_pred.decay= s->p_pred.decay= 0.4; 121 rcc->pass1_bits =0.001;
90 122 rcc->pass1_wanted_bits=0.001;
91 // use more bits at the beginning, otherwise high motion at the begin will look like shit 123
92 s->qsum=100 * s->qmin; 124 /* init stuff with the user specified complexity */
93 s->qcount=100; 125 if(s->avctx->rc_initial_cplx){
94 126 for(i=0; i<60*30; i++){
95 s->short_term_qsum=0.001; 127 double bits= s->avctx->rc_initial_cplx * (i/10000.0 + 1.0)*s->mb_num;
96 s->short_term_qcount=0.001; 128 RateControlEntry rce;
97 129 double q;
130
131 if (i%((s->gop_size+3)/4)==0) rce.pict_type= I_TYPE;
132 else if(i%(s->max_b_frames+1)) rce.pict_type= B_TYPE;
133 else rce.pict_type= P_TYPE;
134
135 rce.new_pict_type= rce.pict_type;
136 rce.mc_mb_var_sum= bits*s->mb_num/100000;
137 rce.mb_var_sum = s->mb_num;
138 rce.qscale = 2;
139 rce.f_code = 2;
140 rce.b_code = 1;
141 rce.misc_bits= 1;
142
143 if(s->pict_type== I_TYPE){
144 rce.i_count = s->mb_num;
145 rce.i_tex_bits= bits;
146 rce.p_tex_bits= 0;
147 rce.mv_bits= 0;
148 }else{
149 rce.i_count = 0; //FIXME we do know this approx
150 rce.i_tex_bits= 0;
151 rce.p_tex_bits= bits*0.9;
152 rce.mv_bits= bits*0.1;
153 }
154 rcc->i_cplx_sum [rce.pict_type] += rce.i_tex_bits*rce.qscale;
155 rcc->p_cplx_sum [rce.pict_type] += rce.p_tex_bits*rce.qscale;
156 rcc->mv_bits_sum[rce.pict_type] += rce.mv_bits;
157 rcc->frame_count[rce.pict_type] ++;
158
159 bits= rce.i_tex_bits + rce.p_tex_bits;
160
161 q= get_qscale(s, &rce, rcc->pass1_wanted_bits/rcc->pass1_bits, i);
162 rcc->pass1_wanted_bits+= s->bit_rate/(s->frame_rate / (double)FRAME_RATE_BASE);
163 }
164 }
165
166 }
167
98 return 0; 168 return 0;
99 } 169 }
100 170
101 void ff_rate_control_uninit(MpegEncContext *s) 171 void ff_rate_control_uninit(MpegEncContext *s)
102 { 172 {
103 RateControlContext *rcc= &s->rc_context; 173 RateControlContext *rcc= &s->rc_context;
104 emms_c(); 174 emms_c();
105 175
106 if(rcc->stats_file)
107 fclose(rcc->stats_file);
108 rcc->stats_file = NULL;
109 av_freep(&rcc->entry); 176 av_freep(&rcc->entry);
177 }
178
179 static inline double qp2bits(RateControlEntry *rce, double qp){
180 if(qp<=0.0){
181 fprintf(stderr, "qp<=0.0\n");
182 }
183 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ qp;
184 }
185
186 static inline double bits2qp(RateControlEntry *rce, double bits){
187 if(bits<0.9){
188 fprintf(stderr, "bits<0.9\n");
189 }
190 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
191 }
192
193 static void update_rc_buffer(MpegEncContext *s, int frame_size){
194 RateControlContext *rcc= &s->rc_context;
195 const double fps= (double)s->frame_rate / FRAME_RATE_BASE;
196 const double buffer_size= s->avctx->rc_buffer_size;
197 const double min_rate= s->avctx->rc_min_rate/fps;
198 const double max_rate= s->avctx->rc_max_rate/fps;
199
200 if(buffer_size){
201 rcc->buffer_index-= frame_size;
202 if(rcc->buffer_index < buffer_size/2 /*FIXME /2 */ || min_rate==0){
203 rcc->buffer_index+= max_rate;
204 if(rcc->buffer_index >= buffer_size)
205 rcc->buffer_index= buffer_size-1;
206 }else{
207 rcc->buffer_index+= min_rate;
208 }
209
210 if(rcc->buffer_index < 0)
211 fprintf(stderr, "rc buffer underflow\n");
212 if(rcc->buffer_index >= s->avctx->rc_buffer_size)
213 fprintf(stderr, "rc buffer overflow\n");
214 }
215 }
216
217 /**
218 * modifies the bitrate curve from pass1 for one frame
219 */
220 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num){
221 RateControlContext *rcc= &s->rc_context;
222 double q, bits;
223 const int pict_type= rce->new_pict_type;
224 const double mb_num= s->mb_num;
225 int i;
226 const double last_q= rcc->last_qscale_for[pict_type];
227
228 double const_values[]={
229 M_PI,
230 M_E,
231 rce->i_tex_bits*rce->qscale,
232 rce->p_tex_bits*rce->qscale,
233 (rce->i_tex_bits + rce->p_tex_bits)*(double)rce->qscale,
234 rce->mv_bits/mb_num,
235 rce->pict_type == B_TYPE ? (rce->f_code + rce->b_code)*0.5 : rce->f_code,
236 rce->i_count/mb_num,
237 rce->mc_mb_var_sum/mb_num,
238 rce->mb_var_sum/mb_num,
239 rce->pict_type == I_TYPE,
240 rce->pict_type == P_TYPE,
241 rce->pict_type == B_TYPE,
242 rcc->qscale_sum[pict_type] / (double)rcc->frame_count[pict_type],
243 s->qcompress,
244 /* rcc->last_qscale_for[I_TYPE],
245 rcc->last_qscale_for[P_TYPE],
246 rcc->last_qscale_for[B_TYPE],
247 rcc->next_non_b_qscale,*/
248 rcc->i_cplx_sum[I_TYPE] / (double)rcc->frame_count[I_TYPE],
249 rcc->i_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
250 rcc->p_cplx_sum[P_TYPE] / (double)rcc->frame_count[P_TYPE],
251 rcc->p_cplx_sum[B_TYPE] / (double)rcc->frame_count[B_TYPE],
252 (rcc->i_cplx_sum[pict_type] + rcc->p_cplx_sum[pict_type]) / (double)rcc->frame_count[pict_type],
253 0
254 };
255 char *const_names[]={
256 "PI",
257 "E",
258 "iTex",
259 "pTex",
260 "tex",
261 "mv",
262 "fCode",
263 "iCount",
264 "mcVar",
265 "var",
266 "isI",
267 "isP",
268 "isB",
269 "avgQP",
270 "qComp",
271 /* "lastIQP",
272 "lastPQP",
273 "lastBQP",
274 "nextNonBQP",*/
275 "avgIITex",
276 "avgPITex",
277 "avgPPTex",
278 "avgBPTex",
279 "avgTex",
280 NULL
281 };
282 double (*func1[])(void *, double)={
283 bits2qp,
284 qp2bits,
285 NULL
286 };
287 char *func1_names[]={
288 "bits2qp",
289 "qp2bits",
290 NULL
291 };
292
293 bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
294
295 rcc->pass1_bits+= bits;
296 bits*=rate_factor;
297 if(bits<0.0) bits=0.0;
298 bits+= 1.0; //avoid 1/0 issues
299
300 /* user override */
301 for(i=0; i<s->avctx->rc_override_count; i++){
302 RcOverride *rco= s->avctx->rc_override;
303 if(rco[i].start_frame > frame_num) continue;
304 if(rco[i].end_frame < frame_num) continue;
305
306 if(rco[i].qscale)
307 bits= qp2bits(rce, rco[i].qscale); //FIXME move at end to really force it?
308 else
309 bits*= rco[i].quality_factor;
310 }
311
312 q= bits2qp(rce, bits);
313
314 /* I/B difference */
315 if (pict_type==I_TYPE && s->avctx->i_quant_factor<0.0)
316 q= -q*s->avctx->i_quant_factor + s->avctx->i_quant_offset;
317 else if(pict_type==B_TYPE && s->avctx->b_quant_factor<0.0)
318 q= -q*s->avctx->b_quant_factor + s->avctx->b_quant_offset;
319
320 /* last qscale / qdiff stuff */
321 if (q > last_q + s->max_qdiff) q= last_q + s->max_qdiff;
322 else if(q < last_q - s->max_qdiff) q= last_q - s->max_qdiff;
323
324 rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring
325
326 return q;
327 }
328
329 /**
330 * gets the qmin & qmax for pict_type
331 */
332 static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
333 int qmin= s->qmin;
334 int qmax= s->qmax;
335
336 if(pict_type==B_TYPE){
337 qmin= (int)(qmin*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
338 qmax= (int)(qmax*ABS(s->avctx->b_quant_factor)+s->avctx->b_quant_offset + 0.5);
339 }else if(pict_type==I_TYPE){
340 qmin= (int)(qmin*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
341 qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
342 }
343
344 if(qmin<1) qmin=1;
345 if(qmin==1 && s->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1
346
347 if(qmin<3 && s->max_qcoeff<=128 && pict_type==I_TYPE) qmin=3; //reduce cliping problems
348
349 if(qmax>31) qmax=31;
350 if(qmax<=qmin) qmax= qmin= (qmax+qmin+1)>>1;
351
352 *qmin_ret= qmin;
353 *qmax_ret= qmax;
354 }
355
356 static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
357 RateControlContext *rcc= &s->rc_context;
358 int qmin, qmax;
359 double bits;
360 const int pict_type= rce->new_pict_type;
361 const double buffer_size= s->avctx->rc_buffer_size;
362 const double min_rate= s->avctx->rc_min_rate;
363 const double max_rate= s->avctx->rc_max_rate;
364
365 get_qminmax(&qmin, &qmax, s, pict_type);
366
367 /* modulation */
368 if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE)
369 q*= s->avctx->rc_qmod_amp;
370
371 bits= qp2bits(rce, q);
372
373 /* buffer overflow/underflow protection */
374 if(buffer_size){
375 double expected_size= rcc->buffer_index - bits;
376
377 if(min_rate){
378 double d= 2*(buffer_size - (expected_size + min_rate))/buffer_size;
379 if(d>1.0) d=1.0;
380 q/= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
381 }
382
383 if(max_rate){
384 double d= 2*expected_size/buffer_size;
385 if(d>1.0) d=1.0;
386 q*= pow(d, 1.0/s->avctx->rc_buffer_aggressivity);
387 }
388 }
389
390 if(s->avctx->rc_qsquish==0.0){
391 if (q<qmin) q=qmin;
392 else if(q>qmax) q=qmax;
393 }else{
394 double min2= log(qmin);
395 double max2= log(qmax);
396
397 q= log(q);
398 q= (q - min2)/(max2-min2) - 0.5;
399 q*= -4.0;
400 q= 1.0/(1.0 + exp(q));
401 q= q*(max2-min2) + min2;
402
403 q= exp(q);
404 }
405
406 return q;
110 } 407 }
111 408
112 //---------------------------------- 409 //----------------------------------
113 // 1 Pass Code 410 // 1 Pass Code
114 411
115 static double predict(Predictor *p, double q, double var) 412 static double predict_size(Predictor *p, double q, double var)
116 { 413 {
117 return p->coeff*var / (q*p->count); 414 return p->coeff*var / (q*p->count);
415 }
416
417 static double predict_qp(Predictor *p, double size, double var)
418 {
419 //printf("coeff:%f, count:%f, var:%f, size:%f//\n", p->coeff, p->count, var, size);
420 return p->coeff*var / (size*p->count);
118 } 421 }
119 422
120 static void update_predictor(Predictor *p, double q, double var, double size) 423 static void update_predictor(Predictor *p, double q, double var, double size)
121 { 424 {
122 double new_coeff= size*q / (var + 1); 425 double new_coeff= size*q / (var + 1);
123 if(var<1000) return; 426 if(var<10) return;
124 427
125 p->count*= p->decay; 428 p->count*= p->decay;
126 p->coeff*= p->decay; 429 p->coeff*= p->decay;
127 p->count++; 430 p->count++;
128 p->coeff+= new_coeff; 431 p->coeff+= new_coeff;
129 } 432 }
130 433
131 int ff_rate_estimate_qscale(MpegEncContext *s) 434 int ff_rate_estimate_qscale(MpegEncContext *s)
132 { 435 {
133 int qmin= s->qmin;
134 int qmax= s->qmax;
135 int rate_q=5;
136 float q; 436 float q;
137 int qscale; 437 int qscale, qmin, qmax;
138 float br_compensation; 438 float br_compensation;
139 double diff; 439 double diff;
140 double short_term_q; 440 double short_term_q;
141 double long_term_q;
142 double fps; 441 double fps;
143 int picture_number= s->input_picture_number - s->max_b_frames; 442 int picture_number= s->picture_number;
144 int64_t wanted_bits; 443 int64_t wanted_bits;
444 RateControlContext *rcc= &s->rc_context;
445 RateControlEntry local_rce, *rce;
446 double bits;
447 double rate_factor;
448 int var;
449 const int pict_type= s->pict_type;
145 emms_c(); 450 emms_c();
146 451
452 get_qminmax(&qmin, &qmax, s, pict_type);
453
147 fps= (double)s->frame_rate / FRAME_RATE_BASE; 454 fps= (double)s->frame_rate / FRAME_RATE_BASE;
148 wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps); 455 //printf("input_picture_number:%d picture_number:%d\n", s->input_picture_number, s->picture_number);
149 // printf("%d %d %d\n", picture_number, (int)wanted_bits, (int)s->total_bits);
150
151 if(s->pict_type==B_TYPE){
152 qmin= (int)(qmin*s->b_quant_factor+s->b_quant_offset + 0.5);
153 qmax= (int)(qmax*s->b_quant_factor+s->b_quant_offset + 0.5);
154 }
155 if(qmin<1) qmin=1;
156 if(qmax>31) qmax=31;
157 if(qmax<=qmin) qmax= qmin;
158
159 /* update predictors */ 456 /* update predictors */
160 if(picture_number>2){ 457 if(picture_number>2){
161 if(s->pict_type!=B_TYPE && s->last_non_b_pict_type == P_TYPE){ 458 const int last_var= s->last_pict_type == I_TYPE ? rcc->last_mb_var_sum : rcc->last_mc_mb_var_sum;
162 //printf("%d %d %d %f\n", s->qscale, s->last_mc_mb_var, s->frame_bits, s->p_pred.coeff); 459 update_predictor(&rcc->pred[s->last_pict_type], rcc->last_qscale, sqrt(last_var), s->frame_bits);
163 update_predictor(&s->p_pred, s->last_non_b_qscale, s->last_non_b_mc_mb_var, s->pb_frame_bits); 460 }
164 } 461
165 } 462 if(s->flags&CODEC_FLAG_PASS2){
166 463 assert(picture_number>=0);
167 if(s->pict_type == I_TYPE){ 464 assert(picture_number<rcc->num_entries);
168 short_term_q= s->short_term_qsum/s->short_term_qcount; 465 rce= &rcc->entry[picture_number];
169 466 wanted_bits= rce->expected_bits;
170 long_term_q= s->qsum/s->qcount*(s->total_bits+1)/(wanted_bits+1); //+1 to avoid nan & 0 467 }else{
171 468 rce= &local_rce;
172 q= 1/((1/long_term_q - 1/short_term_q)*s->qcompress + 1/short_term_q); 469 wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps);
173 }else if(s->pict_type==B_TYPE){
174 q= (int)(s->last_non_b_qscale*s->b_quant_factor+s->b_quant_offset + 0.5);
175 }else{ //P Frame
176 int i;
177 int diff, best_diff=1000000000;
178 for(i=1; i<=31; i++){
179 diff= predict(&s->p_pred, i, s->mc_mb_var_sum) - (double)s->bit_rate/fps;
180 if(diff<0) diff= -diff;
181 if(diff<best_diff){
182 best_diff= diff;
183 rate_q= i;
184 }
185 }
186 s->short_term_qsum*=s->qblur;
187 s->short_term_qcount*=s->qblur;
188
189 s->short_term_qsum+= rate_q;
190 s->short_term_qcount++;
191 short_term_q= s->short_term_qsum/s->short_term_qcount;
192
193 long_term_q= s->qsum/s->qcount*(s->total_bits+1)/(wanted_bits+1); //+1 to avoid nan & 0
194
195 // q= (long_term_q - short_term_q)*s->qcompress + short_term_q;
196 q= 1/((1/long_term_q - 1/short_term_q)*s->qcompress + 1/short_term_q);
197 } 470 }
198 471
199 diff= s->total_bits - wanted_bits; 472 diff= s->total_bits - wanted_bits;
200 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance; 473 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
201 if(br_compensation<=0.0) br_compensation=0.001; 474 if(br_compensation<=0.0) br_compensation=0.001;
202 q/=br_compensation; 475
476 var= pict_type == I_TYPE ? s->mb_var_sum : s->mc_mb_var_sum;
477
478 if(s->flags&CODEC_FLAG_PASS2){
479 if(pict_type!=I_TYPE)
480 assert(pict_type == rce->new_pict_type);
481
482 q= rce->new_qscale / br_compensation;
483 //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type);
484 }else{
485 rce->pict_type=
486 rce->new_pict_type= pict_type;
487 rce->mc_mb_var_sum= s->mc_mb_var_sum;
488 rce->mb_var_sum = s-> mb_var_sum;
489 rce->qscale = 2;
490 rce->f_code = s->f_code;
491 rce->b_code = s->b_code;
492 rce->misc_bits= 1;
493
494 if(picture_number>0)
495 update_rc_buffer(s, s->frame_bits);
496
497 bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var));
498 if(pict_type== I_TYPE){
499 rce->i_count = s->mb_num;
500 rce->i_tex_bits= bits;
501 rce->p_tex_bits= 0;
502 rce->mv_bits= 0;
503 }else{
504 rce->i_count = 0; //FIXME we do know this approx
505 rce->i_tex_bits= 0;
506 rce->p_tex_bits= bits*0.9;
507
508 rce->mv_bits= bits*0.1;
509 }
510 rcc->i_cplx_sum [pict_type] += rce->i_tex_bits*rce->qscale;
511 rcc->p_cplx_sum [pict_type] += rce->p_tex_bits*rce->qscale;
512 rcc->mv_bits_sum[pict_type] += rce->mv_bits;
513 rcc->frame_count[pict_type] ++;
514
515 bits= rce->i_tex_bits + rce->p_tex_bits;
516 rate_factor= rcc->pass1_wanted_bits/rcc->pass1_bits * br_compensation;
517
518 q= get_qscale(s, rce, rate_factor, picture_number);
519
520 //printf("%f ", q);
521 if (pict_type==I_TYPE && s->avctx->i_quant_factor>0.0)
522 q= rcc->next_p_qscale*s->avctx->i_quant_factor + s->avctx->i_quant_offset;
523 else if(pict_type==B_TYPE && s->avctx->b_quant_factor>0.0)
524 q= rcc->next_non_b_qscale*s->avctx->b_quant_factor + s->avctx->b_quant_offset;
525
526 //printf("%f ", q);
527 assert(q>0.0);
528
529 if(pict_type==P_TYPE || s->intra_only){ //FIXME type dependant blur like in 2-pass
530 rcc->short_term_qsum*=s->qblur;
531 rcc->short_term_qcount*=s->qblur;
532
533 rcc->short_term_qsum+= q;
534 rcc->short_term_qcount++;
535 //printf("%f ", q);
536 q= short_term_q= rcc->short_term_qsum/rcc->short_term_qcount;
537 //printf("%f ", q);
538 }
539 q= modify_qscale(s, rce, q, picture_number);
540
541 rcc->pass1_wanted_bits+= s->bit_rate/fps;
542
543 if(pict_type != B_TYPE) rcc->next_non_b_qscale= q;
544 if(pict_type == P_TYPE) rcc->next_p_qscale= q;
545 }
546 //printf("qmin:%d, qmax:%d, q:%f\n", qmin, qmax, q);
547
548
549 if (q<qmin) q=qmin;
550 else if(q>qmax) q=qmax;
551
552 // printf("%f %d %d %d\n", q, picture_number, (int)wanted_bits, (int)s->total_bits);
553
554
203 //printf("%f %f %f\n", q, br_compensation, short_term_q); 555 //printf("%f %f %f\n", q, br_compensation, short_term_q);
204 qscale= (int)(q + 0.5); 556 qscale= (int)(q + 0.5);
205 if (qscale<qmin) qscale=qmin; 557 //printf("%d ", qscale);
206 else if(qscale>qmax) qscale=qmax; 558
207
208 if(s->pict_type!=B_TYPE){
209 s->qsum+= qscale;
210 s->qcount++;
211 if (qscale<s->last_non_b_qscale-s->max_qdiff) qscale=s->last_non_b_qscale-s->max_qdiff;
212 else if(qscale>s->last_non_b_qscale+s->max_qdiff) qscale=s->last_non_b_qscale+s->max_qdiff;
213 }
214 //printf("q:%d diff:%d comp:%f rate_q:%d st_q:%f fvar:%d last_size:%d\n", qscale, (int)diff, br_compensation, 559 //printf("q:%d diff:%d comp:%f rate_q:%d st_q:%f fvar:%d last_size:%d\n", qscale, (int)diff, br_compensation,
215 // rate_q, short_term_q, s->mc_mb_var, s->frame_bits); 560 // rate_q, short_term_q, s->mc_mb_var, s->frame_bits);
216 //printf("%d %d\n", s->bit_rate, (int)fps); 561 //printf("%d %d\n", s->bit_rate, (int)fps);
562
563 rcc->last_qscale= qscale;
564 rcc->last_mc_mb_var_sum= s->mc_mb_var_sum;
565 rcc->last_mb_var_sum= s->mb_var_sum;
217 return qscale; 566 return qscale;
218 } 567 }
219 568
220 //---------------------------------------------- 569 //----------------------------------------------
221 // 2-Pass code 570 // 2-Pass code
229 double avg_quantizer[5]; 578 double avg_quantizer[5];
230 uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits 579 uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits
231 uint64_t available_bits[5]; 580 uint64_t available_bits[5];
232 uint64_t all_const_bits; 581 uint64_t all_const_bits;
233 uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps); 582 uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps);
234 int num_frames[5]={0,0,0,0,0};
235 double rate_factor=0; 583 double rate_factor=0;
236 double step; 584 double step;
237 int last_i_frame=-10000000; 585 int last_i_frame=-10000000;
586 const int filter_size= (int)(s->qblur*4) | 1;
587 double expected_bits;
588 double *qscale, *blured_qscale;
238 589
239 /* find complexity & const_bits & decide the pict_types */ 590 /* find complexity & const_bits & decide the pict_types */
240 for(i=0; i<rcc->num_entries; i++){ 591 for(i=0; i<rcc->num_entries; i++){
241 RateControlEntry *rce= &rcc->entry[i]; 592 RateControlEntry *rce= &rcc->entry[i];
242 593
270 else 621 else
271 rce->new_pict_type= B_TYPE; 622 rce->new_pict_type= B_TYPE;
272 break; 623 break;
273 } 624 }
274 } 625 }
626 rcc->i_cplx_sum [rce->pict_type] += rce->i_tex_bits*rce->qscale;
627 rcc->p_cplx_sum [rce->pict_type] += rce->p_tex_bits*rce->qscale;
628 rcc->mv_bits_sum[rce->pict_type] += rce->mv_bits;
629 rcc->frame_count[rce->pict_type] ++;
275 630
276 complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale; 631 complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale;
277 const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits; 632 const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits;
278 num_frames[rce->new_pict_type]++;
279 } 633 }
280 all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE]; 634 all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE];
281 635
282 if(all_available_bits < all_const_bits){ 636 if(all_available_bits < all_const_bits){
283 fprintf(stderr, "requested bitrate is to low\n"); 637 fprintf(stderr, "requested bitrate is to low\n");
284 return -1; 638 return -1;
285 } 639 }
286 640
287 // avg_complexity= complexity/rcc->num_entries; 641 /* find average quantizers */
288 avg_quantizer[P_TYPE]= 642 avg_quantizer[P_TYPE]=0;
289 avg_quantizer[I_TYPE]= (complexity[I_TYPE]+complexity[P_TYPE] + complexity[B_TYPE]/s->b_quant_factor) 643 for(step=256*256; step>0.0000001; step*=0.5){
290 / (all_available_bits - all_const_bits); 644 double expected_bits=0;
291 avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*s->b_quant_factor + s->b_quant_offset; 645 avg_quantizer[P_TYPE]+= step;
292 //printf("avg quantizer: %f %f\n", avg_quantizer[P_TYPE], avg_quantizer[B_TYPE]); 646
647 avg_quantizer[I_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->i_quant_factor) + s->avctx->i_quant_offset;
648 avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
649
650 expected_bits=
651 + all_const_bits
652 + complexity[I_TYPE]/avg_quantizer[I_TYPE]
653 + complexity[P_TYPE]/avg_quantizer[P_TYPE]
654 + complexity[B_TYPE]/avg_quantizer[B_TYPE];
655
656 if(expected_bits < all_available_bits) avg_quantizer[P_TYPE]-= step;
657 //printf("%f %lld %f\n", expected_bits, all_available_bits, avg_quantizer[P_TYPE]);
658 }
659 printf("qp_i:%f, qp_p:%f, qp_b:%f\n", avg_quantizer[I_TYPE],avg_quantizer[P_TYPE],avg_quantizer[B_TYPE]);
293 660
294 for(i=0; i<5; i++){ 661 for(i=0; i<5; i++){
295 available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i]; 662 available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i];
296 } 663 }
297 //printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits); 664 //printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits);
298 665
666 qscale= malloc(sizeof(double)*rcc->num_entries);
667 blured_qscale= malloc(sizeof(double)*rcc->num_entries);
668
299 for(step=256*256; step>0.0000001; step*=0.5){ 669 for(step=256*256; step>0.0000001; step*=0.5){
300 uint64_t expected_bits=0; 670 expected_bits=0;
301 rate_factor+= step; 671 rate_factor+= step;
672
673 rcc->buffer_index= s->avctx->rc_buffer_size/2;
674
302 /* find qscale */ 675 /* find qscale */
303 for(i=0; i<rcc->num_entries; i++){ 676 for(i=0; i<rcc->num_entries; i++){
677 qscale[i]= get_qscale(s, &rcc->entry[i], rate_factor, i);
678 }
679 assert(filter_size%2==1);
680
681 /* fixed I/B QP relative to P mode */
682 rcc->next_non_b_qscale= 10;
683 rcc->next_p_qscale= 10;
684 for(i=rcc->num_entries-1; i>=0; i--){
304 RateControlEntry *rce= &rcc->entry[i]; 685 RateControlEntry *rce= &rcc->entry[i];
305 double short_term_q, q, bits_left;
306 const int pict_type= rce->new_pict_type; 686 const int pict_type= rce->new_pict_type;
307 int qmin= s->qmin; 687
308 int qmax= s->qmax; 688 if (pict_type==I_TYPE && s->avctx->i_quant_factor>0.0)
309 689 qscale[i]= rcc->next_p_qscale*s->avctx->i_quant_factor + s->avctx->i_quant_offset;
310 if(pict_type==B_TYPE){ 690 else if(pict_type==B_TYPE && s->avctx->b_quant_factor>0.0)
311 qmin= (int)(qmin*s->b_quant_factor+s->b_quant_offset + 0.5); 691 qscale[i]= rcc->next_non_b_qscale*s->avctx->b_quant_factor + s->avctx->b_quant_offset;
312 qmax= (int)(qmax*s->b_quant_factor+s->b_quant_offset + 0.5); 692
693 if(pict_type!=B_TYPE)
694 rcc->next_non_b_qscale= qscale[i];
695 if(pict_type==P_TYPE)
696 rcc->next_p_qscale= qscale[i];
697 }
698
699 /* smooth curve */
700 for(i=0; i<rcc->num_entries; i++){
701 RateControlEntry *rce= &rcc->entry[i];
702 const int pict_type= rce->new_pict_type;
703 int j;
704 double q=0.0, sum=0.0;
705
706 for(j=0; j<filter_size; j++){
707 int index= i+j-filter_size/2;
708 double d= index-i;
709 double coeff= s->qblur==0 ? 1.0 : exp(-d*d/(s->qblur * s->qblur));
710
711 if(index < 0 || index >= rcc->num_entries) continue;
712 if(pict_type != rcc->entry[index].new_pict_type) continue;
713 q+= qscale[index] * coeff;
714 sum+= coeff;
313 } 715 }
314 if(qmin<1) qmin=1; 716 blured_qscale[i]= q/sum;
315 if(qmax>31) qmax=31; 717 }
316 if(qmax<=qmin) qmax= qmin;
317
318 switch(s->rc_strategy){
319 case 0:
320 bits_left= available_bits[pict_type]/num_frames[pict_type]*rate_factor - rce->misc_bits - rce->mv_bits;
321 if(bits_left<1.0) bits_left=1.0;
322 short_term_q= rce->qscale*(rce->i_tex_bits + rce->p_tex_bits)/bits_left;
323 break;
324 case 1:
325 bits_left= (available_bits[pict_type] - const_bits[pict_type])/num_frames[pict_type]*rate_factor;
326 if(bits_left<1.0) bits_left=1.0;
327 short_term_q= rce->qscale*(rce->i_tex_bits + rce->p_tex_bits)/bits_left;
328 break;
329 case 2:
330 bits_left= available_bits[pict_type]/num_frames[pict_type]*rate_factor;
331 if(bits_left<1.0) bits_left=1.0;
332 short_term_q= rce->qscale*(rce->i_tex_bits + rce->p_tex_bits + rce->misc_bits + rce->mv_bits)/bits_left;
333 break;
334 default:
335 fprintf(stderr, "unknown strategy\n");
336 short_term_q=3; //gcc warning fix
337 }
338
339 if(short_term_q>31.0) short_term_q=31.0;
340 else if (short_term_q<1.0) short_term_q=1.0;
341
342 q= 1/((1/avg_quantizer[pict_type] - 1/short_term_q)*s->qcompress + 1/short_term_q);
343 if (q<qmin) q=qmin;
344 else if(q>qmax) q=qmax;
345 //printf("lq:%f, sq:%f t:%f q:%f\n", avg_quantizer[rce->pict_type], short_term_q, bits_left, q);
346 rce->new_qscale= q;
347 }
348
349 /* smooth curve */
350 718
351 /* find expected bits */ 719 /* find expected bits */
352 for(i=0; i<rcc->num_entries; i++){ 720 for(i=0; i<rcc->num_entries; i++){
353 RateControlEntry *rce= &rcc->entry[i]; 721 RateControlEntry *rce= &rcc->entry[i];
354 double factor= rce->qscale / rce->new_qscale; 722 double bits;
355 723 rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
724 bits= qp2bits(rce, rce->new_qscale);
725 //printf("%d %f\n", rce->new_bits, blured_qscale[i]);
726 update_rc_buffer(s, bits);
727
356 rce->expected_bits= expected_bits; 728 rce->expected_bits= expected_bits;
357 expected_bits += (int)(rce->misc_bits + rce->mv_bits + (rce->i_tex_bits + rce->p_tex_bits)*factor + 0.5); 729 expected_bits += bits;
358 } 730 }
359 731
360 // printf("%d %d %f\n", (int)expected_bits, (int)all_available_bits, rate_factor); 732 // printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
361 if(expected_bits > all_available_bits) rate_factor-= step; 733 if(expected_bits > all_available_bits) rate_factor-= step;
362 } 734 }
735 free(qscale);
736 free(blured_qscale);
737
738 if(abs(expected_bits/all_available_bits - 1.0) > 0.01 ){
739 fprintf(stderr, "Error: 2pass curve failed to converge\n");
740 return -1;
741 }
363 742
364 return 0; 743 return 0;
365 } 744 }
366
367 int ff_rate_estimate_qscale_pass2(MpegEncContext *s)
368 {
369 int qmin= s->qmin;
370 int qmax= s->qmax;
371 float q;
372 int qscale;
373 float br_compensation;
374 double diff;
375 int picture_number= s->picture_number;
376 RateControlEntry *rce= &s->rc_context.entry[picture_number];
377 int64_t wanted_bits= rce->expected_bits;
378 emms_c();
379
380 // printf("%d %d %d\n", picture_number, (int)wanted_bits, (int)s->total_bits);
381
382 if(s->pict_type==B_TYPE){
383 qmin= (int)(qmin*s->b_quant_factor+s->b_quant_offset + 0.5);
384 qmax= (int)(qmax*s->b_quant_factor+s->b_quant_offset + 0.5);
385 }
386 if(qmin<1) qmin=1;
387 if(qmax>31) qmax=31;
388 if(qmax<=qmin) qmax= qmin;
389
390 q= rce->new_qscale;
391
392 diff= s->total_bits - wanted_bits;
393 br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
394 if(br_compensation<=0.0) br_compensation=0.001;
395 q/=br_compensation;
396
397 qscale= (int)(q + 0.5);
398 if (qscale<qmin) qscale=qmin;
399 else if(qscale>qmax) qscale=qmax;
400 // printf("%d %d %d %d type:%d\n", qmin, qscale, qmax, picture_number, s->pict_type); fflush(stdout);
401 return qscale;
402 }