73 |
Bitstream * bs, |
Bitstream * bs, |
74 |
uint32_t * pBits, |
uint32_t * pBits, |
75 |
bool force_inter, |
bool force_inter, |
76 |
bool vol_header, |
bool vol_header); |
|
int interpolate); |
|
77 |
|
|
78 |
static void FrameCodeB(Encoder * pEnc, |
static void FrameCodeB(Encoder * pEnc, |
79 |
FRAMEINFO * frame, |
FRAMEINFO * frame, |
80 |
Bitstream * bs, |
Bitstream * bs, |
81 |
uint32_t * pBits, |
uint32_t * pBits); |
|
int interpolate_forward, |
|
|
int interpolate_backward); |
|
82 |
|
|
83 |
/***************************************************************************** |
/***************************************************************************** |
84 |
* Local data |
* Local data |
183 |
/* 1 keyframe each 10 seconds */ |
/* 1 keyframe each 10 seconds */ |
184 |
|
|
185 |
if (pParam->max_key_interval <= 0) |
if (pParam->max_key_interval <= 0) |
186 |
pParam->max_key_interval = 10 * pParam->fincr / pParam->fbase; |
pParam->max_key_interval = 10 * pParam->fbase / pParam->fincr; |
187 |
|
|
188 |
pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE); |
pEnc = (Encoder *) xvid_malloc(sizeof(Encoder), CACHE_LINE); |
189 |
if (pEnc == NULL) |
if (pEnc == NULL) |
677 |
|
|
678 |
int input_valid = 1; |
int input_valid = 1; |
679 |
int bframes_count = 0; |
int bframes_count = 0; |
|
int interpolate_forward = 1; |
|
|
int interpolate_backward = 1; |
|
680 |
|
|
681 |
ENC_CHECK(pEnc); |
ENC_CHECK(pEnc); |
682 |
ENC_CHECK(pFrame); |
ENC_CHECK(pFrame); |
711 |
|
|
712 |
SWAP(FRAMEINFO *, pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); |
SWAP(FRAMEINFO *, pEnc->current, pEnc->bframes[pEnc->bframenum_tail]); |
713 |
|
|
714 |
if (pEnc->mbParam.m_quarterpel) |
FrameCodeP(pEnc, &bs, &bits, 1, 0); |
|
pEnc->current->global_flags |= XVID_QUARTERPEL; |
|
|
else |
|
|
pEnc->current->global_flags &= ~XVID_QUARTERPEL; |
|
|
|
|
|
FrameCodeP(pEnc, &bs, &bits, 1, 0, interpolate_backward); |
|
715 |
bframes_count = 0; |
bframes_count = 0; |
|
interpolate_forward = 0; |
|
|
interpolate_backward = 1; |
|
716 |
|
|
717 |
BitstreamPadAlways(&bs); |
BitstreamPadAlways(&bs); |
718 |
pFrame->length = BitstreamLength(&bs); |
pFrame->length = BitstreamLength(&bs); |
727 |
pResult->kblks = pEnc->current->sStat.kblks; |
pResult->kblks = pEnc->current->sStat.kblks; |
728 |
pResult->mblks = pEnc->current->sStat.mblks; |
pResult->mblks = pEnc->current->sStat.mblks; |
729 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
|
pResult->iblks = pEnc->current->sStat.iblks; |
|
|
pResult->qblks = pEnc->current->sStat.qblks; |
|
730 |
} |
} |
731 |
|
|
732 |
return XVID_ERR_OK; |
return XVID_ERR_OK; |
737 |
pEnc->bframenum_head, pEnc->bframenum_tail, |
pEnc->bframenum_head, pEnc->bframenum_tail, |
738 |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
pEnc->queue_head, pEnc->queue_tail, pEnc->queue_size); |
739 |
|
|
740 |
if (pEnc->mbParam.m_quarterpel) |
FrameCodeB(pEnc, pEnc->bframes[pEnc->bframenum_head], &bs, &bits); |
|
pEnc->current->global_flags |= XVID_QUARTERPEL; |
|
|
else |
|
|
pEnc->current->global_flags &= ~XVID_QUARTERPEL; |
|
|
|
|
|
FrameCodeB(pEnc, pEnc->bframes[pEnc->bframenum_head], &bs, |
|
|
&bits, interpolate_forward, interpolate_backward); |
|
741 |
pEnc->bframenum_head++; |
pEnc->bframenum_head++; |
742 |
|
|
|
interpolate_forward = 0; |
|
|
interpolate_backward = 0; |
|
|
|
|
743 |
BitstreamPadAlways(&bs); |
BitstreamPadAlways(&bs); |
744 |
pFrame->length = BitstreamLength(&bs); |
pFrame->length = BitstreamLength(&bs); |
745 |
pFrame->intra = 2; |
pFrame->intra = 2; |
750 |
pResult->kblks = pEnc->current->sStat.kblks; |
pResult->kblks = pEnc->current->sStat.kblks; |
751 |
pResult->mblks = pEnc->current->sStat.mblks; |
pResult->mblks = pEnc->current->sStat.mblks; |
752 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
|
pResult->iblks = pEnc->current->sStat.iblks; |
|
|
pResult->qblks = pEnc->current->sStat.qblks; |
|
753 |
} |
} |
754 |
|
|
755 |
emms(); |
emms(); |
799 |
pResult->kblks = pEnc->current->sStat.kblks; |
pResult->kblks = pEnc->current->sStat.kblks; |
800 |
pResult->mblks = pEnc->current->sStat.mblks; |
pResult->mblks = pEnc->current->sStat.mblks; |
801 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
|
pResult->iblks = pEnc->current->sStat.iblks; |
|
|
pResult->qblks = pEnc->current->sStat.qblks; |
|
802 |
} |
} |
803 |
|
|
804 |
emms(); |
emms(); |
910 |
pResult->kblks = 0; |
pResult->kblks = 0; |
911 |
pResult->mblks = 0; |
pResult->mblks = 0; |
912 |
pResult->ublks = 0; |
pResult->ublks = 0; |
|
pResult->iblks = 0; |
|
|
pResult->qblks = 0; |
|
913 |
} |
} |
914 |
} else { |
} else { |
915 |
|
|
919 |
pResult->kblks = pEnc->current->sStat.kblks; |
pResult->kblks = pEnc->current->sStat.kblks; |
920 |
pResult->mblks = pEnc->current->sStat.mblks; |
pResult->mblks = pEnc->current->sStat.mblks; |
921 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
|
pResult->iblks = pEnc->current->sStat.iblks; |
|
|
pResult->qblks = pEnc->current->sStat.qblks; |
|
922 |
} |
} |
923 |
|
|
924 |
} |
} |
1057 |
if ((pEnc->mbParam.global & XVID_GLOBAL_DEBUG)) { |
if ((pEnc->mbParam.global & XVID_GLOBAL_DEBUG)) { |
1058 |
image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 100, "DX50 BVOP->PVOP"); |
image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 100, "DX50 BVOP->PVOP"); |
1059 |
} |
} |
1060 |
|
FrameCodeP(pEnc, &bs, &bits, 1, 0); |
|
if (pEnc->mbParam.m_quarterpel) |
|
|
pEnc->current->global_flags |= XVID_QUARTERPEL; |
|
|
else |
|
|
pEnc->current->global_flags &= ~XVID_QUARTERPEL; |
|
|
|
|
|
FrameCodeP(pEnc, &bs, &bits, 1, 0, interpolate_backward); |
|
1061 |
bframes_count = 0; |
bframes_count = 0; |
1062 |
pFrame->intra = 0; |
pFrame->intra = 0; |
|
interpolate_forward = 0; |
|
|
interpolate_backward = 1; |
|
1063 |
|
|
1064 |
} else { |
} else { |
1065 |
|
|
|
if (pEnc->mbParam.m_quarterpel) |
|
|
pEnc->current->global_flags |= XVID_QUARTERPEL; |
|
|
else |
|
|
pEnc->current->global_flags &= ~XVID_QUARTERPEL; |
|
|
|
|
1066 |
FrameCodeI(pEnc, &bs, &bits); |
FrameCodeI(pEnc, &bs, &bits); |
1067 |
bframes_count = 0; |
bframes_count = 0; |
|
interpolate_forward = 1; |
|
|
interpolate_backward = 1; |
|
1068 |
pFrame->intra = 1; |
pFrame->intra = 1; |
1069 |
|
|
1070 |
pEnc->bframenum_dx50bvop = -1; |
pEnc->bframenum_dx50bvop = -1; |
1095 |
image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 200, "PVOP"); |
image_printf(&pEnc->current->image, pEnc->mbParam.edged_width, pEnc->mbParam.height, 5, 200, "PVOP"); |
1096 |
} |
} |
1097 |
|
|
1098 |
if (pEnc->mbParam.m_quarterpel) |
FrameCodeP(pEnc, &bs, &bits, 1, 0); |
|
pEnc->current->global_flags |= XVID_QUARTERPEL; |
|
|
else |
|
|
pEnc->current->global_flags &= ~XVID_QUARTERPEL; |
|
|
|
|
|
FrameCodeP(pEnc, &bs, &bits, 1, 0, interpolate_backward); |
|
1099 |
bframes_count = 0; |
bframes_count = 0; |
1100 |
pFrame->intra = 0; |
pFrame->intra = 0; |
|
interpolate_forward = 0; |
|
|
interpolate_backward = 1; |
|
1101 |
pEnc->flush_bframes = 1; |
pEnc->flush_bframes = 1; |
1102 |
|
|
1103 |
if ((pEnc->mbParam.global & XVID_GLOBAL_PACKED) && (pEnc->bframenum_tail > 0)) { |
if ((pEnc->mbParam.global & XVID_GLOBAL_PACKED) && (pEnc->bframenum_tail > 0)) { |
1155 |
pResult->kblks = pEnc->current->sStat.kblks; |
pResult->kblks = pEnc->current->sStat.kblks; |
1156 |
pResult->mblks = pEnc->current->sStat.mblks; |
pResult->mblks = pEnc->current->sStat.mblks; |
1157 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
|
pResult->iblks = pEnc->current->sStat.iblks; |
|
|
pResult->qblks = pEnc->current->sStat.qblks; |
|
1158 |
|
|
1159 |
if (pFrame->general & XVID_EXTRASTATS) |
if (pFrame->general & XVID_EXTRASTATS) |
1160 |
{ pResult->sse_y = |
{ pResult->sse_y = |
1208 |
Bitstream bs; |
Bitstream bs; |
1209 |
uint32_t bits; |
uint32_t bits; |
1210 |
uint16_t write_vol_header = 0; |
uint16_t write_vol_header = 0; |
|
unsigned int old_qpel; |
|
1211 |
|
|
1212 |
float psnr; |
float psnr; |
1213 |
char temp[128]; |
char temp[128]; |
1261 |
pEnc->current->quant = pFrame->quant; |
pEnc->current->quant = pFrame->quant; |
1262 |
} |
} |
1263 |
|
|
|
old_qpel = pEnc->mbParam.m_quarterpel; |
|
|
|
|
1264 |
if ((pEnc->current->global_flags & XVID_QUARTERPEL)) |
if ((pEnc->current->global_flags & XVID_QUARTERPEL)) |
1265 |
pEnc->mbParam.m_quarterpel = 1; |
pEnc->mbParam.m_quarterpel = 1; |
1266 |
else |
else |
1331 |
&& (pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval))) { |
&& (pEnc->iFrameNum >= pEnc->mbParam.iMaxKeyInterval))) { |
1332 |
pFrame->intra = FrameCodeI(pEnc, &bs, &bits); |
pFrame->intra = FrameCodeI(pEnc, &bs, &bits); |
1333 |
} else { |
} else { |
1334 |
if (old_qpel != pEnc->mbParam.m_quarterpel) |
pFrame->intra = FrameCodeP(pEnc, &bs, &bits, 0, write_vol_header); |
|
pEnc->mbParam.m_quarterpel = old_qpel; |
|
|
pFrame->intra = FrameCodeP(pEnc, &bs, &bits, 0, write_vol_header, 1); |
|
1335 |
} |
} |
1336 |
} else { |
} else { |
1337 |
if (pFrame->intra == 1) { |
if (pFrame->intra == 1) { |
1338 |
pFrame->intra = FrameCodeI(pEnc, &bs, &bits); |
pFrame->intra = FrameCodeI(pEnc, &bs, &bits); |
1339 |
} else { |
} else { |
1340 |
if (old_qpel != pEnc->mbParam.m_quarterpel) |
pFrame->intra = FrameCodeP(pEnc, &bs, &bits, 1, write_vol_header); |
|
pEnc->mbParam.m_quarterpel = old_qpel; |
|
|
pFrame->intra = FrameCodeP(pEnc, &bs, &bits, 1, write_vol_header, 1); |
|
1341 |
} |
} |
1342 |
|
|
1343 |
} |
} |
1356 |
pResult->kblks = pEnc->current->sStat.kblks; |
pResult->kblks = pEnc->current->sStat.kblks; |
1357 |
pResult->mblks = pEnc->current->sStat.mblks; |
pResult->mblks = pEnc->current->sStat.mblks; |
1358 |
pResult->ublks = pEnc->current->sStat.ublks; |
pResult->ublks = pEnc->current->sStat.ublks; |
|
pResult->iblks = pEnc->current->sStat.iblks; |
|
|
pResult->qblks = pEnc->current->sStat.qblks; |
|
1359 |
} |
} |
1360 |
|
|
1361 |
emms(); |
emms(); |
1638 |
|
|
1639 |
set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); |
set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); |
1640 |
|
|
1641 |
BitstreamPadAlways(bs); |
BitstreamPad(bs); |
1642 |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1); |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1); |
1643 |
|
|
1644 |
*pBits = BitstreamPos(bs); |
*pBits = BitstreamPos(bs); |
1646 |
pEnc->current->sStat.iTextBits = 0; |
pEnc->current->sStat.iTextBits = 0; |
1647 |
pEnc->current->sStat.kblks = mb_width * mb_height; |
pEnc->current->sStat.kblks = mb_width * mb_height; |
1648 |
pEnc->current->sStat.mblks = pEnc->current->sStat.ublks = 0; |
pEnc->current->sStat.mblks = pEnc->current->sStat.ublks = 0; |
|
pEnc->current->sStat.iblks = pEnc->current->sStat.qblks = 0; |
|
1649 |
|
|
1650 |
for (y = 0; y < mb_height; y++) |
for (y = 0; y < mb_height; y++) |
1651 |
for (x = 0; x < mb_width; x++) { |
for (x = 0; x < mb_width; x++) { |
1701 |
Bitstream * bs, |
Bitstream * bs, |
1702 |
uint32_t * pBits, |
uint32_t * pBits, |
1703 |
bool force_inter, |
bool force_inter, |
1704 |
bool vol_header, |
bool vol_header) |
|
int interpolate) |
|
1705 |
{ |
{ |
1706 |
float fSigma; |
float fSigma; |
1707 |
|
|
1715 |
int x, y, k; |
int x, y, k; |
1716 |
int iSearchRange; |
int iSearchRange; |
1717 |
int bIntra, skip_possible; |
int bIntra, skip_possible; |
|
IMAGE *refh, *refv, *refhv; |
|
1718 |
|
|
1719 |
/* IMAGE *pCurrent = &pEnc->current->image; */ |
/* IMAGE *pCurrent = &pEnc->current->image; */ |
1720 |
IMAGE *pRef = &pEnc->reference->image; |
IMAGE *pRef = &pEnc->reference->image; |
1725 |
mb_height = (pEnc->mbParam.height + 31) / 32; |
mb_height = (pEnc->mbParam.height + 31) / 32; |
1726 |
} |
} |
1727 |
|
|
1728 |
|
start_timer(); |
1729 |
|
image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
1730 |
|
pEnc->mbParam.width, pEnc->mbParam.height); |
1731 |
|
stop_edges_timer(); |
1732 |
|
|
1733 |
pEnc->mbParam.m_rounding_type = 1 - pEnc->mbParam.m_rounding_type; |
pEnc->mbParam.m_rounding_type = 1 - pEnc->mbParam.m_rounding_type; |
1734 |
pEnc->current->rounding_type = pEnc->mbParam.m_rounding_type; |
pEnc->current->rounding_type = pEnc->mbParam.m_rounding_type; |
1735 |
pEnc->current->quarterpel = pEnc->mbParam.m_quarterpel; |
pEnc->current->quarterpel = pEnc->mbParam.m_quarterpel; |
1740 |
else |
else |
1741 |
iLimit = mb_width * mb_height + 1; |
iLimit = mb_width * mb_height + 1; |
1742 |
|
|
|
if((interpolate) || (pEnc->current->rounding_type != 0)) { |
|
|
start_timer(); |
|
|
image_setedges(pRef, pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
|
|
pEnc->mbParam.width, pEnc->mbParam.height); |
|
|
stop_edges_timer(); |
|
|
|
|
1743 |
if ((pEnc->current->global_flags & XVID_HALFPEL)) { |
if ((pEnc->current->global_flags & XVID_HALFPEL)) { |
1744 |
start_timer(); |
start_timer(); |
1745 |
image_interpolate(pRef, &pEnc->vInterH, &pEnc->vInterV, |
image_interpolate(pRef, &pEnc->vInterH, &pEnc->vInterV, |
1750 |
stop_inter_timer(); |
stop_inter_timer(); |
1751 |
} |
} |
1752 |
|
|
|
refh = &pEnc->vInterH; |
|
|
refv = &pEnc->vInterV; |
|
|
refhv = &pEnc->vInterHV; |
|
|
} |
|
|
else { |
|
|
refh = &pEnc->f_refh; |
|
|
refv = &pEnc->f_refv; |
|
|
refhv = &pEnc->f_refhv; |
|
|
} |
|
|
|
|
1753 |
pEnc->current->coding_type = P_VOP; |
pEnc->current->coding_type = P_VOP; |
1754 |
|
|
1755 |
start_timer(); |
start_timer(); |
1758 |
else |
else |
1759 |
bIntra = |
bIntra = |
1760 |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
MotionEstimation(&pEnc->mbParam, pEnc->current, pEnc->reference, |
1761 |
refh, refv, refhv, |
&pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
1762 |
iLimit); |
iLimit); |
1763 |
|
|
1764 |
stop_motion_timer(); |
stop_motion_timer(); |
1785 |
set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); |
set_timecodes(pEnc->current,pEnc->reference,pEnc->mbParam.fbase); |
1786 |
if (vol_header) |
if (vol_header) |
1787 |
{ BitstreamWriteVolHeader(bs, &pEnc->mbParam, pEnc->current); |
{ BitstreamWriteVolHeader(bs, &pEnc->mbParam, pEnc->current); |
1788 |
BitstreamPadAlways(bs); |
BitstreamPad(bs); |
1789 |
} |
} |
1790 |
|
|
1791 |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1); |
BitstreamWriteVopHeader(bs, &pEnc->mbParam, pEnc->current, 1); |
1794 |
|
|
1795 |
pEnc->current->sStat.iTextBits = pEnc->current->sStat.iMvSum = pEnc->current->sStat.iMvCount = |
pEnc->current->sStat.iTextBits = pEnc->current->sStat.iMvSum = pEnc->current->sStat.iMvCount = |
1796 |
pEnc->current->sStat.kblks = pEnc->current->sStat.mblks = pEnc->current->sStat.ublks = 0; |
pEnc->current->sStat.kblks = pEnc->current->sStat.mblks = pEnc->current->sStat.ublks = 0; |
|
pEnc->current->sStat.iblks = pEnc->current->sStat.qblks = 0; |
|
1797 |
|
|
1798 |
|
|
1799 |
for (y = 0; y < mb_height; y++) { |
for (y = 0; y < mb_height; y++) { |
1855 |
|
|
1856 |
start_timer(); |
start_timer(); |
1857 |
MBMotionCompensation(pMB, x, y, &pEnc->reference->image, |
MBMotionCompensation(pMB, x, y, &pEnc->reference->image, |
1858 |
refh, refv, |
&pEnc->vInterH, &pEnc->vInterV, |
1859 |
refhv, &pEnc->vGMC, |
&pEnc->vInterHV, &pEnc->vGMC, |
1860 |
&pEnc->current->image, |
&pEnc->current->image, |
1861 |
dct_codes, pEnc->mbParam.width, |
dct_codes, pEnc->mbParam.width, |
1862 |
pEnc->mbParam.height, |
pEnc->mbParam.height, |
1895 |
pEnc->current->sStat.ublks++; |
pEnc->current->sStat.ublks++; |
1896 |
} |
} |
1897 |
|
|
|
if(pEnc->mbParam.m_quarterpel) { |
|
|
for (k = 0; k < ((pMB->mode == MODE_INTER4V) ? 4 : 1); k++) { |
|
|
if (((pMB->qmvs[k].x % 4) != 0) || ((pMB->qmvs[k].y % 4) != 0)) |
|
|
pEnc->current->sStat.iblks++; |
|
|
|
|
|
if (((pMB->qmvs[k].x % 4) & 1) || ((pMB->qmvs[k].y % 4) & 1)) |
|
|
pEnc->current->sStat.qblks++; |
|
|
} |
|
|
} |
|
|
|
|
1898 |
start_timer(); |
start_timer(); |
1899 |
|
|
1900 |
/* Finished processing the MB, now check if to CODE or SKIP */ |
/* Finished processing the MB, now check if to CODE or SKIP */ |
2089 |
FrameCodeB(Encoder * pEnc, |
FrameCodeB(Encoder * pEnc, |
2090 |
FRAMEINFO * frame, |
FRAMEINFO * frame, |
2091 |
Bitstream * bs, |
Bitstream * bs, |
2092 |
uint32_t * pBits, |
uint32_t * pBits) |
|
int interpolate_forward, |
|
|
int interpolate_backward) |
|
2093 |
{ |
{ |
2094 |
DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE); |
DECLARE_ALIGNED_MATRIX(dct_codes, 6, 64, int16_t, CACHE_LINE); |
2095 |
DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE); |
DECLARE_ALIGNED_MATRIX(qcoeff, 6, 64, int16_t, CACHE_LINE); |
2114 |
|
|
2115 |
frame->quarterpel = pEnc->mbParam.m_quarterpel; |
frame->quarterpel = pEnc->mbParam.m_quarterpel; |
2116 |
|
|
|
if ((interpolate_forward) || ((pEnc->mbParam.m_rounding_type != 1) && interpolate_backward)) { |
|
|
|
|
2117 |
/* forward */ |
/* forward */ |
2118 |
image_setedges(f_ref, pEnc->mbParam.edged_width, |
image_setedges(f_ref, pEnc->mbParam.edged_width, |
2119 |
pEnc->mbParam.edged_height, pEnc->mbParam.width, |
pEnc->mbParam.edged_height, pEnc->mbParam.width, |
2120 |
pEnc->mbParam.height); |
pEnc->mbParam.height); |
2121 |
start_timer(); |
start_timer(); |
2122 |
image_interpolate(f_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
image_interpolate(f_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
2123 |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
2124 |
pEnc->mbParam.m_quarterpel, 0); |
pEnc->mbParam.m_quarterpel, 0); |
2125 |
stop_inter_timer(); |
stop_inter_timer(); |
|
} |
|
|
|
|
|
if (interpolate_backward) { |
|
2126 |
|
|
2127 |
/* backward */ |
/* backward */ |
2128 |
image_setedges(b_ref, pEnc->mbParam.edged_width, |
image_setedges(b_ref, pEnc->mbParam.edged_width, |
2129 |
pEnc->mbParam.edged_height, pEnc->mbParam.width, |
pEnc->mbParam.edged_height, pEnc->mbParam.width, |
2130 |
pEnc->mbParam.height); |
pEnc->mbParam.height); |
2131 |
start_timer(); |
start_timer(); |
2132 |
image_interpolate(b_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
image_interpolate(b_ref, &pEnc->vInterH, &pEnc->vInterV, &pEnc->vInterHV, |
2133 |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
pEnc->mbParam.edged_width, pEnc->mbParam.edged_height, |
2134 |
pEnc->mbParam.m_quarterpel, 0); |
pEnc->mbParam.m_quarterpel, 0); |
2135 |
stop_inter_timer(); |
stop_inter_timer(); |
|
} |
|
2136 |
|
|
2137 |
start_timer(); |
start_timer(); |
2138 |
|
|
2139 |
MotionEstimationBVOP(&pEnc->mbParam, frame, |
MotionEstimationBVOP(&pEnc->mbParam, frame, |
2140 |
((int32_t)(pEnc->current->stamp - frame->stamp)), /* time_bp */ |
((int32_t)(pEnc->current->stamp - frame->stamp)), /* time_bp */ |
2141 |
((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)), /* time_pp */ |
((int32_t)(pEnc->current->stamp - pEnc->reference->stamp)), /* time_pp */ |
2142 |
pEnc->reference->mbs, f_ref, &pEnc->vInterH, |
pEnc->reference->mbs, f_ref, |
2143 |
&pEnc->vInterV, &pEnc->vInterHV, |
&pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv, |
2144 |
pEnc->current, b_ref, &pEnc->f_refh, &pEnc->f_refv, &pEnc->f_refhv); |
pEnc->current, b_ref, &pEnc->vInterH, |
2145 |
|
&pEnc->vInterV, &pEnc->vInterHV); |
2146 |
|
|
2147 |
|
|
2148 |
stop_motion_timer(); |
stop_motion_timer(); |
2149 |
/* |
/* |
2163 |
frame->sStat.iMvSum = 0; |
frame->sStat.iMvSum = 0; |
2164 |
frame->sStat.iMvCount = 0; |
frame->sStat.iMvCount = 0; |
2165 |
frame->sStat.kblks = frame->sStat.mblks = frame->sStat.ublks = 0; |
frame->sStat.kblks = frame->sStat.mblks = frame->sStat.ublks = 0; |
|
frame->sStat.iblks = frame->sStat.qblks = 0; |
|
2166 |
|
|
2167 |
|
|
2168 |
for (y = 0; y < pEnc->mbParam.mb_height; y++) { |
for (y = 0; y < pEnc->mbParam.mb_height; y++) { |
2178 |
|
|
2179 |
if (mb->mode != MODE_DIRECT_NONE_MV) { |
if (mb->mode != MODE_DIRECT_NONE_MV) { |
2180 |
MBMotionCompensationBVOP(&pEnc->mbParam, mb, x, y, &frame->image, |
MBMotionCompensationBVOP(&pEnc->mbParam, mb, x, y, &frame->image, |
2181 |
f_ref, &pEnc->vInterH, &pEnc->vInterV, |
f_ref, &pEnc->f_refh, &pEnc->f_refv, |
2182 |
&pEnc->vInterHV, b_ref, &pEnc->f_refh, |
&pEnc->f_refhv, b_ref, &pEnc->vInterH, |
2183 |
&pEnc->f_refv, &pEnc->f_refhv, |
&pEnc->vInterV, &pEnc->vInterHV, |
2184 |
dct_codes); |
dct_codes); |
2185 |
|
|
2186 |
if (mb->mode == MODE_DIRECT_NO4V) mb->mode = MODE_DIRECT; |
if (mb->mode == MODE_DIRECT_NO4V) mb->mode = MODE_DIRECT; |