<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:14px">Hi friends,</span><div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">I know when av_read_frame(ctx, pkt) returns < 0 we can set pkt.data = NULL and pkt.size = 0 to flush any frames in decoder if the decoder has the CODEC_CAP_DELAY set.</div>
<div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">The example in src/doc/examples/demuxing.c does these</div><div style="font-family:arial,sans-serif;font-size:14px">
<br></div><div style="font-family:arial,sans-serif;font-size:14px">while (av_read_frame(ctx, &pkt) >=0 ) {</div><div style="font-family:arial,sans-serif;font-size:14px">    decode_packet(&got_frame, 0);</div><div style="font-family:arial,sans-serif;font-size:14px">
    av_free_packet()</div><div style="font-family:arial,sans-serif;font-size:14px">}</div><div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">pkt.data = NULL;</div>
<div style="font-family:arial,sans-serif;font-size:14px">pkt.size = 0;</div><div style="font-family:arial,sans-serif;font-size:14px">do {</div><div style="font-family:arial,sans-serif;font-size:14px">    decode_packet(&got_frame, 1);</div>
<div style="font-family:arial,sans-serif;font-size:14px">} while (got_frame);</div><div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">so my question is how if both Audio and Video has something to flush?</div>
<div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">Because decode_packet() depends on pkt.stream_index to call audio or video decoder,</div><div style="font-family:arial,sans-serif;font-size:14px">
but pkt.stream_index is set in the last call to av_read_frame, so it never changes in whole </div><div style="font-family:arial,sans-serif;font-size:14px">do {} while.</div><div style="font-family:arial,sans-serif;font-size:14px">
<br></div><div style="font-family:arial,sans-serif;font-size:14px">My second question is<font color="#ff0000"> how to flush all video frame quickly.</font> Can I do this:</div><div style="font-family:arial,sans-serif;font-size:14px">
<br></div><div style="font-family:arial,sans-serif;font-size:14px"><div>while (av_read_frame(ctx, &pkt) >=0 ) {</div><div>    decode_packet(&got_frame, 0);</div><div>    av_free_packet()</div><div>}</div></div>
<div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">// will it have problem if there're only audio frames wait to flush but no video frame</div><div style="font-family:arial,sans-serif;font-size:14px">
// can I explicitly set pkt index to video and call decode_video? (I only want video frames)</div><div style="font-family:arial,sans-serif;font-size:14px"><font color="#ff0000">pkt.stream_index = video_index;</font></div>
<div style="font-family:arial,sans-serif;font-size:14px">pkt.data = NULL;</div><div style="font-family:arial,sans-serif;font-size:14px">pkt.size = 0;</div><div style="font-family:arial,sans-serif;font-size:14px">do {</div>
<div style="font-family:arial,sans-serif;font-size:14px">    avcodec_decode_video2(,&got_frame,..);</div><div style="font-family:arial,sans-serif;font-size:14px">} while(got_frame)</div><div style="font-family:arial,sans-serif;font-size:14px">
<br></div><div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">I set steam_index to video index because I'm afraid that pkt.stream_index may be the index of audio after return from av_read_frame(). </div>
<div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px"><font color="#ff0000">Just imagine this case: when av_read_frame() returns < 0, there're audio frames wait to flush but no video frames left. Will my call to avcodec_decode_video2(,&got_frame,..) cause any crash? or it's guaranteed to return  got_frame == false so that I know there's no video frame left?</font></div>
<div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">Great thanks!</div></div>