From 78b708f94d12b460d099a4323dd1ae7988672493 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 5 Jun 2014 11:59:13 +0100 Subject: Use Magick::Image::write rather than a hand-made loop; much faster. --- src/lib/image_proxy.cc | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'src/lib/image_proxy.cc') diff --git a/src/lib/image_proxy.cc b/src/lib/image_proxy.cc index 230bfacad..dbfd8c6d4 100644 --- a/src/lib/image_proxy.cc +++ b/src/lib/image_proxy.cc @@ -134,18 +134,8 @@ MagickImageProxy::image () const _image.reset (new Image (PIX_FMT_RGB24, size, true)); using namespace MagickCore; - - 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; - } - p += _image->stride()[0]; - } + + magick_image->write (0, 0, size.width, size.height, "RGB", CharPixel, _image->data()[0]); delete magick_image; -- cgit v1.2.3 From 604e8aae4fc6ed22f9051173b11f509d178617c7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 9 Jun 2014 00:38:55 +0100 Subject: Fix corrupted still image sources in some cases. --- src/lib/image_proxy.cc | 12 +++++++----- src/lib/image_proxy.h | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'src/lib/image_proxy.cc') diff --git a/src/lib/image_proxy.cc b/src/lib/image_proxy.cc index dbfd8c6d4..618cdbcf3 100644 --- a/src/lib/image_proxy.cc +++ b/src/lib/image_proxy.cc @@ -133,11 +133,13 @@ MagickImageProxy::image () const _image.reset (new Image (PIX_FMT_RGB24, size, true)); - using namespace MagickCore; - - magick_image->write (0, 0, size.width, size.height, "RGB", CharPixel, _image->data()[0]); - - delete magick_image; + /* 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 i = 0; i < size.height; ++i) { + using namespace MagickCore; + magick_image->write (0, i, size.width, 1, "RGB", CharPixel, p); + p += _image->stride()[0]; + } LOG_TIMING ("[%1] MagickImageProxy completes decode and convert of %2 bytes", boost::this_thread::get_id(), _blob.length()); diff --git a/src/lib/image_proxy.h b/src/lib/image_proxy.h index b499b3292..f6212e54f 100644 --- a/src/lib/image_proxy.h +++ b/src/lib/image_proxy.h @@ -49,7 +49,8 @@ class ImageProxy : public boost::noncopyable { public: ImageProxy (boost::shared_ptr log); - + + /** @return Image (which must be aligned) */ virtual boost::shared_ptr image () const = 0; virtual void add_metadata (xmlpp::Node *) const = 0; virtual void send_binary (boost::shared_ptr) const = 0; -- cgit v1.2.3 From ac1d52f98e8db9d428b08eb1de655ddfc83836e3 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 10 Jun 2014 10:24:06 +0100 Subject: Fix server/client with non-RGB24 images. --- ChangeLog | 2 ++ src/lib/image_proxy.cc | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'src/lib/image_proxy.cc') diff --git a/ChangeLog b/ChangeLog index c03d54e9a..a402353d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2014-06-09 Carl Hetherington + * Fix server/client with non-RGB24 sources. + * Make audio gain a floating-point value in the UI (#367). * Work-around out-of-memory crashes with large start trims (#252). diff --git a/src/lib/image_proxy.cc b/src/lib/image_proxy.cc index 618cdbcf3..4e2f8a135 100644 --- a/src/lib/image_proxy.cc +++ b/src/lib/image_proxy.cc @@ -55,7 +55,7 @@ RawImageProxy::RawImageProxy (shared_ptr xml, shared_ptr soc 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); } @@ -71,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 (libdcp::raw_convert (_image->size().width)); node->add_child("Height")->add_child_text (libdcp::raw_convert (_image->size().height)); + node->add_child("PixelFormat")->add_child_text (libdcp::raw_convert (_image->pixel_format ())); } void -- cgit v1.2.3