Fix setup of the libswresample context to work with high channel
authorCarl Hetherington <cth@carlh.net>
Sat, 10 May 2014 12:35:55 +0000 (13:35 +0100)
committerCarl Hetherington <cth@carlh.net>
Sat, 10 May 2014 12:35:55 +0000 (13:35 +0100)
counts.

Reported-by: Sumit
ChangeLog
src/lib/resampler.cc

index 440434d5ea3c19509c3d205cca429eb6dc4c56da..e3398702e38f85cfe8561207feddce04be294a0c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-05-10  Carl Hetherington  <cth@carlh.net>
+
+       * Fix setup of the libswresample context to work with high channel counts.
+
 2014-05-09  Carl Hetherington  <cth@carlh.net>
 
        * Fix crash on using content with more than 12 audio channels.
index d897bf562dc4a97dcf5c314a8e7242e050f93e2f..e6b1623d9cbeb3afbe7df32a758323d9980b36b9 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@
 
 extern "C" {
 #include "libavutil/channel_layout.h"
+#include "libavutil/opt.h"
 }      
 #include "resampler.h"
 #include "audio_buffers.h"
@@ -37,24 +38,19 @@ Resampler::Resampler (int in, int out, int channels)
        , _out_rate (out)
        , _channels (channels)
 {
-       /* We will be using planar float data when we call the
-          resampler.  As far as I can see, the audio channel
-          layout is not necessary for our purposes; it seems
-          only to be used get the number of channels and
-          decide if rematrixing is needed.  It won't be, since
-          input and output layouts are the same.
-       */
-
-       _swr_context = swr_alloc_set_opts (
-               0,
-               av_get_default_channel_layout (_channels),
-               AV_SAMPLE_FMT_FLTP,
-               _out_rate,
-               av_get_default_channel_layout (_channels),
-               AV_SAMPLE_FMT_FLTP,
-               _in_rate,
-               0, 0
-               );
+       _swr_context = swr_alloc ();
+
+       /* Sample formats */
+       av_opt_set_int (_swr_context, "isf", AV_SAMPLE_FMT_FLTP, 0);
+       av_opt_set_int (_swr_context, "osf", AV_SAMPLE_FMT_FLTP, 0);
+
+       /* Channel counts */
+       av_opt_set_int (_swr_context, "ich", _channels, 0);
+       av_opt_set_int (_swr_context, "och", _channels, 0);
+
+       /* Sample rates */
+       av_opt_set_int (_swr_context, "isr", _in_rate, 0);
+       av_opt_set_int (_swr_context, "osr", _out_rate, 0);
        
        swr_init (_swr_context);
 }