[07/24] examples/avcodec: split audio decoding into a separate example

Message ID 1476972462-2228-7-git-send-email-anton@khirnov.net
State New
Headers show

Commit Message

Anton Khirnov Oct. 20, 2016, 2:07 p.m.
The four examples (audio/video encoding/decoding) are completely
independent so it makes little sense to have them all in one file.
---
 configure                   |   2 +
 doc/Makefile                |   4 +-
 doc/examples/avcodec.c      |  97 -------------------------------
 doc/examples/decode_audio.c | 137 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 142 insertions(+), 98 deletions(-)
 create mode 100644 doc/examples/decode_audio.c

Comments

Diego Biurrun Oct. 20, 2016, 4:24 p.m. | #1
On Thu, Oct 20, 2016 at 04:07:25PM +0200, Anton Khirnov wrote:
> --- /dev/null
> +++ b/doc/examples/decode_audio.c
> @@ -0,0 +1,137 @@
> +
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <string.h>

nit: order

LGTM

Diego

Patch

diff --git a/configure b/configure
index 079c415..16532e6 100755
--- a/configure
+++ b/configure
@@ -1210,6 +1210,7 @@  COMPONENT_LIST="
 
 EXAMPLE_LIST="
     avcodec_example
+    decode_audio_example
     encode_audio_example
     filter_audio_example
     metadata_example
@@ -2436,6 +2437,7 @@  scale_vaapi_filter_deps="vaapi VAProcPipelineParameterBuffer"
 
 # examples
 avcodec_example_deps="avcodec avutil"
+decode_audio_example_deps="avcodec avutil"
 encode_audio_example_deps="avcodec avutil"
 filter_audio_example_deps="avfilter avutil"
 metadata_example_deps="avformat avutil"
diff --git a/doc/Makefile b/doc/Makefile
index 738e601..326bb12 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -17,13 +17,15 @@  DOCS-$(CONFIG_TEXI2HTML)                        += $(HTMLPAGES)
 DOCS = $(DOCS-yes)
 
 DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE)          += avcodec
+DOC_EXAMPLES-$(CONFIG_DECODE_AUDIO_EXAMPLE)     += decode_audio
 DOC_EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE)     += encode_audio
 DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE)     += filter_audio
 DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE)         += metadata
 DOC_EXAMPLES-$(CONFIG_OUTPUT_EXAMPLE)           += output
 DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE)           += qsvdec
 DOC_EXAMPLES-$(CONFIG_TRANSCODE_AAC_EXAMPLE)    += transcode_aac
-ALL_DOC_EXAMPLES = avcodec encode_audio filter_audio metadata output transcode_aac
+ALL_DOC_EXAMPLES = avcodec decode_audio encode_audio filter_audio metadata \
+                   output transcode_aac
 
 DOC_EXAMPLES     := $(DOC_EXAMPLES-yes:%=doc/examples/%$(EXESUF))
 ALL_DOC_EXAMPLES := $(ALL_DOC_EXAMPLES:%=doc/examples/%$(EXESUF))
diff --git a/doc/examples/avcodec.c b/doc/examples/avcodec.c
index 63812d9..4f7dc8b 100644
--- a/doc/examples/avcodec.c
+++ b/doc/examples/avcodec.c
@@ -44,100 +44,6 @@ 
 #include "libavutil/samplefmt.h"
 
 #define INBUF_SIZE 4096
-#define AUDIO_INBUF_SIZE 20480
-#define AUDIO_REFILL_THRESH 4096
-
-/*
- * Audio decoding.
- */
-static void audio_decode_example(const char *outfilename, const char *filename)
-{
-    AVCodec *codec;
-    AVCodecContext *c= NULL;
-    int len;
-    FILE *f, *outfile;
-    uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
-    AVPacket avpkt;
-    AVFrame *decoded_frame = NULL;
-
-    av_init_packet(&avpkt);
-
-    printf("Audio decoding\n");
-
-    /* find the MPEG audio decoder */
-    codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
-    if (!codec) {
-        fprintf(stderr, "codec not found\n");
-        exit(1);
-    }
-
-    c = avcodec_alloc_context3(codec);
-
-    /* open it */
-    if (avcodec_open2(c, codec, NULL) < 0) {
-        fprintf(stderr, "could not open codec\n");
-        exit(1);
-    }
-
-    f = fopen(filename, "rb");
-    if (!f) {
-        fprintf(stderr, "could not open %s\n", filename);
-        exit(1);
-    }
-    outfile = fopen(outfilename, "wb");
-    if (!outfile) {
-        av_free(c);
-        exit(1);
-    }
-
-    /* decode until eof */
-    avpkt.data = inbuf;
-    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
-
-    while (avpkt.size > 0) {
-        int got_frame = 0;
-
-        if (!decoded_frame) {
-            if (!(decoded_frame = av_frame_alloc())) {
-                fprintf(stderr, "out of memory\n");
-                exit(1);
-            }
-        }
-
-        len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
-        if (len < 0) {
-            fprintf(stderr, "Error while decoding\n");
-            exit(1);
-        }
-        if (got_frame) {
-            /* if a frame has been decoded, output it */
-            int data_size = av_samples_get_buffer_size(NULL, c->channels,
-                                                       decoded_frame->nb_samples,
-                                                       c->sample_fmt, 1);
-            fwrite(decoded_frame->data[0], 1, data_size, outfile);
-        }
-        avpkt.size -= len;
-        avpkt.data += len;
-        if (avpkt.size < AUDIO_REFILL_THRESH) {
-            /* Refill the input buffer, to avoid trying to decode
-             * incomplete frames. Instead of this, one could also use
-             * a parser, or use a proper container format through
-             * libavformat. */
-            memmove(inbuf, avpkt.data, avpkt.size);
-            avpkt.data = inbuf;
-            len = fread(avpkt.data + avpkt.size, 1,
-                        AUDIO_INBUF_SIZE - avpkt.size, f);
-            if (len > 0)
-                avpkt.size += len;
-        }
-    }
-
-    fclose(outfile);
-    fclose(f);
-
-    avcodec_free_context(&c);
-    av_frame_free(&decoded_frame);
-}
 
 /*
  * Video encoding example
@@ -406,15 +312,12 @@  int main(int argc, char **argv)
     avcodec_register_all();
 
     if (argc <= 1) {
-        audio_decode_example("/tmp/test.sw", "/tmp/test.mp2");
-
         video_encode_example("/tmp/test.mpg");
         filename = "/tmp/test.mpg";
     } else {
         filename = argv[1];
     }
 
-    //    audio_decode_example("/tmp/test.sw", filename);
     video_decode_example("/tmp/test%d.pgm", filename);
 
     return 0;
diff --git a/doc/examples/decode_audio.c b/doc/examples/decode_audio.c
new file mode 100644
index 0000000..83b3bbd
--- /dev/null
+++ b/doc/examples/decode_audio.c
@@ -0,0 +1,137 @@ 
+/*
+ * copyright (c) 2001 Fabrice Bellard
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * audio decoding with libavcodec API example
+ *
+ * @example decode_audio.c
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "libavcodec/avcodec.h"
+
+#include "libavutil/frame.h"
+
+#define AUDIO_INBUF_SIZE 20480
+#define AUDIO_REFILL_THRESH 4096
+
+int main(int argc, char **argv)
+{
+    const char *outfilename, *filename;
+    AVCodec *codec;
+    AVCodecContext *c= NULL;
+    int len;
+    FILE *f, *outfile;
+    uint8_t inbuf[AUDIO_INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
+    AVPacket avpkt;
+    AVFrame *decoded_frame = NULL;
+
+    if (argc <= 2) {
+        fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
+        exit(0);
+    }
+    filename    = argv[1];
+    outfilename = argv[2];
+
+    /* register all the codecs */
+    avcodec_register_all();
+
+    av_init_packet(&avpkt);
+
+    /* find the MPEG audio decoder */
+    codec = avcodec_find_decoder(AV_CODEC_ID_MP2);
+    if (!codec) {
+        fprintf(stderr, "codec not found\n");
+        exit(1);
+    }
+
+    c = avcodec_alloc_context3(codec);
+
+    /* open it */
+    if (avcodec_open2(c, codec, NULL) < 0) {
+        fprintf(stderr, "could not open codec\n");
+        exit(1);
+    }
+
+    f = fopen(filename, "rb");
+    if (!f) {
+        fprintf(stderr, "could not open %s\n", filename);
+        exit(1);
+    }
+    outfile = fopen(outfilename, "wb");
+    if (!outfile) {
+        av_free(c);
+        exit(1);
+    }
+
+    /* decode until eof */
+    avpkt.data = inbuf;
+    avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
+
+    while (avpkt.size > 0) {
+        int got_frame = 0;
+
+        if (!decoded_frame) {
+            if (!(decoded_frame = av_frame_alloc())) {
+                fprintf(stderr, "out of memory\n");
+                exit(1);
+            }
+        }
+
+        len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
+        if (len < 0) {
+            fprintf(stderr, "Error while decoding\n");
+            exit(1);
+        }
+        if (got_frame) {
+            /* if a frame has been decoded, output it */
+            int data_size = av_samples_get_buffer_size(NULL, c->channels,
+                                                       decoded_frame->nb_samples,
+                                                       c->sample_fmt, 1);
+            fwrite(decoded_frame->data[0], 1, data_size, outfile);
+        }
+        avpkt.size -= len;
+        avpkt.data += len;
+        if (avpkt.size < AUDIO_REFILL_THRESH) {
+            /* Refill the input buffer, to avoid trying to decode
+             * incomplete frames. Instead of this, one could also use
+             * a parser, or use a proper container format through
+             * libavformat. */
+            memmove(inbuf, avpkt.data, avpkt.size);
+            avpkt.data = inbuf;
+            len = fread(avpkt.data + avpkt.size, 1,
+                        AUDIO_INBUF_SIZE - avpkt.size, f);
+            if (len > 0)
+                avpkt.size += len;
+        }
+    }
+
+    fclose(outfile);
+    fclose(f);
+
+    avcodec_free_context(&c);
+    av_frame_free(&decoded_frame);
+
+    return 0;
+}