X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fimage_proxy.cc;h=1eb9c169c5c3b375d4677b61f6b19bdc58af71db;hb=4e411ea97b4dab8a5fa282d1d4cf7971ef1e24ad;hp=c74e846c99680b1e0e3f4ab0319ad17c109f1c9a;hpb=39bc73fe192f932ed6695eb87b19de446e8b4f55;p=dcpomatic.git diff --git a/src/lib/image_proxy.cc b/src/lib/image_proxy.cc index c74e846c9..1eb9c169c 100644 --- a/src/lib/image_proxy.cc +++ b/src/lib/image_proxy.cc @@ -24,27 +24,38 @@ #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) { 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); } @@ -60,6 +71,7 @@ RawImageProxy::add_metadata (xmlpp::Node* node) const node->add_child("Type")->add_child_text (N_("Raw")); 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); @@ -113,24 +129,19 @@ MagickImageProxy::image () const } 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"));