[Libav-user] avcodec_decode_video2 missing the first 8 frames
morlando616 at gmail.com
Tue Jul 22 16:49:47 CEST 2014
Thanks for the response. That's very interesting, though I wonder if it
could actually be header related. Based on the videos, I know for sure
there are exactly 64 frames in the first movie, for instance. My
m_FrameRead is only increased if avcodec_decode_video2 says it was able to
get a picture. My thinking is that if it was a header that was read, that
function wouldn't set frameFinished to "true". So av_read_frame hits the
EOF when my m_FrameRead counter is only 56.
Are you saying that perhaps the av_read_frame is reading a bunch of data
(header + frames) and my avcodec_decode_video2 says there's no picture
because there's header data in there. Then a few frames later (or maybe
next frame), av_read_frame reads more data, now including the 9th 'frame'
and finally avcodec_decode_video2 decodes and I increment my counter (which
would be now 1 when I'd want it to be 9).
Thanks for the help!
On Tue, Jul 22, 2014 at 8:30 AM, cyril poulet <cyril.poulet at centraliens.net>
> according to the doc, av_read_packet does not check wether the data in the
> decoded frame is a valid image or not.
> As it is always the 8 first "frames" missing, I would assume it is the
> header that gets decoded first.
> Have you noticed missing images when comparing the first real decoded
> image and your stream in a player ?
> 2014-07-21 18:37 GMT+02:00 Matt Orlando <morlando616 at gmail.com>:
>> Hi folks,
>> I'm having some trouble with the decoding of my h.264 movies. I've
>> tested with different videos, one 64 frames long and another 52 frames
>> long. In both cases, the first 8 frames (exactly 8) weren't decoding. In
>> other words, the call to avcodec_decode_video2 returns 0 for the
>> got_picture variable. I track the frames read and received for our system
>> and I never get notice that all the frames were read because my counter
>> doesn't increase for the first 8...however all of the subsequent calls to
>> av_read_frame return EOF. To prevent any confusion (or perhaps just to add
>> some context), I need the raw data from each decoded frame since I don't
>> treat them as a frame to a movie but rather a frame of x,y,z positional
>> I work in Unity but made a plugin to communicate with the libraries to
>> read and decode the h.264 movies. This is our update function:
>> bool H264Stream::Update(int desiredFrame)
>> if( desiredFrame <= m_FrameRead )
>> return true;
>> int frameFinished = 0;
>> if( av_read_frame( m_AVFormat, &m_Packet ) >= 0 )
>> if( m_Packet.stream_index == m_AVStream->index )
>> av_frame_unref( m_AVFrame );
>> avcodec_decode_video2( m_AVContext, m_AVFrame, &frameFinished,
>> &m_Packet );
>> if( frameFinished != 0 )
>> sws_scale( m_SwsContext, m_AVFrame->data,
>> m_AVFrame->linesize, 0, m_AVContext->height, m_Picture->data,
>> m_Picture->linesize );
>> av_free_packet( &m_Packet );
>> return m_FrameRead >= desiredFrame;
>> Oh, quick note, this is my first time using these libraries so if there's
>> something blatantly wrong with how I'm doing this, please let me know. :)
>> Just keep in mind, it's the full frame of 'raw' data I use (post-decode)
>> that I pass back into my Unity c# scripts.
>> Thanks for the help everyone!
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
> Libav-user mailing list
> Libav-user at ffmpeg.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Libav-user