Forum Jump

Select Group :
Select Forum :
Sorted By :
Sort Order :
From The :
 
Thread Tools  Search this thread 
bedhead
August 11, 2008 4:45 AM PDT
UMC and OpenCv

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 <stdio.h>
#include <stdlib.h>
#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...
Vladimir Dudnik (Intel)
Total Points:
26,150
Status Points:
26,150
Black Belt
August 27, 2008 7:39 AM PDT
Rate
 
#1

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





Intel Software Network Forums Statistics

8295 users have contributed to 31245 threads and 99128 posts to date.
In the past 24 hours, we have 10 new thread(s) 20 new posts(s), and 31 new user(s).

In the past 3 days, the most popular thread for everyone has been huge pages on linux? The most posts were made to Pipeline buffer between stages? The post with the most views is Another example attached (Tr

Please welcome our newest member wingvk