#include "ipp.h" #include "umc_file_reader.h" #include "umc_fio_reader.h" #include "umc_mp4_spl.h" #include "umc_splitter.h" #include "umc_video_render.h" #include "fw_video_render.h" #include "umc_h264_dec.h" #include "vm_time.h" void EncodeStream(vm_char * inputfilename, vm_char * outputfilename ) { Ipp32u videoTrack=0; int exit_flag =0; UMC::Status status; UMC::MediaData in; UMC::VideoData out; UMC::FIOReader reader; UMC::FileReaderParams readerParams; UMC::SplitterParams splitterParams; UMC::SplitterInfo * streamInfo; UMC::MP4Splitter Splitter; UMC::VideoStreamInfo *videoInfo=NULL; UMC::VideoDecoder * videoDecoder; UMC::VideoDecoderParams videoDecParams; UMC::FWVideoRender fwRender; UMC::FWVideoRenderParams fwRenderParams; readerParams.m_portion_size = 0; vm_string_strcpy(readerParams.m_file_name, inputfilename); if((status = reader.Init(&readerParams))!= UMC::UMC_OK) return; splitterParams.m_lFlags = UMC::VIDEO_SPLITTER; splitterParams.m_pDataReader = &reader; if((status = Splitter.Init(splitterParams))!= UMC::UMC_OK) return; Splitter.GetInfo(&streamInfo); for (videoTrack = 0; videoTrack < streamInfo->m_nOfTracks; videoTrack++) { if (streamInfo->m_ppTrackInfo[videoTrack]->m_Type == UMC::TRACK_H264) break; } videoInfo = (UMC::VideoStreamInfo*)(streamInfo->m_ppTrackInfo[videoTrack]->m_pStreamInfo); if(videoInfo->stream_type!=UMC::H264_VIDEO) return; videoDecParams.info = (*videoInfo); videoDecParams.m_pData = streamInfo->m_ppTrackInfo[videoTrack]->m_pDecSpecInfo; videoDecParams.numThreads = 1; videoDecoder = (UMC::VideoDecoder*)(new UMC::H264VideoDecoder()); if((status = videoDecoder->Init(&videoDecParams))!= UMC::UMC_OK) return; fwRenderParams.out_data_template.Init(videoInfo->clip_info.width, videoInfo->clip_info.height, videoInfo->color_format); fwRenderParams.pOutFile = outputfilename; if(status = fwRender.Init(&fwRenderParams)!= UMC::UMC_OK) return; Splitter.Run(); do { do{ if (in.GetDataSize() < 4) { do{ status= Splitter.GetNextData(&in,videoTrack); if(status==UMC::UMC_ERR_NOT_ENOUGH_DATA) vm_time_sleep(5); }while(status==UMC::UMC_ERR_NOT_ENOUGH_DATA); if(((status != UMC::UMC_OK) && (status != UMC::UMC_ERR_END_OF_STREAM))|| (status == UMC::UMC_ERR_END_OF_STREAM)&& (in.GetDataSize()<4)) { exit_flag=1; } } fwRender.LockInputBuffer(&out); videoDecoder->GetFrame(&in,&out); fwRender.UnLockInputBuffer(&out); fwRender.RenderFrame(); }while(!exit_flag && (status == UMC::UMC_ERR_NOT_ENOUGH_DATA || status == UMC::UMC_ERR_SYNC)); }while (exit_flag!=1); do{ fwRender.LockInputBuffer(&out); status = videoDecoder->GetFrame(NULL,&out); fwRender.UnLockInputBuffer(&out); fwRender.RenderFrame(); }while(status == UMC::UMC_OK); } void main(int argc, vm_char* argv[]) { vm_char * InputVideofileName, *OutputYUVFileName; InputVideofileName = "teststream.mp4"; //use unicode string if project use unicode characters OutputYUVFileName = "testoutput.yuv"; //use unicode string if project use unicode characters EncodeStream(InputVideofileName,OutputYUVFileName); }