Merge branch 'master' into i18n
[dcpomatic.git] / src / lib / util.cc
index b500ddc2f9ae4068cd2f06a4da26cbabd6308822..4ee304600f0d368cbba0acd367b7cc0eaa03c60b 100644 (file)
@@ -63,6 +63,7 @@ extern "C" {
 
 using namespace std;
 using namespace boost;
+using libdcp::Size;
 
 thread::id ui_thread;
 
@@ -232,6 +233,8 @@ seconds (struct timeval t)
 void
 dvdomatic_setup ()
 {
+       avfilter_register_all ();
+       
        Format::setup_formats ();
        DCPContentType::setup_dcp_content_types ();
        Scaler::setup_scalers ();
@@ -246,7 +249,7 @@ dvdomatic_setup ()
  *  @return FFmpeg crop filter string.
  */
 string
-crop_string (Position start, Size size)
+crop_string (Position start, libdcp::Size size)
 {
        stringstream s;
        s << "crop=" << size.width << ":" << size.height << ":" << start.x << ":" << start.y;
@@ -332,7 +335,8 @@ md5_digest (string file)
        return s.str ();
 }
 
-static bool about_equal (float a, float b)
+static bool
+about_equal (float a, float b)
 {
        /* A film of F seconds at f FPS will be Ff frames;
           Consider some delta FPS d, so if we run the same
@@ -454,17 +458,6 @@ dcp_audio_channels (int f)
        return f;
 }
 
-
-bool operator== (Size const & a, Size const & b)
-{
-       return (a.width == b.width && a.height == b.height);
-}
-
-bool operator!= (Size const & a, Size const & b)
-{
-       return !(a == b);
-}
-
 bool operator== (Crop const & a, Crop const & b)
 {
        return (a.left == b.left && a.right == b.right && a.top == b.top && a.bottom == b.bottom);
@@ -492,10 +485,10 @@ colour_lut_index_to_name (int index)
        return "";
 }
 
-Socket::Socket ()
+Socket::Socket (int timeout)
        : _deadline (_io_service)
        , _socket (_io_service)
-       , _buffer_data (0)
+       , _timeout (timeout)
 {
        _deadline.expires_at (posix_time::pos_infin);
        check ();
@@ -512,14 +505,13 @@ Socket::check ()
        _deadline.async_wait (boost::bind (&Socket::check, this));
 }
 
-/** Blocking connect with timeout.
+/** Blocking connect.
  *  @param endpoint End-point to connect to.
- *  @param timeout Time-out in seconds.
  */
 void
-Socket::connect (asio::ip::basic_resolver_entry<asio::ip::tcp> const & endpoint, int timeout)
+Socket::connect (asio::ip::basic_resolver_entry<asio::ip::tcp> const & endpoint)
 {
-       _deadline.expires_from_now (posix_time::seconds (timeout));
+       _deadline.expires_from_now (posix_time::seconds (_timeout));
        system::error_code ec = asio::error::would_block;
        _socket.async_connect (endpoint, lambda::var(ec) = lambda::_1);
        do {
@@ -531,129 +523,61 @@ Socket::connect (asio::ip::basic_resolver_entry<asio::ip::tcp> const & endpoint,
        }
 }
 
-/** Blocking write with timeout.
+/** Blocking write.
  *  @param data Buffer to write.
  *  @param size Number of bytes to write.
- *  @param timeout Time-out, in seconds.
  */
 void
-Socket::write (uint8_t const * data, int size, int timeout)
+Socket::write (uint8_t const * data, int size)
 {
-       _deadline.expires_from_now (posix_time::seconds (timeout));
+       _deadline.expires_from_now (posix_time::seconds (_timeout));
        system::error_code ec = asio::error::would_block;
 
        asio::async_write (_socket, asio::buffer (data, size), lambda::var(ec) = lambda::_1);
+       
        do {
                _io_service.run_one ();
        } while (ec == asio::error::would_block);
 
        if (ec) {
-               throw NetworkError ("write timed out");
+               throw NetworkError (ec.message ());
        }
 }
 
-/** Blocking read with timeout.
+void
+Socket::write (uint32_t v)
+{
+       v = htonl (v);
+       write (reinterpret_cast<uint8_t*> (&v), 4);
+}
+
+/** Blocking read.
  *  @param data Buffer to read to.
  *  @param size Number of bytes to read.
- *  @param timeout Time-out, in seconds.
  */
-int
-Socket::read (uint8_t* data, int size, int timeout)
+void
+Socket::read (uint8_t* data, int size)
 {
-       _deadline.expires_from_now (posix_time::seconds (timeout));
+       _deadline.expires_from_now (posix_time::seconds (_timeout));
        system::error_code ec = asio::error::would_block;
 
-       int amount_read = 0;
-
-       _socket.async_read_some (
-               asio::buffer (data, size),
-               (lambda::var(ec) = lambda::_1, lambda::var(amount_read) = lambda::_2)
-               );
+       asio::async_read (_socket, asio::buffer (data, size), lambda::var(ec) = lambda::_1);
 
        do {
                _io_service.run_one ();
        } while (ec == asio::error::would_block);
        
        if (ec) {
-               amount_read = 0;
+               throw NetworkError (ec.message ());
        }
-
-       return amount_read;
 }
 
-/** Mark some data as being `consumed', so that it will not be returned
- *  as data again.
- *  @param size Amount of data to consume, in bytes.
- */
-void
-Socket::consume (int size)
+uint32_t
+Socket::read_uint32 ()
 {
-       assert (_buffer_data >= size);
-       
-       _buffer_data -= size;
-       if (_buffer_data > 0) {
-               /* Shift still-valid data to the start of the buffer */
-               memmove (_buffer, _buffer + size, _buffer_data);
-       }
-}
-
-/** Read a definite amount of data from our socket, and mark
- *  it as consumed.
- *  @param data Where to put the data.
- *  @param size Number of bytes to read.
- */
-void
-Socket::read_definite_and_consume (uint8_t* data, int size, int timeout)
-{
-       int const from_buffer = min (_buffer_data, size);
-       if (from_buffer > 0) {
-               /* Get data from our buffer */
-               memcpy (data, _buffer, from_buffer);
-               consume (from_buffer);
-               /* Update our output state */
-               data += from_buffer;
-               size -= from_buffer;
-       }
-
-       /* read() the rest */
-       while (size > 0) {
-               int const n = read (data, size, timeout);
-               if (n <= 0) {
-                       throw NetworkError ("could not read");
-               }
-
-               data += n;
-               size -= n;
-       }
-}
-
-/** Read as much data as is available, up to some limit.
- *  @param data Where to put the data.
- *  @param size Maximum amount of data to read.
- */
-void
-Socket::read_indefinite (uint8_t* data, int size, int timeout)
-{
-       assert (size < int (sizeof (_buffer)));
-
-       /* Amount of extra data we need to read () */
-       int to_read = size - _buffer_data;
-       while (to_read > 0) {
-               /* read as much of it as we can (into our buffer) */
-               int const n = read (_buffer + _buffer_data, to_read, timeout);
-               if (n <= 0) {
-                       throw NetworkError ("could not read");
-               }
-
-               to_read -= n;
-               _buffer_data += n;
-       }
-
-       assert (_buffer_data >= size);
-
-       /* copy data into the output buffer */
-       assert (size >= _buffer_data);
-       memcpy (data, _buffer, size);
+       uint32_t v;
+       read (reinterpret_cast<uint8_t *> (&v), 4);
+       return ntohl (v);
 }
 
 /** @param other A Rect.
@@ -942,15 +866,11 @@ video_frames_to_audio_frames (SourceFrame v, float audio_sample_rate, float fram
 bool
 still_image_file (string f)
 {
-#if BOOST_FILESYSTEM_VERSION == 3
        string ext = boost::filesystem::path(f).extension().string();
-#else
-       string ext = boost::filesystem::path(f).extension();
-#endif
 
        transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
        
-       return (ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" || ext == ".png");
+       return (ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".bmp");
 }
 
 /** @return A pair containing CPU model name and the number of processors */