Try again to sort out the audio padding / alignment.
[dcpomatic.git] / src / lib / util.h
index ed13cd43cba51bf95f2cad930381bf81f24d7d5a..1d9984d9d74f5513db5089013a72f2a111786222 100644 (file)
@@ -46,14 +46,13 @@ 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 ();
 
 enum ContentType {
        STILL,
@@ -121,16 +120,56 @@ struct Position
        int y;
 };
 
+/** A rectangle */
+struct Rect
+{
+       Rect ()
+               : x (0)
+               , y (0)
+               , width (0)
+               , height (0)
+       {}
+
+       Rect (int x_, int y_, int w_, int h_)
+               : x (x_)
+               , y (y_)
+               , width (w_)
+               , height (h_)
+       {}
+
+       int x;
+       int y;
+       int width;
+       int height;
+
+       Position position () const {
+               return Position (x, y);
+       }
+
+       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 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
@@ -160,25 +199,39 @@ 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 ();
+
+       float** data () const {
+               return _data;
+       }
+       
+       float* data (int) const;
+
+       int frames () const {
+               return _frames;
+       }
 
-#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)
+       void set_frames (int f);
 
-#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 make_silent ();
 
-#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)
+private:
+       /* no copy construction */
+       AudioBuffers (AudioBuffers const &);
+       
+       int _channels;
+       int _frames;
+       float** _data;
+};
 
 #endif
+