[FFmpeg-cvslog] doc/examples/transcode_aac: switch to swresample

Michael Niedermayer git at videolan.org
Wed Nov 27 11:45:15 CET 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Nov 27 11:15:48 2013 +0100| [7497c894cd36f6d3e713ddefeeedbd8d880cc896] | committer: Michael Niedermayer

doc/examples/transcode_aac: switch to swresample

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7497c894cd36f6d3e713ddefeeedbd8d880cc896
---

 configure                    |    2 +-
 doc/examples/transcode_aac.c |   78 ++++++++++++++++++------------------------
 2 files changed, 35 insertions(+), 45 deletions(-)

diff --git a/configure b/configure
index 4a86c36..99fac77 100755
--- a/configure
+++ b/configure
@@ -2277,7 +2277,7 @@ zmq_filter_deps="libzmq"
 
 # examples
 muxing_example_deps="avcodec avformat avutil swscale"
-transcode_aac_example_deps="avcodec avformat avresample"
+transcode_aac_example_deps="avcodec avformat swresample"
 
 # libraries
 avcodec_deps="avutil"
diff --git a/doc/examples/transcode_aac.c b/doc/examples/transcode_aac.c
index d00e20e..cfed0e1 100644
--- a/doc/examples/transcode_aac.c
+++ b/doc/examples/transcode_aac.c
@@ -30,11 +30,12 @@
 #include "libavcodec/avcodec.h"
 
 #include "libavutil/audio_fifo.h"
+#include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
 #include "libavutil/frame.h"
 #include "libavutil/opt.h"
 
-#include "libavresample/avresample.h"
+#include "libswresample/swresample.h"
 
 /** The output bit rate in kbit/s */
 #define OUTPUT_BIT_RATE 48000
@@ -223,11 +224,11 @@ static int init_input_frame(AVFrame **frame)
 /**
  * Initialize the audio resampler based on the input and output codec settings.
  * If the input and output sample formats differ, a conversion is required
- * libavresample takes care of this, but requires initialization.
+ * libswresample takes care of this, but requires initialization.
  */
 static int init_resampler(AVCodecContext *input_codec_context,
                           AVCodecContext *output_codec_context,
-                          AVAudioResampleContext **resample_context)
+                          SwrContext **resample_context)
 {
     /**
      * Only initialize the resampler if it is necessary, i.e.,
@@ -237,35 +238,36 @@ static int init_resampler(AVCodecContext *input_codec_context,
         input_codec_context->channels != output_codec_context->channels) {
         int error;
 
-        /** Create a resampler context for the conversion. */
-        if (!(*resample_context = avresample_alloc_context())) {
-            fprintf(stderr, "Could not allocate resample context\n");
-            return AVERROR(ENOMEM);
-        }
-
         /**
+         * Create a resampler context for the conversion.
          * Set the conversion parameters.
          * Default channel layouts based on the number of channels
          * are assumed for simplicity (they are sometimes not detected
          * properly by the demuxer and/or decoder).
          */
-        av_opt_set_int(*resample_context, "in_channel_layout",
-                       av_get_default_channel_layout(input_codec_context->channels), 0);
-        av_opt_set_int(*resample_context, "out_channel_layout",
-                       av_get_default_channel_layout(output_codec_context->channels), 0);
-        av_opt_set_int(*resample_context, "in_sample_rate",
-                       input_codec_context->sample_rate, 0);
-        av_opt_set_int(*resample_context, "out_sample_rate",
-                       output_codec_context->sample_rate, 0);
-        av_opt_set_int(*resample_context, "in_sample_fmt",
-                       input_codec_context->sample_fmt, 0);
-        av_opt_set_int(*resample_context, "out_sample_fmt",
-                       output_codec_context->sample_fmt, 0);
+        *resample_context = swr_alloc_set_opts(NULL,
+                                              av_get_default_channel_layout(output_codec_context->channels),
+                                              output_codec_context->sample_fmt,
+                                              output_codec_context->sample_rate,
+                                              av_get_default_channel_layout(input_codec_context->channels),
+                                              input_codec_context->sample_fmt,
+                                              input_codec_context->sample_rate,
+                                              0, NULL);
+        if (!*resample_context) {
+            fprintf(stderr, "Could not allocate resample context\n");
+            return AVERROR(ENOMEM);
+        }
+        /**
+        * Perform a sanity check so that the number of converted samples is
+        * not greater than the number of samples to be converted.
+        * If the sample rates differ, this case has to be handled differently
+        */
+        av_assert0(output_codec_context->sample_rate == input_codec_context->sample_rate);
 
         /** Open the resampler with the specified parameters. */
-        if ((error = avresample_open(*resample_context)) < 0) {
+        if ((error = swr_init(*resample_context)) < 0) {
             fprintf(stderr, "Could not open resample context\n");
-            avresample_free(resample_context);
+            swr_free(resample_context);
             return error;
         }
     }
@@ -387,30 +389,21 @@ static int init_converted_samples(uint8_t ***converted_input_samples,
  * The conversion happens on a per-frame basis, the size of which is specified
  * by frame_size.
  */
-static int convert_samples(uint8_t **input_data,
+static int convert_samples(const uint8_t **input_data,
                            uint8_t **converted_data, const int frame_size,
-                           AVAudioResampleContext *resample_context)
+                           SwrContext *resample_context)
 {
     int error;
 
     /** Convert the samples using the resampler. */
-    if ((error = avresample_convert(resample_context, converted_data, 0,
-                                    frame_size, input_data, 0, frame_size)) < 0) {
+    if ((error = swr_convert(resample_context,
+                             converted_data, frame_size,
+                             input_data    , frame_size)) < 0) {
         fprintf(stderr, "Could not convert input samples (error '%s')\n",
                 get_error_text(error));
         return error;
     }
 
-    /**
-     * Perform a sanity check so that the number of converted samples is
-     * not greater than the number of samples to be converted.
-     * If the sample rates differ, this case has to be handled differently
-     */
-    if (avresample_available(resample_context)) {
-        fprintf(stderr, "Converted samples left over\n");
-        return AVERROR_EXIT;
-    }
-
     return 0;
 }
 
@@ -447,7 +440,7 @@ static int read_decode_convert_and_store(AVAudioFifo *fifo,
                                          AVFormatContext *input_format_context,
                                          AVCodecContext *input_codec_context,
                                          AVCodecContext *output_codec_context,
-                                         AVAudioResampleContext *resampler_context,
+                                         SwrContext *resampler_context,
                                          int *finished)
 {
     /** Temporary storage of the input samples of the frame read from the file. */
@@ -484,7 +477,7 @@ static int read_decode_convert_and_store(AVAudioFifo *fifo,
          * Convert the input samples to the desired output sample format.
          * This requires a temporary storage provided by converted_input_samples.
          */
-        if (convert_samples(input_frame->extended_data, converted_input_samples,
+        if (convert_samples((const uint8_t**)input_frame->extended_data, converted_input_samples,
                             input_frame->nb_samples, resampler_context))
             goto cleanup;
 
@@ -646,7 +639,7 @@ int main(int argc, char **argv)
 {
     AVFormatContext *input_format_context = NULL, *output_format_context = NULL;
     AVCodecContext *input_codec_context = NULL, *output_codec_context = NULL;
-    AVAudioResampleContext *resample_context = NULL;
+    SwrContext *resample_context = NULL;
     AVAudioFifo *fifo = NULL;
     int ret = AVERROR_EXIT;
 
@@ -750,10 +743,7 @@ int main(int argc, char **argv)
 cleanup:
     if (fifo)
         av_audio_fifo_free(fifo);
-    if (resample_context) {
-        avresample_close(resample_context);
-        avresample_free(&resample_context);
-    }
+    swr_free(&resample_context);
     if (output_codec_context)
         avcodec_close(output_codec_context);
     if (output_format_context) {



More information about the ffmpeg-cvslog mailing list