]> git.sesse.net Git - casparcg/commitdiff
#467 [framerate_producer] Fixed nb_frames() and frame_number() calculation
authorHelge Norberg <helge.norberg@svt.se>
Fri, 9 Sep 2016 14:47:29 +0000 (16:47 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Fri, 9 Sep 2016 14:47:29 +0000 (16:47 +0200)
core/producer/framerate/framerate_producer.cpp
core/producer/transition/transition_producer.cpp

index 031e99524fba50945a99ff7190e45407c213ca6b..dc40ea97472dd36b89318785fccdb84539981e8b 100644 (file)
@@ -351,12 +351,18 @@ public:
 
        uint32_t nb_frames() const override
        {
-               return static_cast<uint32_t>(source_->nb_frames() * boost::rational_cast<double>(1 / get_speed() / (output_repeat_ != 0 ? 2 : 1)));
+               auto source_nb_frames = source_->nb_frames();
+               auto multiple = boost::rational_cast<double>(1 / get_speed() * (output_repeat_ != 0 ? 2 : 1));
+
+               return static_cast<uint32_t>(source_nb_frames * multiple);
        }
 
        uint32_t frame_number() const override
        {
-               return static_cast<uint32_t>(source_->frame_number() * boost::rational_cast<double>(1 / get_speed() / (output_repeat_ != 0 ? 2 : 1)));
+               auto source_frame_number = source_->frame_number() - 1; // next frame already received
+               auto multiple = boost::rational_cast<double>(1 / get_speed() * (output_repeat_ != 0 ? 2 : 1));
+
+               return static_cast<uint32_t>(source_frame_number * multiple);
        }
 
        constraints& pixel_constraints() override
index 34a5ef1bc945ec28face70b4b04d5dab29b860ad..590aca44d248fc02d3c27c9e4179ffb1ca86512c 100644 (file)
@@ -127,6 +127,11 @@ public:
                return dest_producer_->nb_frames();
        }
 
+       uint32_t frame_number() const override
+       {
+               return dest_producer_->frame_number();
+       }
+
        std::wstring print() const override
        {
                return L"transition[" + source_producer_->print() + L"=>" + dest_producer_->print() + L"]";