X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fimage_proxy.cc;h=1eb9c169c5c3b375d4677b61f6b19bdc58af71db;hb=4e411ea97b4dab8a5fa282d1d4cf7971ef1e24ad;hp=47ac5d3728eee1bc249d680d8b0aa94706d190fb;hpb=317222764debbaf1ac96d256df24c00af85c1b6a;p=dcpomatic.git diff --git a/src/lib/image_proxy.cc b/src/lib/image_proxy.cc index 47ac5d372..1eb9c169c 100644 --- a/src/lib/image_proxy.cc +++ b/src/lib/image_proxy.cc @@ -18,33 +18,44 @@ */ #include -#include -#include +#include +#include #include "image_proxy.h" #include "image.h" #include "exceptions.h" #include "cross.h" +#include "log.h" #include "i18n.h" +#define LOG_TIMING(...) _log->microsecond_log (String::compose (__VA_ARGS__), Log::TYPE_TIMING); + using std::cout; using std::string; using std::stringstream; using boost::shared_ptr; -RawImageProxy::RawImageProxy (shared_ptr image) - : _image (image) +ImageProxy::ImageProxy (shared_ptr log) + : _log (log) +{ + +} + +RawImageProxy::RawImageProxy (shared_ptr image, shared_ptr log) + : ImageProxy (log) + , _image (image) { } -RawImageProxy::RawImageProxy (shared_ptr xml, shared_ptr socket) +RawImageProxy::RawImageProxy (shared_ptr xml, shared_ptr socket, shared_ptr log) + : ImageProxy (log) { - libdcp::Size size ( + dcp::Size size ( xml->number_child ("Width"), xml->number_child ("Height") ); - _image.reset (new Image (PIX_FMT_RGB24, size, true)); + _image.reset (new Image (static_cast (xml->number_child ("PixelFormat")), size, true)); _image->read_from_socket (socket); } @@ -58,8 +69,9 @@ void RawImageProxy::add_metadata (xmlpp::Node* node) const { node->add_child("Type")->add_child_text (N_("Raw")); - node->add_child("Width")->add_child_text (libdcp::raw_convert (_image->size().width)); - node->add_child("Height")->add_child_text (libdcp::raw_convert (_image->size().height)); + node->add_child("Width")->add_child_text (dcp::raw_convert (_image->size().width)); + node->add_child("Height")->add_child_text (dcp::raw_convert (_image->size().height)); + node->add_child("PixelFormat")->add_child_text (dcp::raw_convert (_image->pixel_format ())); } void @@ -68,7 +80,8 @@ RawImageProxy::send_binary (shared_ptr socket) const _image->write_to_socket (socket); } -MagickImageProxy::MagickImageProxy (boost::filesystem::path path) +MagickImageProxy::MagickImageProxy (boost::filesystem::path path, shared_ptr log) + : ImageProxy (log) { /* Read the file into a Blob */ @@ -89,7 +102,8 @@ MagickImageProxy::MagickImageProxy (boost::filesystem::path path) delete[] data; } -MagickImageProxy::MagickImageProxy (shared_ptr, shared_ptr socket) +MagickImageProxy::MagickImageProxy (shared_ptr, shared_ptr socket, shared_ptr log) + : ImageProxy (log) { uint32_t const size = socket->read_uint32 (); uint8_t* data = new uint8_t[size]; @@ -105,6 +119,8 @@ MagickImageProxy::image () const return _image; } + LOG_TIMING ("[%1] MagickImageProxy begins decode and convert of %2 bytes", boost::this_thread::get_id(), _blob.length()); + Magick::Image* magick_image = 0; try { magick_image = new Magick::Image (_blob); @@ -112,25 +128,20 @@ MagickImageProxy::image () const throw DecodeError (_("Could not decode image file")); } - libdcp::Size size (magick_image->columns(), magick_image->rows()); + dcp::Size size (magick_image->columns(), magick_image->rows()); + LOG_TIMING ("[%1] MagickImageProxy decode finished", boost::this_thread::get_id ()); _image.reset (new Image (PIX_FMT_RGB24, size, true)); - using namespace MagickCore; - + /* Write line-by-line here as _image must be aligned, and write() cannot be told about strides */ uint8_t* p = _image->data()[0]; - for (int y = 0; y < size.height; ++y) { - uint8_t* q = p; - for (int x = 0; x < size.width; ++x) { - Magick::Color c = magick_image->pixelColor (x, y); - *q++ = c.redQuantum() * 255 / QuantumRange; - *q++ = c.greenQuantum() * 255 / QuantumRange; - *q++ = c.blueQuantum() * 255 / QuantumRange; - } + for (int i = 0; i < size.height; ++i) { + using namespace MagickCore; + magick_image->write (0, i, size.width, 1, "RGB", CharPixel, p); p += _image->stride()[0]; } - delete magick_image; + LOG_TIMING ("[%1] MagickImageProxy completes decode and convert of %2 bytes", boost::this_thread::get_id(), _blob.length()); return _image; } @@ -149,12 +160,12 @@ MagickImageProxy::send_binary (shared_ptr socket) const } shared_ptr -image_proxy_factory (shared_ptr xml, shared_ptr socket) +image_proxy_factory (shared_ptr xml, shared_ptr socket, shared_ptr log) { if (xml->string_child("Type") == N_("Raw")) { - return shared_ptr (new RawImageProxy (xml, socket)); + return shared_ptr (new RawImageProxy (xml, socket, log)); } else if (xml->string_child("Type") == N_("Magick")) { - return shared_ptr (new MagickImageProxy (xml, socket)); + return shared_ptr (new MagickImageProxy (xml, socket, log)); } throw NetworkError (_("Unexpected image type received by server"));