Move SRC (badly) to AudioDecoder.
authorCarl Hetherington <cth@carlh.net>
Fri, 10 May 2013 22:06:17 +0000 (23:06 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 10 May 2013 22:06:17 +0000 (23:06 +0100)
src/lib/audio_decoder.cc
src/lib/audio_decoder.h
src/lib/encoder.cc
src/lib/encoder.h
src/lib/ffmpeg_decoder.cc
src/lib/sndfile_decoder.cc

index df13a984a4b36416fb1120b6512aca4537484f6c..68554daf96856e37d07493538874bbbcd6e2f2d6 100644 (file)
 */
 
 #include "audio_decoder.h"
+#include "exceptions.h"
+#include "log.h"
 
+#include "i18n.h"
+
+using std::stringstream;
 using boost::optional;
 using boost::shared_ptr;
 
-AudioDecoder::AudioDecoder (shared_ptr<const Film> f)
+AudioDecoder::AudioDecoder (shared_ptr<const Film> f, shared_ptr<const AudioContent> c)
        : Decoder (f)
+       , _audio_content (c)
 {
+       if (_audio_content->audio_frame_rate() != _film->target_audio_sample_rate()) {
+
+               stringstream s;
+               s << String::compose ("Will resample audio from %1 to %2", _audio_content->audio_frame_rate(), _film->target_audio_sample_rate());
+               _film->log()->log (s.str ());
+
+               /* 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 (MAX_AUDIO_CHANNELS),
+                       AV_SAMPLE_FMT_FLTP,
+                       _film->target_audio_sample_rate(),
+                       av_get_default_channel_layout (MAX_AUDIO_CHANNELS),
+                       AV_SAMPLE_FMT_FLTP,
+                       _audio_content->audio_frame_rate(),
+                       0, 0
+                       );
+               
+               swr_init (_swr_context);
+       } else {
+               _swr_context = 0;
+       }
+}
+
+AudioDecoder::~AudioDecoder ()
+{
+       if (_swr_context) {
+               swr_free (&_swr_context);
+       }
 }
+       
+
+#if 0
+void
+AudioDecoder::process_end ()
+{
+       if (_film->has_audio() && _swr_context) {
+
+               shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_mapping().dcp_channels(), 256));
+                       
+               while (1) {
+                       int const frames = swr_convert (_swr_context, (uint8_t **) out->data(), 256, 0, 0);
+
+                       if (frames < 0) {
+                               throw EncodeError (_("could not run sample-rate converter"));
+                       }
+
+                       if (frames == 0) {
+                               break;
+                       }
+
+                       out->set_frames (frames);
+                       _writer->write (out);
+               }
+
+       }
+}
+#endif
+
+void
+AudioDecoder::emit_audio (shared_ptr<const AudioBuffers> data, Time time)
+{
+       /* XXX: map audio to 5.1 */
+       
+       /* Maybe sample-rate convert */
+       if (_swr_context) {
+
+               /* Compute the resampled frames count and add 32 for luck */
+               int const max_resampled_frames = ceil ((int64_t) data->frames() * _film->target_audio_sample_rate() / _audio_content->audio_frame_rate()) + 32;
+
+               shared_ptr<AudioBuffers> resampled (new AudioBuffers (MAX_AUDIO_CHANNELS, max_resampled_frames));
+
+               /* Resample audio */
+               int const resampled_frames = swr_convert (
+                       _swr_context, (uint8_t **) resampled->data(), max_resampled_frames, (uint8_t const **) data->data(), data->frames()
+                       );
+               
+               if (resampled_frames < 0) {
+                       throw EncodeError (_("could not run sample-rate converter"));
+               }
+
+               resampled->set_frames (resampled_frames);
+               
+               /* And point our variables at the resampled audio */
+               data = resampled;
+       }
+
+       Audio (data, time);
+}
+
+               
index c393e95f12b776f3b93172a4539159c6b78fa8a2..8db16e3694b540f3bdb0c700ff02d97a645de220 100644 (file)
@@ -26,6 +26,9 @@
 
 #include "audio_source.h"
 #include "decoder.h"
+extern "C" {
+#include <libswresample/swresample.h>
+}
 
 class AudioContent;
 
@@ -35,7 +38,14 @@ class AudioContent;
 class AudioDecoder : public TimedAudioSource, public virtual Decoder
 {
 public:
-       AudioDecoder (boost::shared_ptr<const Film>);
+       AudioDecoder (boost::shared_ptr<const Film>, boost::shared_ptr<const AudioContent>);
+       ~AudioDecoder ();
+
+       void emit_audio (boost::shared_ptr<const AudioBuffers>, Time);
+
+private:
+       boost::shared_ptr<const AudioContent> _audio_content;
+       SwrContext* _swr_context;
 };
 
 #endif
index 8e0d1cd91e5efe6b6843e64c4e2c3f6c6aac136a..f91a2c4e20e3929867428c265fa139ad5b8e62c0 100644 (file)
@@ -60,7 +60,6 @@ Encoder::Encoder (shared_ptr<Film> f, shared_ptr<Job> j)
        , _job (j)
        , _video_frames_in (0)
        , _video_frames_out (0)
-       , _swr_context (0)
        , _have_a_real_frame (false)
        , _terminate (false)
 {
@@ -78,36 +77,6 @@ Encoder::~Encoder ()
 void
 Encoder::process_begin ()
 {
-       if (_film->has_audio() && _film->audio_frame_rate() != _film->target_audio_sample_rate()) {
-
-               stringstream s;
-               s << String::compose (N_("Will resample audio from %1 to %2"), _film->audio_frame_rate(), _film->target_audio_sample_rate());
-               _film->log()->log (s.str ());
-
-               /* 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 (_film->audio_mapping().dcp_channels ()),
-                       AV_SAMPLE_FMT_FLTP,
-                       _film->target_audio_sample_rate(),
-                       av_get_default_channel_layout (_film->audio_mapping().dcp_channels ()),
-                       AV_SAMPLE_FMT_FLTP,
-                       _film->audio_frame_rate(),
-                       0, 0
-                       );
-               
-               swr_init (_swr_context);
-       } else {
-               _swr_context = 0;
-       }
-
        for (int i = 0; i < Config::instance()->num_local_encoding_threads (); ++i) {
                _threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, (ServerDescription *) 0)));
        }
@@ -127,28 +96,6 @@ Encoder::process_begin ()
 void
 Encoder::process_end ()
 {
-       if (_film->has_audio() && _swr_context) {
-
-               shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_mapping().dcp_channels(), 256));
-                       
-               while (1) {
-                       int const frames = swr_convert (_swr_context, (uint8_t **) out->data(), 256, 0, 0);
-
-                       if (frames < 0) {
-                               throw EncodeError (_("could not run sample-rate converter"));
-                       }
-
-                       if (frames == 0) {
-                               break;
-                       }
-
-                       out->set_frames (frames);
-                       _writer->write (out);
-               }
-
-               swr_free (&_swr_context);
-       }
-
        boost::mutex::scoped_lock lock (_mutex);
 
        _film->log()->log (String::compose (N_("Clearing queue of %1"), _queue.size ()));
@@ -296,29 +243,6 @@ Encoder::process_video (shared_ptr<const Image> image, bool same, shared_ptr<Sub
 void
 Encoder::process_audio (shared_ptr<const AudioBuffers> data)
 {
-       /* Maybe sample-rate convert */
-       if (_swr_context) {
-
-               /* Compute the resampled frames count and add 32 for luck */
-               int const max_resampled_frames = ceil ((int64_t) data->frames() * _film->target_audio_sample_rate() / _film->audio_frame_rate()) + 32;
-
-               shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_mapping().dcp_channels(), max_resampled_frames));
-
-               /* Resample audio */
-               int const resampled_frames = swr_convert (
-                       _swr_context, (uint8_t **) resampled->data(), max_resampled_frames, (uint8_t const **) data->data(), data->frames()
-                       );
-               
-               if (resampled_frames < 0) {
-                       throw EncodeError (_("could not run sample-rate converter"));
-               }
-
-               resampled->set_frames (resampled_frames);
-               
-               /* And point our variables at the resampled audio */
-               data = resampled;
-       }
-
        _writer->write (data);
 }
 
index a3a484856c68aa597161379d58b5588107bdebdf..cce26efc8f06689fb6fb88f56c27e0eafc34a98f 100644 (file)
@@ -106,8 +106,6 @@ private:
        /** Number of video frames written for the DCP so far */
        int _video_frames_out;
 
-       SwrContext* _swr_context;
-
        bool _have_a_real_frame;
        bool _terminate;
        std::list<boost::shared_ptr<DCPVideoFrame> > _queue;
index b857860bde32c730cdf581436c1c27902ecf507e..0e704bb1444577d9298afd7a7f1f39786d6b7ca3 100644 (file)
@@ -66,7 +66,7 @@ boost::mutex FFmpegDecoder::_mutex;
 FFmpegDecoder::FFmpegDecoder (shared_ptr<const Film> f, shared_ptr<const FFmpegContent> c, bool video, bool audio, bool subtitles)
        : Decoder (f)
        , VideoDecoder (f)
-       , AudioDecoder (f)
+       , AudioDecoder (f, c)
        , _ffmpeg_content (c)
        , _format_context (0)
        , _video_stream (-1)
index dd9e654c77de7984a4672a7a577fb8d91f340f44..dc22475cdfd344dd6fc2046cdd774b9dfa74c909 100644 (file)
@@ -34,7 +34,7 @@ using boost::shared_ptr;
 
 SndfileDecoder::SndfileDecoder (shared_ptr<const Film> f, shared_ptr<const SndfileContent> c)
        : Decoder (f)
-       , AudioDecoder (f)
+       , AudioDecoder (f, c)
        , _sndfile_content (c)
        , _deinterleave_buffer (0)
 {