Merge 1.0-seek and subtitle-content.
[dcpomatic.git] / src / lib / decoded.h
index 1de2ff79e5222e76156c368f10f263e3c3cf158a..f4ebe0dbd18a5ed7236372c352861bf5cca28888 100644 (file)
 #ifndef DCPOMATIC_LIB_DECODED_H
 #define DCPOMATIC_LIB_DECODED_H
 
+#include <libdcp/subtitle_asset.h>
 #include "types.h"
 #include "rect.h"
+#include "util.h"
 
 class Image;
 
@@ -29,20 +31,13 @@ class Decoded
 {
 public:
        Decoded ()
-               : content_time (0)
-               , dcp_time (0)
-       {}
-
-       Decoded (DCPTime ct)
-               : content_time (ct)
-               , dcp_time (0)
+               : dcp_time (0)
        {}
 
        virtual ~Decoded () {}
 
-       virtual void set_dcp_times (float speed_up, DCPTime offset) = 0;
+       virtual void set_dcp_times (VideoFrame, AudioFrame, FrameRateChange, DCPTime) = 0;
 
-       ContentTime content_time;
        DCPTime dcp_time;
 };
 
@@ -53,64 +48,98 @@ public:
        DecodedVideo ()
                : eyes (EYES_BOTH)
                , same (false)
+               , frame (0)
        {}
 
-       DecodedVideo (boost::shared_ptr<const Image> im, Eyes e, bool s, ContentTime ct)
-               : Decoded (ct)
-               , image (im)
+       DecodedVideo (boost::shared_ptr<const Image> im, Eyes e, bool s, VideoFrame f)
+               : image (im)
                , eyes (e)
                , same (s)
+               , frame (f)
        {}
 
-       void set_dcp_times (float speed_up, DCPTime offset) {
-               dcp_time = rint (content_time / speed_up) + offset;
+       void set_dcp_times (VideoFrame video_frame_rate, AudioFrame, FrameRateChange frc, DCPTime offset)
+       {
+               dcp_time = frame * TIME_HZ * frc.factor() / video_frame_rate + offset;
        }
        
        boost::shared_ptr<const Image> image;
        Eyes eyes;
        bool same;
+       VideoFrame frame;
 };
 
 class DecodedAudio : public Decoded
 {
 public:
-       DecodedAudio (boost::shared_ptr<const AudioBuffers> d, ContentTime ct)
-               : Decoded (ct)
-               , data (d)
+       DecodedAudio (boost::shared_ptr<const AudioBuffers> d, AudioFrame f)
+               : data (d)
+               , frame (f)
        {}
 
-       void set_dcp_times (float speed_up, DCPTime offset) {
-               dcp_time = rint (content_time / speed_up) + offset;
+       void set_dcp_times (VideoFrame, AudioFrame audio_frame_rate, FrameRateChange, DCPTime offset)
+       {
+               dcp_time = frame * TIME_HZ / audio_frame_rate + offset;
        }
        
        boost::shared_ptr<const AudioBuffers> data;
+       AudioFrame frame;
 };
 
-class DecodedSubtitle : public Decoded
+class DecodedImageSubtitle : public Decoded
 {
 public:
-       DecodedSubtitle ()
-               : content_time_to (0)
+       DecodedImageSubtitle ()
+               : content_time (0)
+               , content_time_to (0)
                , dcp_time_to (0)
        {}
 
-       DecodedSubtitle (boost::shared_ptr<Image> im, dcpomatic::Rect<double> r, ContentTime f, ContentTime t)
-               : Decoded (f)
-               , image (im)
+       DecodedImageSubtitle (boost::shared_ptr<Image> im, dcpomatic::Rect<double> r, ContentTime f, ContentTime t)
+               : image (im)
                , rect (r)
+               , content_time (f)
                , content_time_to (t)
                , dcp_time_to (0)
        {}
 
-       void set_dcp_times (float speed_up, DCPTime offset) {
-               dcp_time = rint (content_time / speed_up) + offset;
-               dcp_time_to = rint (content_time_to / speed_up) + offset;
+       void set_dcp_times (VideoFrame, AudioFrame, FrameRateChange frc, DCPTime offset)
+       {
+               dcp_time = rint (content_time / frc.speed_up) + offset;
+               dcp_time_to = rint (content_time_to / frc.speed_up) + offset;
        }
 
        boost::shared_ptr<Image> image;
        dcpomatic::Rect<double> rect;
+       ContentTime content_time;
        ContentTime content_time_to;
        DCPTime dcp_time_to;
 };
 
+class DecodedTextSubtitle : public Decoded
+{
+public:
+       DecodedTextSubtitle ()
+               : dcp_time_to (0)
+       {}
+
+       DecodedTextSubtitle (std::list<libdcp::Subtitle> s)
+               : subs (s)
+       {}
+
+       void set_dcp_times (VideoFrame, AudioFrame, FrameRateChange frc, DCPTime offset)
+       {
+               if (subs.empty ()) {
+                       return;
+               }
+
+               /* Assuming that all subs are at the same time */
+               dcp_time = rint (subs.front().in().to_ticks() * 4 * TIME_HZ / frc.speed_up) + offset;
+               dcp_time_to = rint (subs.front().out().to_ticks() * 4 * TIME_HZ / frc.speed_up) + offset;
+       }
+
+       std::list<libdcp::Subtitle> subs;
+       DCPTime dcp_time_to;
+};
+
 #endif