21 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
22 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 |
* |
* |
24 |
* $Id: encoder.c,v 1.120 2005-11-22 10:23:01 suxen_drol Exp $ |
* $Id: encoder.c,v 1.124 2006-02-15 20:58:43 Isibaar Exp $ |
25 |
* |
* |
26 |
****************************************************************************/ |
****************************************************************************/ |
27 |
|
|
238 |
goto xvid_err_memory1a; |
goto xvid_err_memory1a; |
239 |
} |
} |
240 |
|
|
241 |
|
/* temp lambdas */ |
242 |
|
if (pEnc->mbParam.plugin_flags & XVID_REQLAMBDA) { |
243 |
|
pEnc->temp_lambda = (float *) xvid_malloc(pEnc->mbParam.mb_width * |
244 |
|
pEnc->mbParam.mb_height * 6 * sizeof(float), CACHE_LINE); |
245 |
|
if (pEnc->temp_lambda == NULL) |
246 |
|
goto xvid_err_memory1a; |
247 |
|
} |
248 |
|
|
249 |
/* bframes */ |
/* bframes */ |
250 |
pEnc->mbParam.max_bframes = MAX(create->max_bframes, 0); |
pEnc->mbParam.max_bframes = MAX(create->max_bframes, 0); |
251 |
pEnc->mbParam.bquant_ratio = MAX(create->bquant_ratio, 0); |
pEnc->mbParam.bquant_ratio = MAX(create->bquant_ratio, 0); |
527 |
xvid_free(pEnc->temp_dquants); |
xvid_free(pEnc->temp_dquants); |
528 |
} |
} |
529 |
|
|
530 |
|
if(pEnc->mbParam.plugin_flags & XVID_REQLAMBDA) { |
531 |
|
xvid_free(pEnc->temp_lambda); |
532 |
|
} |
533 |
|
|
534 |
xvid_err_memory0: |
xvid_err_memory0: |
535 |
for (n=0; n<pEnc->num_plugins;n++) { |
for (n=0; n<pEnc->num_plugins;n++) { |
536 |
if (pEnc->plugins[n].func) { |
if (pEnc->plugins[n].func) { |
663 |
static void call_plugins(Encoder * pEnc, FRAMEINFO * frame, IMAGE * original, |
static void call_plugins(Encoder * pEnc, FRAMEINFO * frame, IMAGE * original, |
664 |
int opt, int * type, int * quant, xvid_enc_stats_t * stats) |
int opt, int * type, int * quant, xvid_enc_stats_t * stats) |
665 |
{ |
{ |
666 |
unsigned int i, j; |
unsigned int i, j, k; |
667 |
xvid_plg_data_t data; |
xvid_plg_data_t data; |
668 |
|
|
669 |
/* set data struct */ |
/* set data struct */ |
725 |
memset(data.dquant, 0, data.mb_width*data.mb_height); |
memset(data.dquant, 0, data.mb_width*data.mb_height); |
726 |
} |
} |
727 |
|
|
728 |
|
if(pEnc->mbParam.plugin_flags & XVID_REQLAMBDA) { |
729 |
|
int block = 0; |
730 |
|
data.lambda = pEnc->temp_lambda; |
731 |
|
for(i = 0;i < pEnc->mbParam.mb_height; i++) |
732 |
|
for(j = 0;j < pEnc->mbParam.mb_width; j++) |
733 |
|
for (k = 0; k < 6; k++) |
734 |
|
data.lambda[block++] = 1.0f; |
735 |
|
} |
736 |
|
|
737 |
} else { /* XVID_PLG_AFTER */ |
} else { /* XVID_PLG_AFTER */ |
738 |
if ((pEnc->mbParam.plugin_flags & XVID_REQORIGINAL)) { |
if ((pEnc->mbParam.plugin_flags & XVID_REQORIGINAL)) { |
739 |
data.original.csp = XVID_CSP_PLANAR; |
data.original.csp = XVID_CSP_PLANAR; |
837 |
frame->mbs[j*pEnc->mbParam.mb_width + i].dquant = 0; |
frame->mbs[j*pEnc->mbParam.mb_width + i].dquant = 0; |
838 |
} |
} |
839 |
} |
} |
840 |
|
|
841 |
|
if (pEnc->mbParam.plugin_flags & XVID_REQLAMBDA) { |
842 |
|
for (j = 0; j < pEnc->mbParam.mb_height; j++) |
843 |
|
for (i = 0; i < pEnc->mbParam.mb_width; i++) |
844 |
|
for (k = 0; k < 6; k++) { |
845 |
|
frame->mbs[j*pEnc->mbParam.mb_width + i].lambda[k] = |
846 |
|
(int) ((float)(1<<LAMBDA_EXP) * data.lambda[6 * (j * data.mb_width + i) + k]); |
847 |
|
} |
848 |
|
} else { |
849 |
|
for (j = 0; j<pEnc->mbParam.mb_height; j++) |
850 |
|
for (i = 0; i<pEnc->mbParam.mb_width; i++) |
851 |
|
for (k = 0; k < 6; k++) { |
852 |
|
frame->mbs[j*pEnc->mbParam.mb_width + i].lambda[k] = 1<<LAMBDA_EXP; |
853 |
|
} |
854 |
|
} |
855 |
|
|
856 |
|
|
857 |
frame->mbs[0].quant = data.quant; /* FRAME will not affect the quant in stats */ |
frame->mbs[0].quant = data.quant; /* FRAME will not affect the quant in stats */ |
858 |
} |
} |
859 |
|
|
1384 |
|
|
1385 |
if ( FrameCodeP(pEnc, &bs) == 0 ) { |
if ( FrameCodeP(pEnc, &bs) == 0 ) { |
1386 |
/* N-VOP, we mustn't code b-frames yet */ |
/* N-VOP, we mustn't code b-frames yet */ |
1387 |
|
if ((pEnc->mbParam.global_flags & XVID_GLOBAL_PACKED) || |
1388 |
|
pEnc->mbParam.max_bframes == 0) |
1389 |
call_plugins(pEnc, pEnc->current, &pEnc->sOriginal, XVID_PLG_AFTER, NULL, NULL, stats); |
call_plugins(pEnc, pEnc->current, &pEnc->sOriginal, XVID_PLG_AFTER, NULL, NULL, stats); |
1390 |
goto done; |
goto done; |
1391 |
} |
} |
1496 |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1, pEnc->current->mbs[0].quant); |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1, pEnc->current->mbs[0].quant); |
1497 |
|
|
1498 |
pEnc->current->sStat.iTextBits = 0; |
pEnc->current->sStat.iTextBits = 0; |
1499 |
|
pEnc->current->sStat.iMVBits = 0; |
1500 |
pEnc->current->sStat.kblks = mb_width * mb_height; |
pEnc->current->sStat.kblks = mb_width * mb_height; |
1501 |
pEnc->current->sStat.mblks = pEnc->current->sStat.ublks = 0; |
pEnc->current->sStat.mblks = pEnc->current->sStat.ublks = 0; |
1502 |
|
|
1595 |
if ((current->vop_flags & XVID_VOP_HALFPEL)) { |
if ((current->vop_flags & XVID_VOP_HALFPEL)) { |
1596 |
if (reference->is_interpolated != current->rounding_type) { |
if (reference->is_interpolated != current->rounding_type) { |
1597 |
start_timer(); |
start_timer(); |
1598 |
image_interpolate(pRef, &pEnc->vInterH, &pEnc->vInterV, |
image_interpolate(pRef->y, pEnc->vInterH.y, pEnc->vInterV.y, |
1599 |
&pEnc->vInterHV, pParam->edged_width, |
pEnc->vInterHV.y, pParam->edged_width, |
1600 |
pParam->edged_height, |
pParam->edged_height, |
1601 |
(pParam->vol_flags & XVID_VOL_QUARTERPEL), |
(pParam->vol_flags & XVID_VOL_QUARTERPEL), |
1602 |
current->rounding_type); |
current->rounding_type); |
1606 |
} |
} |
1607 |
|
|
1608 |
current->sStat.iTextBits = current->sStat.iMvSum = current->sStat.iMvCount = |
current->sStat.iTextBits = current->sStat.iMvSum = current->sStat.iMvCount = |
1609 |
current->sStat.kblks = current->sStat.mblks = current->sStat.ublks = 0; |
current->sStat.kblks = current->sStat.mblks = current->sStat.ublks = |
1610 |
|
current->sStat.iMVBits = 0; |
1611 |
|
|
1612 |
current->coding_type = P_VOP; |
current->coding_type = P_VOP; |
1613 |
|
|
1799 |
(pParam->frame_drop_ratio * mb_width * mb_height) / 100 && |
(pParam->frame_drop_ratio * mb_width * mb_height) / 100 && |
1800 |
( (pEnc->bframenum_head >= pEnc->bframenum_tail) || !(pEnc->mbParam.global_flags & XVID_GLOBAL_CLOSED_GOP)) ) |
( (pEnc->bframenum_head >= pEnc->bframenum_tail) || !(pEnc->mbParam.global_flags & XVID_GLOBAL_CLOSED_GOP)) ) |
1801 |
{ |
{ |
1802 |
current->sStat.kblks = current->sStat.mblks = 0; |
current->sStat.kblks = current->sStat.mblks = current->sStat.iTextBits = 0; |
1803 |
current->sStat.ublks = mb_width * mb_height; |
current->sStat.ublks = mb_width * mb_height; |
1804 |
|
|
1805 |
BitstreamReset(bs); |
BitstreamReset(bs); |
1889 |
|
|
1890 |
if (pEnc->reference->is_interpolated != 0) { |
if (pEnc->reference->is_interpolated != 0) { |
1891 |
start_timer(); |
start_timer(); |
1892 |
image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
image_interpolate(f_ref->y, pEnc->f_refh.y, pEnc->f_refv.y, pEnc->f_refhv.y, |
1893 |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
1894 |
(pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); |
(pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); |
1895 |
stop_inter_timer(); |
stop_inter_timer(); |
1906 |
|
|
1907 |
if (pEnc->current->is_interpolated != 0) { |
if (pEnc->current->is_interpolated != 0) { |
1908 |
start_timer(); |
start_timer(); |
1909 |
image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
image_interpolate(b_ref->y, pEnc->vInterH.y, pEnc->vInterV.y, pEnc->vInterHV.y, |
1910 |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
1911 |
(pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); |
(pEnc->mbParam.vol_flags & XVID_VOL_QUARTERPEL), 0); |
1912 |
stop_inter_timer(); |
stop_inter_timer(); |
1914 |
} |
} |
1915 |
|
|
1916 |
frame->coding_type = B_VOP; |
frame->coding_type = B_VOP; |
1917 |
call_plugins(pEnc, pEnc->current, NULL, XVID_PLG_FRAME, NULL, NULL, NULL); |
call_plugins(pEnc, frame, NULL, XVID_PLG_FRAME, NULL, NULL, NULL); |
1918 |
|
|
1919 |
start_timer(); |
start_timer(); |
1920 |
MotionEstimationBVOP(&pEnc->mbParam, frame, |
MotionEstimationBVOP(&pEnc->mbParam, frame, |
1930 |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame, 1, frame->quant); |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, frame, 1, frame->quant); |
1931 |
|
|
1932 |
frame->sStat.iTextBits = 0; |
frame->sStat.iTextBits = 0; |
1933 |
|
frame->sStat.iMVBits = 0; |
1934 |
frame->sStat.iMvSum = 0; |
frame->sStat.iMvSum = 0; |
1935 |
frame->sStat.iMvCount = 0; |
frame->sStat.iMvCount = 0; |
1936 |
frame->sStat.kblks = frame->sStat.mblks = frame->sStat.ublks = 0; |
frame->sStat.kblks = frame->sStat.mblks = frame->sStat.ublks = 0; |