- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
[sectionBodyText]I have a problem with using multiple mpeg4 encoded videostream avis. [/sectionBodyText]
[sectionBodyText]Decoding the first 2 gigabytes of my recordings work fine, but about 2.1 gigs (suspiciously close to 2^31) in to the recording
getFrame from the decoder starts returning UMC_ERR_SYNC and UMC_WRN_INVALID_STREAM alternatingly. [/sectionBodyText]
[sectionBodyText]My video contains 3 videostreams (DX50) and no sound. If I decode just one of the video streams, I have no problems. [/sectionBodyText]
[sectionBodyText]If I ignore the errors, I will get a messed up video that looks like it contains some video data from the beginning of the recording instead. [/sectionBodyText]
[sectionBodyText]It also seems to be from a different video stream than expected (i.e stuff from stream 2 can be found in stream 1).
To me it looks like some kind of overflow error. [/sectionBodyText]
[sectionBodyText]My videos are recorded with a mpeg4 encoder board and muxed into one avi using directshow. [/sectionBodyText]
[sectionBodyText]I can play them in VLC or Media Player classic without problems.[/sectionBodyText]
[sectionBodyText]Here's some code that should reproduce the error:[/sectionBodyText]
[cpp][/cpp]
[cpp]int decodeAVI(char * filename, char * smafilename, int maxFrames)
{
UMC::Status sts, sSts;
UMC::FIOReader Reader;
UMC::AVISplitter Splitter;
UMC::SplitterInfo *StreamInfo;
UMC::MPEG4VideoDecoder Decoder[3]; // one per stream
UMC::MediaData in[3]; // one per stream
UMC::VideoData out[3]; // one per stream
// Initialize data reader component
UMC::FileReaderParams FileParams;
FileParams.m_portion_size = 0;
vm_string_strcpy(FileParams.m_file_name, filename);
sts = Reader.Init(&FileParams);
if (sts != UMC::UMC_OK) {
printf("Reader Init error ");
return 1;
}
// Initialize splitter component
UMC::SplitterParams SplParams;
SplParams.m_lFlags = UMC::VIDEO_SPLITTER; // extract only video
SplParams.m_pDataReader = &Reader;
sts = Splitter.Init(SplParams);
if (sts != UMC::UMC_OK) {
printf("Splitter Init error ");
return 1;
}
sts = Splitter.Run();
if (sts != UMC::UMC_OK) {
printf("Splitter Run error ");
return 1;
}
// Get stream info
sts = Splitter.GetInfo(&StreamInfo);
if (sts != UMC::UMC_OK) {
printf("Splitter GetInfo error ");
return 1;
}
else
{
printf("Found %d TrackstStream Length: %.4fsn",StreamInfo->m_nOfTracks,StreamInfo->m_dDuration);
}
// find all MPEG4 video-tracks
std::vector videoTracks;
for (Ipp32u videoTrack = 0; videoTrack < StreamInfo->m_nOfTracks; videoTrack++) {
if (videoTracks.size()==3)
break;
if (StreamInfo->m_ppTrackInfo[videoTrack]->m_Type == UMC::TRACK_MPEG4V)
videoTracks.push_back(videoTrack);
}
if (videoTracks.size() == 0)
{
printf("AVI does not contain MPEG-4 video ");
return 1;
}
UMC::VideoStreamInfo videoTrackInfo[3];
UMC::VideoDecoderParams VDecParams[3];
for (Ipp32u track=0;trackm_ppTrackInfo[videoTracks[track]]->m_pStreamInfo);
// Initialize video decoder component
VDecParams[track].info = videoTrackInfo[track];
VDecParams[track].lFlags = UMC::FLAG_VDEC_REORDER;
VDecParams[track].numThreads = 1;
VDecParams[track].m_pData = StreamInfo->m_ppTrackInfo[videoTracks[track]]->m_pDecSpecInfo;
sts = Decoder[track].Init(&VDecParams[track]);
if (sts != UMC::UMC_OK) {
printf("Decoder Init error ");
return 1;
}
if (videoTrackInfo[track].color_format != UMC::YV12)
{
printf("Expected YV12 Format");
}
// allocate memory for video data
out[track].Init(videoTrackInfo[track].clip_info.width,videoTrackInfo[track].clip_info.height,videoTrackInfo[track].color_format);
out[track].SetColorFormat(videoTrackInfo[track].color_format);
out[track].Alloc();
printf("Track Size: %dx%dn",videoTrackInfo[track].clip_info.width,videoTrackInfo[track].clip_info.height);
}
int nframes = 0;
printf("Decoding Streamn");[/cpp]
[cpp][/cpp]
[cpp] for (Ipp32u track=0;track[cpp] {[/cpp][cpp] while (UMC::UMC_ERR_NOT_ENOUGH_DATA == (sts = Splitter.GetNextData(&in[track], videoTracks[track]))) // wait until data is decoded vm_time_sleep(5); if (sts != UMC::UMC_OK && sts != UMC::UMC_ERR_END_OF_STREAM) { printf("Splitter error (%d), frame %d ", sts, nframes); break; } sSts = sts; sts = Decoder[track].GetFrame(sSts == UMC::UMC_OK ? &in[track] : NULL, &out[track]);[/cpp][cpp] ///////////////////[/cpp][cpp] /// returns UMC_ERR_SYNC around 2 gigs into the recording[/cpp][cpp] if (sts != UMC::UMC_OK && sts != UMC::UMC_ERR_NOT_ENOUGH_DATA) { printf("Track %d, Dec Err (%d), Frame %d ", track, sts, nframes); return 1; } } // all tracks decoded if (sts == UMC::UMC_OK) { if (nframes%100==0) printf("frame %4dn", nframes); } if (sSts == UMC::UMC_ERR_END_OF_STREAM) break; } printf("processed %d framesn", nframes); return 0; }[/cpp]
Link Copied
7 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Sorry about the formatting..I'm using: w_ipp-samples_p_5.3.095
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Did you try this file with simple_player application?
Vladimir
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Our expert recommend to replace UMC::FIOReader with UMC::FileReader which use vm_file wrappers to support files with more than 2 Gb lenght
Vladimir
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Quoting - vdudnik
Our expert recommend to replace UMC::FIOReader with UMC::FileReader which use vm_file wrappers to support files with more than 2 Gb lenght
Vladimir
Now it works great!
Thanks a lot Vladimir!
By the way, is there any documentation for FileReader or FIOReader? I had no idea this could be the problem.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Yes, UMC components should be documented in UMC manual, please check folder 'doc' in audio-video-codecs sample.
Regards,
Vladimir
Vladimir
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks,
I have read the manual, I couldn't find any mention about the differences between FIOReader and FileReader though, only the baseclass datareader is documented there as far as I can tell.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for your points. That mean we have to improve documentation in future versions.
Vladimir
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page