On Thu, Sep 22, 2016 at 3:35 AM, Anton Khirnov <an...@khirnov.net> wrote: > --- > doc/examples/output.c | 71 > +++++++++++++++++++++++++++++++-------------------- > 1 file changed, 44 insertions(+), 27 deletions(-) > > diff --git a/doc/examples/output.c b/doc/examples/output.c > index 44a55f5..bb0da30 100644 > --- a/doc/examples/output.c > +++ b/doc/examples/output.c > @@ -233,25 +233,37 @@ static AVFrame *get_audio_frame(OutputStream *ost) > static int encode_audio_frame(AVFormatContext *oc, OutputStream *ost, > AVFrame *frame) > { > - AVPacket pkt = { 0 }; // data and size must be 0; > - int got_packet; > + int ret; > > - av_init_packet(&pkt); > - avcodec_encode_audio2(ost->enc, &pkt, frame, &got_packet); > + ret = avcodec_send_frame(ost->enc, frame); > + if (ret < 0) { > + fprintf(stderr, "Error submitting a frame for encoding\n"); > + exit(1); > + } > > - if (got_packet) { > - pkt.stream_index = ost->st->index; > + while (ret >= 0) { > + AVPacket pkt = { 0 }; // data and size must be 0; > > - av_packet_rescale_ts(&pkt, ost->enc->time_base, ost->st->time_base); > + av_init_packet(&pkt); > > - /* Write the compressed frame to the media file. */ > - if (av_interleaved_write_frame(oc, &pkt) != 0) { > - fprintf(stderr, "Error while writing audio frame\n"); > + ret = avcodec_receive_packet(ost->enc, &pkt); > + if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { > + fprintf(stderr, "Error encoding a video frame\n"); > exit(1); > + } else if (ret >= 0) { > + av_packet_rescale_ts(&pkt, ost->enc->time_base, > ost->st->time_base); > + pkt.stream_index = ost->st->index; > + > + /* Write the compressed frame to the media file. */ > + ret = av_interleaved_write_frame(oc, &pkt); > + if (ret < 0) { > + fprintf(stderr, "Error while writing video frame\n"); > + exit(1); > + } > } > } > > - return (frame || got_packet) ? 0 : 1; > + return ret == AVERROR_EOF; > } > > /* > @@ -517,36 +529,41 @@ static int write_video_frame(AVFormatContext *oc, > OutputStream *ost) > int ret; > AVCodecContext *c; > AVFrame *frame; > - AVPacket pkt = { 0 }; > - int got_packet = 0; > > c = ost->enc; > > frame = get_video_frame(ost); > > - av_init_packet(&pkt); > - > /* encode the image */ > - ret = avcodec_encode_video2(c, &pkt, frame, &got_packet); > + ret = avcodec_send_frame(c, frame); > if (ret < 0) { > - fprintf(stderr, "Error encoding a video frame\n"); > + fprintf(stderr, "Error submitting a frame for encoding\n"); > exit(1); > } > > - if (got_packet) { > - av_packet_rescale_ts(&pkt, c->time_base, ost->st->time_base); > - pkt.stream_index = ost->st->index; > + while (ret >= 0) { > + AVPacket pkt = { 0 }; > > - /* Write the compressed frame to the media file. */ > - ret = av_interleaved_write_frame(oc, &pkt); > - } > + av_init_packet(&pkt); > > - if (ret != 0) { > - fprintf(stderr, "Error while writing video frame\n"); > - exit(1); > + ret = avcodec_receive_packet(c, &pkt); > + if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { > + fprintf(stderr, "Error encoding a video frame\n"); > + exit(1); > + } else if (ret >= 0) { > + av_packet_rescale_ts(&pkt, c->time_base, ost->st->time_base); > + pkt.stream_index = ost->st->index; > + > + /* Write the compressed frame to the media file. */ > + ret = av_interleaved_write_frame(oc, &pkt); > + if (ret < 0) { > + fprintf(stderr, "Error while writing video frame\n"); > + exit(1); > + } > + } > } > > - return (frame || got_packet) ? 0 : 1; > + return ret == AVERROR_EOF; > } > > static void close_stream(AVFormatContext *oc, OutputStream *ost) > --
ok i think -- Vittorio _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel