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

MPEG4 encoding/decodeing issues

phoenixpl
Beginner
746 Views

Hello,

I have two questions:

1. I have tryied H264 and MPEG4 encoders to encode 16 live images at the same time. Right now I have best performance on MPEG4, but still for only 5 video streams I'm getting only 8-10 frames per stream on bitrate = 2000000 (for 16 streams even lower). Ether I'm doing something wrong or I'm changing wrong parameters, but it seams that bitrate is the only parameter that has influance on image quality and I need it quite high. Is there a way to set MPEG4 or H264 to encode 16 live streams with at least 12 frames? I'm using P4 2.8Ghz with 512MB RAM.

2. I have tried to decode MPEG4 stream, but I can't get any response from decoder. I have already written all compressed data to AVI file and I can play it back in any kind of player without any problems, but I need to put compressed data into specific file structure that is not AVI or any other media format. I have already tested my solution with raw data or H264, so I know that I'm reading file stream correctly. The problem is that when I feed single data chunk into MPEG4 decoder it is returning me -899 error code. This is a part of code that I'm using to initialize decoder:

//constructor

m_dataOut =

new UMC::VideoData;

m_dataIn =

new UMC::MediaData;

UMC::VideoStreamInfo video_info;

video_info.color_format = UMC::YV12;

video_info.stream_type = UMC::MPEG4_VIDEO;

video_info.stream_subtype = UMC::UNDEF_VIDEO_SUBTYPE;

video_info.clip_info.width = XDIM;

video_info.clip_info.height = YDIM;

UMC::ColorConversionInfo ColorInit;

ColorInit.SizeSource.width = XDIM;

ColorInit.SizeSource.height = YDIM;

ColorInit.FormatDest = UMC::YV12;

ColorInit.SizeDest.width = XDIM;

ColorInit.SizeDest.height = YDIM;

ColorInit.lFlags = 1;

ColorInit.lDeinterlace = 0;

ColorInit.lInterpolation = UMC::FLAG_CCNV_CONVERT;

UMC::ColorSpaceConverter ColorDecoder;

m_mpeg4_Param.info = video_info;

m_mpeg4_Param.cformat = UMC::YV12;

m_mpeg4_Param.lFlags = 0;

m_mpeg4_Param.lpConverter = &ColorDecoder;

m_mpeg4_Param.lpConvertInit = &ColorInit;

m_mpeg4_Param.uiLimitThreads = 1;

UMC::Status status = m_mpeg4_dec.Init( &m_mpeg4_Param );

// decoding routin

int mRetval;

BYTE *pY = _buffer;

BYTE *pU = _buffer + ( XDIM * YDIM );

BYTE *pV = pU + ( XDIM * YDIM ) / 4;

m_dataOut->SetDest( pY, pU, pV

);

m_dataOut->SetPitch( XDIM, XDIM/4, XDIM/4 );

m_dataIn->SetBufferPointer( _dataFile.data, _dataFile.dataSize );

m_dataIn->SetDataSize( _dataFile.dataSize );

mRetval = m_mpeg4_dec.GetFrame( m_dataIn, m_dataOut );

return _buffer;

When I retrive mRetval value it's -899. What am I doing wrong? Do I have problems because I'm not using streams from avisplitter or yuvreader?

0 Kudos
6 Replies
phoenixpl
Beginner
746 Views
I have manage to solve my problem with decoding. It apperas that all I had to do was to add FLAG_VDEC_COMPATIBLE. Now decoding seams to work fine. However I still have a big speed issue. Any ideas what can I do to speed up encoding?
0 Kudos
phoenixpl
Beginner
746 Views

I have v5.1.

These are my settings for encoder, where image size is 720x576:

m_mpeg4_Param.Width = XDIM;

m_mpeg4_Param.Height = YDIM;

m_mpeg4_Param.NumOfFrames = 1000000;

m_mpeg4_Param.TimeIncrement = 1;

m_mpeg4_Param.TimeResolution = 30;

m_mpeg4_Param.RateControl = 1;

m_mpeg4_Param.BitRate =2000000;

//25000;

m_mpeg4_Param.quant_type = 0;

m_mpeg4_Param.quantIVOP = 4;

m_mpeg4_Param.quantPVOP = 4;

m_mpeg4_Param.quantBVOP = 6;

m_mpeg4_Param.short_video_header = 0;

m_mpeg4_Param.IVOPdist = 300;

m_mpeg4_Param.BVOPdist = 0;

m_mpeg4_Param.PVOPsearchWidth = 15;

m_mpeg4_Param.PVOPsearchHeight = 15;

m_mpeg4_Param.BVOPsearchWidthForw = 15;

m_mpeg4_Param.BVOPsearchHeightForw = 15;

m_mpeg4_Param.BVOPsearchWidthBack = 15;

m_mpeg4_Param.BVOPsearchHeightBack = 15;

m_mpeg4_Param.MEalgorithm = 1;

m_mpeg4_Param.MEaccuracy = 2;

m_mpeg4_Param.ME4mv = 0;

m_mpeg4_Param.obmc_disable = 1;

m_mpeg4_Param.RoundingControl = 1;

m_mpeg4_Param.calcPSNR = 0;

m_mpeg4_Param.SceneChangeThreshold = 50;

m_mpeg4_Param.insertGOV = 0;

m_mpeg4_Param.repeatHeaders = 0;

m_mpeg4_Param.resync = 0;

m_mpeg4_Param.VideoPacketLenght = 8192;

m_mpeg4_Param.data_partitioned = 0;

m_mpeg4_Param.reversible_vlc = 0;

m_mpeg4_Param.interlaced = 0;

m_mpeg4_Param.top_field_first = 1;

m_mpeg4_Param.alternate_vertical_scan_flag = 1;

m_mpeg4_Param.interlacedME = 0;

m_mpeg4_Param.sprite_enable = 0;

m_mpeg4_Param.no_of_sprite_warping_points = 0;

m_mpeg4_Param.sprite_warping_accuracy = 0;

m_mpeg4_Param.sprite_brightness_change = 0;

m_mpeg4_Param.sprite_left_coordinate = 0;

m_mpeg4_Param.sprite_top_coordinate = 0;

m_mpeg4_Param.sprite_width = 0;

m_mpeg4_Param.sprite_height = 0;

m_mpeg4_Param.warping_mv_code_du = NULL;

m_mpeg4_Param.warping_mv_code_dv = NULL;

m_mpeg4_Param.brightness_change_factor = NULL;

m_mpeg4_Param.load_intra_quant_mat = 0;

m_mpeg4_Param.load_intra_quant_mat_len = 0;

m_mpeg4_Param.load_nonintra_quant_mat = 0;

m_mpeg4_Param.load_nonintra_quant_mat_len = 0;

m_mpeg4_Param.bsBuffer = (Ipp8u*)1;

m_mpeg4_Param.bsBuffSize = 1;

// encoder will not allocate buffer

m_mpeg4_Param.padType = 0;

// set 1 for QuickTime and 2 for DivX v. >= 5

0 Kudos
phoenixpl
Beginner
746 Views
Regarding second question I know that I need to have raw data. AVI file that I have created was just to see if compression is done correctly. All the raw data received from encoder is placed in custom file structure and there is no need to extract it from AVI. The only thing missing that has solved my problem was flag FLAG_VDEC_COMPATIBLE, but thanks for the tip.
0 Kudos
phoenixpl
Beginner
746 Views

I will try those settings with IPP 5.1. Unfrotunately I have downloaded and tried IPP 5.2, but it is:

1. Not compiling h264_enc - some redefinition errors.
2. When mpeg4 encoder Init(...) is called with encode param PADTYPE = 0, 1 or 2 I get immidiet crush "access violation reading location..." and break point in dbgdel.cpp line 52 according to stack view on delete operator. I have used encoder settings listed here(post 30233318). Any ideas what is going on?

0 Kudos
phoenixpl
Beginner
746 Views

It is crushing with any padType. It doesn't metter if I will but 0, 1 or 2 and it crushes and Init(). Now I have modified mpeg4_enc_mis.cpp a little in order to see what is going on. The only thing that I have added is vm_debug_trace and it is showing me that Init() is crushing at delete [] MBinfo ( only number "1" is shown in debug outputwithout "end 1" ). I have already tried cleaning and rebuilding my api, but it doesn't help.

void ippVideoEncoderMPEG4::Close()
{
if (mIsInit) {
// free
if (MBinfo)
{
vm_debug_trace( 1, VM_STRING("1") );
delete [] MBinfo;
vm_debug_trace( 1, VM_STRING("end 1") );
}
if (mbsAlloc && cBS.mBuffer)
{
vm_debug_trace( 1, VM_STRING("2") );
ippsFree(cBS.mBuffer);
}
if (mBuffer_1)
{
vm_debug_trace( 1, VM_STRING("3") );
ippsFree(mBuffer_1);
}
if (mBuffer_2)
{
vm_debug_trace( 1, VM_STRING("4") );
ippsFree(mBuffer_2);
}
0 Kudos
phoenixpl
Beginner
746 Views

I have removed IPP 5.1 just in case and left only IPP 5.2. I'm sure that I'm using correct inlcude files.

I can't build video_enc_con application because I have problem with compiling h264_enc. I was pointed by you to replace header file from some other thread, but it didn't help. I'm still not able to compile h264. This time I don't have redefinition error, but "identifier not found". I have attached both log files. Any other ideas what can I do?

0 Kudos
Reply