]> git.sesse.net Git - casparcg/commitdiff
2.0. audio_decoder: Fixed performance issue.
authorRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 7 Aug 2011 16:51:00 +0000 (16:51 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 7 Aug 2011 16:51:00 +0000 (16:51 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1078 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/audio/audio_decoder.cpp

index 10f827091424d9431a183575e88f4faadada7573..f697768d58e945a3412b7779087f79e31967477e 100644 (file)
@@ -59,6 +59,7 @@ public:
        explicit implementation(const std::shared_ptr<AVFormatContext>& context, const core::video_format_desc& format_desc) \r
                : format_desc_(format_desc)     \r
                , nb_frames_(0)\r
+               , buffer1_(AVCODEC_MAX_AUDIO_FRAME_SIZE*2)\r
        {                                       \r
                try\r
                {\r
@@ -90,6 +91,8 @@ public:
                                                                                                        AV_SAMPLE_FMT_S16,                              codec_context_->sample_fmt,\r
                                                                                                        16, 10, 0, 0.8);\r
 \r
+                       buffer2_.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE*2);\r
+\r
                        CASPAR_LOG(warning) << L" Invalid audio format. Resampling.";\r
 \r
                        if(resampler)\r
@@ -139,7 +142,6 @@ public:
 \r
        std::shared_ptr<std::vector<int16_t>> decode(AVPacket& pkt)\r
        {               \r
-               buffer1_.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE*2, 0);\r
                int written_bytes = buffer1_.size() - FF_INPUT_BUFFER_PADDING_SIZE;\r
 \r
                int ret = THROW_ON_ERROR2(avcodec_decode_audio3(codec_context_.get(), reinterpret_cast<int16_t*>(buffer1_.data()), &written_bytes, &pkt), "[audio_decoder]");\r
@@ -148,20 +150,17 @@ public:
                pkt.size -= ret;\r
                pkt.data += ret;\r
                        \r
-               buffer1_.resize(written_bytes);\r
-\r
                if(resampler_)\r
                {\r
-                       buffer2_.resize(AVCODEC_MAX_AUDIO_FRAME_SIZE*2, 0);\r
                        auto ret = audio_resample(resampler_.get(),\r
                                                                                reinterpret_cast<short*>(buffer2_.data()), \r
                                                                                reinterpret_cast<short*>(buffer1_.data()), \r
-                                                                               buffer1_.size() / (av_get_bytes_per_sample(codec_context_->sample_fmt) * codec_context_->channels)); \r
-                       buffer2_.resize(ret * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16) * format_desc_.audio_channels);\r
+                                                                               written_bytes / (av_get_bytes_per_sample(codec_context_->sample_fmt) * codec_context_->channels)); \r
+                       written_bytes = ret * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16) * format_desc_.audio_channels;\r
                        std::swap(buffer1_, buffer2_);\r
                }\r
 \r
-               const auto n_samples = buffer1_.size() / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);\r
+               const auto n_samples = written_bytes / av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);\r
                const auto samples = reinterpret_cast<int16_t*>(buffer1_.data());\r
 \r
                return std::make_shared<std::vector<int16_t>>(samples, samples + n_samples);\r