]> 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, 26 Oct 2011 11:10:57 +0000 (11:10 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 26 Oct 2011 11:10:57 +0000 (11:10 +0000)
modules/ffmpeg/producer/input.cpp
modules/ffmpeg/producer/util.cpp
modules/ffmpeg/producer/video/video_decoder.cpp

index a5f2e8b0835018c0a82e9262bff8ee7588461cea..98b7bf6f9c4902b21dd697b1870ef33a9f61c724 100644 (file)
@@ -83,6 +83,9 @@ struct input::implementation : public Concurrency::agent, boost::noncopyable
 \r
        overwrite_buffer<bool>                                  is_running_;\r
        governor                                                                governor_;\r
+\r
+       const int                                                               video_index_;\r
+       const int                                                               audio_index_;\r
                \r
 public:\r
        explicit implementation(input::target_t& target,\r
@@ -100,7 +103,9 @@ public:
                , start_(start)\r
                , length_(length)\r
                , frame_number_(0)\r
-               , governor_(8)\r
+               , governor_(4)\r
+               , video_index_(av_find_best_stream(format_context_.get(), AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0))\r
+               , audio_index_(av_find_best_stream(format_context_.get(), AVMEDIA_TYPE_AUDIO, -1, -1, nullptr, 0))\r
        {               \r
                loop_                   = loop;\r
                packets_count_  = 0;\r
@@ -133,16 +138,27 @@ public:
        {\r
                try\r
                {\r
-                       int last_stream_index = -1;\r
+                       double current_dts = 0;\r
+                       std::map<int, double> dts;\r
 \r
                        send(is_running_, true);\r
                        for(auto packet = read_next_packet(); packet && is_running_.value(); packet = read_next_packet())\r
                        {                               \r
                                ticket_t ticket;\r
+                               \r
+                               if(packet->stream_index > 0 && (packet->stream_index == video_index_ || packet->stream_index == audio_index_))\r
+                                       dts[packet->stream_index] = packet->dts*av_q2d(format_context_->streams[packet->stream_index]->time_base);\r
+\r
+                               auto it = std::min_element(dts.begin(), dts.end(), [](const std::pair<int, double>& lhs, const std::pair<int, double>& rhs)\r
+                               {\r
+                                       return lhs.second < rhs.second;\r
+                               });\r
 \r
-                               if((format_context_->nb_streams < 2 || last_stream_index != packet->stream_index) && packet->stream_index == default_stream_index_)\r
+                               if(it != dts.end() && it->second > current_dts)\r
+                               {\r
                                        ticket = governor_.acquire();\r
-                               last_stream_index = packet->stream_index;\r
+                                       current_dts = it->second;\r
+                               }\r
 \r
                                Concurrency::asend(target_, input::target_element_t(packet, ticket));\r
                                Context::Yield();\r
index e35ae7c45bfa9621c7b7cf51d6ce21c22658496c..cb096916244bc3bfc9827dd44280c183f9d39905 100644 (file)
@@ -192,7 +192,10 @@ safe_ptr<core::write_frame> make_write_frame(const void* tag, const safe_ptr<AVF
                        auto result           = write->image_data(n).begin();\r
                        auto decoded          = decoded_frame->data[n];\r
                        auto decoded_linesize = decoded_frame->linesize[n];\r
-                               \r
+                       \r
+                       CASPAR_ASSERT(decoded);\r
+                       CASPAR_ASSERT(write->image_data(n).begin());\r
+\r
                        if(decoded_linesize != static_cast<int>(plane.width))\r
                        {\r
                                // Copy line by line since ffmpeg sometimes pads each line.\r
index 29fb2f4ed9b4e8a1379490be1de51b67451d83b9..2e55d19f0dd8d698a72572015d346c8fef52ed94 100644 (file)
@@ -175,6 +175,7 @@ public:
                std::array<safe_ptr<uint8_t>, 4> new_ptrs;\r
                parallel_for<size_t>(0, count, [&](size_t n)\r
                {\r
+                       CASPAR_ASSERT(frame->data[n]);\r
                        auto size               = frame->linesize[n]*desc.planes[n].height;\r
                        new_ptrs[n]             = fast_memdup(frame->data[n], size);\r
                        org_ptrs[n]             = frame->data[n];\r