Fix servomatic build. Hopefully resolve confusion wrt linesize and
[dcpomatic.git] / src / lib / util.h
index 77fb943e090fa8866ac7b6eb021b6bb5786c8cdb..87735ea8e82b8bc27e77b17515da26eedc8155ee 100644 (file)
@@ -62,16 +62,37 @@ typedef int SourceFrame;
 
 struct DCPFrameRate
 {
+       DCPFrameRate (float);
+
+       /** @return factor by which to multiply a source frame rate
+           to get the effective rate after any skip or repeat has happened.
+       */
+       float factor () const {
+               if (skip) {
+                       return 0.5;
+               } else if (repeat) {
+                       return 2;
+               }
+
+               return 1;
+       }
+       
        /** frames per second for the DCP */
        int frames_per_second;
-       /** Skip every `skip' frames.  e.g. if this is 1, we skip nothing;
-        *  if it's 2, we skip every other frame.
+       /** true to skip every other frame */
+       bool skip;
+       /** true to repeat every frame once */
+       bool repeat;
+       /** true if this DCP will run its video faster or slower than the source
+        *  without taking into account `repeat'.
+        *  (e.g. change_speed will be true if
+        *          source is 29.97fps, DCP is 30fps
+        *          source is 14.50fps, DCP is 30fps
+        *  but not if
+        *          source is 15.00fps, DCP is 30fps
+        *          source is 12.50fps, DCP is 25fps)
         */
-       int skip;
-       /** true if this DCP will run its video faster than the source
-        *  (e.g. if the source is 29.97fps and we will run the DCP at 30fps)
-        */
-       bool run_fast;
+       bool change_speed;
 };
 
 enum ContentType {
@@ -157,7 +178,6 @@ struct Rect
 
 extern std::string crop_string (Position, libdcp::Size);
 extern int dcp_audio_sample_rate (int);
-extern DCPFrameRate dcp_frame_rate (float);
 extern int dcp_audio_channels (int);
 extern std::string colour_lut_index_to_name (int index);
 extern int stride_round_up (int, int const *, int);
@@ -174,39 +194,35 @@ extern std::string get_optional_string (std::multimap<std::string, std::string>
  *  that are useful for DVD-o-matic.
  *
  *  This class wraps some things that I could not work out how to do with boost;
- *  most notably, sync read/write calls with timeouts, and the ability to peek into
- *  data being read.
+ *  most notably, sync read/write calls with timeouts.
  */
 class Socket
 {
 public:
-       Socket ();
+       Socket (int timeout = 30);
 
        /** @return Our underlying socket */
        boost::asio::ip::tcp::socket& socket () {
                return _socket;
        }
 
-       void connect (boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const & endpoint, int timeout);
-       void write (uint8_t const * data, int size, int timeout);
+       void connect (boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const & endpoint);
+
+       void write (uint32_t n);
+       void write (uint8_t const * data, int size);
        
-       void read_definite_and_consume (uint8_t* data, int size, int timeout);
-       void read_indefinite (uint8_t* data, int size, int timeout);
-       void consume (int amount);
+       void read (uint8_t* data, int size);
+       uint32_t read_uint32 ();
        
 private:
        void check ();
-       int read (uint8_t* data, int size, int timeout);
 
        Socket (Socket const &);
 
        boost::asio::io_service _io_service;
        boost::asio::deadline_timer _deadline;
        boost::asio::ip::tcp::socket _socket;
-       /** a buffer for small reads */
-       uint8_t _buffer[1024];
-       /** amount of valid data in the buffer */
-       int _buffer_data;
+       int _timeout;
 };
 
 /** @class AudioBuffers