]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/resample.c
Merge remote branch 'qatar/master'
[ffmpeg] / libavcodec / resample.c
index 122b725d39b1c28becbccdc5a8c69193aa5c5675..d3c12f6354a5115de6e07610cc6dc6f7ab765eed 100644 (file)
  */
 
 /**
- * @file libavcodec/resample.c
+ * @file
  * samplerate conversion for both audio and video
  */
 
 #include "avcodec.h"
 #include "audioconvert.h"
-#include "opt.h"
+#include "libavutil/opt.h"
+#include "libavutil/samplefmt.h"
 
 struct AVResampleContext;
 
@@ -36,7 +37,7 @@ static const char *context_to_name(void *ptr)
 }
 
 static const AVOption options[] = {{NULL}};
-static const AVClass audioresample_context_class = { "ReSampleContext", context_to_name, options };
+static const AVClass audioresample_context_class = { "ReSampleContext", context_to_name, options, LIBAVUTIL_VERSION_INT };
 
 struct ReSampleContext {
     struct AVResampleContext *resample_context;
@@ -46,7 +47,7 @@ struct ReSampleContext {
     /* channel convert */
     int input_channels, output_channels, filter_channels;
     AVAudioConvert *convert_ctx[2];
-    enum SampleFormat sample_fmt[2]; ///< input and output sample format
+    enum AVSampleFormat sample_fmt[2]; ///< input and output sample format
     unsigned sample_size[2];         ///< size of one sample in sample_fmt
     short *buffer[2];                ///< buffers used for conversion to S16
     unsigned buffer_size[2];         ///< sizes of allocated buffers
@@ -143,8 +144,8 @@ static void ac3_5p1_mux(short *output, short *input1, short *input2, int n)
 
 ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
                                         int output_rate, int input_rate,
-                                        enum SampleFormat sample_fmt_out,
-                                        enum SampleFormat sample_fmt_in,
+                                        enum AVSampleFormat sample_fmt_out,
+                                        enum AVSampleFormat sample_fmt_in,
                                         int filter_length, int log2_phase_count,
                                         int linear, double cutoff)
 {
@@ -174,26 +175,26 @@ ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
 
     s->sample_fmt [0] = sample_fmt_in;
     s->sample_fmt [1] = sample_fmt_out;
-    s->sample_size[0] = av_get_bits_per_sample_format(s->sample_fmt[0])>>3;
-    s->sample_size[1] = av_get_bits_per_sample_format(s->sample_fmt[1])>>3;
+    s->sample_size[0] = av_get_bits_per_sample_fmt(s->sample_fmt[0])>>3;
+    s->sample_size[1] = av_get_bits_per_sample_fmt(s->sample_fmt[1])>>3;
 
-    if (s->sample_fmt[0] != SAMPLE_FMT_S16) {
-        if (!(s->convert_ctx[0] = av_audio_convert_alloc(SAMPLE_FMT_S16, 1,
+    if (s->sample_fmt[0] != AV_SAMPLE_FMT_S16) {
+        if (!(s->convert_ctx[0] = av_audio_convert_alloc(AV_SAMPLE_FMT_S16, 1,
                                                          s->sample_fmt[0], 1, NULL, 0))) {
             av_log(s, AV_LOG_ERROR,
                    "Cannot convert %s sample format to s16 sample format\n",
-                   avcodec_get_sample_fmt_name(s->sample_fmt[0]));
+                   av_get_sample_fmt_name(s->sample_fmt[0]));
             av_free(s);
             return NULL;
         }
     }
 
-    if (s->sample_fmt[1] != SAMPLE_FMT_S16) {
+    if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
         if (!(s->convert_ctx[1] = av_audio_convert_alloc(s->sample_fmt[1], 1,
-                                                         SAMPLE_FMT_S16, 1, NULL, 0))) {
+                                                         AV_SAMPLE_FMT_S16, 1, NULL, 0))) {
             av_log(s, AV_LOG_ERROR,
                    "Cannot convert s16 sample format to %s sample format\n",
-                   avcodec_get_sample_fmt_name(s->sample_fmt[1]));
+                   av_get_sample_fmt_name(s->sample_fmt[1]));
             av_audio_convert_free(s->convert_ctx[0]);
             av_free(s);
             return NULL;
@@ -212,22 +213,11 @@ ReSampleContext *av_audio_resample_init(int output_channels, int input_channels,
     s->resample_context= av_resample_init(output_rate, input_rate,
                          filter_length, log2_phase_count, linear, cutoff);
 
-    *(AVClass**)s->resample_context = &audioresample_context_class;
+    *(const AVClass**)s->resample_context = &audioresample_context_class;
 
     return s;
 }
 
-#if LIBAVCODEC_VERSION_MAJOR < 53
-ReSampleContext *audio_resample_init(int output_channels, int input_channels,
-                                     int output_rate, int input_rate)
-{
-    return av_audio_resample_init(output_channels, input_channels,
-                                  output_rate, input_rate,
-                                  SAMPLE_FMT_S16, SAMPLE_FMT_S16,
-                                  TAPS, 10, 0, 0.8);
-}
-#endif
-
 /* resample audio. 'nb_samples' is the number of input samples */
 /* XXX: optimize it ! */
 int audio_resample(ReSampleContext *s, short *output, short *input, int nb_samples)
@@ -245,7 +235,7 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
         return nb_samples;
     }
 
-    if (s->sample_fmt[0] != SAMPLE_FMT_S16) {
+    if (s->sample_fmt[0] != AV_SAMPLE_FMT_S16) {
         int istride[1] = { s->sample_size[0] };
         int ostride[1] = { 2 };
         const void *ibuf[1] = { input };
@@ -257,7 +247,7 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
             s->buffer_size[0] = input_size;
             s->buffer[0] = av_malloc(s->buffer_size[0]);
             if (!s->buffer[0]) {
-                av_log(s, AV_LOG_ERROR, "Could not allocate buffer\n");
+                av_log(s->resample_context, AV_LOG_ERROR, "Could not allocate buffer\n");
                 return 0;
             }
         }
@@ -266,16 +256,16 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
 
         if (av_audio_convert(s->convert_ctx[0], obuf, ostride,
                              ibuf, istride, nb_samples*s->input_channels) < 0) {
-            av_log(s, AV_LOG_ERROR, "Audio sample format conversion failed\n");
+            av_log(s->resample_context, AV_LOG_ERROR, "Audio sample format conversion failed\n");
             return 0;
         }
 
         input  = s->buffer[0];
     }
 
-    lenout= 4*nb_samples * s->ratio + 16;
+    lenout= 2*s->output_channels*nb_samples * s->ratio + 16;
 
-    if (s->sample_fmt[1] != SAMPLE_FMT_S16) {
+    if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
         output_bak = output;
 
         if (!s->buffer_size[1] || s->buffer_size[1] < lenout) {
@@ -283,7 +273,7 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
             s->buffer_size[1] = lenout;
             s->buffer[1] = av_malloc(s->buffer_size[1]);
             if (!s->buffer[1]) {
-                av_log(s, AV_LOG_ERROR, "Could not allocate buffer\n");
+                av_log(s->resample_context, AV_LOG_ERROR, "Could not allocate buffer\n");
                 return 0;
             }
         }
@@ -340,7 +330,7 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
         ac3_5p1_mux(output, buftmp3[0], buftmp3[1], nb_samples1);
     }
 
-    if (s->sample_fmt[1] != SAMPLE_FMT_S16) {
+    if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
         int istride[1] = { 2 };
         int ostride[1] = { s->sample_size[1] };
         const void *ibuf[1] = { output };
@@ -348,7 +338,7 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
 
         if (av_audio_convert(s->convert_ctx[1], obuf, ostride,
                              ibuf, istride, nb_samples1*s->output_channels) < 0) {
-            av_log(s, AV_LOG_ERROR, "Audio sample format convertion failed\n");
+            av_log(s->resample_context, AV_LOG_ERROR, "Audio sample format convertion failed\n");
             return 0;
         }
     }