[FFmpeg-devel] [PATCH] doc/examples/filtering_audio: switch to new decoding API

Matthieu Bouron matthieu.bouron at gmail.com
Thu Mar 30 16:24:50 EEST 2017


On Wed, Mar 29, 2017 at 04:31:47PM +0200, Matthieu Bouron wrote:
> ---
>  doc/examples/filtering_audio.c | 42 ++++++++++++++++++++++++++----------------
>  1 file changed, 26 insertions(+), 16 deletions(-)
> 
> diff --git a/doc/examples/filtering_audio.c b/doc/examples/filtering_audio.c
> index c6a930ba8b..c62a1f6f62 100644
> --- a/doc/examples/filtering_audio.c
> +++ b/doc/examples/filtering_audio.c
> @@ -216,7 +216,8 @@ static void print_frame(const AVFrame *frame)
>  int main(int argc, char **argv)
>  {
>      int ret;
> -    AVPacket packet0, packet;
> +    AVPacket packet;
> +    int keep_packet = 0;
>      AVFrame *frame = av_frame_alloc();
>      AVFrame *filt_frame = av_frame_alloc();
>      int got_frame;
> @@ -239,28 +240,37 @@ int main(int argc, char **argv)
>          goto end;
>  
>      /* read all packets */
> -    packet0.data = NULL;
> -    packet.data = NULL;
>      while (1) {
> -        if (!packet0.data) {
> +        if (!keep_packet) {
>              if ((ret = av_read_frame(fmt_ctx, &packet)) < 0)
>                  break;
> -            packet0 = packet;
> +            keep_packet = 1;
>          }
>  
>          if (packet.stream_index == audio_stream_index) {
>              got_frame = 0;
> -            ret = avcodec_decode_audio4(dec_ctx, frame, &got_frame, &packet);
> -            if (ret < 0) {
> -                av_log(NULL, AV_LOG_ERROR, "Error decoding audio\n");
> -                continue;
> +
> +            ret = avcodec_send_packet(dec_ctx, &packet);
> +            if (ret >= 0) {
> +                keep_packet = 0;
> +            } else if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
> +                av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
> +                break;
> +            }
> +
> +            ret = avcodec_receive_frame(dec_ctx, frame);
> +            if (ret >= 0) {
> +                got_frame = 1;
> +            } else if (ret == AVERROR_EOF) {
> +                break;
> +            } else if (ret != AVERROR(EAGAIN)) {
> +                av_log(NULL, AV_LOG_ERROR, "Error while receiving a frame from the decoder\n");
> +                break;
>              }
> -            packet.size -= ret;
> -            packet.data += ret;
>  
>              if (got_frame) {
>                  /* push the audio data from decoded frame into the filtergraph */
> -                if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, 0) < 0) {
> +                if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
>                      av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");
>                      break;
>                  }
> @@ -275,14 +285,14 @@ int main(int argc, char **argv)
>                      print_frame(filt_frame);
>                      av_frame_unref(filt_frame);
>                  }
> +                av_frame_unref(frame);
>              }
> -
> -            if (packet.size <= 0)
> -                av_packet_unref(&packet0);
>          } else {
>              /* discard non-wanted packets */
> -            av_packet_unref(&packet0);
> +            keep_packet = 0;
>          }
> +        if (!keep_packet)
> +           av_packet_unref(&packet);
>      }
>  end:
>      avfilter_graph_free(&filter_graph);
> -- 
> 2.12.0
> 

Patch applied (taking into account wm4 comments about porting the
filtering_video example).


More information about the ffmpeg-devel mailing list