[Libav-user] avcodec_decode_video2 missing the first 8 frames

cyril poulet cyril.poulet at centraliens.net
Tue Jul 22 14:30:43 CEST 2014


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
> data.
>
> 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 );
>
>             m_FrameRead++;
>
>             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!
> -Matt
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20140722/05955d7a/attachment.html>


More information about the Libav-user mailing list