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

UMC and OpenCv

bedhead
Beginner
280 Views

I am trying to decode an avi file using UMC. End of my code i wanted to see video frames by using highgui library of opencv. However, all i can see is nothing but a gray window. I did steps which are given in the UMC document using sample codes. Here is my code:

#include
#include
#include "ippdefs.h"
#include "ipps.h"
#include "ippi.h"
#include "ippj.h"
#include "ippcc.h"
#include "vm_time.h"
#include "umc_defs.h"
#include "umc_structures.h"
#include "umc_data_reader.h"
#include "umc_splitter.h"
#include "umc_video_decoder.h"
#include "umc_mpeg4_video_decoder.h"
#include "umc_video_data.h"
#include "umc_file_reader.h"
#include "umc_fio_reader.h"
#include "umc_avi_splitter.h"
#include "cv.h"
#include "highgui.h"
#include "ippimage.h"

using namespace UMC;

UMC::Status InitDataReader(DataReader *data_reader, char *file_name)
{
FileReaderParams reader_params;

reader_params.m_portion_size = 0;
strcpy(reader_params.m_file_name, file_name);

return data_reader->Init(&reader_params);
}

IplImage* InitializeImage(int width, int height, int bitDepth, int channels)
{
IplImage* imgTmp = NULL ;
imgTmp = cvCreateImageHeader(cvSize( width, height), bitDepth, channels );//iplCreateImageHeader(1, 0, IPL_DEPTH_32S, "ARGB", "ARGB", IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_TL, IPL_ALIGN_4BYTES, 768, 576, NULL, NULL, NULL, NULL);
imgTmp->imageData=(char *)malloc(imgTmp->height*imgTmp->widthStep);//(IMAGE_WIDTH*IMAGE_HEIGHT*channels*4);
return imgTmp;
}

UMC::Status InitAviSplitter(Splitter *avi_splitter, DataReader *data_reader)
{
SplitterParams splitter_params;
splitter_params.m_lFlags = UMC::VIDEO_SPLITTER;
splitter_params.m_pDataReader = data_reader;

return avi_splitter->Init(splitter_params);
}

UMC::Status InitMPEG4VDecoder(VideoDecoder *video_decoder, VideoStreamInfo *video_info)
{
if(video_info->stream_type != UMC::MPEG4_VIDEO)
return UMC_ERR_FAILED;

VideoDecoderParams decoder_params;

decoder_params.info = *video_info;
decoder_params.lFlags = 0;

return video_decoder->Init(&decoder_params);
}

UMC::Status DecodeVideo(char* input_file)
{
Ipp32u track=0;

FIOReader src;
AVISplitter avi_spl;
SplitterInfo *spl_info;
VideoStreamInfo *video_info;
MPEG4VideoDecoder dec;
MediaData in;
VideoData out;
IplImage *img = InitializeImage(768, 576, IPL_DEPTH_8U, 4);

UMC::Status umcRes;

umcRes = InitDataReader(&src, input_file);
if(umcRes != UMC_OK)
return umcRes;

umcRes = InitAviSplitter(&avi_spl, &src);
if(umcRes != UMC_OK)
return umcRes;

umcRes = avi_spl.GetInfo(&spl_info);
if(umcRes != UMC_OK)
return umcRes;

for(track=0; track < spl_info->m_nOfTracks; track++)
if(spl_info->m_ppTrackInfo[track]->m_Type == UMC::TRACK_MPEG4V)
break;

if(track >= spl_info->m_nOfTracks)
return UMC_ERR_INVALID_STREAM;

video_info = (VideoStreamInfo *)spl_info->m_ppTrackInfo[track]->m_pStreamInfo;
video_info->color_format = UMC::YUY2;

umcRes = InitMPEG4VDecoder(&dec, video_info);
if(umcRes != UMC_OK)
return umcRes;

umcRes = out.Init(video_info->clip_info.width, video_info->clip_info.height, video_info->color_format);
if(umcRes != UMC_OK)
return umcRes;

umcRes = out.Alloc();
if(umcRes != UMC_OK)
return umcRes;

cvNamedWindow("Display");

while(UMC_OK==umcRes || UMC_ERR_NOT_ENOUGH_DATA == umcRes)
{
while(UMC_ERR_NOT_ENOUGH_DATA == (umcRes = avi_spl.GetNextData(&in, track)))
vm_time_sleep(5);

if(UMC_OK != umcRes)
break;

umcRes = dec.GetFrame(&in, &out);
if(umcRes != UMC_OK)
break;

memcpy(img->imageData, out.m_pbAllocated, out.GetMappingSize());
cvShowImage("Display", img);
cvWaitKey(0);
}

return umcRes;
}
int main()
{
ippStaticInit();
char inp[] = "C:\Documents and Settings\cagri\My Documents\Visual Studio 2005\Projects\Disk\pb.avi";

DecodeVideo(inp);

return 0;
}

I put m_pbAllocated variable of VideoData Class to public.My code can decode the file successfully. In this point my question is:
1- Is my problem on the getting frames from decoder?
2-Or is my problem is on transferring data from out(VideoData) yo img(IplImage)?

Thanks in advance...
0 Kudos
1 Reply
Vladimir_Dudnik
Employee
280 Views

It is not clear where your problem are. Did you try to playback that particular AVI file with simple_player application (it is part of IPP audio-video-codecs sample)? Please take a look on UMC documentation to find how to access data in MediaData object

Regards,
Vladimir

0 Kudos
Reply