Loading...
You are not logged-in Login/Register





  • Posts   Search Threads
  • bedheadAugust 11, 2008 3: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 SettingscagriMy DocumentsVisual Studio 2005ProjectsDiskpb.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)August 27, 2008 6:39 AM PDT
    Rate
     
    Re: UMC and OpenCv

    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



Forum jump:  

Intel Software Network Forums Statistics

17,025 users have contributed to 48,319 threads and 172,758 posts to date.

In the past 24 hours, we have 11 new thread(s) 54 new posts(s), and 47 new user(s).

In the past 3 days, the most popular thread for everyone has been Optimalization of sine function\'s taylor expansion The most posts were made to Most likely, the issue is that The post with the most views is Optimalization of sine function\'s taylor expansion

Please welcome our newest member redfruit83


For more complete information about compiler optimizations, see our Optimization Notice.