47 |
|
|
48 |
double total1 = 0.0; |
double total1 = 0.0; |
49 |
double total2 = 0.0; |
double total2 = 0.0; |
50 |
|
double dbytes, dbytes2; |
51 |
|
|
52 |
if (codec->config.hinted_me) |
if (codec->config.hinted_me) |
53 |
{ |
{ |
253 |
} |
} |
254 |
} |
} |
255 |
|
|
256 |
|
if (frames == 0) |
257 |
|
{ |
258 |
|
twopass->minpsize = (twopass->nns1.kblk + 88) / 8; |
259 |
|
twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8; |
260 |
|
} |
261 |
|
|
262 |
if (!codec_is_in_credits(&codec->config, frames) && |
if (!codec_is_in_credits(&codec->config, frames) && |
263 |
!(twopass->nns1.quant & NNSTATS_KEYFRAME)) |
!(twopass->nns1.quant & NNSTATS_KEYFRAME)) |
264 |
{ |
{ |
265 |
double dbytes = twopass->nns2.bytes / twopass->movie_curve; |
dbytes = twopass->nns2.bytes / twopass->movie_curve; |
266 |
total1 += dbytes; |
total1 += dbytes; |
267 |
|
|
268 |
if (codec->config.use_alt_curve) |
if (codec->config.use_alt_curve) |
270 |
if (dbytes > twopass->average_frame) |
if (dbytes > twopass->average_frame) |
271 |
{ |
{ |
272 |
if (dbytes >= twopass->alt_curve_high) |
if (dbytes >= twopass->alt_curve_high) |
273 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev); |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev); |
274 |
else |
else |
275 |
{ |
{ |
276 |
switch(codec->config.alt_curve_type) |
switch(codec->config.alt_curve_type) |
277 |
{ |
{ |
278 |
case 2: |
case 2: |
279 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
280 |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))); |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))); |
281 |
break; |
break; |
282 |
case 1: |
case 1: |
283 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
284 |
(dbytes - twopass->average_frame) / twopass->alt_curve_high_diff); |
(dbytes - twopass->average_frame) / twopass->alt_curve_high_diff); |
285 |
break; |
break; |
286 |
case 0: |
case 0: |
287 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
288 |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)))); |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)))); |
289 |
} |
} |
290 |
} |
} |
292 |
else |
else |
293 |
{ |
{ |
294 |
if (dbytes <= twopass->alt_curve_low) |
if (dbytes <= twopass->alt_curve_low) |
295 |
total2 += dbytes; |
dbytes2 = dbytes; |
296 |
else |
else |
297 |
{ |
{ |
298 |
switch(codec->config.alt_curve_type) |
switch(codec->config.alt_curve_type) |
299 |
{ |
{ |
300 |
case 2: |
case 2: |
301 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
302 |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))); |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))); |
303 |
break; |
break; |
304 |
case 1: |
case 1: |
305 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
306 |
(dbytes - twopass->average_frame) / twopass->alt_curve_low_diff); |
(dbytes - twopass->average_frame) / twopass->alt_curve_low_diff); |
307 |
break; |
break; |
308 |
case 0: |
case 0: |
309 |
total2 += dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev * |
310 |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)))); |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)))); |
311 |
} |
} |
312 |
} |
} |
316 |
{ |
{ |
317 |
if (dbytes > twopass->average_frame) |
if (dbytes > twopass->average_frame) |
318 |
{ |
{ |
319 |
total2 += ((double)dbytes + (twopass->average_frame - dbytes) * |
dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) * |
320 |
codec->config.curve_compression_high / 100.0); |
codec->config.curve_compression_high / 100.0); |
321 |
} |
} |
322 |
else |
else |
323 |
{ |
{ |
324 |
total2 += ((double)dbytes + (twopass->average_frame - dbytes) * |
dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) * |
325 |
codec->config.curve_compression_low / 100.0); |
codec->config.curve_compression_low / 100.0); |
326 |
} |
} |
327 |
} |
} |
328 |
|
|
329 |
|
if (dbytes2 < twopass->minpsize) |
330 |
|
dbytes2 = twopass->minpsize; |
331 |
|
|
332 |
|
total2 += dbytes2; |
333 |
} |
} |
334 |
|
|
335 |
++frames; |
++frames; |
523 |
} |
} |
524 |
} |
} |
525 |
|
|
526 |
|
if (frames == 0) |
527 |
|
{ |
528 |
|
twopass->minpsize = (twopass->nns1.kblk + 88) / 8; |
529 |
|
twopass->minisize = ((twopass->nns1.kblk * 22) + 240) / 8; |
530 |
|
} |
531 |
|
|
532 |
if (!codec_is_in_credits(&codec->config, frames) && |
if (!codec_is_in_credits(&codec->config, frames) && |
533 |
!(twopass->nns1.quant & NNSTATS_KEYFRAME)) |
!(twopass->nns1.quant & NNSTATS_KEYFRAME)) |
534 |
{ |
{ |
535 |
double dbytes = twopass->nns1.bytes / twopass->movie_curve; |
dbytes = twopass->nns1.bytes / twopass->movie_curve; |
536 |
total1 += dbytes; |
total1 += dbytes; |
537 |
|
|
538 |
if (codec->config.use_alt_curve) |
if (codec->config.use_alt_curve) |
540 |
if (dbytes > twopass->average_frame) |
if (dbytes > twopass->average_frame) |
541 |
{ |
{ |
542 |
if (dbytes >= twopass->alt_curve_high) |
if (dbytes >= twopass->alt_curve_high) |
543 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev); |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev); |
544 |
else |
else |
545 |
{ |
{ |
546 |
switch(codec->config.alt_curve_type) |
switch(codec->config.alt_curve_type) |
547 |
{ |
{ |
548 |
case 2: |
case 2: |
549 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
550 |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))); |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff))); |
551 |
break; |
break; |
552 |
case 1: |
case 1: |
553 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
554 |
(dbytes - twopass->average_frame) / twopass->alt_curve_high_diff); |
(dbytes - twopass->average_frame) / twopass->alt_curve_high_diff); |
555 |
break; |
break; |
556 |
case 0: |
case 0: |
557 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
558 |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)))); |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_high_diff)))); |
559 |
} |
} |
560 |
} |
} |
562 |
else |
else |
563 |
{ |
{ |
564 |
if (dbytes <= twopass->alt_curve_low) |
if (dbytes <= twopass->alt_curve_low) |
565 |
total2 += dbytes; |
dbytes2 = dbytes; |
566 |
else |
else |
567 |
{ |
{ |
568 |
switch(codec->config.alt_curve_type) |
switch(codec->config.alt_curve_type) |
569 |
{ |
{ |
570 |
case 2: |
case 2: |
571 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
572 |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))); |
sin(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff))); |
573 |
break; |
break; |
574 |
case 1: |
case 1: |
575 |
total2 += dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual - twopass->alt_curve_qual_dev * |
576 |
(dbytes - twopass->average_frame) / twopass->alt_curve_low_diff); |
(dbytes - twopass->average_frame) / twopass->alt_curve_low_diff); |
577 |
break; |
break; |
578 |
case 0: |
case 0: |
579 |
total2 += dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev * |
dbytes2 = dbytes * (twopass->alt_curve_mid_qual + twopass->alt_curve_qual_dev * |
580 |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)))); |
(1.0 - cos(DEG2RAD * ((dbytes - twopass->average_frame) * 90.0 / twopass->alt_curve_low_diff)))); |
581 |
} |
} |
582 |
} |
} |
586 |
{ |
{ |
587 |
if (dbytes > twopass->average_frame) |
if (dbytes > twopass->average_frame) |
588 |
{ |
{ |
589 |
total2 += ((double)dbytes + (twopass->average_frame - dbytes) * |
dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) * |
590 |
codec->config.curve_compression_high / 100.0); |
codec->config.curve_compression_high / 100.0); |
591 |
} |
} |
592 |
else |
else |
593 |
{ |
{ |
594 |
total2 += ((double)dbytes + (twopass->average_frame - dbytes) * |
dbytes2 = ((double)dbytes + (twopass->average_frame - dbytes) * |
595 |
codec->config.curve_compression_low / 100.0); |
codec->config.curve_compression_low / 100.0); |
596 |
} |
} |
597 |
} |
} |
598 |
|
|
599 |
|
if (dbytes2 < twopass->minpsize) |
600 |
|
dbytes2 = twopass->minpsize; |
601 |
|
|
602 |
|
total2 += dbytes2; |
603 |
} |
} |
604 |
|
|
605 |
++frames; |
++frames; |
958 |
bytes2 += ((int)dbytes); |
bytes2 += ((int)dbytes); |
959 |
} |
} |
960 |
|
|
961 |
|
if (frame->intra) |
962 |
|
{ |
963 |
|
if (bytes2 < twopass->minisize) |
964 |
|
{ |
965 |
|
curve_comp_error -= twopass->minisize - bytes2; |
966 |
|
bytes2 = twopass->minisize; |
967 |
|
} |
968 |
|
} |
969 |
|
else |
970 |
|
{ |
971 |
// cap bytes2 to first pass size, lowers number of quant=1 frames |
// cap bytes2 to first pass size, lowers number of quant=1 frames |
972 |
if (bytes2 > bytes1) |
if (bytes2 > bytes1) |
973 |
{ |
{ |
974 |
curve_comp_error += bytes2 - bytes1; |
curve_comp_error += bytes2 - bytes1; |
975 |
bytes2 = bytes1; |
bytes2 = bytes1; |
976 |
} |
} |
977 |
else if (bytes2 < 1) |
else if (bytes2 < twopass->minpsize) |
978 |
{ |
bytes2 = twopass->minpsize; |
|
curve_comp_error += --bytes2; |
|
|
bytes2 = 1; |
|
979 |
} |
} |
980 |
} |
} |
981 |
|
|
1009 |
|
|
1010 |
// Foxer: scale overflow in relation to average size, so smaller frames don't get |
// Foxer: scale overflow in relation to average size, so smaller frames don't get |
1011 |
// too much/little bitrate |
// too much/little bitrate |
1012 |
overflow = (int)((double)overflow * bytes2 / twopass->average_frame); |
overflow = (int)((double)overflow * bytes2 / twopass->average_frame * |
1013 |
|
(bytes1 - bytes2) / bytes1); |
1014 |
|
|
1015 |
// Foxer: reign in overflow with huge frames |
// Foxer: reign in overflow with huge frames |
1016 |
if (labs(overflow) > labs(twopass->overflow)) |
if (labs(overflow) > labs(twopass->overflow)) |
1262 |
return; |
return; |
1263 |
} |
} |
1264 |
} |
} |
1265 |
|
|