Given a codec context and encoded packets from a media stream, you can start decoding media into raw frames. To decode a single frame, you can use the following code:
// A codec context, and some encoded data packet from a stream/file, given. AVCodecContext *codecContext; // See Open a codec context AVPacket *packet; // See the Reading Media topic // Send the data packet to the decoder int sendPacketResult = avcodec_send_packet(codecContext, packet); if (sendPacketResult == AVERROR(EAGAIN)){ // Decoder can't take packets right now. Make sure you are draining it. }else if (sendPacketResult < 0){ // Failed to send the packet to the decoder } // Get decoded frame from decoder AVFrame *frame = av_frame_alloc(); int decodeFrame = avcodec_receive_frame(codecContext, frame); if (decodeFrame == AVERROR(EAGAIN)){ // The decoder doesn't have enough data to produce a frame // Not an error unless we reached the end of the stream // Just pass more packets until it has enough to produce a frame av_frame_unref(frame); av_freep(frame); }else if (decodeFrame < 0){ // Failed to get a frame from the decoder av_frame_unref(frame); av_freep(frame); } // Use the frame (ie. display it)
If you want to decode all frames, you can simply place the previous code in a loop, feeding it consecutive packets.