49 |
double total2 = 0.0; |
double total2 = 0.0; |
50 |
double dbytes, dbytes2; |
double dbytes, dbytes2; |
51 |
|
|
52 |
|
/* ensure free() is called safely */ |
53 |
|
codec->twopass.hintstream = NULL; |
54 |
|
twopass->nns1_array = NULL; |
55 |
|
twopass->nns2_array = NULL; |
56 |
|
|
57 |
if (codec->config.hinted_me) |
if (codec->config.hinted_me) |
58 |
{ |
{ |
59 |
codec->twopass.hintstream = malloc(100000); |
codec->twopass.hintstream = malloc(100000); |
342 |
|
|
343 |
twopass->movie_curve = ((double)(bframe_total_ext + pframe_total_ext + i_boost_total) / |
twopass->movie_curve = ((double)(bframe_total_ext + pframe_total_ext + i_boost_total) / |
344 |
(bframe_total_ext + pframe_total_ext)); |
(bframe_total_ext + pframe_total_ext)); |
345 |
|
|
346 |
|
if (bframes) |
347 |
twopass->average_bframe = (double)bframe_total_ext / bframes / twopass->movie_curve; |
twopass->average_bframe = (double)bframe_total_ext / bframes / twopass->movie_curve; |
348 |
|
|
349 |
|
if (pframes) |
350 |
twopass->average_pframe = (double)pframe_total_ext / pframes / twopass->movie_curve; |
twopass->average_pframe = (double)pframe_total_ext / pframes / twopass->movie_curve; |
351 |
|
else |
352 |
|
if (bframes) |
353 |
|
twopass->average_pframe = twopass->average_bframe; // b-frame packed bitstream fix |
354 |
|
else |
355 |
|
{ |
356 |
|
DEBUGERR("ERROR: No p-frames or b-frames were present in the 1st pass. Rate control cannot function properly!"); |
357 |
|
return ICERR_ERROR; |
358 |
|
} |
359 |
|
|
360 |
|
|
361 |
|
|
665 |
break; |
break; |
666 |
} |
} |
667 |
|
|
668 |
|
if (bframes) |
669 |
twopass->average_bframe = (double)bframe_total / bframes / twopass->movie_curve; |
twopass->average_bframe = (double)bframe_total / bframes / twopass->movie_curve; |
670 |
|
|
671 |
|
if (pframes) |
672 |
twopass->average_pframe = (double)pframe_total / pframes / twopass->movie_curve; |
twopass->average_pframe = (double)pframe_total / pframes / twopass->movie_curve; |
673 |
|
else |
674 |
|
if (bframes) |
675 |
|
twopass->average_pframe = twopass->average_bframe; // b-frame packed bitstream fix |
676 |
|
else |
677 |
|
{ |
678 |
|
DEBUGERR("ERROR: No p-frames or b-frames were present in the 1st pass. Rate control cannot function properly!"); |
679 |
|
return ICERR_ERROR; |
680 |
|
} |
681 |
|
|
682 |
|
|
683 |
|
|
993 |
|
|
994 |
if (twopass->nns_array_pos >= twopass->nns_array_length) |
if (twopass->nns_array_pos >= twopass->nns_array_length) |
995 |
{ |
{ |
996 |
twopass->nns_array_pos = 0; |
// fix for VirtualDub 1.4.13 bframe handling |
997 |
DEBUG("ERROR: VIDEO EXCEEDS 1ST PASS!!!"); |
if (codec->config.max_bframes > 0 && |
998 |
frame->intra = -1; |
codec->framenum < twopass->nns_array_length + codec->config.max_bframes) |
999 |
return 2; |
{ |
1000 |
|
return ICERR_OK; |
1001 |
|
} |
1002 |
|
else |
1003 |
|
{ |
1004 |
|
DEBUGERR("ERROR: VIDEO EXCEEDS 1ST PASS!!!"); |
1005 |
|
return ICERR_ERROR; |
1006 |
|
} |
1007 |
} |
} |
1008 |
|
|
1009 |
memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS)); |
memcpy(&twopass->nns1, &twopass->nns1_array[twopass->nns_array_pos], sizeof(NNSTATS)); |
1020 |
twopass->bytes2 = bytes1; |
twopass->bytes2 = bytes1; |
1021 |
twopass->desired_bytes2 = bytes1; |
twopass->desired_bytes2 = bytes1; |
1022 |
frame->intra = 3; |
frame->intra = 3; |
1023 |
return 2; |
return ICERR_OK; |
1024 |
} |
} |
1025 |
else if (twopass->nns1.dd_v & NNSTATS_PADFRAME) |
else if (twopass->nns1.dd_v & NNSTATS_PADFRAME) |
1026 |
{ |
{ |
1028 |
twopass->bytes2 = bytes1; |
twopass->bytes2 = bytes1; |
1029 |
twopass->desired_bytes2 = bytes1; |
twopass->desired_bytes2 = bytes1; |
1030 |
frame->intra = 4; |
frame->intra = 4; |
1031 |
return 2; |
return ICERR_OK; |
1032 |
} |
} |
1033 |
else if (twopass->nns1.dd_v & NNSTATS_DELAYFRAME) |
else if (twopass->nns1.dd_v & NNSTATS_DELAYFRAME) |
1034 |
{ |
{ |
1036 |
twopass->bytes2 = bytes1; |
twopass->bytes2 = bytes1; |
1037 |
twopass->desired_bytes2 = bytes1; |
twopass->desired_bytes2 = bytes1; |
1038 |
frame->intra = 5; |
frame->intra = 5; |
1039 |
return 2; |
return ICERR_OK; |
1040 |
} |
} |
1041 |
|
|
1042 |
overflow = twopass->overflow / 8; |
overflow = twopass->overflow / 8; |
1205 |
} |
} |
1206 |
} |
} |
1207 |
} |
} |
|
curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus; |
|
|
|
|
1208 |
if (twopass->nns1.dd_v & NNSTATS_BFRAME) |
if (twopass->nns1.dd_v & NNSTATS_BFRAME) |
1209 |
curve_temp *= twopass->average_bframe / twopass->average_pframe; |
curve_temp *= twopass->average_bframe / twopass->average_pframe; |
1210 |
|
|
1211 |
|
curve_temp = curve_temp * twopass->curve_comp_scale + twopass->curve_bias_bonus; |
1212 |
|
|
1213 |
bytes2 += ((int)curve_temp); |
bytes2 += ((int)curve_temp); |
1214 |
curve_comp_error += curve_temp - ((int)curve_temp); |
curve_comp_error += curve_temp - ((int)curve_temp); |
1215 |
} |
} |
1465 |
|
|
1466 |
if (capped_to_max_framesize == 0) |
if (capped_to_max_framesize == 0) |
1467 |
{ |
{ |
1468 |
if (twopass->nns1.dd_v & NNSTATS_BFRAME) |
if (twopass->nns1.quant & NNSTATS_KEYFRAME) |
1469 |
|
{ |
1470 |
|
last_bquant = frame->quant; |
1471 |
|
last_pquant = frame->quant; |
1472 |
|
} |
1473 |
|
else if (twopass->nns1.dd_v & NNSTATS_BFRAME) |
1474 |
last_bquant = frame->quant; |
last_bquant = frame->quant; |
1475 |
else |
else |
1476 |
last_pquant = frame->quant; |
last_pquant = frame->quant; |
1481 |
frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT; |
frame->general |= (frame->quant < 4) ? XVID_MPEGQUANT : XVID_H263QUANT; |
1482 |
frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT; |
frame->general &= (frame->quant < 4) ? ~XVID_H263QUANT : ~XVID_MPEGQUANT; |
1483 |
} |
} |
1484 |
/* |
|
1485 |
if (codec->config.quant_type == QUANT_MODE_MOD_NEW) |
if (codec->config.quant_type == QUANT_MODE_MOD_NEW) |
1486 |
{ |
{ |
1487 |
frame->general |= (frame->quant < 4) ? XVID_H263QUANT : XVID_MPEGQUANT; |
frame->general |= (frame->quant < 4) ? XVID_H263QUANT : XVID_MPEGQUANT; |
1488 |
frame->general &= (frame->quant < 4) ? ~XVID_MPEGQUANT : ~XVID_H263QUANT; |
frame->general &= (frame->quant < 4) ? ~XVID_MPEGQUANT : ~XVID_H263QUANT; |
1489 |
} |
} |
1490 |
*/ |
|
1491 |
return ICERR_OK; |
return ICERR_OK; |
1492 |
} |
} |
1493 |
|
|
1515 |
{ |
{ |
1516 |
case DLG_MODE_2PASS_1 : |
case DLG_MODE_2PASS_1 : |
1517 |
nns1.bytes = frame->length; // total bytes |
nns1.bytes = frame->length; // total bytes |
1518 |
nns1.dd_v = stats->hlength; // header bytes |
// THIS small bugger messed up 2pass encoding! |
1519 |
|
// nns1.dd_v = stats->hlength; // header bytes |
1520 |
|
nns1.dd_v = 0; |
1521 |
nns1.dd_u = nns1.dd_y = 0; |
nns1.dd_u = nns1.dd_y = 0; |
1522 |
nns1.dk_v = nns1.dk_u = nns1.dk_y = 0; |
nns1.dk_v = nns1.dk_u = nns1.dk_y = 0; |
1523 |
nns1.md_u = nns1.md_y = 0; |
nns1.md_u = nns1.md_y = 0; |
1629 |
else if (codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) { |
else if (codec->twopass.nns1.dd_v & NNSTATS_SKIPFRAME) { |
1630 |
frame_type="skipped"; |
frame_type="skipped"; |
1631 |
frame->quant = 2; |
frame->quant = 2; |
1632 |
codec->twopass.bytes1 = 8; |
codec->twopass.bytes1 = 1; |
1633 |
codec->twopass.desired_bytes2 = 8; |
codec->twopass.desired_bytes2 = 1; |
1634 |
frame->length = 8; |
frame->length = 1; |
1635 |
} |
} |
1636 |
else if (codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) { |
else if (codec->twopass.nns1.dd_v & NNSTATS_PADFRAME) { |
1637 |
frame_type="padded"; |
frame_type="padded"; |
1638 |
frame->quant = 2; |
frame->quant = 2; |
1639 |
codec->twopass.bytes1 = 8; |
codec->twopass.bytes1 = 7; |
1640 |
codec->twopass.desired_bytes2 = 8; |
codec->twopass.desired_bytes2 = 7; |
1641 |
frame->length = 8; |
frame->length = 7; |
1642 |
} |
} |
1643 |
else if (codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME) { |
else if (codec->twopass.nns1.dd_v & NNSTATS_DELAYFRAME) { |
1644 |
frame_type="delayed"; |
frame_type="delayed"; |
1645 |
frame->quant = 2; |
frame->quant = 2; |
1646 |
codec->twopass.bytes1 = 8; |
codec->twopass.bytes1 = 1; |
1647 |
codec->twopass.desired_bytes2 = 8; |
codec->twopass.desired_bytes2 = 1; |
1648 |
frame->length = 8; |
frame->length = 1; |
1649 |
} |
} |
1650 |
|
|
1651 |
DEBUG2ND(frame->quant, quant_type, frame_type, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos) |
DEBUG2ND(frame->quant, quant_type, frame_type, codec->twopass.bytes1, codec->twopass.desired_bytes2, frame->length, codec->twopass.overflow, credits_pos) |
1664 |
char s[100]; |
char s[100]; |
1665 |
|
|
1666 |
if (codec->twopass.nns1_array) |
if (codec->twopass.nns1_array) |
1667 |
|
{ |
1668 |
free(codec->twopass.nns1_array); |
free(codec->twopass.nns1_array); |
1669 |
|
codec->twopass.nns1_array = NULL; |
1670 |
|
} |
1671 |
if (codec->twopass.nns2_array) |
if (codec->twopass.nns2_array) |
1672 |
|
{ |
1673 |
free(codec->twopass.nns2_array); |
free(codec->twopass.nns2_array); |
1674 |
|
codec->twopass.nns2_array = NULL; |
1675 |
|
} |
1676 |
codec->twopass.nns_array_size = 0; |
codec->twopass.nns_array_size = 0; |
1677 |
codec->twopass.nns_array_length = 0; |
codec->twopass.nns_array_length = 0; |
1678 |
codec->twopass.nns_array_pos = 0; |
codec->twopass.nns_array_pos = 0; |