]> git.sesse.net Git - casparcg/commitdiff
2.0. ffmpeg_producer: Added LENGTH for playing subclips together with SEEK.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 11 Aug 2011 07:00:00 +0000 (07:00 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 11 Aug 2011 07:00:00 +0000 (07:00 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1133 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/input.cpp
modules/ffmpeg/producer/input.h

index 02bd2fa054743355d9228d0f59754ee4c63d743c..0a999aa362cb387ab8570fa41b6a7aefe9930680 100644 (file)
@@ -231,14 +231,21 @@ safe_ptr<core::frame_producer> create_ffmpeg_producer(const safe_ptr<core::frame
        std::wstring path = filename + L"." + *ext;\r
        bool loop = boost::find(params, L"LOOP") != params.end();\r
 \r
-       int start = -1;\r
-       int length = -1;\r
+       size_t start = 0;\r
+       size_t length = std::numeric_limits<size_t>::max();\r
        \r
        auto seek_it = std::find(params.begin(), params.end(), L"SEEK");\r
        if(seek_it != params.end())\r
        {\r
                if(++seek_it != params.end())\r
-                       start = boost::lexical_cast<int>(*seek_it);\r
+                       start = boost::lexical_cast<size_t>(*seek_it);\r
+       }\r
+       \r
+       auto length_it = std::find(params.begin(), params.end(), L"LENGTH");\r
+       if(length_it != params.end())\r
+       {\r
+               if(++length_it != params.end())\r
+                       length = boost::lexical_cast<size_t>(*length_it);\r
        }\r
 \r
        std::wstring filter = L"";\r
index 23822c5a5abb6a85b31875e99bcde2fd550ae719..9006c1edf35dc1bf97c678a1d750208191197fb7 100644 (file)
@@ -69,7 +69,9 @@ struct input::implementation : boost::noncopyable
                \r
        const std::wstring                                                                                      filename_;\r
        const bool                                                                                                      loop_;\r
-       const int                                                                                                       start_;         \r
+       const size_t                                                                                            start_;         \r
+       const size_t                                                                                            length_;\r
+       size_t                                                                                                          frame_number_;\r
        \r
        tbb::concurrent_bounded_queue<std::shared_ptr<AVPacket>>        buffer_;\r
        tbb::atomic<size_t>                                                                                     buffer_size_;\r
@@ -83,11 +85,13 @@ struct input::implementation : boost::noncopyable
        tbb::atomic<size_t>                                                                                     nb_loops_;\r
 \r
 public:\r
-       explicit implementation(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, int start\r
+       explicit implementation(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, size_t start, size_t length\r
                : graph_(graph)\r
                , loop_(loop)\r
                , filename_(filename)\r
-               , start_(std::max(start, 0))\r
+               , start_(start)\r
+               , length_(length)\r
+               , frame_number_(0)\r
        {                       \r
                is_running_ = true;\r
                nb_frames_      = 0;\r
@@ -104,7 +108,7 @@ public:
                \r
                default_stream_index_ = THROW_ON_ERROR2(av_find_default_stream_index(format_context_.get()), print());\r
 \r
-               if(start_ != 0)                 \r
+               if(start_ > 0)                  \r
                        seek_frame(start_);\r
                \r
                for(int n = 0; n < 16 && !full(); ++n)\r
@@ -195,6 +199,7 @@ private:
                if(is_eof(ret))                                                                                                              \r
                {\r
                        ++nb_loops_;\r
+                       frame_number_ = 0;\r
 \r
                        if(loop_)\r
                        {\r
@@ -212,8 +217,12 @@ private:
                {               \r
                        THROW_ON_ERROR(ret, print(), "av_read_frame");\r
 \r
-                       if(read_packet->stream_index == default_stream_index_ && nb_loops_ == 0)\r
-                               ++nb_frames_;\r
+                       if(read_packet->stream_index == default_stream_index_)\r
+                       {\r
+                               if(nb_loops_ == 0)\r
+                                       ++nb_frames_;\r
+                               ++frame_number_;\r
+                       }\r
 \r
                        THROW_ON_ERROR2(av_dup_packet(read_packet.get()), print());\r
                                \r
@@ -253,7 +262,7 @@ private:
                if(ret == AVERROR_EOF)\r
                        CASPAR_LOG(trace) << print() << " Received EOF. " << nb_frames_;\r
 \r
-               return ret == AVERROR_EOF || ret == AVERROR(EIO); // av_read_frame doesn't always correctly return AVERROR_EOF;\r
+               return ret == AVERROR_EOF || ret == AVERROR(EIO) || frame_number_ >= length_; // av_read_frame doesn't always correctly return AVERROR_EOF;\r
        }\r
        \r
        std::wstring print() const\r
@@ -262,8 +271,8 @@ private:
        }\r
 };\r
 \r
-input::input(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, int start, int length) \r
-       : impl_(new implementation(graph, filename, loop, start)){}\r
+input::input(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, size_t start, size_t length) \r
+       : impl_(new implementation(graph, filename, loop, start, length)){}\r
 bool input::eof() const {return !impl_->is_running_;}\r
 bool input::try_pop(std::shared_ptr<AVPacket>& packet){return impl_->try_pop(packet);}\r
 safe_ptr<AVFormatContext> input::context(){return make_safe(impl_->format_context_);}\r
index 1d5b729d49b9dde64584f99c53bfe51e5812999d..66e8e547ea4b00bdeaddd3b8a079d9c1debb9f99 100644 (file)
@@ -40,7 +40,7 @@ class graph;
 class input : boost::noncopyable\r
 {\r
 public:\r
-       explicit input(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, int start, int length);\r
+       explicit input(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, size_t start = 0, size_t length = std::numeric_limits<size_t>::max());\r
 \r
        bool try_pop(std::shared_ptr<AVPacket>& packet);\r
        bool eof() const;\r