diff --git a/doc/examples/decode_video.c b/doc/examples/decode_video.c index 4c1068bef3..74146432c0 100644 --- a/doc/examples/decode_video.c +++ b/doc/examples/decode_video.c @@ -54,26 +54,31 @@ static void decode(AVCodecContext *dec_ctx, AVFrame *frame, AVPacket *pkt, const char *filename) { char buf[1024]; - int ret, got_picture; + int ret; - while (pkt->size > 0) { - ret = avcodec_decode_video2(dec_ctx, frame, &got_picture, pkt); - if (ret < 0) { - fprintf(stderr, "Error while decoding frame %d\n", dec_ctx->frame_number); + ret = avcodec_send_packet(dec_ctx, pkt); + if (ret < 0) { + fprintf(stderr, "Error sending a packet for decoding\n"); + exit(1); + } + + while (ret >= 0) { + ret = avcodec_receive_frame(dec_ctx, frame); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + return; + else if (ret < 0) { + fprintf(stderr, "Error during decoding\n"); exit(1); } - if (got_picture) { - printf("saving frame %3d\n", dec_ctx->frame_number); - fflush(stdout); - /* the picture is allocated by the decoder. no need to - free it */ - snprintf(buf, sizeof(buf), filename, dec_ctx->frame_number); - pgm_save(frame->data[0], frame->linesize[0], - frame->width, frame->height, buf); - } - pkt->size -= ret; - pkt->data += ret; + printf("saving frame %3d\n", dec_ctx->frame_number); + fflush(stdout); + + /* the picture is allocated by the decoder. no need to + free it */ + snprintf(buf, sizeof(buf), filename, dec_ctx->frame_number); + pgm_save(frame->data[0], frame->linesize[0], + frame->width, frame->height, buf); } } @@ -161,9 +166,7 @@ int main(int argc, char **argv) } /* flush the decoder */ - avpkt.data = NULL; - avpkt.size = 0; - decode(c, picture, &avpkt, outfilename); + decode(c, picture, NULL, outfilename); fclose(f);