Remove film player, DVD ripping, alignment, screen configs; never finished and not...
[dcpomatic.git] / src / lib / util.h
index e1ad7fd642707ee546b8374e4dc879f9c792e871..7aa9f25e14f01be88c0e4e43bda5b55bc0700b4b 100644 (file)
@@ -36,7 +36,7 @@ extern "C" {
 #include "compose.hpp"
 
 #ifdef DVDOMATIC_DEBUG
-#define TIMING(...) _log->microsecond_log (String::compose (__VA_ARGS__), Log::TIMING);
+#define TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TIMING);
 #else
 #define TIMING(...)
 #endif
@@ -46,14 +46,22 @@ class Scaler;
 extern std::string seconds_to_hms (int);
 extern std::string seconds_to_approximate_hms (int);
 extern void stacktrace (std::ostream &, int);
-extern std::string audio_sample_format_to_string (AVSampleFormat);
-extern AVSampleFormat audio_sample_format_from_string (std::string);
 extern std::string dependency_version_summary ();
 extern double seconds (struct timeval);
 extern void dvdomatic_setup ();
 extern std::vector<std::string> split_at_spaces_considering_quotes (std::string);
 extern std::string md5_digest (std::string);
 extern std::string md5_digest (void const *, int);
+extern void ensure_ui_thread ();
+
+typedef int SourceFrame;
+
+struct DCPFrameRate
+{
+       int frames_per_second;
+       int skip;
+       bool run_fast;
+};
 
 enum ContentType {
        STILL,
@@ -84,6 +92,8 @@ struct Size
        int height;
 };
 
+extern bool operator== (Size const & a, Size const & b);
+
 /** A description of the crop of an image or video. */
 struct Crop
 {
@@ -122,40 +132,56 @@ struct Position
 };
 
 /** A rectangle */
-struct Rectangle
+struct Rect
 {
-       Rectangle ()
+       Rect ()
                : x (0)
                , y (0)
-               , w (0)
-               , h (0)
+               , width (0)
+               , height (0)
        {}
 
-       Rectangle (int x_, int y_, int w_, int h_)
+       Rect (int x_, int y_, int w_, int h_)
                : x (x_)
                , y (y_)
-               , w (w_)
-               , h (h_)
+               , width (w_)
+               , height (h_)
        {}
 
        int x;
        int y;
-       int w;
-       int h;
+       int width;
+       int height;
+
+       Position position () const {
+               return Position (x, y);
+       }
 
-       Rectangle intersection (Rectangle const & other) const;
+       Size size () const {
+               return Size (width, height);
+       }
+
+       Rect intersection (Rect const & other) const;
 };
 
 extern std::string crop_string (Position, Size);
 extern int dcp_audio_sample_rate (int);
+extern DCPFrameRate dcp_frame_rate (float);
 extern std::string colour_lut_index_to_name (int index);
+extern int round_up (int, int);
+extern std::multimap<std::string, std::string> read_key_value (std::istream& s);
+extern int get_required_int (std::multimap<std::string, std::string> const & kv, std::string k);
+extern float get_required_float (std::multimap<std::string, std::string> const & kv, std::string k);
+extern std::string get_required_string (std::multimap<std::string, std::string> const & kv, std::string k);
+extern int get_optional_int (std::multimap<std::string, std::string> const & kv, std::string k);
+extern std::string get_optional_string (std::multimap<std::string, std::string> const & kv, std::string k);
 
 /** @class Socket
  *  @brief A class to wrap a boost::asio::ip::tcp::socket with some things
  *  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 peak into
+ *  most notably, sync read/write calls with timeouts, and the ability to peek into
  *  data being read.
  */
 class Socket
@@ -185,25 +211,47 @@ private:
        boost::asio::deadline_timer _deadline;
        boost::asio::ip::tcp::socket _socket;
        /** a buffer for small reads */
-       uint8_t _buffer[256];
+       uint8_t _buffer[1024];
        /** amount of valid data in the buffer */
        int _buffer_data;
 };
 
-#define SCALEBITS 10
-#define ONE_HALF  (1 << (SCALEBITS - 1))
-#define FIX(x)    ((int) ((x) * (1<<SCALEBITS) + 0.5))
+class AudioBuffers
+{
+public:
+       AudioBuffers (int channels, int frames);
+       AudioBuffers (AudioBuffers const &);
+       ~AudioBuffers ();
+
+       float** data () const {
+               return _data;
+       }
+       
+       float* data (int) const;
 
-#define RGB_TO_Y_CCIR(r, g, b) \
-((FIX(0.29900*219.0/255.0) * (r) + FIX(0.58700*219.0/255.0) * (g) + \
-  FIX(0.11400*219.0/255.0) * (b) + (ONE_HALF + (16 << SCALEBITS))) >> SCALEBITS)
+       int channels () const {
+               return _channels;
+       }
+
+       int frames () const {
+               return _frames;
+       }
 
-#define RGB_TO_U_CCIR(r1, g1, b1, shift)\
-(((- FIX(0.16874*224.0/255.0) * r1 - FIX(0.33126*224.0/255.0) * g1 +         \
-     FIX(0.50000*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+       void set_frames (int f);
 
-#define RGB_TO_V_CCIR(r1, g1, b1, shift)\
-(((FIX(0.50000*224.0/255.0) * r1 - FIX(0.41869*224.0/255.0) * g1 -           \
-   FIX(0.08131*224.0/255.0) * b1 + (ONE_HALF << shift) - 1) >> (SCALEBITS + shift)) + 128)
+       void make_silent ();
+
+       void copy_from (AudioBuffers* from, int frames_to_copy, int read_offset, int write_offset);
+       void move (int from, int to, int frames);
+
+private:
+       int _channels;
+       int _frames;
+       int _allocated_frames;
+       float** _data;
+};
+
+extern int64_t video_frames_to_audio_frames (SourceFrame v, float audio_sample_rate, float frames_per_second);
 
 #endif
+