<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:13px">Hi, I am trying to write a mpeg player for iOS, for some reason, same code that calls "av_read_frame" has different result on Windows and iOS. after calling "av_read_frame", "stream_index" field inside "</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">AVPacket" has non-zero value in iOS whereas on Windows it is always 0, when trying to play same stream.</span><div style="font-family:arial,sans-serif;font-size:13px">
The code snipper is following:</div><div style="font-family:arial,sans-serif;font-size:13px"> // header file</div><p style="font-family:arial,sans-serif;font-size:13px"> class LibavDecoder</p><p style="font-family:arial,sans-serif;font-size:13px">
{</p><p style="font-family:arial,sans-serif;font-size:13px"> ..........</p><p style="font-family:arial,sans-serif;font-size:13px"> AVFormatContext *avFormatContextPtr;</p>
<p style="font-family:arial,sans-serif;font-size:13px"> AVPacket avpkt; </p><p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px">
// cpp file</p><p style="font-family:arial,sans-serif;font-size:13px"></p><p style="font-family:arial,sans-serif;font-size:13px">void LibavDecoder::initStreams (AVFormatContext *avFormatContextPtr)</p>
<p style="font-family:arial,sans-serif;font-size:13px">{</p><p style="font-family:arial,sans-serif;font-size:13px"> AVStream *tempStream = NULL;</p><p style="font-family:arial,sans-serif;font-size:13px"> AVCodec *tempCodec = NULL;</p>
<p style="font-family:arial,sans-serif;font-size:13px"> StreamConfig tempConfig;</p><p style="font-family:arial,sans-serif;font-size:13px"><br></p><p style="font-family:arial,sans-serif;font-size:13px"> for (size_t streamcnt = 0; streamcnt < avFormatContextPtr->nb_streams; ++streamcnt)</p>
<p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> tempStream = avFormatContextPtr->streams[streamcnt];</p><p style="font-family:arial,sans-serif;font-size:13px">
<br></p><p style="font-family:arial,sans-serif;font-size:13px"> if ((tempStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) ||</p><p style="font-family:arial,sans-serif;font-size:13px"> (tempStream->codec->codec_type == AVMEDIA_TYPE_AUDIO))</p>
<p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> tempConfig.stream = tempStream;</p><p style="font-family:arial,sans-serif;font-size:13px">
tempCodec = avcodec_find_decoder(tempStream->codec->codec_id);</p><p style="font-family:arial,sans-serif;font-size:13px"> tempConfig.codecContext = tempStream->codec;</p><p style="font-family:arial,sans-serif;font-size:13px">
tempConfig.frameCnt = 0;</p><p style="font-family:arial,sans-serif;font-size:13px"><br></p><p style="font-family:arial,sans-serif;font-size:13px"> avcodec_open2(tempConfig.codecContext, tempCodec, NULL);</p>
<p style="font-family:arial,sans-serif;font-size:13px"> this->streamconfigs.push_back(tempConfig);</p><p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px">
}</p><p style="font-family:arial,sans-serif;font-size:13px">}</p><p style="font-family:arial,sans-serif;font-size:13px"></p><p style="font-family:arial,sans-serif;font-size:13px">StreamConfig* LibavDecoder::getNextFrame (AVFormatContext* avFormatContextPtr, AVPacket* avpkt)</p>
<p style="font-family:arial,sans-serif;font-size:13px">{</p><p style="font-family:arial,sans-serif;font-size:13px"> int loop = 1;</p><p style="font-family:arial,sans-serif;font-size:13px"> int err = 0;</p>
<p style="font-family:arial,sans-serif;font-size:13px"> size_t configcnt = 0;</p><p style="font-family:arial,sans-serif;font-size:13px"> StreamConfig *tempConfig = 0;</p><p style="font-family:arial,sans-serif;font-size:13px">
<br></p><p style="font-family:arial,sans-serif;font-size:13px"><br></p><p style="font-family:arial,sans-serif;font-size:13px"> while (loop == 1)</p><p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px">
err = <b>av_read_frame</b>(avFormatContextPtr, avpkt);</p><p style="font-family:arial,sans-serif;font-size:13px"> if (err < 0)</p><p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px">
if (err != -11) //Ressource not available, try again</p><p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> if ((size_t)err != AVERROR_EOF)</p>
<p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> error("Error while av_read_frame", err);</p><p style="font-family:arial,sans-serif;font-size:13px">
}</p><p style="font-family:arial,sans-serif;font-size:13px"> loop = 0;</p><p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px">
} else</p><p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> configcnt = 0;</p><p style="font-family:arial,sans-serif;font-size:13px">
while ((loop == 1) && (configcnt < this->streamconfigs.size()))</p><p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> if (this-><a href="http://streamconfigs.at">streamconfigs.at</a>(configcnt).stream->index == <b>avpkt->stream_index</b>)<br>
</p><p style="font-family:arial,sans-serif;font-size:13px"> {</p><p style="font-family:arial,sans-serif;font-size:13px"> tempConfig = &this-><a href="http://streamconfigs.at">streamconfigs.at</a>(configcnt);</p>
<p style="font-family:arial,sans-serif;font-size:13px"> loop = 0;</p><p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px"> configcnt++;</p>
<p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px"> if (loop == 1)</p>
<p style="font-family:arial,sans-serif;font-size:13px"> av_free_packet(avpkt);</p><p style="font-family:arial,sans-serif;font-size:13px"> }</p><p style="font-family:arial,sans-serif;font-size:13px"> return tempConfig;</p>
<p style="font-family:arial,sans-serif;font-size:13px">}</p><p style="font-family:arial,sans-serif;font-size:13px"><br></p><p style="font-family:arial,sans-serif;font-size:13px">any ideas while this happens? Thanks a bunch in advance.</p>
</div>