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

Matthieu Bouron matthieu.bouron at gmail.com
Wed Mar 29 17:31:47 EEST 2017


---
 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



More information about the ffmpeg-devel mailing list