Line | Count | Source (jump to first uncovered line) |
1 | | /******************************************************************** |
2 | | * * |
3 | | * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. * |
4 | | * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * |
5 | | * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * |
6 | | * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * |
7 | | * * |
8 | | * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * |
9 | | * by the Xiph.Org Foundation https://www.xiph.org/ * |
10 | | * * |
11 | | ******************************************************************** |
12 | | |
13 | | function: |
14 | | |
15 | | ********************************************************************/ |
16 | | #include <stdlib.h> |
17 | | #include <string.h> |
18 | | #include "encint.h" |
19 | | |
20 | | /*A rough lookup table for tan(x), 0<=x<pi/2. |
21 | | The values are Q12 fixed-point and spaced at 5 degree intervals. |
22 | | These decisions are somewhat arbitrary, but sufficient for the 2nd order |
23 | | Bessel follower below. |
24 | | Values of x larger than 85 degrees are extrapolated from the last interval, |
25 | | which is way off, but "good enough".*/ |
26 | | static unsigned short OC_ROUGH_TAN_LOOKUP[18]={ |
27 | | 0, 358, 722, 1098, 1491, 1910, |
28 | | 2365, 2868, 3437, 4096, 4881, 5850, |
29 | | 7094, 8784,11254,15286,23230,46817 |
30 | | }; |
31 | | |
32 | | /*_alpha is Q24 in the range [0,0.5). |
33 | | The return values is 5.12.*/ |
34 | 36.4k | static int oc_warp_alpha(int _alpha){ |
35 | 36.4k | int i; |
36 | 36.4k | int d; |
37 | 36.4k | int t0; |
38 | 36.4k | int t1; |
39 | 36.4k | i=_alpha*36>>24; |
40 | 36.4k | if(i>=17)i=16; |
41 | 36.4k | t0=OC_ROUGH_TAN_LOOKUP[i]; |
42 | 36.4k | t1=OC_ROUGH_TAN_LOOKUP[i+1]; |
43 | 36.4k | d=_alpha*36-(i<<24); |
44 | 36.4k | return (int)(((ogg_int64_t)t0<<32)+(t1-t0<<8)*(ogg_int64_t)d>>32); |
45 | 36.4k | } |
46 | | |
47 | | /*Re-initialize the Bessel filter coefficients with the specified delay. |
48 | | This does not alter the x/y state, but changes the reaction time of the |
49 | | filter. |
50 | | Altering the time constant of a reactive filter without alterning internal |
51 | | state is something that has to be done carefully, but our design operates at |
52 | | high enough delays and with small enough time constant changes to make it |
53 | | safe.*/ |
54 | 12.1k | static void oc_iir_filter_reinit(oc_iir_filter *_f,int _delay){ |
55 | 12.1k | int alpha; |
56 | 12.1k | ogg_int64_t one48; |
57 | 12.1k | ogg_int64_t warp; |
58 | 12.1k | ogg_int64_t k1; |
59 | 12.1k | ogg_int64_t k2; |
60 | 12.1k | ogg_int64_t d; |
61 | 12.1k | ogg_int64_t a; |
62 | 12.1k | ogg_int64_t ik2; |
63 | 12.1k | ogg_int64_t b1; |
64 | 12.1k | ogg_int64_t b2; |
65 | | /*This borrows some code from an unreleased version of Postfish. |
66 | | See the recipe at http://unicorn.us.com/alex/2polefilters.html for details |
67 | | on deriving the filter coefficients.*/ |
68 | | /*alpha is Q24*/ |
69 | 12.1k | alpha=(1<<24)/_delay; |
70 | 12.1k | one48=(ogg_int64_t)1<<48; |
71 | | /*warp is 7.12*/ |
72 | 12.1k | warp=OC_MAXI(oc_warp_alpha(alpha),1); |
73 | | /*k1 is 9.12*/ |
74 | 12.1k | k1=3*warp; |
75 | | /*k2 is 16.24.*/ |
76 | 12.1k | k2=k1*warp; |
77 | | /*d is 16.15.*/ |
78 | 12.1k | d=((1<<12)+k1<<12)+k2+256>>9; |
79 | | /*a is 0.32, since d is larger than both 1.0 and k2.*/ |
80 | 12.1k | a=(k2<<23)/d; |
81 | | /*ik2 is 25.24.*/ |
82 | 12.1k | ik2=one48/k2; |
83 | | /*b1 is Q56; in practice, the integer ranges between -2 and 2.*/ |
84 | 12.1k | b1=2*a*(ik2-(1<<24)); |
85 | | /*b2 is Q56; in practice, the integer ranges between -2 and 2.*/ |
86 | 12.1k | b2=(one48<<8)-(4*a<<24)-b1; |
87 | | /*All of the filter parameters are Q24.*/ |
88 | 12.1k | _f->c[0]=(ogg_int32_t)(b1+((ogg_int64_t)1<<31)>>32); |
89 | 12.1k | _f->c[1]=(ogg_int32_t)(b2+((ogg_int64_t)1<<31)>>32); |
90 | 12.1k | _f->g=(ogg_int32_t)(a+128>>8); |
91 | 12.1k | } |
92 | | |
93 | | /*Initialize a 2nd order low-pass Bessel filter with the corresponding delay |
94 | | and initial value. |
95 | | _value is Q24.*/ |
96 | 9.44k | static void oc_iir_filter_init(oc_iir_filter *_f,int _delay,ogg_int32_t _value){ |
97 | 9.44k | oc_iir_filter_reinit(_f,_delay); |
98 | 9.44k | _f->y[1]=_f->y[0]=_f->x[1]=_f->x[0]=_value; |
99 | 9.44k | } |
100 | | |
101 | 45.7k | static ogg_int64_t oc_iir_filter_update(oc_iir_filter *_f,ogg_int32_t _x){ |
102 | 45.7k | ogg_int64_t c0; |
103 | 45.7k | ogg_int64_t c1; |
104 | 45.7k | ogg_int64_t g; |
105 | 45.7k | ogg_int64_t x0; |
106 | 45.7k | ogg_int64_t x1; |
107 | 45.7k | ogg_int64_t y0; |
108 | 45.7k | ogg_int64_t y1; |
109 | 45.7k | ogg_int64_t ya; |
110 | 45.7k | c0=_f->c[0]; |
111 | 45.7k | c1=_f->c[1]; |
112 | 45.7k | g=_f->g; |
113 | 45.7k | x0=_f->x[0]; |
114 | 45.7k | x1=_f->x[1]; |
115 | 45.7k | y0=_f->y[0]; |
116 | 45.7k | y1=_f->y[1]; |
117 | 45.7k | ya=(_x+x0*2+x1)*g+y0*c0+y1*c1+(1<<23)>>24; |
118 | 45.7k | _f->x[1]=(ogg_int32_t)x0; |
119 | 45.7k | _f->x[0]=_x; |
120 | 45.7k | _f->y[1]=(ogg_int32_t)y0; |
121 | 45.7k | _f->y[0]=(ogg_int32_t)ya; |
122 | 45.7k | return ya; |
123 | 45.7k | } |
124 | | |
125 | | |
126 | | |
127 | | /*Search for the quantizer that matches the target most closely. |
128 | | We don't assume a linear ordering, but when there are ties we pick the |
129 | | quantizer closest to the old one.*/ |
130 | | static int oc_enc_find_qi_for_target(oc_enc_ctx *_enc,int _qti,int _qi_old, |
131 | 102k | int _qi_min,ogg_int64_t _log_qtarget){ |
132 | 102k | ogg_int64_t best_qdiff; |
133 | 102k | int best_qi; |
134 | 102k | int qi; |
135 | 102k | best_qi=_qi_min; |
136 | 102k | best_qdiff=_enc->log_qavg[_qti][best_qi]-_log_qtarget; |
137 | 102k | best_qdiff=best_qdiff+OC_SIGNMASK(best_qdiff)^OC_SIGNMASK(best_qdiff); |
138 | 6.55M | for(qi=_qi_min+1;qi<64;qi++){ |
139 | 6.45M | ogg_int64_t qdiff; |
140 | 6.45M | qdiff=_enc->log_qavg[_qti][qi]-_log_qtarget; |
141 | 6.45M | qdiff=qdiff+OC_SIGNMASK(qdiff)^OC_SIGNMASK(qdiff); |
142 | 6.45M | if(qdiff<best_qdiff|| |
143 | 6.45M | qdiff==best_qdiff&&abs(qi-_qi_old)<abs(best_qi-_qi_old)){ |
144 | 4.41M | best_qi=qi; |
145 | 4.41M | best_qdiff=qdiff; |
146 | 4.41M | } |
147 | 6.45M | } |
148 | 102k | return best_qi; |
149 | 102k | } |
150 | | |
151 | 51.0k | void oc_enc_calc_lambda(oc_enc_ctx *_enc,int _qti){ |
152 | 51.0k | ogg_int64_t lq; |
153 | 51.0k | int qi; |
154 | 51.0k | int qi1; |
155 | 51.0k | int nqis; |
156 | | /*For now, lambda is fixed depending on the qi value and frame type: |
157 | | lambda=qscale*(qavg[qti][qi]**2), |
158 | | where qscale=0.2125. |
159 | | This was derived by exhaustively searching for the optimal quantizer for |
160 | | the AC coefficients in each block from a number of test sequences for a |
161 | | number of fixed lambda values and fitting the peaks of the resulting |
162 | | histograms (on the log(qavg) scale). |
163 | | The same model applies to both inter and intra frames. |
164 | | A more adaptive scheme might perform better.*/ |
165 | 51.0k | qi=_enc->state.qis[0]; |
166 | | /*If rate control is active, use the lambda for the _target_ quantizer. |
167 | | This allows us to scale to rates slightly lower than we'd normally be able |
168 | | to reach, and give the rate control a semblance of "fractional qi" |
169 | | precision. |
170 | | TODO: Add API for changing QI, and allow extra precision.*/ |
171 | 51.0k | if(_enc->state.info.target_bitrate>0)lq=_enc->rc.log_qtarget; |
172 | 4.48k | else lq=_enc->log_qavg[_qti][qi]; |
173 | | /*The resulting lambda value is less than 0x500000.*/ |
174 | 51.0k | _enc->lambda=(int)oc_bexp64(2*lq-0x4780BD468D6B62BLL); |
175 | | /*Select additional quantizers. |
176 | | The R-D optimal block AC quantizer statistics suggest that the distribution |
177 | | is roughly Gaussian-like with a slight positive skew. |
178 | | K-means clustering on log_qavg to select 3 quantizers produces cluster |
179 | | centers of {log_qavg-0.6,log_qavg,log_qavg+0.7}. |
180 | | Experiments confirm these are relatively good choices. |
181 | | |
182 | | Although we do greedy R-D optimization of the qii flags to avoid switching |
183 | | too frequently, this becomes ineffective at low rates, either because we |
184 | | do a poor job of predicting the actual R-D cost, or the greedy |
185 | | optimization is not sufficient. |
186 | | Therefore adaptive quantization is disabled above an (experimentally |
187 | | suggested) threshold of log_qavg=7.00 (e.g., below INTRA qi=12 or |
188 | | INTER qi=20 with current matrices). |
189 | | This may need to be revised if the R-D cost estimation or qii flag |
190 | | optimization strategies change.*/ |
191 | 51.0k | nqis=1; |
192 | 51.0k | if(lq<(OC_Q57(56)>>3)&&!_enc->vp3_compatible&& |
193 | 51.0k | _enc->sp_level<OC_SP_LEVEL_FAST_ANALYSIS){ |
194 | 27.9k | qi1=oc_enc_find_qi_for_target(_enc,_qti,OC_MAXI(qi-1,0),0, |
195 | 27.9k | lq+(OC_Q57(7)+5)/10); |
196 | 27.9k | if(qi1!=qi)_enc->state.qis[nqis++]=qi1; |
197 | 27.9k | qi1=oc_enc_find_qi_for_target(_enc,_qti,OC_MINI(qi+1,63),0, |
198 | 27.9k | lq-(OC_Q57(6)+5)/10); |
199 | 27.9k | if(qi1!=qi&&qi1!=_enc->state.qis[nqis-1])_enc->state.qis[nqis++]=qi1; |
200 | 27.9k | } |
201 | 51.0k | _enc->state.nqis=nqis; |
202 | 51.0k | } |
203 | | |
204 | | /*Binary exponential of _log_scale with 24-bit fractional precision and |
205 | | saturation. |
206 | | _log_scale: A binary logarithm in Q24 format. |
207 | | Return: The binary exponential in Q24 format, saturated to 2**47-1 if |
208 | | _log_scale was too large.*/ |
209 | 0 | static ogg_int64_t oc_bexp_q24(ogg_int32_t _log_scale){ |
210 | 0 | if(_log_scale<(ogg_int32_t)23<<24){ |
211 | 0 | ogg_int64_t ret; |
212 | 0 | ret=oc_bexp64(((ogg_int64_t)_log_scale<<33)+OC_Q57(24)); |
213 | 0 | return ret<0x7FFFFFFFFFFFLL?ret:0x7FFFFFFFFFFFLL; |
214 | 0 | } |
215 | 0 | return 0x7FFFFFFFFFFFLL; |
216 | 0 | } |
217 | | |
218 | | /*Convenience function converts Q57 value to a clamped 32-bit Q24 value |
219 | | _in: input in Q57 format. |
220 | | Return: same number in Q24 */ |
221 | 36.1k | static ogg_int32_t oc_q57_to_q24(ogg_int64_t _in){ |
222 | 36.1k | ogg_int64_t ret; |
223 | 36.1k | ret=_in+((ogg_int64_t)1<<32)>>33; |
224 | | /*0x80000000 is automatically converted to unsigned on 32-bit systems. |
225 | | -0x7FFFFFFF-1 is needed to avoid "promoting" the whole expression to |
226 | | unsigned.*/ |
227 | 36.1k | return (ogg_int32_t)OC_CLAMPI(-0x7FFFFFFF-1,ret,0x7FFFFFFF); |
228 | 36.1k | } |
229 | | |
230 | | /*Binary exponential of _log_scale with 24-bit fractional precision and |
231 | | saturation. |
232 | | _log_scale: A binary logarithm in Q57 format. |
233 | | Return: The binary exponential in Q24 format, saturated to 2**31-1 if |
234 | | _log_scale was too large.*/ |
235 | 3.14k | static ogg_int32_t oc_bexp64_q24(ogg_int64_t _log_scale){ |
236 | 3.14k | if(_log_scale<OC_Q57(8)){ |
237 | 3.14k | ogg_int64_t ret; |
238 | 3.14k | ret=oc_bexp64(_log_scale+OC_Q57(24)); |
239 | 3.14k | return ret<0x7FFFFFFF?(ogg_int32_t)ret:0x7FFFFFFF; |
240 | 3.14k | } |
241 | 0 | return 0x7FFFFFFF; |
242 | 3.14k | } |
243 | | |
244 | | |
245 | 3.14k | static void oc_enc_rc_reset(oc_enc_ctx *_enc){ |
246 | 3.14k | ogg_int64_t npixels; |
247 | 3.14k | ogg_int64_t ibpp; |
248 | 3.14k | int inter_delay; |
249 | | /*TODO: These parameters should be exposed in a th_encode_ctl() API.*/ |
250 | 3.14k | _enc->rc.bits_per_frame=(_enc->state.info.target_bitrate* |
251 | 3.14k | (ogg_int64_t)_enc->state.info.fps_denominator)/ |
252 | 3.14k | _enc->state.info.fps_numerator; |
253 | | /*Insane framerates or frame sizes mean insane bitrates. |
254 | | Let's not get carried away.*/ |
255 | 3.14k | if(_enc->rc.bits_per_frame>0x400000000000LL){ |
256 | 116 | _enc->rc.bits_per_frame=(ogg_int64_t)0x400000000000LL; |
257 | 116 | } |
258 | 3.03k | else if(_enc->rc.bits_per_frame<32)_enc->rc.bits_per_frame=32; |
259 | 3.14k | _enc->rc.buf_delay=OC_MAXI(_enc->rc.buf_delay,12); |
260 | 3.14k | _enc->rc.max=_enc->rc.bits_per_frame*_enc->rc.buf_delay; |
261 | | /*Start with a buffer fullness of 50% plus 25% of the amount we plan to spend |
262 | | on a single keyframe interval. |
263 | | We can require fully half the bits in an interval for a keyframe, so this |
264 | | initial level gives us maximum flexibility for over/under-shooting in |
265 | | subsequent frames.*/ |
266 | 3.14k | _enc->rc.target=(_enc->rc.max+1>>1)+(_enc->rc.bits_per_frame+2>>2)* |
267 | 3.14k | OC_MINI(_enc->keyframe_frequency_force,_enc->rc.buf_delay); |
268 | 3.14k | _enc->rc.fullness=_enc->rc.target; |
269 | | /*Pick exponents and initial scales for quantizer selection.*/ |
270 | 3.14k | npixels=_enc->state.info.frame_width* |
271 | 3.14k | (ogg_int64_t)_enc->state.info.frame_height; |
272 | 3.14k | _enc->rc.log_npixels=oc_blog64(npixels); |
273 | 3.14k | ibpp=npixels/_enc->rc.bits_per_frame; |
274 | 3.14k | if(ibpp<1){ |
275 | 1.42k | _enc->rc.exp[0]=59; |
276 | 1.42k | _enc->rc.log_scale[0]=oc_blog64(1997)-OC_Q57(8); |
277 | 1.42k | } |
278 | 1.72k | else if(ibpp<2){ |
279 | 68 | _enc->rc.exp[0]=55; |
280 | 68 | _enc->rc.log_scale[0]=oc_blog64(1604)-OC_Q57(8); |
281 | 68 | } |
282 | 1.65k | else{ |
283 | 1.65k | _enc->rc.exp[0]=48; |
284 | 1.65k | _enc->rc.log_scale[0]=oc_blog64(834)-OC_Q57(8); |
285 | 1.65k | } |
286 | 3.14k | if(ibpp<4){ |
287 | 1.57k | _enc->rc.exp[1]=100; |
288 | 1.57k | _enc->rc.log_scale[1]=oc_blog64(2249)-OC_Q57(8); |
289 | 1.57k | } |
290 | 1.57k | else if(ibpp<8){ |
291 | 133 | _enc->rc.exp[1]=95; |
292 | 133 | _enc->rc.log_scale[1]=oc_blog64(1751)-OC_Q57(8); |
293 | 133 | } |
294 | 1.44k | else{ |
295 | 1.44k | _enc->rc.exp[1]=73; |
296 | 1.44k | _enc->rc.log_scale[1]=oc_blog64(1260)-OC_Q57(8); |
297 | 1.44k | } |
298 | 3.14k | _enc->rc.prev_drop_count=0; |
299 | 3.14k | _enc->rc.log_drop_scale=OC_Q57(0); |
300 | | /*Set up second order followers, initialized according to corresponding |
301 | | time constants.*/ |
302 | 3.14k | oc_iir_filter_init(&_enc->rc.scalefilter[0],4, |
303 | 3.14k | oc_q57_to_q24(_enc->rc.log_scale[0])); |
304 | 3.14k | inter_delay=(_enc->rc.twopass? |
305 | 3.14k | OC_MAXI(_enc->keyframe_frequency_force,12):_enc->rc.buf_delay)>>1; |
306 | 3.14k | _enc->rc.inter_count=0; |
307 | | /*We clamp the actual inter_delay to a minimum of 10 to work within the range |
308 | | of values where later incrementing the delay works as designed. |
309 | | 10 is not an exact choice, but rather a good working trade-off.*/ |
310 | 3.14k | _enc->rc.inter_delay=10; |
311 | 3.14k | _enc->rc.inter_delay_target=inter_delay; |
312 | 3.14k | oc_iir_filter_init(&_enc->rc.scalefilter[1],_enc->rc.inter_delay, |
313 | 3.14k | oc_q57_to_q24(_enc->rc.log_scale[1])); |
314 | 3.14k | oc_iir_filter_init(&_enc->rc.vfrfilter,4, |
315 | 3.14k | oc_bexp64_q24(_enc->rc.log_drop_scale)); |
316 | 3.14k | } |
317 | | |
318 | 3.41k | void oc_rc_state_init(oc_rc_state *_rc,oc_enc_ctx *_enc){ |
319 | 3.41k | _rc->twopass=0; |
320 | 3.41k | _rc->twopass_buffer_bytes=0; |
321 | 3.41k | _rc->twopass_force_kf=0; |
322 | 3.41k | _rc->frame_metrics=NULL; |
323 | 3.41k | _rc->rate_bias=0; |
324 | 3.41k | if(_enc->state.info.target_bitrate>0){ |
325 | | /*The buffer size is set equal to the keyframe interval, clamped to the |
326 | | range [12,256] frames. |
327 | | The 12 frame minimum gives us some chance to distribute bit estimation |
328 | | errors. |
329 | | The 256 frame maximum means we'll require 8-10 seconds of pre-buffering |
330 | | at 24-30 fps, which is not unreasonable.*/ |
331 | 3.14k | _rc->buf_delay=_enc->keyframe_frequency_force>256? |
332 | 3.14k | 256:_enc->keyframe_frequency_force; |
333 | | /*By default, enforce all buffer constraints.*/ |
334 | 3.14k | _rc->drop_frames=1; |
335 | 3.14k | _rc->cap_overflow=1; |
336 | 3.14k | _rc->cap_underflow=0; |
337 | 3.14k | oc_enc_rc_reset(_enc); |
338 | 3.14k | } |
339 | 3.41k | } |
340 | | |
341 | 3.41k | void oc_rc_state_clear(oc_rc_state *_rc){ |
342 | 3.41k | _ogg_free(_rc->frame_metrics); |
343 | 3.41k | } |
344 | | |
345 | 0 | void oc_enc_rc_resize(oc_enc_ctx *_enc){ |
346 | | /*If encoding has not yet begun, reset the buffer state.*/ |
347 | 0 | if(_enc->state.curframe_num<0)oc_enc_rc_reset(_enc); |
348 | 0 | else{ |
349 | 0 | int idt; |
350 | | /*Otherwise, update the bounds on the buffer, but not the current |
351 | | fullness.*/ |
352 | 0 | _enc->rc.bits_per_frame=(_enc->state.info.target_bitrate* |
353 | 0 | (ogg_int64_t)_enc->state.info.fps_denominator)/ |
354 | 0 | _enc->state.info.fps_numerator; |
355 | | /*Insane framerates or frame sizes mean insane bitrates. |
356 | | Let's not get carried away.*/ |
357 | 0 | if(_enc->rc.bits_per_frame>0x400000000000LL){ |
358 | 0 | _enc->rc.bits_per_frame=(ogg_int64_t)0x400000000000LL; |
359 | 0 | } |
360 | 0 | else if(_enc->rc.bits_per_frame<32)_enc->rc.bits_per_frame=32; |
361 | 0 | _enc->rc.buf_delay=OC_MAXI(_enc->rc.buf_delay,12); |
362 | 0 | _enc->rc.max=_enc->rc.bits_per_frame*_enc->rc.buf_delay; |
363 | 0 | _enc->rc.target=(_enc->rc.max+1>>1)+(_enc->rc.bits_per_frame+2>>2)* |
364 | 0 | OC_MINI(_enc->keyframe_frequency_force,_enc->rc.buf_delay); |
365 | | /*Update the INTER-frame scale filter delay. |
366 | | We jump to it immediately if we've already seen enough frames; otherwise |
367 | | it is simply set as the new target.*/ |
368 | 0 | _enc->rc.inter_delay_target=idt=OC_MAXI(_enc->rc.buf_delay>>1,10); |
369 | 0 | if(idt<OC_MINI(_enc->rc.inter_delay,_enc->rc.inter_count)){ |
370 | 0 | oc_iir_filter_init(&_enc->rc.scalefilter[1],idt, |
371 | 0 | _enc->rc.scalefilter[1].y[0]); |
372 | 0 | _enc->rc.inter_delay=idt; |
373 | 0 | } |
374 | 0 | } |
375 | | /*If we're in pass-2 mode, make sure the frame metrics array is big enough |
376 | | to hold frame statistics for the full buffer.*/ |
377 | 0 | if(_enc->rc.twopass==2){ |
378 | 0 | int cfm; |
379 | 0 | int buf_delay; |
380 | 0 | int reset_window; |
381 | 0 | buf_delay=_enc->rc.buf_delay; |
382 | 0 | reset_window=_enc->rc.frame_metrics==NULL&&(_enc->rc.frames_total[0]==0|| |
383 | 0 | buf_delay<_enc->rc.frames_total[0]+_enc->rc.frames_total[1] |
384 | 0 | +_enc->rc.frames_total[2]); |
385 | 0 | cfm=_enc->rc.cframe_metrics; |
386 | | /*Only try to resize the frame metrics buffer if a) it's too small and |
387 | | b) we were using a finite buffer, or are about to start.*/ |
388 | 0 | if(cfm<buf_delay&&(_enc->rc.frame_metrics!=NULL||reset_window)){ |
389 | 0 | oc_frame_metrics *fm; |
390 | 0 | int nfm; |
391 | 0 | int fmh; |
392 | 0 | fm=(oc_frame_metrics *)_ogg_realloc(_enc->rc.frame_metrics, |
393 | 0 | buf_delay*sizeof(*_enc->rc.frame_metrics)); |
394 | 0 | if(fm==NULL){ |
395 | | /*We failed to allocate a finite buffer.*/ |
396 | | /*If we don't have a valid 2-pass header yet, just return; we'll reset |
397 | | the buffer size when we read the header.*/ |
398 | 0 | if(_enc->rc.frames_total[0]==0)return; |
399 | | /*Otherwise revert to the largest finite buffer previously set, or to |
400 | | whole-file buffering if we were still using that.*/ |
401 | 0 | _enc->rc.buf_delay=_enc->rc.frame_metrics!=NULL? |
402 | 0 | cfm:_enc->rc.frames_total[0]+_enc->rc.frames_total[1] |
403 | 0 | +_enc->rc.frames_total[2]; |
404 | 0 | oc_enc_rc_resize(_enc); |
405 | 0 | return; |
406 | 0 | } |
407 | 0 | _enc->rc.frame_metrics=fm; |
408 | 0 | _enc->rc.cframe_metrics=buf_delay; |
409 | | /*Re-organize the circular buffer.*/ |
410 | 0 | fmh=_enc->rc.frame_metrics_head; |
411 | 0 | nfm=_enc->rc.nframe_metrics; |
412 | 0 | if(fmh+nfm>cfm){ |
413 | 0 | int shift; |
414 | 0 | shift=OC_MINI(fmh+nfm-cfm,buf_delay-cfm); |
415 | 0 | memcpy(fm+cfm,fm,OC_MINI(fmh+nfm-cfm,buf_delay-cfm)*sizeof(*fm)); |
416 | 0 | if(fmh+nfm>buf_delay)memmove(fm,fm+shift,fmh+nfm-buf_delay); |
417 | 0 | } |
418 | 0 | } |
419 | | /*We were using whole-file buffering; now we're not.*/ |
420 | 0 | if(reset_window){ |
421 | 0 | _enc->rc.nframes[0]=_enc->rc.nframes[1]=_enc->rc.nframes[2]=0; |
422 | 0 | _enc->rc.scale_sum[0]=_enc->rc.scale_sum[1]=0; |
423 | 0 | _enc->rc.scale_window_end=_enc->rc.scale_window0= |
424 | 0 | _enc->state.curframe_num+_enc->prev_dup_count+1; |
425 | 0 | if(_enc->rc.twopass_buffer_bytes){ |
426 | 0 | int qti; |
427 | | /*We already read the metrics for the first frame in the window.*/ |
428 | 0 | *(_enc->rc.frame_metrics)=*&_enc->rc.cur_metrics; |
429 | 0 | _enc->rc.nframe_metrics++; |
430 | 0 | qti=_enc->rc.cur_metrics.frame_type; |
431 | 0 | _enc->rc.nframes[qti]++; |
432 | 0 | _enc->rc.nframes[2]+=_enc->rc.cur_metrics.dup_count; |
433 | 0 | _enc->rc.scale_sum[qti]+=oc_bexp_q24(_enc->rc.cur_metrics.log_scale); |
434 | 0 | _enc->rc.scale_window_end+=_enc->rc.cur_metrics.dup_count+1; |
435 | 0 | if(_enc->rc.scale_window_end-_enc->rc.scale_window0<buf_delay){ |
436 | | /*We need more frame data.*/ |
437 | 0 | _enc->rc.twopass_buffer_bytes=0; |
438 | 0 | } |
439 | 0 | } |
440 | 0 | } |
441 | | /*Otherwise, we could shrink the size of the current window, if necessary, |
442 | | but leaving it like it is lets us adapt to the new buffer size more |
443 | | gracefully.*/ |
444 | 0 | } |
445 | 0 | } |
446 | | |
447 | | /*Scale the number of frames by the number of expected drops/duplicates.*/ |
448 | 46.5k | static int oc_rc_scale_drop(oc_rc_state *_rc,int _nframes){ |
449 | 46.5k | if(_rc->prev_drop_count>0||_rc->log_drop_scale>OC_Q57(0)){ |
450 | 16.4k | ogg_int64_t dup_scale; |
451 | 16.4k | dup_scale=oc_bexp64((_rc->log_drop_scale |
452 | 16.4k | +oc_blog64(_rc->prev_drop_count+1)>>1)+OC_Q57(8)); |
453 | 16.4k | if(dup_scale<_nframes<<8){ |
454 | 16.1k | int dup_scalei; |
455 | 16.1k | dup_scalei=(int)dup_scale; |
456 | 16.1k | if(dup_scalei>0)_nframes=((_nframes<<8)+dup_scalei-1)/dup_scalei; |
457 | 16.1k | } |
458 | 310 | else _nframes=!!_nframes; |
459 | 16.4k | } |
460 | 46.5k | return _nframes; |
461 | 46.5k | } |
462 | | |
463 | 46.5k | int oc_enc_select_qi(oc_enc_ctx *_enc,int _qti,int _clamp){ |
464 | 46.5k | ogg_int64_t rate_total; |
465 | 46.5k | ogg_int64_t rate_bias; |
466 | 46.5k | int nframes[2]; |
467 | 46.5k | int buf_delay; |
468 | 46.5k | int buf_pad; |
469 | 46.5k | ogg_int64_t log_qtarget; |
470 | 46.5k | ogg_int64_t log_scale0; |
471 | 46.5k | ogg_int64_t log_cur_scale; |
472 | 46.5k | ogg_int64_t log_qexp; |
473 | 46.5k | int exp0; |
474 | 46.5k | int old_qi; |
475 | 46.5k | int qi; |
476 | | /*Figure out how to re-distribute bits so that we hit our fullness target |
477 | | before the last keyframe in our current buffer window (after the current |
478 | | frame), or the end of the buffer window, whichever comes first.*/ |
479 | 46.5k | log_cur_scale=(ogg_int64_t)_enc->rc.scalefilter[_qti].y[0]<<33; |
480 | 46.5k | buf_pad=0; |
481 | 46.5k | switch(_enc->rc.twopass){ |
482 | 46.5k | default:{ |
483 | 46.5k | ogg_uint32_t next_key_frame; |
484 | | /*Single pass mode: assume only forced keyframes and attempt to estimate |
485 | | the drop count for VFR content.*/ |
486 | 46.5k | next_key_frame=_qti?_enc->keyframe_frequency_force |
487 | 27.7k | -(_enc->state.curframe_num-_enc->state.keyframe_num):0; |
488 | 46.5k | nframes[0]=(_enc->rc.buf_delay-OC_MINI(next_key_frame,_enc->rc.buf_delay) |
489 | 46.5k | +_enc->keyframe_frequency_force-1)/_enc->keyframe_frequency_force; |
490 | 46.5k | if(nframes[0]+_qti>1){ |
491 | 9.00k | nframes[0]--; |
492 | 9.00k | buf_delay=next_key_frame+nframes[0]*_enc->keyframe_frequency_force; |
493 | 9.00k | } |
494 | 37.5k | else buf_delay=_enc->rc.buf_delay; |
495 | 46.5k | nframes[1]=buf_delay-nframes[0]; |
496 | | /*Downgrade the delta frame rate to correspond to the recent drop count |
497 | | history.*/ |
498 | 46.5k | nframes[1]=oc_rc_scale_drop(&_enc->rc,nframes[1]); |
499 | 46.5k | }break; |
500 | 0 | case 1:{ |
501 | | /*Pass 1 mode: use a fixed qi value.*/ |
502 | 0 | qi=_enc->state.qis[0]; |
503 | 0 | _enc->rc.log_qtarget=_enc->log_qavg[_qti][qi]; |
504 | 0 | return qi; |
505 | 0 | }break; |
506 | 0 | case 2:{ |
507 | 0 | ogg_int64_t scale_sum[2]; |
508 | 0 | int qti; |
509 | | /*Pass 2 mode: we know exactly how much of each frame type there is in |
510 | | the current buffer window, and have estimates for the scales.*/ |
511 | 0 | nframes[0]=_enc->rc.nframes[0]; |
512 | 0 | nframes[1]=_enc->rc.nframes[1]; |
513 | 0 | scale_sum[0]=_enc->rc.scale_sum[0]; |
514 | 0 | scale_sum[1]=_enc->rc.scale_sum[1]; |
515 | | /*The window size can be slightly larger than the buffer window for VFR |
516 | | content; clamp it down, if appropriate (the excess will all be dup |
517 | | frames).*/ |
518 | 0 | buf_delay=OC_MINI(_enc->rc.scale_window_end-_enc->rc.scale_window0, |
519 | 0 | _enc->rc.buf_delay); |
520 | | /*If we're approaching the end of the file, add some slack to keep us |
521 | | from slamming into a rail. |
522 | | Our rate accuracy goes down, but it keeps the result sensible. |
523 | | We position the target where the first forced keyframe beyond the end |
524 | | of the file would be (for consistency with 1-pass mode).*/ |
525 | 0 | buf_pad=OC_MINI(_enc->rc.buf_delay,_enc->state.keyframe_num |
526 | 0 | +_enc->keyframe_frequency_force-_enc->rc.scale_window0); |
527 | 0 | if(buf_delay<buf_pad)buf_pad-=buf_delay; |
528 | 0 | else{ |
529 | | /*Otherwise, search for the last keyframe in the buffer window and |
530 | | target that.*/ |
531 | 0 | buf_pad=0; |
532 | | /*TODO: Currently we only do this when using a finite buffer; we could |
533 | | save the position of the last keyframe in the summary data and do it |
534 | | with a whole-file buffer as well, but it isn't likely to make a |
535 | | difference.*/ |
536 | 0 | if(_enc->rc.frame_metrics!=NULL){ |
537 | 0 | int fmi; |
538 | 0 | int fm_tail; |
539 | 0 | fm_tail=_enc->rc.frame_metrics_head+_enc->rc.nframe_metrics; |
540 | 0 | if(fm_tail>=_enc->rc.cframe_metrics)fm_tail-=_enc->rc.cframe_metrics; |
541 | 0 | for(fmi=fm_tail;;){ |
542 | 0 | oc_frame_metrics *m; |
543 | 0 | fmi--; |
544 | 0 | if(fmi<0)fmi+=_enc->rc.cframe_metrics; |
545 | | /*Stop before we remove the first frame.*/ |
546 | 0 | if(fmi==_enc->rc.frame_metrics_head)break; |
547 | 0 | m=_enc->rc.frame_metrics+fmi; |
548 | | /*If we find a keyframe, remove it and everything past it.*/ |
549 | 0 | if(m->frame_type==OC_INTRA_FRAME){ |
550 | 0 | do{ |
551 | 0 | qti=m->frame_type; |
552 | 0 | nframes[qti]--; |
553 | 0 | scale_sum[qti]-=oc_bexp_q24(m->log_scale); |
554 | 0 | buf_delay-=m->dup_count+1; |
555 | 0 | fmi++; |
556 | 0 | if(fmi>=_enc->rc.cframe_metrics)fmi=0; |
557 | 0 | m=_enc->rc.frame_metrics+fmi; |
558 | 0 | } |
559 | 0 | while(fmi!=fm_tail); |
560 | | /*And stop scanning backwards.*/ |
561 | 0 | break; |
562 | 0 | } |
563 | 0 | } |
564 | 0 | } |
565 | 0 | } |
566 | | /*If we're not using the same frame type as in pass 1 (because someone |
567 | | changed the keyframe interval), remove that scale estimate. |
568 | | We'll add in a replacement for the correct frame type below.*/ |
569 | 0 | qti=_enc->rc.cur_metrics.frame_type; |
570 | 0 | if(qti!=_qti){ |
571 | 0 | nframes[qti]--; |
572 | 0 | scale_sum[qti]-=oc_bexp_q24(_enc->rc.cur_metrics.log_scale); |
573 | 0 | } |
574 | | /*Compute log_scale estimates for each frame type from the pass-1 scales |
575 | | we measured in the current window.*/ |
576 | 0 | for(qti=0;qti<2;qti++){ |
577 | 0 | _enc->rc.log_scale[qti]=nframes[qti]>0? |
578 | 0 | oc_blog64(scale_sum[qti])-oc_blog64(nframes[qti])-OC_Q57(24): |
579 | 0 | -_enc->rc.log_npixels; |
580 | 0 | } |
581 | | /*If we're not using the same frame type as in pass 1, add a scale |
582 | | estimate for the corresponding frame using the current low-pass |
583 | | filter value. |
584 | | This is mostly to ensure we have a valid estimate even when pass 1 had |
585 | | no frames of this type in the buffer window. |
586 | | TODO: We could also plan ahead and figure out how many keyframes we'll |
587 | | be forced to add in the current buffer window.*/ |
588 | 0 | qti=_enc->rc.cur_metrics.frame_type; |
589 | 0 | if(qti!=_qti){ |
590 | 0 | ogg_int64_t scale; |
591 | 0 | scale=_enc->rc.log_scale[_qti]<OC_Q57(23)? |
592 | 0 | oc_bexp64(_enc->rc.log_scale[_qti]+OC_Q57(24)):0x7FFFFFFFFFFFLL; |
593 | 0 | scale*=nframes[_qti]; |
594 | 0 | nframes[_qti]++; |
595 | 0 | scale+=oc_bexp_q24(log_cur_scale>>33); |
596 | 0 | _enc->rc.log_scale[_qti]=oc_blog64(scale) |
597 | 0 | -oc_blog64(nframes[qti])-OC_Q57(24); |
598 | 0 | } |
599 | 0 | else log_cur_scale=(ogg_int64_t)_enc->rc.cur_metrics.log_scale<<33; |
600 | | /*Add the padding from above. |
601 | | This basically reverts to 1-pass estimations in the last keyframe |
602 | | interval.*/ |
603 | 0 | if(buf_pad>0){ |
604 | 0 | ogg_int64_t scale; |
605 | 0 | int nextra_frames; |
606 | | /*Extend the buffer.*/ |
607 | 0 | buf_delay+=buf_pad; |
608 | | /*Add virtual delta frames according to the estimated drop count.*/ |
609 | 0 | nextra_frames=oc_rc_scale_drop(&_enc->rc,buf_pad); |
610 | | /*And blend in the low-pass filtered scale according to how many frames |
611 | | we added.*/ |
612 | 0 | scale= |
613 | 0 | oc_bexp64(_enc->rc.log_scale[1]+OC_Q57(24))*(ogg_int64_t)nframes[1] |
614 | 0 | +oc_bexp_q24(_enc->rc.scalefilter[1].y[0])*(ogg_int64_t)nextra_frames; |
615 | 0 | nframes[1]+=nextra_frames; |
616 | 0 | _enc->rc.log_scale[1]=oc_blog64(scale)-oc_blog64(nframes[1])-OC_Q57(24); |
617 | 0 | } |
618 | 0 | }break; |
619 | 46.5k | } |
620 | | /*If we've been missing our target, add a penalty term.*/ |
621 | 46.5k | rate_bias=(_enc->rc.rate_bias/(_enc->state.curframe_num+1000))* |
622 | 46.5k | (buf_delay-buf_pad); |
623 | | /*rate_total is the total bits available over the next buf_delay frames.*/ |
624 | 46.5k | rate_total=_enc->rc.fullness-_enc->rc.target+rate_bias |
625 | 46.5k | +buf_delay*_enc->rc.bits_per_frame; |
626 | 46.5k | log_scale0=_enc->rc.log_scale[_qti]+_enc->rc.log_npixels; |
627 | | /*If there aren't enough bits to achieve our desired fullness level, use the |
628 | | minimum quality permitted.*/ |
629 | 46.5k | if(rate_total<=buf_delay)log_qtarget=OC_QUANT_MAX_LOG; |
630 | 41.3k | else{ |
631 | 41.3k | static const ogg_int64_t LOG_KEY_RATIO=0x0137222BB70747BALL; |
632 | 41.3k | ogg_int64_t log_scale1; |
633 | 41.3k | ogg_int64_t rlo; |
634 | 41.3k | ogg_int64_t rhi; |
635 | 41.3k | log_scale1=_enc->rc.log_scale[1-_qti]+_enc->rc.log_npixels; |
636 | 41.3k | rlo=0; |
637 | 41.3k | rhi=(rate_total+nframes[_qti]-1)/nframes[_qti]; |
638 | 688k | while(rlo<rhi){ |
639 | 648k | ogg_int64_t curr; |
640 | 648k | ogg_int64_t rdiff; |
641 | 648k | ogg_int64_t log_rpow; |
642 | 648k | ogg_int64_t rscale; |
643 | 648k | curr=rlo+rhi>>1; |
644 | 648k | log_rpow=oc_blog64(curr)-log_scale0; |
645 | 648k | log_rpow=(log_rpow+(_enc->rc.exp[_qti]>>1))/_enc->rc.exp[_qti]; |
646 | 648k | if(_qti)log_rpow+=LOG_KEY_RATIO>>6; |
647 | 351k | else log_rpow-=LOG_KEY_RATIO>>6; |
648 | 648k | log_rpow*=_enc->rc.exp[1-_qti]; |
649 | 648k | rscale=nframes[1-_qti]*oc_bexp64(log_scale1+log_rpow); |
650 | 648k | rdiff=nframes[_qti]*curr+rscale-rate_total; |
651 | 648k | if(rdiff<0)rlo=curr+1; |
652 | 173k | else if(rdiff>0)rhi=curr-1; |
653 | 880 | else break; |
654 | 648k | } |
655 | 41.3k | log_qtarget=OC_Q57(2)-((oc_blog64(rlo)-log_scale0+(_enc->rc.exp[_qti]>>1))/ |
656 | 41.3k | _enc->rc.exp[_qti]<<6); |
657 | 41.3k | log_qtarget=OC_MINI(log_qtarget,OC_QUANT_MAX_LOG); |
658 | 41.3k | } |
659 | | /*The above allocation looks only at the total rate we'll accumulate in the |
660 | | next buf_delay frames. |
661 | | However, we could overflow the buffer on the very next frame, so check for |
662 | | that here, if we're not using a soft target.*/ |
663 | 46.5k | exp0=_enc->rc.exp[_qti]; |
664 | 46.5k | if(_enc->rc.cap_overflow){ |
665 | 46.5k | ogg_int64_t margin; |
666 | 46.5k | ogg_int64_t soft_limit; |
667 | 46.5k | ogg_int64_t log_soft_limit; |
668 | | /*Allow 3% of the buffer for prediction error. |
669 | | This should be plenty, and we don't mind if we go a bit over; we only |
670 | | want to keep these bits from being completely wasted.*/ |
671 | 46.5k | margin=_enc->rc.max+31>>5; |
672 | | /*We want to use at least this many bits next frame.*/ |
673 | 46.5k | soft_limit=_enc->rc.fullness+_enc->rc.bits_per_frame-(_enc->rc.max-margin); |
674 | 46.5k | log_soft_limit=oc_blog64(soft_limit); |
675 | | /*If we're predicting we won't use that many...*/ |
676 | 46.5k | log_qexp=(log_qtarget-OC_Q57(2)>>6)*exp0; |
677 | 46.5k | if(log_scale0-log_qexp<log_soft_limit){ |
678 | | /*Scale the adjustment based on how far into the margin we are.*/ |
679 | 4.78k | log_qexp+=(log_scale0-log_soft_limit-log_qexp>>32)* |
680 | 4.78k | ((OC_MINI(margin,soft_limit)<<32)/margin); |
681 | 4.78k | log_qtarget=((log_qexp+(exp0>>1))/exp0<<6)+OC_Q57(2); |
682 | 4.78k | } |
683 | 46.5k | } |
684 | | /*If this was not one of the initial frames, limit the change in quality.*/ |
685 | 46.5k | old_qi=_enc->state.qis[0]; |
686 | 46.5k | if(_clamp){ |
687 | 40.2k | ogg_int64_t log_qmin; |
688 | 40.2k | ogg_int64_t log_qmax; |
689 | | /*Clamp the target quantizer to within [0.8*Q,1.2*Q], where Q is the |
690 | | current quantizer. |
691 | | TODO: With user-specified quant matrices, we need to enlarge these limits |
692 | | if they don't actually let us change qi values.*/ |
693 | 40.2k | log_qmin=_enc->log_qavg[_qti][old_qi]-0x00A4D3C25E68DC58LL; |
694 | 40.2k | log_qmax=_enc->log_qavg[_qti][old_qi]+0x00A4D3C25E68DC58LL; |
695 | 40.2k | log_qtarget=OC_CLAMPI(log_qmin,log_qtarget,log_qmax); |
696 | 40.2k | } |
697 | | /*The above allocation looks only at the total rate we'll accumulate in the |
698 | | next buf_delay frames. |
699 | | However, we could bust the budget on the very next frame, so check for that |
700 | | here, if we're not using a soft target.*/ |
701 | | /* Disabled when our minimum qi > 0; if we saturate log_qtarget to |
702 | | to the maximum possible size when we have a minimum qi, the |
703 | | resulting lambda will interact very strangely with SKIP. The |
704 | | resulting artifacts look like waterfalls. */ |
705 | 46.5k | if(_enc->state.info.quality==0){ |
706 | 46.5k | ogg_int64_t log_hard_limit; |
707 | | /*Compute the maximum number of bits we can use in the next frame. |
708 | | Allow 50% of the rate for a single frame for prediction error. |
709 | | This may not be enough for keyframes or sudden changes in complexity.*/ |
710 | 46.5k | log_hard_limit=oc_blog64(_enc->rc.fullness+(_enc->rc.bits_per_frame>>1)); |
711 | | /*If we're predicting we'll use more than this...*/ |
712 | 46.5k | log_qexp=(log_qtarget-OC_Q57(2)>>6)*exp0; |
713 | 46.5k | if(log_scale0-log_qexp>log_hard_limit){ |
714 | | /*Force the target to hit our limit exactly.*/ |
715 | 12.0k | log_qexp=log_scale0-log_hard_limit; |
716 | 12.0k | log_qtarget=((log_qexp+(exp0>>1))/exp0<<6)+OC_Q57(2); |
717 | | /*If that target is unreasonable, oh well; we'll have to drop.*/ |
718 | 12.0k | log_qtarget=OC_MINI(log_qtarget,OC_QUANT_MAX_LOG); |
719 | 12.0k | } |
720 | 46.5k | } |
721 | | /*Compute a final estimate of the number of bits we plan to use.*/ |
722 | 46.5k | log_qexp=(log_qtarget-OC_Q57(2)>>6)*_enc->rc.exp[_qti]; |
723 | 46.5k | _enc->rc.rate_bias+=oc_bexp64(log_cur_scale+_enc->rc.log_npixels-log_qexp); |
724 | 46.5k | qi=oc_enc_find_qi_for_target(_enc,_qti,old_qi, |
725 | 46.5k | _enc->state.info.quality,log_qtarget); |
726 | | /*Save the quantizer target for lambda calculations.*/ |
727 | 46.5k | _enc->rc.log_qtarget=log_qtarget; |
728 | 46.5k | return qi; |
729 | 46.5k | } |
730 | | |
731 | | int oc_enc_update_rc_state(oc_enc_ctx *_enc, |
732 | 35.3k | long _bits,int _qti,int _qi,int _trial,int _droppable){ |
733 | 35.3k | ogg_int64_t buf_delta; |
734 | 35.3k | ogg_int64_t log_scale; |
735 | 35.3k | int dropped; |
736 | 35.3k | dropped=0; |
737 | | /* Drop frames also disabled for now in the case of infinite-buffer |
738 | | two-pass mode */ |
739 | 35.3k | if(!_enc->rc.drop_frames||_enc->rc.twopass&&_enc->rc.frame_metrics==NULL){ |
740 | 0 | _droppable=0; |
741 | 0 | } |
742 | 35.3k | buf_delta=_enc->rc.bits_per_frame*(1+_enc->dup_count); |
743 | 35.3k | if(_bits<=0){ |
744 | | /*We didn't code any blocks in this frame.*/ |
745 | 5.50k | log_scale=OC_Q57(-64); |
746 | 5.50k | _bits=0; |
747 | 5.50k | } |
748 | 29.8k | else{ |
749 | 29.8k | ogg_int64_t log_bits; |
750 | 29.8k | ogg_int64_t log_qexp; |
751 | | /*Compute the estimated scale factor for this frame type.*/ |
752 | 29.8k | log_bits=oc_blog64(_bits); |
753 | 29.8k | log_qexp=_enc->rc.log_qtarget-OC_Q57(2); |
754 | 29.8k | log_qexp=(log_qexp>>6)*(_enc->rc.exp[_qti]); |
755 | 29.8k | log_scale=OC_MINI(log_bits-_enc->rc.log_npixels+log_qexp,OC_Q57(16)); |
756 | 29.8k | } |
757 | | /*Special two-pass processing.*/ |
758 | 35.3k | switch(_enc->rc.twopass){ |
759 | 0 | case 1:{ |
760 | | /*Pass 1 mode: save the metrics for this frame.*/ |
761 | 0 | _enc->rc.cur_metrics.log_scale=oc_q57_to_q24(log_scale); |
762 | 0 | _enc->rc.cur_metrics.dup_count=_enc->dup_count; |
763 | 0 | _enc->rc.cur_metrics.frame_type=_enc->state.frame_type; |
764 | 0 | _enc->rc.cur_metrics.activity_avg=_enc->activity_avg; |
765 | 0 | _enc->rc.twopass_buffer_bytes=0; |
766 | 0 | }break; |
767 | 0 | case 2:{ |
768 | | /*Pass 2 mode:*/ |
769 | 0 | if(!_trial){ |
770 | 0 | ogg_int64_t next_frame_num; |
771 | 0 | int qti; |
772 | | /*Move the current metrics back one frame.*/ |
773 | 0 | *&_enc->rc.prev_metrics=*&_enc->rc.cur_metrics; |
774 | 0 | next_frame_num=_enc->state.curframe_num+_enc->dup_count+1; |
775 | | /*Back out the last frame's statistics from the sliding window.*/ |
776 | 0 | qti=_enc->rc.prev_metrics.frame_type; |
777 | 0 | _enc->rc.frames_left[qti]--; |
778 | 0 | _enc->rc.frames_left[2]-=_enc->rc.prev_metrics.dup_count; |
779 | 0 | _enc->rc.nframes[qti]--; |
780 | 0 | _enc->rc.nframes[2]-=_enc->rc.prev_metrics.dup_count; |
781 | 0 | _enc->rc.scale_sum[qti]-=oc_bexp_q24(_enc->rc.prev_metrics.log_scale); |
782 | 0 | _enc->rc.scale_window0=(int)next_frame_num; |
783 | | /*Free the corresponding entry in the circular buffer.*/ |
784 | 0 | if(_enc->rc.frame_metrics!=NULL){ |
785 | 0 | _enc->rc.nframe_metrics--; |
786 | 0 | _enc->rc.frame_metrics_head++; |
787 | 0 | if(_enc->rc.frame_metrics_head>=_enc->rc.cframe_metrics){ |
788 | 0 | _enc->rc.frame_metrics_head=0; |
789 | 0 | } |
790 | 0 | } |
791 | | /*Mark us ready for the next 2-pass packet.*/ |
792 | 0 | _enc->rc.twopass_buffer_bytes=0; |
793 | | /*Update state, so the user doesn't have to keep calling 2pass_in after |
794 | | they've fed in all the data when we're using a finite buffer.*/ |
795 | 0 | _enc->prev_dup_count=_enc->dup_count; |
796 | 0 | oc_enc_rc_2pass_in(_enc,NULL,0); |
797 | 0 | } |
798 | 0 | }break; |
799 | 35.3k | } |
800 | | /*Common to all passes:*/ |
801 | 35.3k | if(_bits>0){ |
802 | 29.8k | if(_trial){ |
803 | 4.51k | oc_iir_filter *f; |
804 | | /*Use the estimated scale factor directly if this was a trial.*/ |
805 | 4.51k | f=_enc->rc.scalefilter+_qti; |
806 | 4.51k | f->y[1]=f->y[0]=f->x[1]=f->x[0]=oc_q57_to_q24(log_scale); |
807 | 4.51k | _enc->rc.log_scale[_qti]=log_scale; |
808 | 4.51k | } |
809 | 25.3k | else{ |
810 | | /*Lengthen the time constant for the INTER filter as we collect more |
811 | | frame statistics, until we reach our target.*/ |
812 | 25.3k | if(_enc->rc.inter_delay<_enc->rc.inter_delay_target&& |
813 | 25.3k | _enc->rc.inter_count>=_enc->rc.inter_delay&&_qti==OC_INTER_FRAME){ |
814 | 2.71k | oc_iir_filter_reinit(&_enc->rc.scalefilter[1],++_enc->rc.inter_delay); |
815 | 2.71k | } |
816 | | /*Otherwise update the low-pass scale filter for this frame type, |
817 | | regardless of whether or not we dropped this frame.*/ |
818 | 25.3k | _enc->rc.log_scale[_qti]=oc_iir_filter_update( |
819 | 25.3k | _enc->rc.scalefilter+_qti,oc_q57_to_q24(log_scale))<<33; |
820 | | /*If this frame busts our budget, it must be dropped.*/ |
821 | 25.3k | if(_droppable&&_enc->rc.fullness+buf_delta<_bits){ |
822 | 4.84k | _enc->rc.prev_drop_count+=1+_enc->dup_count; |
823 | 4.84k | _bits=0; |
824 | 4.84k | dropped=1; |
825 | 4.84k | } |
826 | 20.4k | else{ |
827 | 20.4k | ogg_uint32_t drop_count; |
828 | | /*Update a low-pass filter to estimate the "real" frame rate taking |
829 | | drops and duplicates into account. |
830 | | This is only done if the frame is coded, as it needs the final |
831 | | count of dropped frames.*/ |
832 | 20.4k | drop_count=_enc->rc.prev_drop_count+1; |
833 | 20.4k | if(drop_count>0x7F)drop_count=0x7FFFFFFF; |
834 | 20.4k | else drop_count<<=24; |
835 | 20.4k | _enc->rc.log_drop_scale=oc_blog64(oc_iir_filter_update( |
836 | 20.4k | &_enc->rc.vfrfilter,drop_count))-OC_Q57(24); |
837 | | /*Initialize the drop count for this frame to the user-requested dup |
838 | | count. |
839 | | It will be increased if we drop more frames.*/ |
840 | 20.4k | _enc->rc.prev_drop_count=_enc->dup_count; |
841 | 20.4k | } |
842 | 25.3k | } |
843 | | /*Increment the INTER frame count, for filter adaptation purposes.*/ |
844 | 29.8k | if(_enc->rc.inter_count<INT_MAX)_enc->rc.inter_count+=_qti; |
845 | 29.8k | } |
846 | | /*Increase the drop count.*/ |
847 | 5.50k | else _enc->rc.prev_drop_count+=1+_enc->dup_count; |
848 | | /*And update the buffer fullness level.*/ |
849 | 35.3k | if(!_trial){ |
850 | 30.5k | _enc->rc.fullness+=buf_delta-_bits; |
851 | | /*If we're too quick filling the buffer and overflow is capped, |
852 | | that rate is lost forever.*/ |
853 | 30.5k | if(_enc->rc.cap_overflow&&_enc->rc.fullness>_enc->rc.max){ |
854 | 4.17k | _enc->rc.fullness=_enc->rc.max; |
855 | 4.17k | } |
856 | | /*If we're too quick draining the buffer and underflow is capped, |
857 | | don't try to make up that rate later.*/ |
858 | 30.5k | if(_enc->rc.cap_underflow&&_enc->rc.fullness<0){ |
859 | 0 | _enc->rc.fullness=0; |
860 | 0 | } |
861 | | /*Adjust the bias for the real bits we've used.*/ |
862 | 30.5k | _enc->rc.rate_bias-=_bits; |
863 | 30.5k | } |
864 | 35.3k | return dropped; |
865 | 35.3k | } |
866 | | |
867 | 0 | #define OC_RC_2PASS_VERSION (2) |
868 | 0 | #define OC_RC_2PASS_HDR_SZ (38) |
869 | 0 | #define OC_RC_2PASS_PACKET_SZ (12) |
870 | | |
871 | 0 | static void oc_rc_buffer_val(oc_rc_state *_rc,ogg_int64_t _val,int _bytes){ |
872 | 0 | while(_bytes-->0){ |
873 | 0 | _rc->twopass_buffer[_rc->twopass_buffer_bytes++]=(unsigned char)(_val&0xFF); |
874 | 0 | _val>>=8; |
875 | 0 | } |
876 | 0 | } |
877 | | |
878 | 0 | int oc_enc_rc_2pass_out(oc_enc_ctx *_enc,unsigned char **_buf){ |
879 | 0 | if(_enc->rc.twopass_buffer_bytes==0){ |
880 | 0 | if(_enc->rc.twopass==0){ |
881 | 0 | int qi; |
882 | | /*Pick first-pass qi for scale calculations.*/ |
883 | 0 | qi=oc_enc_select_qi(_enc,0,0); |
884 | 0 | _enc->state.nqis=1; |
885 | 0 | _enc->state.qis[0]=qi; |
886 | 0 | _enc->rc.twopass=1; |
887 | 0 | _enc->rc.frames_total[0]=_enc->rc.frames_total[1]= |
888 | 0 | _enc->rc.frames_total[2]=0; |
889 | 0 | _enc->rc.scale_sum[0]=_enc->rc.scale_sum[1]=0; |
890 | | /*Fill in dummy summary values.*/ |
891 | 0 | oc_rc_buffer_val(&_enc->rc,0x5032544F,4); |
892 | 0 | oc_rc_buffer_val(&_enc->rc,OC_RC_2PASS_VERSION,4); |
893 | 0 | oc_rc_buffer_val(&_enc->rc,0,OC_RC_2PASS_HDR_SZ-8); |
894 | 0 | } |
895 | 0 | else{ |
896 | 0 | int qti; |
897 | 0 | qti=_enc->rc.cur_metrics.frame_type; |
898 | 0 | _enc->rc.scale_sum[qti]+=oc_bexp_q24(_enc->rc.cur_metrics.log_scale); |
899 | 0 | _enc->rc.frames_total[qti]++; |
900 | 0 | _enc->rc.frames_total[2]+=_enc->rc.cur_metrics.dup_count; |
901 | 0 | oc_rc_buffer_val(&_enc->rc, |
902 | 0 | _enc->rc.cur_metrics.dup_count|_enc->rc.cur_metrics.frame_type<<31,4); |
903 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.cur_metrics.log_scale,4); |
904 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.cur_metrics.activity_avg,4); |
905 | 0 | } |
906 | 0 | } |
907 | 0 | else if(_enc->packet_state==OC_PACKET_DONE&& |
908 | 0 | _enc->rc.twopass_buffer_bytes!=OC_RC_2PASS_HDR_SZ){ |
909 | 0 | _enc->rc.twopass_buffer_bytes=0; |
910 | 0 | oc_rc_buffer_val(&_enc->rc,0x5032544F,4); |
911 | 0 | oc_rc_buffer_val(&_enc->rc,OC_RC_2PASS_VERSION,4); |
912 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.frames_total[0],4); |
913 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.frames_total[1],4); |
914 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.frames_total[2],4); |
915 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.exp[0],1); |
916 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.exp[1],1); |
917 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.scale_sum[0],8); |
918 | 0 | oc_rc_buffer_val(&_enc->rc,_enc->rc.scale_sum[1],8); |
919 | 0 | } |
920 | 0 | else{ |
921 | | /*The data for this frame has already been retrieved.*/ |
922 | 0 | *_buf=NULL; |
923 | 0 | return 0; |
924 | 0 | } |
925 | 0 | *_buf=_enc->rc.twopass_buffer; |
926 | 0 | return _enc->rc.twopass_buffer_bytes; |
927 | 0 | } |
928 | | |
929 | | static size_t oc_rc_buffer_fill(oc_rc_state *_rc, |
930 | 0 | unsigned char *_buf,size_t _bytes,size_t _consumed,size_t _goal){ |
931 | 0 | while(_rc->twopass_buffer_fill<_goal&&_consumed<_bytes){ |
932 | 0 | _rc->twopass_buffer[_rc->twopass_buffer_fill++]=_buf[_consumed++]; |
933 | 0 | } |
934 | 0 | return _consumed; |
935 | 0 | } |
936 | | |
937 | 0 | static ogg_int64_t oc_rc_unbuffer_val(oc_rc_state *_rc,int _bytes){ |
938 | 0 | ogg_int64_t ret; |
939 | 0 | int shift; |
940 | 0 | ret=0; |
941 | 0 | shift=0; |
942 | 0 | while(_bytes-->0){ |
943 | 0 | ret|=((ogg_int64_t)_rc->twopass_buffer[_rc->twopass_buffer_bytes++])<<shift; |
944 | 0 | shift+=8; |
945 | 0 | } |
946 | 0 | return ret; |
947 | 0 | } |
948 | | |
949 | 0 | int oc_enc_rc_2pass_in(oc_enc_ctx *_enc,unsigned char *_buf,size_t _bytes){ |
950 | 0 | size_t consumed; |
951 | 0 | consumed=0; |
952 | | /*Enable pass 2 mode if this is the first call.*/ |
953 | 0 | if(_enc->rc.twopass==0){ |
954 | 0 | _enc->rc.twopass=2; |
955 | 0 | _enc->rc.twopass_buffer_fill=0; |
956 | 0 | _enc->rc.frames_total[0]=0; |
957 | 0 | _enc->rc.nframe_metrics=0; |
958 | 0 | _enc->rc.cframe_metrics=0; |
959 | 0 | _enc->rc.frame_metrics_head=0; |
960 | 0 | _enc->rc.scale_window0=0; |
961 | 0 | _enc->rc.scale_window_end=0; |
962 | 0 | } |
963 | | /*If we haven't got a valid summary header yet, try to parse one.*/ |
964 | 0 | if(_enc->rc.frames_total[0]==0){ |
965 | 0 | if(!_buf){ |
966 | 0 | int frames_needed; |
967 | | /*If we're using a whole-file buffer, we just need the first frame. |
968 | | Otherwise, we may need as many as one per buffer slot.*/ |
969 | 0 | frames_needed=_enc->rc.frame_metrics==NULL?1:_enc->rc.buf_delay; |
970 | 0 | return OC_RC_2PASS_HDR_SZ+frames_needed*OC_RC_2PASS_PACKET_SZ |
971 | 0 | -_enc->rc.twopass_buffer_fill; |
972 | 0 | } |
973 | 0 | consumed=oc_rc_buffer_fill(&_enc->rc, |
974 | 0 | _buf,_bytes,consumed,OC_RC_2PASS_HDR_SZ); |
975 | 0 | if(_enc->rc.twopass_buffer_fill>=OC_RC_2PASS_HDR_SZ){ |
976 | 0 | ogg_int64_t scale_sum[2]; |
977 | 0 | int exp[2]; |
978 | 0 | int buf_delay; |
979 | | /*Read the summary header data.*/ |
980 | | /*Check the magic value and version number.*/ |
981 | 0 | if(oc_rc_unbuffer_val(&_enc->rc,4)!=0x5032544F|| |
982 | 0 | oc_rc_unbuffer_val(&_enc->rc,4)!=OC_RC_2PASS_VERSION){ |
983 | 0 | _enc->rc.twopass_buffer_bytes=0; |
984 | 0 | return TH_ENOTFORMAT; |
985 | 0 | } |
986 | 0 | _enc->rc.frames_total[0]=(ogg_uint32_t)oc_rc_unbuffer_val(&_enc->rc,4); |
987 | 0 | _enc->rc.frames_total[1]=(ogg_uint32_t)oc_rc_unbuffer_val(&_enc->rc,4); |
988 | 0 | _enc->rc.frames_total[2]=(ogg_uint32_t)oc_rc_unbuffer_val(&_enc->rc,4); |
989 | 0 | exp[0]=(int)oc_rc_unbuffer_val(&_enc->rc,1); |
990 | 0 | exp[1]=(int)oc_rc_unbuffer_val(&_enc->rc,1); |
991 | 0 | scale_sum[0]=oc_rc_unbuffer_val(&_enc->rc,8); |
992 | 0 | scale_sum[1]=oc_rc_unbuffer_val(&_enc->rc,8); |
993 | | /*Make sure the file claims to have at least one frame. |
994 | | Otherwise we probably got the placeholder data from an aborted pass 1. |
995 | | Also make sure the total frame count doesn't overflow an integer.*/ |
996 | 0 | buf_delay=_enc->rc.frames_total[0]+_enc->rc.frames_total[1] |
997 | 0 | +_enc->rc.frames_total[2]; |
998 | 0 | if(_enc->rc.frames_total[0]==0||buf_delay<0|| |
999 | 0 | (ogg_uint32_t)buf_delay<_enc->rc.frames_total[0]|| |
1000 | 0 | (ogg_uint32_t)buf_delay<_enc->rc.frames_total[1]){ |
1001 | 0 | _enc->rc.frames_total[0]=0; |
1002 | 0 | _enc->rc.twopass_buffer_bytes=0; |
1003 | 0 | return TH_EBADHEADER; |
1004 | 0 | } |
1005 | | /*Got a valid header; set up pass 2.*/ |
1006 | 0 | _enc->rc.frames_left[0]=_enc->rc.frames_total[0]; |
1007 | 0 | _enc->rc.frames_left[1]=_enc->rc.frames_total[1]; |
1008 | 0 | _enc->rc.frames_left[2]=_enc->rc.frames_total[2]; |
1009 | | /*If the user hasn't specified a buffer size, use the whole file.*/ |
1010 | 0 | if(_enc->rc.frame_metrics==NULL){ |
1011 | 0 | _enc->rc.buf_delay=buf_delay; |
1012 | 0 | _enc->rc.nframes[0]=_enc->rc.frames_total[0]; |
1013 | 0 | _enc->rc.nframes[1]=_enc->rc.frames_total[1]; |
1014 | 0 | _enc->rc.nframes[2]=_enc->rc.frames_total[2]; |
1015 | 0 | _enc->rc.scale_sum[0]=scale_sum[0]; |
1016 | 0 | _enc->rc.scale_sum[1]=scale_sum[1]; |
1017 | 0 | _enc->rc.scale_window_end=buf_delay; |
1018 | 0 | oc_enc_rc_reset(_enc); |
1019 | 0 | } |
1020 | 0 | _enc->rc.exp[0]=exp[0]; |
1021 | 0 | _enc->rc.exp[1]=exp[1]; |
1022 | | /*Clear the header data from the buffer to make room for packet data.*/ |
1023 | 0 | _enc->rc.twopass_buffer_fill=0; |
1024 | 0 | _enc->rc.twopass_buffer_bytes=0; |
1025 | 0 | } |
1026 | 0 | } |
1027 | 0 | if(_enc->rc.frames_total[0]!=0){ |
1028 | 0 | ogg_int64_t curframe_num; |
1029 | 0 | int nframes_total; |
1030 | 0 | curframe_num=_enc->state.curframe_num; |
1031 | 0 | if(curframe_num>=0){ |
1032 | | /*We just encoded a frame; make sure things matched.*/ |
1033 | 0 | if(_enc->rc.prev_metrics.dup_count!=_enc->prev_dup_count){ |
1034 | 0 | _enc->rc.twopass_buffer_bytes=0; |
1035 | 0 | return TH_EINVAL; |
1036 | 0 | } |
1037 | 0 | } |
1038 | 0 | curframe_num+=_enc->prev_dup_count+1; |
1039 | 0 | nframes_total=_enc->rc.frames_total[0]+_enc->rc.frames_total[1] |
1040 | 0 | +_enc->rc.frames_total[2]; |
1041 | 0 | if(curframe_num>=nframes_total){ |
1042 | | /*We don't want any more data after the last frame, and we don't want to |
1043 | | allow any more frames to be encoded.*/ |
1044 | 0 | _enc->rc.twopass_buffer_bytes=0; |
1045 | 0 | } |
1046 | 0 | else if(_enc->rc.twopass_buffer_bytes==0){ |
1047 | 0 | if(_enc->rc.frame_metrics==NULL){ |
1048 | | /*We're using a whole-file buffer:*/ |
1049 | 0 | if(!_buf)return OC_RC_2PASS_PACKET_SZ-_enc->rc.twopass_buffer_fill; |
1050 | 0 | consumed=oc_rc_buffer_fill(&_enc->rc, |
1051 | 0 | _buf,_bytes,consumed,OC_RC_2PASS_PACKET_SZ); |
1052 | 0 | if(_enc->rc.twopass_buffer_fill>=OC_RC_2PASS_PACKET_SZ){ |
1053 | 0 | ogg_uint32_t dup_count; |
1054 | 0 | ogg_int32_t log_scale; |
1055 | 0 | unsigned activity; |
1056 | 0 | int qti; |
1057 | 0 | int arg; |
1058 | | /*Read the metrics for the next frame.*/ |
1059 | 0 | dup_count=oc_rc_unbuffer_val(&_enc->rc,4); |
1060 | 0 | log_scale=oc_rc_unbuffer_val(&_enc->rc,4); |
1061 | 0 | activity=oc_rc_unbuffer_val(&_enc->rc,4); |
1062 | 0 | _enc->rc.cur_metrics.log_scale=log_scale; |
1063 | 0 | qti=(dup_count&0x80000000)>>31; |
1064 | 0 | _enc->rc.cur_metrics.dup_count=dup_count&0x7FFFFFFF; |
1065 | 0 | _enc->rc.cur_metrics.frame_type=qti; |
1066 | 0 | _enc->rc.twopass_force_kf=qti==OC_INTRA_FRAME; |
1067 | 0 | _enc->activity_avg=_enc->rc.cur_metrics.activity_avg=activity; |
1068 | | /*"Helpfully" set the dup count back to what it was in pass 1.*/ |
1069 | 0 | arg=_enc->rc.cur_metrics.dup_count; |
1070 | 0 | th_encode_ctl(_enc,TH_ENCCTL_SET_DUP_COUNT,&arg,sizeof(arg)); |
1071 | | /*Clear the buffer for the next frame.*/ |
1072 | 0 | _enc->rc.twopass_buffer_fill=0; |
1073 | 0 | } |
1074 | 0 | } |
1075 | 0 | else{ |
1076 | 0 | int frames_needed; |
1077 | | /*We're using a finite buffer:*/ |
1078 | 0 | frames_needed=OC_MINI(_enc->rc.buf_delay-OC_MINI(_enc->rc.buf_delay, |
1079 | 0 | _enc->rc.scale_window_end-_enc->rc.scale_window0), |
1080 | 0 | _enc->rc.frames_left[0]+_enc->rc.frames_left[1] |
1081 | 0 | -_enc->rc.nframes[0]-_enc->rc.nframes[1]); |
1082 | 0 | while(frames_needed>0){ |
1083 | 0 | if(!_buf){ |
1084 | 0 | return OC_RC_2PASS_PACKET_SZ*frames_needed |
1085 | 0 | -_enc->rc.twopass_buffer_fill; |
1086 | 0 | } |
1087 | 0 | consumed=oc_rc_buffer_fill(&_enc->rc, |
1088 | 0 | _buf,_bytes,consumed,OC_RC_2PASS_PACKET_SZ); |
1089 | 0 | if(_enc->rc.twopass_buffer_fill>=OC_RC_2PASS_PACKET_SZ){ |
1090 | 0 | oc_frame_metrics *m; |
1091 | 0 | int fmi; |
1092 | 0 | ogg_uint32_t dup_count; |
1093 | 0 | ogg_int32_t log_scale; |
1094 | 0 | int qti; |
1095 | 0 | unsigned activity; |
1096 | | /*Read the metrics for the next frame.*/ |
1097 | 0 | dup_count=oc_rc_unbuffer_val(&_enc->rc,4); |
1098 | 0 | log_scale=oc_rc_unbuffer_val(&_enc->rc,4); |
1099 | 0 | activity=oc_rc_unbuffer_val(&_enc->rc,4); |
1100 | | /*Add the to the circular buffer.*/ |
1101 | 0 | fmi=_enc->rc.frame_metrics_head+_enc->rc.nframe_metrics++; |
1102 | 0 | if(fmi>=_enc->rc.cframe_metrics)fmi-=_enc->rc.cframe_metrics; |
1103 | 0 | m=_enc->rc.frame_metrics+fmi; |
1104 | 0 | m->log_scale=log_scale; |
1105 | 0 | qti=(dup_count&0x80000000)>>31; |
1106 | 0 | m->dup_count=dup_count&0x7FFFFFFF; |
1107 | 0 | m->frame_type=qti; |
1108 | 0 | m->activity_avg=activity; |
1109 | | /*And accumulate the statistics over the window.*/ |
1110 | 0 | _enc->rc.nframes[qti]++; |
1111 | 0 | _enc->rc.nframes[2]+=m->dup_count; |
1112 | 0 | _enc->rc.scale_sum[qti]+=oc_bexp_q24(m->log_scale); |
1113 | 0 | _enc->rc.scale_window_end+=m->dup_count+1; |
1114 | | /*Compute an upper bound on the number of remaining packets needed |
1115 | | for the current window.*/ |
1116 | 0 | frames_needed=OC_MINI(_enc->rc.buf_delay-OC_MINI(_enc->rc.buf_delay, |
1117 | 0 | _enc->rc.scale_window_end-_enc->rc.scale_window0), |
1118 | 0 | _enc->rc.frames_left[0]+_enc->rc.frames_left[1] |
1119 | 0 | -_enc->rc.nframes[0]-_enc->rc.nframes[1]); |
1120 | | /*Clear the buffer for the next frame.*/ |
1121 | 0 | _enc->rc.twopass_buffer_fill=0; |
1122 | 0 | _enc->rc.twopass_buffer_bytes=0; |
1123 | 0 | } |
1124 | | /*Go back for more data.*/ |
1125 | 0 | else break; |
1126 | 0 | } |
1127 | | /*If we've got all the frames we need, fill in the current metrics. |
1128 | | We're ready to go.*/ |
1129 | 0 | if(frames_needed<=0){ |
1130 | 0 | int arg; |
1131 | 0 | *&_enc->rc.cur_metrics= |
1132 | 0 | *(_enc->rc.frame_metrics+_enc->rc.frame_metrics_head); |
1133 | 0 | _enc->rc.twopass_force_kf= |
1134 | 0 | _enc->rc.cur_metrics.frame_type==OC_INTRA_FRAME; |
1135 | 0 | _enc->activity_avg=_enc->rc.cur_metrics.activity_avg; |
1136 | | /*"Helpfully" set the dup count back to what it was in pass 1.*/ |
1137 | 0 | arg=_enc->rc.cur_metrics.dup_count; |
1138 | 0 | th_encode_ctl(_enc,TH_ENCCTL_SET_DUP_COUNT,&arg,sizeof(arg)); |
1139 | | /*Mark us ready for the next frame.*/ |
1140 | 0 | _enc->rc.twopass_buffer_bytes=1; |
1141 | 0 | } |
1142 | 0 | } |
1143 | 0 | } |
1144 | 0 | } |
1145 | 0 | return (int)consumed; |
1146 | 0 | } |