summaryrefslogtreecommitdiff
path: root/src/lib/j2k_image_proxy.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2017-08-03 17:54:06 +0100
committerCarl Hetherington <cth@carlh.net>2017-08-14 21:07:49 +0100
commit0253b4e45c71a1c2e2a8bffaf1c3cb84a0a3e41a (patch)
tree85ca9af20c85ca04a221ca9023c0d2980ffeeca7 /src/lib/j2k_image_proxy.cc
parente952a7b0681d1ad2fc6ebcd0cd7231bf59bbe043 (diff)
Basics of forced reduction of JPEG2000 decode resolution.
Diffstat (limited to 'src/lib/j2k_image_proxy.cc')
-rw-r--r--src/lib/j2k_image_proxy.cc30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/lib/j2k_image_proxy.cc b/src/lib/j2k_image_proxy.cc
index 9e68951e9..a60af1eb2 100644
--- a/src/lib/j2k_image_proxy.cc
+++ b/src/lib/j2k_image_proxy.cc
@@ -53,18 +53,31 @@ J2KImageProxy::J2KImageProxy (boost::filesystem::path path, dcp::Size size, AVPi
}
-J2KImageProxy::J2KImageProxy (shared_ptr<const dcp::MonoPictureFrame> frame, dcp::Size size, AVPixelFormat pixel_format)
+J2KImageProxy::J2KImageProxy (
+ shared_ptr<const dcp::MonoPictureFrame> frame,
+ dcp::Size size,
+ AVPixelFormat pixel_format,
+ optional<int> forced_reduction
+ )
: _data (frame->j2k_size ())
, _size (size)
, _pixel_format (pixel_format)
+ , _forced_reduction (forced_reduction)
{
memcpy (_data.data().get(), frame->j2k_data(), _data.size ());
}
-J2KImageProxy::J2KImageProxy (shared_ptr<const dcp::StereoPictureFrame> frame, dcp::Size size, dcp::Eye eye, AVPixelFormat pixel_format)
+J2KImageProxy::J2KImageProxy (
+ shared_ptr<const dcp::StereoPictureFrame> frame,
+ dcp::Size size,
+ dcp::Eye eye,
+ AVPixelFormat pixel_format,
+ optional<int> forced_reduction
+ )
: _size (size)
, _eye (eye)
, _pixel_format (pixel_format)
+ , _forced_reduction (forced_reduction)
{
switch (eye) {
case dcp::EYE_LEFT:
@@ -104,12 +117,17 @@ J2KImageProxy::prepare (optional<dcp::Size> target_size) const
int reduce = 0;
- while (target_size && (_size.width / pow(2, reduce)) > target_size->width && (_size.height / pow(2, reduce)) > target_size->height) {
- ++reduce;
+ if (_forced_reduction) {
+ reduce = *_forced_reduction;
+ } else {
+ while (target_size && (_size.width / pow(2, reduce)) > target_size->width && (_size.height / pow(2, reduce)) > target_size->height) {
+ ++reduce;
+ }
+
+ --reduce;
+ reduce = max (0, reduce);
}
- --reduce;
- reduce = max (0, reduce);
_decompressed = dcp::decompress_j2k (const_cast<uint8_t*> (_data.data().get()), _data.size (), reduce);
if (_decompressed->precision(0) < 12) {