]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: frame_producer: Fixed bug which caused some unnecessary looping.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 14 May 2011 23:24:22 +0000 (23:24 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 14 May 2011 23:24:22 +0000 (23:24 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@749 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/video/video_decoder.cpp
modules/ffmpeg/producer/video/video_decoder.h

index b4942a3d9d23abc2cd0e0c871453c5fcb7ecedcc..eec215c625fea64b0966b4289c487c32f4af21f6 100644 (file)
@@ -48,7 +48,7 @@ namespace caspar {
 struct ffmpeg_producer : public core::frame_producer\r
 {\r
        static const size_t                                             DECODED_PACKET_BUFFER_SIZE = 4;\r
-       static const size_t                                             MAX_PACKET_OFFSET = 64; // 64 packets should be enough. Otherwise there probably was an error and we want to avoid infinite looping.\r
+       static const size_t                                             MAX_PACKET_OFFSET = 64; // Avoid infinite looping.\r
 \r
        const std::wstring                                              filename_;\r
        const bool                                                              loop_;\r
@@ -78,7 +78,7 @@ public:
                \r
                double frame_time = 1.0f/input_.fps();\r
                double format_frame_time = 1.0/frame_factory->get_video_format_desc().fps;\r
-               if(abs(frame_time - format_frame_time) > 0.0001)\r
+               if(abs(frame_time - format_frame_time) > 0.0001 && abs(frame_time - format_frame_time/2) > 0.0001)\r
                        CASPAR_LOG(warning) << print() << L" Invalid framerate detected. This may cause distorted audio during playback. frame-time: " << frame_time;\r
 \r
                try\r
@@ -89,8 +89,7 @@ public:
                catch(...)\r
                {\r
                        CASPAR_LOG_CURRENT_EXCEPTION();\r
-                       video_decoder_.reset();\r
-                       CASPAR_LOG(warning) << print() << " removed video-stream.";\r
+                       CASPAR_LOG(warning) << print() << " failed to initialize video-decoder.";\r
                }\r
                \r
                try\r
@@ -101,8 +100,7 @@ public:
                catch(...)\r
                {\r
                        CASPAR_LOG_CURRENT_EXCEPTION();\r
-                       audio_decoder_.reset();\r
-                       CASPAR_LOG(warning) << print() << " removed audio-stream.";\r
+                       CASPAR_LOG(warning) << print() << " failed to initialize audio-decoder.";\r
                }               \r
 \r
                if(!video_decoder_ && !audio_decoder_)\r
@@ -119,7 +117,7 @@ public:
                frame_timer_.restart();\r
 \r
                std::shared_ptr<core::basic_frame> frame;       \r
-               for(size_t n = 0; !frame && n < MAX_PACKET_OFFSET; ++n) \r
+               for(size_t n = 0; !frame && input_.has_packet() && n < MAX_PACKET_OFFSET ; ++n) \r
                        frame = try_decode_frame();\r
                \r
                graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*frame_factory_->get_video_format_desc().fps*0.5));\r
@@ -144,9 +142,6 @@ public:
        \r
        std::shared_ptr<core::basic_frame> try_decode_frame()\r
        {\r
-               if(!input_.has_packet())\r
-                       return nullptr;\r
-\r
                tbb::parallel_invoke\r
                (\r
                        [&]\r
@@ -171,7 +166,7 @@ public:
 \r
                try\r
                {\r
-                       boost::range::push_back(video_frame_buffer_, video_decoder_->execute(this, video_packet));\r
+                       boost::range::push_back(video_frame_buffer_, video_decoder_->execute(video_packet));\r
                }\r
                catch(...)\r
                {\r
index 62a23ca61e3eda52f57e88c2cc33aba97921ffc3..4650b0662ebbef91ad92d6f21fa07794987a0c2d 100644 (file)
@@ -147,7 +147,7 @@ public:
                }\r
        }\r
        \r
-       std::vector<safe_ptr<core::write_frame>> execute(void* tag, const packet& video_packet)\r
+       std::vector<safe_ptr<core::write_frame>> execute(const packet& video_packet)\r
        {                               \r
                std::vector<safe_ptr<core::write_frame>> result;\r
 \r
@@ -172,15 +172,15 @@ public:
                        }\r
                \r
                        if(frame_finished != 0)         \r
-                               result.push_back(make_write_frame(tag, decoded_frame));\r
+                               result.push_back(make_write_frame(decoded_frame));\r
                }\r
 \r
                return result;\r
        }\r
 \r
-       safe_ptr<core::write_frame> make_write_frame(void* tag, safe_ptr<AVFrame> decoded_frame)\r
+       safe_ptr<core::write_frame> make_write_frame(safe_ptr<AVFrame> decoded_frame)\r
        {               \r
-               auto write = frame_factory_->create_frame(tag, desc_);\r
+               auto write = frame_factory_->create_frame(this, desc_);\r
                if(sws_context_ == nullptr)\r
                {\r
                        tbb::parallel_for(0, static_cast<int>(desc_.planes.size()), 1, [&](int n)\r
@@ -216,6 +216,6 @@ public:
 };\r
 \r
 video_decoder::video_decoder(AVCodecContext& codec_context, const safe_ptr<core::frame_factory>& frame_factory) : impl_(new implementation(codec_context, frame_factory)){}\r
-std::vector<safe_ptr<core::write_frame>> video_decoder::execute(void* tag, const packet& video_packet){return impl_->execute(tag, video_packet);}\r
+std::vector<safe_ptr<core::write_frame>> video_decoder::execute(const packet& video_packet){return impl_->execute(video_packet);}\r
 \r
 }
\ No newline at end of file
index 4d680f2efae08852e94e21a00ebd43861954b3df..1756b1c205710a59377b292e2363c144fd79bd41 100644 (file)
@@ -36,7 +36,7 @@ class video_decoder : boost::noncopyable
 {\r
 public:\r
        explicit video_decoder(AVCodecContext& codec_context, const safe_ptr<core::frame_factory>& frame_factory);\r
-       std::vector<safe_ptr<core::write_frame>> execute(void* tag, const packet& video_packet);        \r
+       std::vector<safe_ptr<core::write_frame>> execute(const packet& video_packet);   \r
 private:\r
        struct implementation;\r
        safe_ptr<implementation> impl_;\r