<div>Hello,<br></div><div><br></div><div>I am decoding a raw h264 stream based on example from: <a href="https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c">https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/decode_video.c</a><br></div><div><br></div><div>The problem is that I need to somehow tie up a custom information to AVPacket and receive it in AVFrame. Because it is raw h264, I am sure that one AVPacket sent is equal to one AVFrame received.<br></div><div><br></div><div>I've tried the following: AVPacket->opaque but this field is not passed to AVFrame->opaque.<br></div><div>So I've tried some ugly hacks and use one of these fields:<br></div><div><br></div><div>av_packet->duration = <br></div><div>av_packet->pts = <br></div><div>av_packet->dts = <br></div><div>av_packet->pos = <br></div><div><br></div><div>These can be read from frame after calling: avcodec_receive_frame(codec_context, frame);<br></div><div><br></div><div>However, there are two strange things that are occurring:<br></div><div><br></div><ol><li>When I am sending the very first IFrame (which also contains PPS and SPS) via avcodec_send_packet(codec_context, packet) and then I want to receive a corresponding frame via avcodec_receive_frame(), the function will return me AVERROR(EAGAIN). I don't understand why it needs more data if what it got is a full IFrame?. I need to send two more packets (each containing exactly one frame) to get first frame out of avcodec_receive_frame(). Why the decoder decides to store two frames in its buffer before sending me anything.<br></li><li>Even though the frames are received in correct order (I've saved them as images and checked them), the fields like av_packet->pos which was passed to frame and can be read through frame->pkt_pos are in not correct order. Take a look:<br></li></ol><div><br></div><div>avcodec_send_packet - (av_packet->pos): 0<br></div><div>avcodec_send_packet - (av_packet->pos): 1<br></div><div>avcodec_send_packet - (av_packet->pos): 2<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 0 <- first frame received after sending three packets, each containing one frame.<br></div><div>avcodec_send_packet - (av_packet->pos): 3<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 2 <- mixed order, pkt_pos should be 1?<br></div><div>avcodec_send_packet - (av_packet->pos): 4<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 1<br></div><div>avcodec_send_packet - (av_packet->pos): 5<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 3<br></div><div>avcodec_send_packet - (av_packet->pos): 6<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 4<br></div><div>avcodec_send_packet - (av_packet->pos): 7<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 5<br></div><div>avcodec_send_packet - (av_packet->pos): 8<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 6<br></div><div>avcodec_send_packet - (av_packet->pos): 9<br></div><div>flush called<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 8 <- again mixed order, should be 7.<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 7<br></div><div>avcodec_receive_frame - (frame->pkt_pos): 9<br></div><div><br></div><div>I would be grateful if you could:<br>1. Show me how can I force decoder to send me a frame immediately rather thanb keeping it in its buffer.</div><div>2. Show me how to fix that strange ordering.<br></div><div>3. Given any other advice how could I pass information in AVPacket and receive it in corresponding AVFrame.<br></div><div><br></div><div>Thank you.<br></div><div><br></div>