]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 12 Jan 2011 09:29:50 +0000 (09:29 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 12 Jan 2011 09:29:50 +0000 (09:29 +0000)
core/producer/ffmpeg/audio/audio_decoder.cpp
core/producer/ffmpeg/ffmpeg_producer.cpp
core/producer/ffmpeg/input.cpp
core/producer/transition/transition_producer.cpp

index 24a80447a642886b52a8cd9e7d22b4057dddfac1..1e14d81e28ddfd4217b53d3221c0215e103c60fb 100644 (file)
@@ -37,7 +37,11 @@ public:
        explicit implementation(AVCodecContext* codec_context, double fps) \r
                : codec_context_(codec_context)\r
                , audio_buffer_(4*SAMPLE_RATE*2+FF_INPUT_BUFFER_PADDING_SIZE/2)\r
-               , audio_frame_size_(static_cast<size_t>(static_cast<double>(SAMPLE_RATE) / fps) * N_CHANNELS){}\r
+               , audio_frame_size_(static_cast<size_t>(static_cast<double>(SAMPLE_RATE) / fps) * N_CHANNELS)\r
+       {\r
+               if(!codec_context)\r
+                       BOOST_THROW_EXCEPTION(null_argument() << arg_name_info("codec_context"));                                               \r
+       }\r
                \r
        std::vector<std::vector<short>> execute(const aligned_buffer& audio_packet)\r
        {                       \r
@@ -45,7 +49,7 @@ public:
                const int result = avcodec_decode_audio2(codec_context_, audio_buffer_.data(), &written_bytes, audio_packet.data(), audio_packet.size());\r
 \r
                if(result <= 0 || codec_context_->sample_rate != SAMPLE_RATE || codec_context_->channels != 2)\r
-                       return std::vector<std::vector<short>>();\r
+                       BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("Invalid audio stream"));\r
                                                \r
                current_chunk_.insert(current_chunk_.end(), audio_buffer_.data(), audio_buffer_.data() + written_bytes/2);\r
 \r
index a2cb23183014a47892051bb759f873c9aa82c9a8..0eeb238e6209bb236358a2cbcc09dc03169ca488 100644 (file)
@@ -11,6 +11,8 @@
 \r
 #include <tbb/parallel_invoke.h>\r
 \r
+#include <boost/optional.hpp>\r
+\r
 #include <deque>\r
 \r
 using namespace boost::assign;\r
@@ -20,7 +22,7 @@ namespace caspar { namespace core { namespace ffmpeg{
 struct ffmpeg_producer : public frame_producer\r
 {\r
        input                                                           input_;                 \r
-       audio_decoder                                           audio_decoder_;\r
+       std::unique_ptr<audio_decoder>          audio_decoder_;\r
        video_decoder                                           video_decoder_;\r
 \r
        std::deque<safe_ptr<write_frame>>       video_frame_channel_;   \r
@@ -39,11 +41,13 @@ public:
                : filename_(filename)\r
                , last_frame_(draw_frame(draw_frame::empty()))\r
                , input_(filename)\r
-               , video_decoder_(input_.get_video_codec_context().get())\r
-               , audio_decoder_(input_.get_audio_codec_context().get(), input_.fps())\r
-       {                               \r
+               , video_decoder_(input_.get_video_codec_context().get())                \r
+       {                       \r
                input_.set_loop(std::find(params.begin(), params.end(), L"LOOP") != params.end());\r
 \r
+               if(input_.get_audio_codec_context().get())\r
+                       audio_decoder_.reset(new audio_decoder(input_.get_audio_codec_context().get(), input_.fps()));\r
+\r
                auto seek = std::find(params.begin(), params.end(), L"SEEK");\r
                if(seek != params.end() && ++seek != params.end())\r
                {\r
@@ -81,16 +85,24 @@ public:
                        }, \r
                        [&] \r
                        { // Audio Decoding\r
-                               if(!audio_packet.empty())\r
+                               if(!audio_packet.empty() && audio_decoder_)\r
                                {\r
-                                       auto chunks = audio_decoder_.execute(audio_packet);\r
-                                       audio_chunk_channel_.insert(audio_chunk_channel_.end(), chunks.begin(), chunks.end());\r
+                                       try\r
+                                       {\r
+                                               auto chunks = audio_decoder_->execute(audio_packet);\r
+                                               audio_chunk_channel_.insert(audio_chunk_channel_.end(), chunks.begin(), chunks.end());\r
+                                       }\r
+                                       catch(...)\r
+                                       {\r
+                                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                                               audio_decoder_.reset();\r
+                                       }\r
                                }\r
                        });\r
 \r
-                       while(!video_frame_channel_.empty() && (!audio_chunk_channel_.empty() || input_.get_audio_codec_context() == nullptr))\r
+                       while(!video_frame_channel_.empty() && (!audio_chunk_channel_.empty() || !audio_decoder_))\r
                        {\r
-                               if(input_.get_audio_codec_context() != nullptr\r
+                               if(audio_decoder_\r
                                {\r
                                        video_frame_channel_.front()->audio_data() = std::move(audio_chunk_channel_.front());\r
                                        audio_chunk_channel_.pop_front();\r
index 1e69e9a61aad00d23c69638beec648804a9fc148..53807426405b14d9abd8bcf5740518b0e4dc4142 100644 (file)
@@ -189,6 +189,9 @@ public:
                tbb::queuing_mutex::scoped_lock lock(seek_mutex_);\r
                if(av_seek_frame(format_context_.get(), -1, seek_target*AV_TIME_BASE, 0) < 0)\r
                        return false;\r
+               \r
+               video_packet_buffer_.clear();\r
+               audio_packet_buffer_.clear();\r
 \r
                return true;\r
        }\r
index a71cd15404096db4acc63041d87cefc8e601ffa1..9743fb79beb019e550971eab193a200116f055d9 100644 (file)
@@ -45,8 +45,7 @@ struct transition_producer::implementation : boost::noncopyable
                : current_frame_(0)\r
                , info_(info)\r
                , dest_producer_(dest)\r
-               , source_producer_(frame_producer::empty())\r
-       {}\r
+               , source_producer_(frame_producer::empty()){}\r
                \r
        safe_ptr<frame_producer> get_following_producer() const\r
        {\r