[FFmpeg-user] av_read_frame

Andy Huang andy.y.huang at gmail.com
Thu Mar 28 16:31:54 CET 2013


Hi, I am trying to write a mpeg player for iOS, for some reason, same code
that calls "av_read_frame" has different on Windows and iOS. after calling
"av_read_frame", "stream_index" field inside "
AVPacket" has non-zero value in iOS, whereas on Windows it is always 0 when
trying to play same stream.
The code snipper is following:
       // header file

        class LibavDecoder

        {

                ..........

                 AVFormatContext
*avFormatContextPtr;

                 AVPacket                                avpkt;

        }

       // cpp file

void                LibavDecoder::initStreams
(AVFormatContext*avFormatContextPtr)

{

    AVStream      *tempStream   = NULL;

    AVCodec       *tempCodec    = NULL;

    StreamConfig  tempConfig;


    for (size_t streamcnt = 0; streamcnt < avFormatContextPtr->nb_streams;
++streamcnt)

    {

        tempStream = avFormatContextPtr->streams[streamcnt];


        if ((tempStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) ||

            (tempStream->codec->codec_type == AVMEDIA_TYPE_AUDIO))

        {

            tempConfig.stream         = tempStream;

            tempCodec                 = avcodec_find_decoder(tempStream->
codec->codec_id);

            tempConfig.codecContext   = tempStream->codec;

            tempConfig.frameCnt       = 0;


            avcodec_open2(tempConfig.codecContext, tempCodec, NULL);

            this->streamconfigs.push_back(tempConfig);

        }

    }

}

StreamConfig*       LibavDecoder::getNextFrame            (AVFormatContext*
avFormatContextPtr, AVPacket* avpkt)

{

    int           loop               = 1;

    int           err                = 0;

    size_t        configcnt          = 0;

    StreamConfig  *tempConfig        = 0;



    while (loop == 1)

    {

        err = av_read_frame(avFormatContextPtr, avpkt);

        if (err < 0)

        {

            if (err != -11) //Ressource not available, try again

            {

                if ((size_t)err != AVERROR_EOF)

                {

                    error("Error while av_read_frame", err);

                }

                loop = 0;

            }

        } else

        {

            configcnt = 0;

            while ((loop == 1) && (configcnt < this->streamconfigs.size()))

            {

                if (this->streamconfigs.at(configcnt).stream->index ==
avpkt->stream_index)

                {

                    tempConfig = &this->streamconfigs.at(configcnt);

                    loop = 0;

                }

                configcnt++;

            }

        }

        if (loop == 1)

            av_free_packet(avpkt);

    }

    return tempConfig;

}


any ideas while this happens? Thanks a bunch in advance.


More information about the ffmpeg-user mailing list