Hello community, here is the log from the commit of package libopenraw for openSUSE:11.4 checked in at Thu Jun 16 23:13:27 CEST 2011. -------- --- old-versions/11.4/all/libopenraw/libopenraw.changes 2010-10-11 21:23:06.000000000 +0200 +++ 11.4/libopenraw/libopenraw.changes 2011-06-15 06:44:51.000000000 +0200 @@ -1,0 +2,10 @@ +Wed Jun 15 04:40:03 UTC 2011 - glin@novell.com + +- Merge upstream patch libopenraw-detect-compressed-otf.patch to + avoid segfault while loading Olympus raw files (.orf) + bnc#561232, fdo#26618 + +- Rebase and merge upstream patch libopenraw-orf-thumbnail.patch to + decompress otf bnc#699678 + +------------------------------------------------------------------- Package does not exist at destination yet. Using Fallback old-versions/11.4/all/libopenraw Destination is old-versions/11.4/UPDATES/all/libopenraw calling whatdependson for 11.4-i586 New: ---- libopenraw-detect-compressed-otf.patch libopenraw-orf-thumbnail.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libopenraw.spec ++++++ --- /var/tmp/diff_new_pack.jMo4j5/_old 2011-06-16 23:07:30.000000000 +0200 +++ /var/tmp/diff_new_pack.jMo4j5/_new 2011-06-16 23:07:30.000000000 +0200 @@ -1,7 +1,7 @@ # -# spec file for package libopenraw (Version 0.0.8) +# spec file for package libopenraw # -# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -21,13 +21,17 @@ Name: libopenraw Version: 0.0.8 -Release: 9 +Release: 11.<RELEASE12> License: LGPLv2.1+ Group: Development/Libraries/C and C++ Source0: http://libopenraw.freedesktop.org/download/%name-%{version}.tar.bz2 Source99: baselibs.conf # PATCH-FIX-UPSTREAM libopenraw-gdk-pixbuf-loaders-path.patch fdo29208 -- Install gdk-pixbuf module in the right directory, only works with gdk-pixbuf >= 2.21 Patch0: libopenraw-gdk-pixbuf-loaders-path.patch +# PATCH-FIX-UPSTREAM libopenraw-detect-compressed-otf.patch bnc561232 fdo26618 glin@novell.com -- Detect the compressed otf file to avoid potential segfault +Patch1: libopenraw-detect-compressed-otf.patch +# PATCH-FIX-UPSTREAM libopenraw-orf-thumbnail.patch bnc699678 glin@novell.com - Decompress otf files +Patch2: libopenraw-orf-thumbnail.patch BuildRequires: gcc-c++ BuildRequires: boost-devel >= 1.33.1 BuildRequires: libjpeg-devel @@ -73,8 +77,11 @@ %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 %build +autoreconf %configure --disable-static --with-pic %{__make} %{?jobs:-j%jobs} ++++++ libopenraw-detect-compressed-otf.patch ++++++ commit 1b15acdcfdc4664bc6c0be473cb6e096071a4e62 Author: Hubert Figuiere <hub@figuiere.net> Date: Sat Mar 6 11:41:43 2010 -0800 - Support (partially) PEF from Pentax K20D. - Detect that ORF file are compressed if they are. (Closes #26618) - Skip compressed CFA when rendering the image. (Closes #25464) diff --git a/README b/README index b4716ee..e373a22 100644 --- a/README +++ b/README @@ -114,9 +114,9 @@ Olympus ORF Y Y N Y Y Y E-10 B B T E-3 T T T E-300 T T B T T T - E-330 T T T + E-330 T T N T E-400 T B T T - E-410 B T T T + E-410 B T N T T E-500 T T T T E-510 B T T T SP-350 @@ -143,6 +143,7 @@ Pentax PEF Y Y N Y Y Y K10D T T N T T T K100D T K100D Super T T N T + K20D T T N T Epson ERF Y Y Y Y Y Y Epson RD1 T T T T T T diff --git a/include/libopenraw/consts.h b/include/libopenraw/consts.h index c2d6bf4..de49034 100644 --- a/include/libopenraw/consts.h +++ b/include/libopenraw/consts.h @@ -1,8 +1,8 @@ /* * libopenraw - consts.h * - * Copyright (C) 2005-2009 Hubert Figuiere * Copyright (c) 2008 Novell, Inc. + * Copyright (C) 2005-2010 Hubert Figuiere * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -204,7 +204,8 @@ extern "C" { OR_TYPEID_PENTAX_IST_D, OR_TYPEID_PENTAX_IST_DL, OR_TYPEID_PENTAX_K100D_PEF, - OR_TYPEID_PENTAX_K100D_SUPER_PEF + OR_TYPEID_PENTAX_K100D_SUPER_PEF, + OR_TYPEID_PENTAX_K20D_PEF }; /** Epson type IDs */ diff --git a/lib/orffile.cpp b/lib/orffile.cpp index c9f0181..28980f4 100644 --- a/lib/orffile.cpp +++ b/lib/orffile.cpp @@ -1,7 +1,7 @@ /* * libopenraw - orffile.cpp * - * Copyright (C) 2006, 2008 Hubert Figuiere + * Copyright (C) 2006, 2008, 2010 Hubert Figuiere * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -77,7 +77,7 @@ namespace OpenRaw { IFDDir::Ref ORFFile::_locateCfaIfd() { - // in PEF the CFA IFD is the main IFD + // in ORF the CFA IFD is the main IFD if(!m_mainIfd) { m_mainIfd = _locateMainIfd(); } @@ -92,12 +92,37 @@ namespace OpenRaw { - ::or_error ORFFile::_getRawData(RawData & data, uint32_t /*options*/) + ::or_error ORFFile::_getRawData(RawData & data, uint32_t options) { + ::or_error err; if(!m_cfaIfd) { m_cfaIfd = _locateCfaIfd(); } - return _getRawDataFromDir(data, m_cfaIfd); + err = _getRawDataFromDir(data, m_cfaIfd); + if(err == OR_ERROR_NONE) { + // ORF files seems to be marked as uncompressed even if they are. + uint32_t x = data.x(); + uint32_t y = data.y(); + uint16_t compression = 0; + if(data.size() < x * y * 2) { + compression = 65535; + data.setCompression(65535); + data.setDataType(OR_DATA_TYPE_COMPRESSED_CFA); + } + else { + compression = data.compression(); + } + switch(compression) { + case 65535: + if((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) { + // TODO decompress + } + break; + default: + break; + } + } + return err; } } diff --git a/lib/peffile.cpp b/lib/peffile.cpp index d8849fb..cef6b27 100644 --- a/lib/peffile.cpp +++ b/lib/peffile.cpp @@ -1,7 +1,7 @@ /* * libopenraw - peffile.cpp * - * Copyright (C) 2006-2008 Hubert Figuiere + * Copyright (C) 2006-2008, 2010 Hubert Figuiere * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -48,6 +48,8 @@ namespace OpenRaw { OR_TYPEID_PENTAX_K100D_PEF) }, { "PENTAX K100D Super ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX, OR_TYPEID_PENTAX_K100D_PEF) }, + { "PENTAX K20D ", OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX, + OR_TYPEID_PENTAX_K20D_PEF) }, { 0, 0 } }; @@ -83,7 +85,7 @@ namespace OpenRaw { return m_container->setDirectory(0); } - ::or_error PEFFile::_getRawData(RawData & data, uint32_t /*options*/) + ::or_error PEFFile::_getRawData(RawData & data, uint32_t options) { ::or_error err; if(!m_cfaIfd) { @@ -91,14 +93,12 @@ namespace OpenRaw { } err = _getRawDataFromDir(data, m_cfaIfd); if(err == OR_ERROR_NONE) { - uint16_t compression = 0; - m_cfaIfd->getValue(IFD::EXIF_TAG_COMPRESSION, compression); - switch(compression) { - case 1: - data.setDataType(OR_DATA_TYPE_CFA); - break; - case 65535: - // TODO decompress + uint16_t compression = data.compression(); + switch(compression) { + case 65535: + if((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) { + // TODO decompress + } break; default: break; diff --git a/lib/rawfile.cpp b/lib/rawfile.cpp index 6b0821b..c1c11cb 100644 --- a/lib/rawfile.cpp +++ b/lib/rawfile.cpp @@ -1,8 +1,8 @@ /* * libopenraw - rawfile.cpp * - * Copyright (C) 2006-2008 Hubert Figuiere * Copyright (C) 2008 Novell, Inc. + * Copyright (C) 2006-2008, 2010 Hubert Figuiere * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -379,8 +379,13 @@ const std::vector<uint32_t> & RawFile::listThumbnailSizes(void) ::or_error RawFile::getRenderedImage(BitmapData & bitmapdata, uint32_t options) { RawData rawdata; + Trace(DEBUG1) << "options are " << options << "\n"; ::or_error ret = getRawData(rawdata, options); if(ret == OR_ERROR_NONE) { + if(rawdata.dataType() != OR_DATA_TYPE_CFA) { + Trace(DEBUG1) << "wrong data type\n"; + return OR_ERROR_INVALID_FORMAT; + } uint32_t x,y; or_cfa_pattern pattern; uint16_t *src; diff --git a/testsuite/testsuite.xml b/testsuite/testsuite.xml index 9f18dec..c5964b4 100644 --- a/testsuite/testsuite.xml +++ b/testsuite/testsuite.xml @@ -346,6 +346,42 @@ </results> </test> <test> + <name>ORF-test E330</name> + <file>/home/hub/samples/300mm_f5.6.ORF</file> + <source>http://raw.fotosite.pl/download-Olympus_E-330_Sigma_135-400_f4.5-5.6/300mm_f5.6.ORF</source> + <results> + <rawType>ORF</rawType> + <rawTypeId>458757</rawTypeId> + <thumbNum>1</thumbNum> + <thumbSizes>160</thumbSizes> + <thumbFormats>JPEG</thumbFormats> + <thumbDataSizes>11074</thumbDataSizes> + <rawDataType>COMP_CFA</rawDataType> + <rawDataSize>12857600</rawDataSize> + <rawDataDimensions>3280 2450</rawDataDimensions> + <rawCfaPattern>RGGB</rawCfaPattern> + <rawMinValue>0</rawMinValue> + <rawMaxValue>65535</rawMaxValue> + <metaOrientation>1</metaOrientation> + </results> + </test> + <test> + <name>ORF-test E-410</name> + <file>/home/hub/samples/p1013308.orf</file> + <results> + <rawType>ORF</rawType> + <rawTypeId>458759</rawTypeId> + <thumbNum>0</thumbNum> + <rawDataType>COMP_CFA</rawDataType> + <rawDataSize>8131436</rawDataSize> + <rawDataDimensions>3720 2800</rawDataDimensions> + <rawCfaPattern>RGGB</rawCfaPattern> + <rawMinValue>0</rawMinValue> + <rawMaxValue>65535</rawMaxValue> + <metaOrientation>1</metaOrientation> + </results> + </test> + <test> <name>MRW-test Dimage5</name> <file>/home/hub/samples/mrw/Dimage5/dimage5.mrw</file> <source>http://libopenraw.freedesktop.org/samples/mrw/dimage5.mrw</source> ++++++ libopenraw-orf-thumbnail.patch ++++++
From 9be26e10ecbf89ce99b294906be1208d5a484c7e Mon Sep 17 00:00:00 2001 From: Hubert Figuiere <hub@figuiere.net> Date: Fri, 18 Mar 2011 23:41:38 -0700 Subject: [PATCH 1/2] Better support for compression ID Implement Olympus decompression (with decompressor borrowed from RawSpeed)
--- AUTHORS | 3 + lib/Makefile.am | 2 + lib/bititerator.cpp | 30 +++++-- lib/bititerator.h | 4 +- lib/dngfile.cpp | 2 +- lib/ifd.h | 4 +- lib/ifdfile.cpp | 14 +++- lib/ifdfile.h | 7 ++ lib/olympusdecompressor.cpp | 205 +++++++++++++++++++++++++++++++++++++++++++ lib/olympusdecompressor.h | 51 +++++++++++ lib/orffile.cpp | 28 +++++- lib/orffile.h | 5 + lib/peffile.cpp | 2 +- 13 files changed, 338 insertions(+), 19 deletions(-) create mode 100644 lib/olympusdecompressor.cpp create mode 100644 lib/olympusdecompressor.h Index: libopenraw-0.0.8/AUTHORS =================================================================== --- libopenraw-0.0.8.orig/AUTHORS +++ libopenraw-0.0.8/AUTHORS @@ -4,6 +4,9 @@ MRW support: Bradley Broom NEF decompression: Rafael Espíndola Python bindings: Brian Quinlan +Indirect contributors: +Klaus Post for code from RawSpeed. + Sponsors: Novell sponsored time to work on libopenraw as part of their ITO programme (and HackWeek in February 2008) Index: libopenraw-0.0.8/lib/Makefile.am =================================================================== --- libopenraw-0.0.8.orig/lib/Makefile.am +++ libopenraw-0.0.8/lib/Makefile.am @@ -32,6 +32,7 @@ noinst_HEADERS = or_debug.h \ ljpegdecompressor.h \ ljpegdecompressor_priv.h \ crwdecompressor.h \ + olympusdecompressor.h \ exception.h \ endianutils.h \ metavalue.h \ @@ -83,6 +84,7 @@ libopenraw_la_SOURCES = \ decompressor.cpp \ ljpegdecompressor.cpp \ crwdecompressor.cpp \ + olympusdecompressor.cpp \ metavalue.cpp \ unpack.cpp \ bimedian_demosaic.cpp demosaic.h \ Index: libopenraw-0.0.8/lib/bititerator.cpp =================================================================== --- libopenraw-0.0.8.orig/lib/bititerator.cpp +++ libopenraw-0.0.8/lib/bititerator.cpp @@ -20,6 +20,7 @@ */ #include <assert.h> +#include <algorithm> #include "bititerator.h" namespace OpenRaw { @@ -53,22 +54,35 @@ void BitIterator::load(size_t numBits) uint32_t BitIterator::get(size_t n) { - assert(n <= 25); + uint32_t ret = peek(n); + + skip(n); + return ret; +} + +uint32_t BitIterator::peek(size_t n) +{ + assert(n <= 25); + if (n == 0) return 0; - + if (n > m_bitsOnBuffer) load(n - m_bitsOnBuffer); - + assert(n <= m_bitsOnBuffer); + + return m_bitBuffer >> (32 - n); +} - uint32_t ret = m_bitBuffer >> (32 - n); - m_bitsOnBuffer -= n; - m_bitBuffer <<= n; - - return ret; +void BitIterator::skip(size_t n) +{ + size_t num_bits = std::min(n, m_bitsOnBuffer); + m_bitsOnBuffer -= num_bits; + m_bitBuffer <<= num_bits; } + } } Index: libopenraw-0.0.8/lib/bititerator.h =================================================================== --- libopenraw-0.0.8.orig/lib/bititerator.h +++ libopenraw-0.0.8/lib/bititerator.h @@ -31,12 +31,14 @@ namespace Internals { class BitIterator { const uint8_t* m_p; uint32_t m_bitBuffer; - uint8_t m_bitsOnBuffer; + size_t m_bitsOnBuffer; void load(size_t numBits); public: BitIterator(const void *); uint32_t get(size_t); + uint32_t peek(size_t); + void skip(size_t); }; } Index: libopenraw-0.0.8/lib/dngfile.cpp =================================================================== --- libopenraw-0.0.8.orig/lib/dngfile.cpp +++ libopenraw-0.0.8/lib/dngfile.cpp @@ -89,7 +89,7 @@ namespace OpenRaw { if(ret == OR_ERROR_NONE) { uint16_t compression = 0; if (m_cfaIfd->getValue(IFD::EXIF_TAG_COMPRESSION, compression) && - compression == 7) { + compression == IFD::COMPRESS_LJPEG) { // if the option is not set, decompress if ((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) { boost::scoped_ptr<IO::Stream> s(new IO::MemStream(data.data(), Index: libopenraw-0.0.8/lib/ifd.h =================================================================== --- libopenraw-0.0.8.orig/lib/ifd.h +++ libopenraw-0.0.8/lib/ifd.h @@ -69,8 +69,10 @@ namespace OpenRaw { typedef enum { COMPRESS_NONE = 1, COMPRESS_JPEG = 6, + COMPRESS_LJPEG = 7, /**< Lossless JPEG, see DNG */ COMPRESS_NIKON_PACK = 32769, - COMPRESS_NIKON_QUANTIZED = 34713 + COMPRESS_NIKON_QUANTIZED = 34713, + COMPRESS_CUSTOM = 65535 /**< The value everybody seems to use */ } TiffCompress; } } Index: libopenraw-0.0.8/lib/ifdfile.cpp =================================================================== --- libopenraw-0.0.8.orig/lib/ifdfile.cpp +++ libopenraw-0.0.8/lib/ifdfile.cpp @@ -339,6 +339,15 @@ MetaValue *IFDFile::_getMetaValue(int32_ } return val; } + +/** by default we don't translate the compression + */ +uint32_t IFDFile::_translateCompressionType(IFD::TiffCompress tiffCompression) +{ + return (uint32_t)tiffCompression; +} + + namespace { @@ -541,14 +550,15 @@ static RawData::CfaPattern _getCfaPatter return OR_ERROR_NOT_FOUND; } - uint32_t compression = 0; - got_it = dir->getIntegerValue(IFD::EXIF_TAG_COMPRESSION, compression); + uint16_t tiffCompression = 0; + got_it = dir->getValue(IFD::EXIF_TAG_COMPRESSION, tiffCompression); if(!got_it) { Trace(DEBUG1) << "Compression type not found\n"; } BitmapData::DataType data_type = OR_DATA_TYPE_NONE; + uint32_t compression = _translateCompressionType((IFD::TiffCompress)tiffCompression); switch(compression) { case IFD::COMPRESS_NONE: Index: libopenraw-0.0.8/lib/ifdfile.h =================================================================== --- libopenraw-0.0.8.orig/lib/ifdfile.h +++ libopenraw-0.0.8/lib/ifdfile.h @@ -102,6 +102,13 @@ namespace OpenRaw { virtual MetaValue *_getMetaValue(int32_t meta_index); + /** Translate the compression type from the tiff type (16MSB) + * to the RAW specific type if needed (16MSB) + * @param tiffCompression the 16 bits value from TIFF + * @return the actually value. Anything >= 2^16 is specific the RAW type + */ + virtual uint32_t _translateCompressionType(IFD::TiffCompress tiffCompression); + IFDDir::Ref m_cfaIfd; /**< the IFD for the CFA */ IFDDir::Ref m_mainIfd; /**< the IFD for the main image * does not necessarily reference Index: libopenraw-0.0.8/lib/olympusdecompressor.cpp =================================================================== --- /dev/null +++ libopenraw-0.0.8/lib/olympusdecompressor.cpp @@ -0,0 +1,207 @@ +/* + * libopenraw - olympusdecompressor.cpp + * + * Copyright (C) 2011 Hubert Figuiere + * Olympus Decompression copied from RawSpeed + * Copyright (C) 2009 Klaus Post + * + * This library is free software: you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> + +#include <libopenraw++/rawdata.h> + +#include "io/stream.h" +#include "olympusdecompressor.h" +#include "bititerator.h" + + +namespace OpenRaw { +namespace Internals { + +static void decompressOlympus(const uint8_t* buffer, uint8_t* data, uint32_t w, uint32_t h); + +// decompression ported from RawSpeed. +static void decompressOlympus(const uint8_t* buffer, uint8_t* data, uint32_t w, uint32_t h) +{ + int nbits, sign, low, high, i, wo0, n, nw0, wo1, nw1; + int acarry0[3], acarry1[3], pred, diff; + + int pitch = w * 2; //(((w * 2/*bpp*/) + 15) / 16) * 16; // TODO make that part of the outer datas + + /* Build a table to quickly look up "high" value */ + char bittable[4096]; + for (i = 0; i < 4096; i++) { + int b = i; + for (high = 0; high < 12; high++) { + if ((b>>(11-high))&1) { + break; + } + } + bittable[i] = high; + } + wo0 = nw0 = wo1 = nw1 = 0; + buffer += 7; + + BitIterator bits(buffer); + + for (uint32_t y = 0; y < h; y++) { + memset(acarry0, 0, sizeof acarry0); + memset(acarry1, 0, sizeof acarry1); + uint16_t* dest = (uint16_t*) & data[y*pitch]; + for (uint32_t x = 0; x < w; x++) { +// bits.checkPos(); +// bits.fill(); + i = 2 * (acarry0[2] < 3); + for (nbits = 2 + i; (uint16_t) acarry0[0] >> (nbits + i); nbits++) { + + } + + uint32_t b = bits.peek(15); + sign = (b >> 14) * -1; + low = (b >> 12) & 3; + high = bittable[b&4095]; + // Skip bits used above. + bits.skip(std::min(12+3, high + 1 + 3)); + + if (high == 12) { + high = bits.get(16 - nbits) >> 1; + } + + acarry0[0] = (high << nbits) | bits.get(nbits); + diff = (acarry0[0] ^ sign) + acarry0[1]; + acarry0[1] = (diff * 3 + acarry0[1]) >> 5; + acarry0[2] = acarry0[0] > 16 ? 0 : acarry0[2] + 1; + + if (y < 2 || x < 2) { + if (y < 2 && x < 2) { + pred = 0; + } + else if (y < 2) { + pred = wo0; + } + else { + pred = dest[-pitch+((int)x)]; + nw0 = pred; + } + dest[x] = pred + ((diff << 2) | low); + // Set predictor + wo0 = dest[x]; + } + else { + n = dest[-pitch+((int)x)]; + if (((wo0 < nw0) & (nw0 < n)) | ((n < nw0) & (nw0 < wo0))) { + if (abs(wo0 - nw0) > 32 || abs(n - nw0) > 32) { + pred = wo0 + n - nw0; + } + else { + pred = (wo0 + n) >> 1; + } + } + else { + pred = abs(wo0 - nw0) > abs(n - nw0) ? wo0 : n; + } + + dest[x] = pred + ((diff << 2) | low); + // Set predictors + wo0 = dest[x]; + nw0 = n; + } + // _ASSERTE(0 == dest[x] >> 12) ; + + // ODD PIXELS + x += 1; +// bits.checkPos(); +// bits.fill(); + i = 2 * (acarry1[2] < 3); + for (nbits = 2 + i; (uint16_t) acarry1[0] >> (nbits + i); nbits++) { + + } + b = bits.peek(15); + sign = (b >> 14) * -1; + low = (b >> 12) & 3; + high = bittable[b&4095]; + // Skip bits used above. + bits.skip(std::min(12+3, high + 1 + 3)); + + if (high == 12) { + high = bits.get(16 - nbits) >> 1; + } + + acarry1[0] = (high << nbits) | bits.get(nbits); + diff = (acarry1[0] ^ sign) + acarry1[1]; + acarry1[1] = (diff * 3 + acarry1[1]) >> 5; + acarry1[2] = acarry1[0] > 16 ? 0 : acarry1[2] + 1; + + if (y < 2 || x < 2) { + if (y < 2 && x < 2) { + pred = 0; + } + else if (y < 2) { + pred = wo1; + } + else { + pred = dest[-pitch+((int)x)]; + nw1 = pred; + } + dest[x] = pred + ((diff << 2) | low); + // Set predictor + wo1 = dest[x]; + } + else { + n = dest[-pitch+((int)x)]; + if (((wo1 < nw1) & (nw1 < n)) | ((n < nw1) & (nw1 < wo1))) { + if (abs(wo1 - nw1) > 32 || abs(n - nw1) > 32) { + pred = wo1 + n - nw1; + } + else { + pred = (wo1 + n) >> 1; + } + } + else { + pred = abs(wo1 - nw1) > abs(n - nw1) ? wo1 : n; + } + + dest[x] = pred + ((diff << 2) | low); + + // Set predictors + wo1 = dest[x]; + nw1 = n; + } + // _ASSERTE(0 == dest[x] >> 12) ; + } + } +} + +RawData *OlympusDecompressor::decompress(RawData *in) +{ + RawData *output; + if(in) { + output = in; + } + else { + output = new RawData; + } + + output->allocData(m_w * m_h * 2); + decompressOlympus(m_buffer, (uint8_t*)output->data(), m_w, m_h); + + return output; +} + + +} +} Index: libopenraw-0.0.8/lib/olympusdecompressor.h =================================================================== --- /dev/null +++ libopenraw-0.0.8/lib/olympusdecompressor.h @@ -0,0 +1,51 @@ +/* + * libopenraw - olympusdecompressor.cpp + * + * Copyright (C) 2011 Hubert Figuiere + * + * This library is free software: you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + */ + + +#ifndef __OPENRAW_OLYMPUSDECOMPRESSOR_H__ +#define __OPENRAW_OLYMPUSDECOMPRESSOR_H__ + +#include "decompressor.h" + +namespace OpenRaw { +namespace Internals { + +class OlympusDecompressor + : public Decompressor +{ +public: + OlympusDecompressor(const uint8_t *buffer, + RawContainer * container, uint32_t w, uint32_t h) + : Decompressor(NULL, container) + , m_buffer(buffer) + , m_h(h) + , m_w(w) + { + } + virtual RawData *decompress(RawData *in = NULL); +private: + const uint8_t *m_buffer; + uint32_t m_h; + uint32_t m_w; +}; + +} +} +#endif Index: libopenraw-0.0.8/lib/orffile.cpp =================================================================== --- libopenraw-0.0.8.orig/lib/orffile.cpp +++ libopenraw-0.0.8/lib/orffile.cpp @@ -27,6 +27,7 @@ #include "ifddir.h" #include "ifdentry.h" #include "orfcontainer.h" +#include "olympusdecompressor.h" #include "io/file.h" using namespace Debug; @@ -103,19 +104,27 @@ namespace OpenRaw { // ORF files seems to be marked as uncompressed even if they are. uint32_t x = data.x(); uint32_t y = data.y(); - uint16_t compression = 0; + uint32_t compression = 0; if(data.size() < x * y * 2) { - compression = 65535; - data.setCompression(65535); + compression = ORF_COMPRESSION; + data.setCompression(ORF_COMPRESSION); data.setDataType(OR_DATA_TYPE_COMPRESSED_CFA); } else { compression = data.compression(); } switch(compression) { - case 65535: + case ORF_COMPRESSION: if((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) { - // TODO decompress + OlympusDecompressor decomp((const uint8_t*)data.data(), m_container, x, y); + RawData *dData = decomp.decompress(NULL); + if (dData != NULL) { + dData->setCfaPattern(data.cfaPattern()); + data.swap(*dData); + data.setDataType(OR_DATA_TYPE_CFA); + data.setDimensions(x, y); + delete dData; + } } break; default: @@ -124,6 +133,15 @@ namespace OpenRaw { } return err; } + +uint32_t ORFFile::_translateCompressionType(IFD::TiffCompress tiffCompression) +{ + if(tiffCompression == IFD::COMPRESS_CUSTOM) { + return ORF_COMPRESSION; + } + return (uint32_t)tiffCompression; +} + } } Index: libopenraw-0.0.8/lib/orffile.h =================================================================== --- libopenraw-0.0.8.orig/lib/orffile.h +++ libopenraw-0.0.8/lib/orffile.h @@ -43,11 +43,16 @@ namespace OpenRaw { ORFFile(IO::Stream *); virtual ~ORFFile(); + enum { + ORF_COMPRESSION = 0x10000 + }; + protected: virtual IFDDir::Ref _locateCfaIfd(); virtual IFDDir::Ref _locateMainIfd(); virtual ::or_error _getRawData(RawData & data, uint32_t options); + virtual uint32_t _translateCompressionType(IFD::TiffCompress tiffCompression); private: static RawFile::TypeId _typeIdFromModel(const std::string & model); Index: libopenraw-0.0.8/lib/peffile.cpp =================================================================== --- libopenraw-0.0.8.orig/lib/peffile.cpp +++ libopenraw-0.0.8/lib/peffile.cpp @@ -95,7 +95,7 @@ namespace OpenRaw { if(err == OR_ERROR_NONE) { uint16_t compression = data.compression(); switch(compression) { - case 65535: + case IFD::COMPRESS_CUSTOM: if((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) { // TODO decompress } ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org