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.