Intel® Integrated Performance Primitives
Deliberate problems developing high-performance vision, signal, security, and storage applications.

MPEG-4 encoder crash problem

ahmadkq
Beginner
332 Views

Hi,

I have a crash in the MPEG-4 encoder when i set the

IVOPdist to 64 and the BVOPdist 10. The crash occurs in the following code in the EncodeBVOP function at the red line.

mvLumaForwDirect[0].dx = (Ipp16s)(mTRB * MBcurr->mv[0].dx / mTRD);
mvLumaForwDirect[0].dy = (Ipp16s)(mTRB * MBcurr->mv[0].dy / mTRD);
mvLumaBackDirect[0].dx = (Ipp16s)((mTRB - mTRD) * MBcurr->mv[0].dx / mTRD);
mvLumaBackDirect[0].dy = (Ipp16s)((mTRB - mTRD) * MBcurr->mv[0].dy / mTRD);
if (VOL.quarter_sample)
{
mp4_Copy16x16QP_8u(pYf, mStepLuma, mcPredD, 16, &mvLumaForwDirect[0], 0);
mp4_Copy16x16QP_8u(pYb, mStepLuma, mcTmp, 16, &mvLumaBackDirect[0], 0);
}
else
{
mp4_Copy16x16HP_8u(pYf, mStepLuma, mcPredD, 16, &mvLumaForwDirect[0], 0);
mp4_Copy16x16HP_8u(pYb, mStepLuma, mcTmp, 16, &mvLumaBackDirect[0], 0);
}
Do you have any idea?

Thanks,

0 Kudos
2 Replies
ahmadkq
Beginner
332 Views
I forget to tell you that i am using IPP v5.1. The

BVOPsearchWidthForw, BVOPsearchWidthBack, BVOPsearchHeightForw, BVOPsearchHeightBack, PVOPsearchWidth andPVOPsearchHeight valuesis1022 for all.

0 Kudos
Vladimir_Dudnik
Employee
332 Views

Hello,

there is answer from our experts:

Yes, there seem to be an issue with backward MV limitation in version 5.1,

the issue will be fixed in the next version of IPP,

as a temporary workaround you can add the following methods in mp4_enc_misc.cpp

(and define them in mp4_enc.hpp):

void

ippVideoEncoderMPEG4::LimitMV(IppMotionVector *pMV, Ipp32s x, Ipp32s y)

{

mp4_Clip(pMV->dx, (Ipp16s)((-16 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));

mp4_Clip(pMV->dy, (Ipp16s)((-16 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));

}

void

ippVideoEncoderMPEG4::LimitMVQ(IppMotionVector *pMV, Ipp32s x, Ipp32s y)

{

mp4_Clip(pMV->dx, (Ipp16s)((-16 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x) << 2));

mp4_Clip(pMV->dy, (Ipp16s)((-16 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y) << 2));

}

void

ippVideoEncoderMPEG4::Limit4MV(IppMotionVector *pMV, Ipp32s x, Ipp32s y)

{

mp4_Clip(pMV[0].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));

mp4_Clip(pMV[0].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));

mp4_Clip(pMV[1].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 1));

mp4_Clip(pMV[1].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y) << 1));

mp4_Clip(pMV[2].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x) << 1));

mp4_Clip(pMV[2].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 1));

mp4_Clip(pMV[3].dx, (Ipp16s)((-8 - x) << 1), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 1));

mp4_Clip(pMV[3].dy, (Ipp16s)((-8 - y) << 1), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 1));

}

void

ippVideoEncoderMPEG4::Limit4MVQ(IppMotionVector *pMV, Ipp32s x, Ipp32s y)

{

mp4_Clip(pMV[0].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x) << 2));

mp4_Clip(pMV[0].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y) << 2));

mp4_Clip(pMV[1].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 2));

mp4_Clip(pMV[1].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y) << 2));

mp4_Clip(pMV[2].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x) << 2));

mp4_Clip(pMV[2].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 2));

mp4_Clip(pMV[3].dx, (Ipp16s)((-8 - x) << 2), (Ipp16s)((VOL.video_object_layer_width - x - 8) << 2));

mp4_Clip(pMV[3].dy, (Ipp16s)((-8 - y) << 2), (Ipp16s)((VOL.video_object_layer_height - y - 8) << 2 ));

}

Then, in mp4_enc_vop.cpp, insert

LimitMV(mvLumaBackDirect, j << 4, i << 4);

in line 3526

LimitMVQ(mvLumaBackDirect, j << 4, i << 4);

line 3523

Limit4MV(mvLumaBackDirect, j << 4, i << 4);

line 3507

Limit4MV

Q(mvLumaBackDirect, j << 4, i << 4); line 3498

and

LimitMV(mvLumaBackDirect, j << 4,

curRow << 4); in line 3135

LimitMVQ(mvLumaBackDirect, j << 4,

curRow << 4); line 3132

Limit4MV(mvLumaBackDirect, j << 4,

curRow << 4); line 3116

Limit4MV

Q(mvLumaBackDirect, j << 4, curRow << 4); line 3107

Regards,
Vladimir

0 Kudos
Reply