Blame lib/rw2file.cpp

rpm-build d2b433
/*
rpm-build d2b433
 * libopenraw - rw2file.cpp
rpm-build d2b433
 *
rpm-build d2b433
 * Copyright (C) 2011-2017 Hubert Figuiere
rpm-build d2b433
 *
rpm-build d2b433
 * This library is free software: you can redistribute it and/or
rpm-build d2b433
 * modify it under the terms of the GNU Lesser General Public License
rpm-build d2b433
 * as published by the Free Software Foundation, either version 3 of
rpm-build d2b433
 * the License, or (at your option) any later version.
rpm-build d2b433
 *
rpm-build d2b433
 * This library is distributed in the hope that it will be useful,
rpm-build d2b433
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rpm-build d2b433
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
rpm-build d2b433
 * Lesser General Public License for more details.
rpm-build d2b433
 *
rpm-build d2b433
 * You should have received a copy of the GNU Lesser General Public
rpm-build d2b433
 * License along with this library.  If not, see
rpm-build d2b433
 * <http://www.gnu.org/licenses/>.
rpm-build d2b433
 */
rpm-build d2b433
rpm-build d2b433
#include <stddef.h>
rpm-build d2b433
rpm-build d2b433
#include <algorithm>
rpm-build d2b433
#include <cstdint>
rpm-build d2b433
#include <memory>
rpm-build d2b433
rpm-build d2b433
#include <libopenraw/cameraids.h>
rpm-build d2b433
#include <libopenraw/debug.h>
rpm-build d2b433
rpm-build d2b433
#include "rawdata.hpp"
rpm-build d2b433
#include "trace.hpp"
rpm-build d2b433
#include "io/streamclone.hpp"
rpm-build d2b433
#include "rw2file.hpp"
rpm-build d2b433
#include "rw2container.hpp"
rpm-build d2b433
#include "jfifcontainer.hpp"
rpm-build d2b433
#include "rawfile_private.hpp"
rpm-build d2b433
rpm-build d2b433
using namespace Debug;
rpm-build d2b433
rpm-build d2b433
namespace OpenRaw {
rpm-build d2b433
rpm-build d2b433
namespace Internals {
rpm-build d2b433
rpm-build d2b433
#define OR_MAKE_PANASONIC_TYPEID(camid) \
rpm-build d2b433
    OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PANASONIC,camid)
rpm-build d2b433
#define OR_MAKE_LEICA_TYPEID(camid) \
rpm-build d2b433
    OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_LEICA,camid)
rpm-build d2b433
rpm-build d2b433
/* taken from dcraw, by default */
rpm-build d2b433
static const BuiltinColourMatrix s_matrices[] = {
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_CM1),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8770, -3194, -820, -2871, 11281, 1803, -513, 1552, 4434 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF1),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf92,
rpm-build d2b433
    { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF2),
rpm-build d2b433
    15,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 7888,-1902,-1011,-8106,16085,2099,-2353,2866,7330 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF3),
rpm-build d2b433
    15,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 9051,-2468,-1204,-5212,13276,2121,-1197,2510,6890 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF5),
rpm-build d2b433
    15,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 8228,-2945,-660,-3938,11792,2430,-1094,2278,5793 } },
rpm-build d2b433
  // Adobe DNG convert 7.4
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF6),
rpm-build d2b433
    15,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 8130,-2801,-946,-3520,11289,2552,-1314,2511,5791 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF7),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 7610, -2780, -576, -4614, 12195, 2733, -1375, 2393, 6490 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX1),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX8),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 7564, -2263, -606, -3148, 11239, 2177, -540, 1435, 4853 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ8),
rpm-build d2b433
    0,
rpm-build d2b433
    0xf7f,
rpm-build d2b433
    { 8986,-2755,-802,-6341,13575,3077,-1476,2144,6379 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ18),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 9932,-3060,-935,-5809,13331,2753,-1267,2155,5575 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ28),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf96,
rpm-build d2b433
    { 10109,-3488,-993,-5412,12812,2916,-1305,2140,5543 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ200),
rpm-build d2b433
    143,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 8112,-2563,-740,-3730,11784,2197,-941,2075,4933 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ30),
rpm-build d2b433
    0,
rpm-build d2b433
    0xf94,
rpm-build d2b433
    { 10976,-4029,-1141,-7918,15491,2600,-1670,2071,8246 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ330),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8378, -2798, -769, -3068, 11410, 1877, -538, 1792, 4623 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ50),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ100),
rpm-build d2b433
    143,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 16197,-6146,-1761,-2393,10765,1869,366,2238,5248 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G1),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf94,
rpm-build d2b433
    { 8199,-2065,-1056,-8124,16156,2033,-2458,3022,7220 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G2),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf3c,
rpm-build d2b433
    { 10113,-3400,-1114,-4765,12683,2317,-377,1437,6710 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G3),
rpm-build d2b433
    143,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 6763,-1919,-863,-3868,11515,2684,-1216,2387,5879 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G5),
rpm-build d2b433
    143,
rpm-build d2b433
    0xfff,
rpm-build d2b433
    { 7798,-2562,-740,-3879,11584,2613,-1055,2248,5434 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G10),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 10113,-3400,-1114,-4765,12683,2317,-377,1437,6710 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH1),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf92,
rpm-build d2b433
    { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH2),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf95,
rpm-build d2b433
    { 7780,-2410,-806,-3913,11724,2484,-1018,2390,5298 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH3),
rpm-build d2b433
    144,
rpm-build d2b433
    0,
rpm-build d2b433
    { 6559,-1752,-491,-3672,11407,2586,-962,1875,5130 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH4),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 7122,-2108,-512,-3155,11201,2231,-541,1423,5045 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM1),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 6770,-1895,-744,-5232,13145,2303,-1664,2691,5703 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX2),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX3),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX5),
rpm-build d2b433
    143,
rpm-build d2b433
    0,
rpm-build d2b433
    { 10909,-4295,-948,-1333,9306,2399,22,1738,4582 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX7),
rpm-build d2b433
    143,
rpm-build d2b433
    0,
rpm-build d2b433
    { 10148,-3743,-991,-2837,11366,1659,-701,1893,4899 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX100),
rpm-build d2b433
    143,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8844,-3538,-768,-3709,11762,2200,-698,1792,5220 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L1),
rpm-build d2b433
    0,
rpm-build d2b433
    0xf7f,
rpm-build d2b433
    { 8054,-1885,-1025,-8349,16367,2040,-2805,3542,7629 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L10),
rpm-build d2b433
    15,
rpm-build d2b433
    0xf96,
rpm-build d2b433
    { 8025,-1942,-1050,-7920,15904,2100,-2456,3005,7039 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ70),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8802, -3135, -789, -3151, 11468, 1904, -550, 1745, 4810 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ80),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8550, -2908, -842, -3195, 11529, 1881, -338, 1603, 4631 } },
rpm-build d2b433
  { OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ100),
rpm-build d2b433
    15,
rpm-build d2b433
    0,
rpm-build d2b433
    {  7790, -2736, -755, -3452, 11870, 1769, -628, 1647, 4898 } },
rpm-build d2b433
rpm-build d2b433
  { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DIGILUX2),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 11340,-4069,-1275,-7555,15266,2448,-2960,3426,7685 } },
rpm-build d2b433
  { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_3),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } },
rpm-build d2b433
  { OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_1),
rpm-build d2b433
    0,
rpm-build d2b433
    0,
rpm-build d2b433
    { 7906,-2709,-594,-6231,13351,3220,-1922,2631,6537 } },
rpm-build d2b433
rpm-build d2b433
  { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
rpm-build d2b433
};
rpm-build d2b433
rpm-build d2b433
const IfdFile::camera_ids_t Rw2File::s_def[] = {
rpm-build d2b433
	{ "DMC-CM1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_CM1) },
rpm-build d2b433
	{ "DMC-GF1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF1) },
rpm-build d2b433
	{ "DMC-GF2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF2) },
rpm-build d2b433
	{ "DMC-GF3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF3) },
rpm-build d2b433
	{ "DMC-GF5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF5) },
rpm-build d2b433
	{ "DMC-GF6", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF6) },
rpm-build d2b433
	{ "DMC-GF7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GF7) },
rpm-build d2b433
	{ "DMC-GX1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX1) },
rpm-build d2b433
	{ "DMC-GX7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX7) },
rpm-build d2b433
	{ "DMC-GX8", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX8) },
rpm-build d2b433
	{ "DMC-GX80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX80) },
rpm-build d2b433
	{ "DC-GX850", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GX850) },
rpm-build d2b433
	{ "DMC-FZ8", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ8) },
rpm-build d2b433
	{ "DMC-FZ18", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ18) },
rpm-build d2b433
	{ "DMC-FZ28", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ28) },
rpm-build d2b433
	{ "DMC-FZ30", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ30) },
rpm-build d2b433
	{ "DMC-FZ50", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ50) },
rpm-build d2b433
	{ "DMC-FZ100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ100) },
rpm-build d2b433
	{ "DMC-FZ200", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ200) },
rpm-build d2b433
	{ "DMC-FZ2500", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ2500) },
rpm-build d2b433
	{ "DMC-FZ330", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ330) },
rpm-build d2b433
	{ "DC-FZ82", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_FZ82) },
rpm-build d2b433
	{ "DMC-G1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G1) },
rpm-build d2b433
	{ "DMC-G2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G2) },
rpm-build d2b433
	{ "DMC-G3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G3) },
rpm-build d2b433
	{ "DMC-G5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G5) },
rpm-build d2b433
	{ "DMC-G10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G10) },
rpm-build d2b433
	{ "DMC-G80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_G80) },
rpm-build d2b433
	{ "DMC-GH1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH1) },
rpm-build d2b433
	{ "DMC-GH2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH2) },
rpm-build d2b433
	{ "DMC-GH3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH3) },
rpm-build d2b433
	{ "DMC-GH4", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH4) },
rpm-build d2b433
	{ "DC-GH5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GH5) },
rpm-build d2b433
	{ "DMC-GM1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM1) },
rpm-build d2b433
	{ "DMC-GM5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_GM5) },
rpm-build d2b433
	{ "DMC-LX2", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX2) },
rpm-build d2b433
	{ "DMC-LX3", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX3) },
rpm-build d2b433
	{ "DMC-LX5", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX5) },
rpm-build d2b433
	{ "DMC-LX7", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX7) },
rpm-build d2b433
	{ "DMC-LX10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX10) },
rpm-build d2b433
	{ "DMC-LX100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_LX100) },
rpm-build d2b433
	{ "DMC-L1", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L1) },
rpm-build d2b433
	{ "DMC-L10", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_L10) },
rpm-build d2b433
	{ "DMC-TZ100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ100) },
rpm-build d2b433
	{ "DMC-TZ70", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ70) },
rpm-build d2b433
	{ "DMC-TZ80", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_TZ80) },
rpm-build d2b433
	{ "DMC-ZS100", OR_MAKE_PANASONIC_TYPEID(OR_TYPEID_PANASONIC_ZS100) },
rpm-build d2b433
rpm-build d2b433
	{ "DIGILUX 2", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DIGILUX2) },
rpm-build d2b433
	{ "D-LUX 3", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_DLUX_3) },
rpm-build d2b433
	{ "V-LUX 1", OR_MAKE_LEICA_TYPEID(OR_TYPEID_LEICA_VLUX_1) },
rpm-build d2b433
rpm-build d2b433
	{ 0, 0 }
rpm-build d2b433
};
rpm-build d2b433
rpm-build d2b433
RawFile *Rw2File::factory(const IO::Stream::Ptr & s)
rpm-build d2b433
{
rpm-build d2b433
	return new Rw2File(s);
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
Rw2File::Rw2File(const IO::Stream::Ptr & s)
rpm-build d2b433
	: IfdFile(s, OR_RAWFILE_TYPE_RW2, false)
rpm-build d2b433
{
rpm-build d2b433
  _setIdMap(s_def);
rpm-build d2b433
  _setMatrices(s_matrices);
rpm-build d2b433
  m_container = new Rw2Container(m_io, 0);
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
Rw2File::~Rw2File()
rpm-build d2b433
{
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
IfdDir::Ref  Rw2File::_locateCfaIfd()
rpm-build d2b433
{
rpm-build d2b433
	return mainIfd();
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
IfdDir::Ref  Rw2File::_locateMainIfd()
rpm-build d2b433
{
rpm-build d2b433
	return m_container->setDirectory(0);
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
::or_error Rw2File::_locateThumbnail(const IfdDir::Ref & dir,
rpm-build d2b433
                                     std::vector<uint32_t> &list)
rpm-build d2b433
{
rpm-build d2b433
    uint32_t offset = 0;
rpm-build d2b433
    uint32_t size = 0;
rpm-build d2b433
rpm-build d2b433
    offset = _getJpegThumbnailOffset(dir, size);
rpm-build d2b433
    if(size == 0) {
rpm-build d2b433
        return OR_ERROR_NOT_FOUND;
rpm-build d2b433
    }
rpm-build d2b433
    LOGDBG1("Jpeg offset: %u\n", offset);
rpm-build d2b433
rpm-build d2b433
    uint32_t x = 0;
rpm-build d2b433
    uint32_t y = 0;
rpm-build d2b433
    ::or_data_type _type = OR_DATA_TYPE_JPEG;
rpm-build d2b433
    IO::Stream::Ptr s(new IO::StreamClone(m_io, offset));
rpm-build d2b433
    std::unique_ptr<JfifContainer> jfif(new JfifContainer(s, 0));
rpm-build d2b433
    if (jfif->getDimensions(x,y)) {
rpm-build d2b433
        LOGDBG1("JPEG dimensions x=%u y=%u\n", x, y);
rpm-build d2b433
    }
rpm-build d2b433
    if(_type != OR_DATA_TYPE_NONE) {
rpm-build d2b433
        uint32_t dim = std::max(x, y);
rpm-build d2b433
        _addThumbnail(dim, ThumbDesc(x, y, _type, offset, size));
rpm-build d2b433
        list.push_back(dim);
rpm-build d2b433
    }
rpm-build d2b433
rpm-build d2b433
    return OR_ERROR_NONE;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
uint32_t Rw2File::_getJpegThumbnailOffset(const IfdDir::Ref & dir, uint32_t & len)
rpm-build d2b433
{
rpm-build d2b433
    IfdEntry::Ref e = dir->getEntry(IFD::RW2_TAG_JPEG_FROM_RAW);
rpm-build d2b433
	if(!e) {
rpm-build d2b433
	    len = 0;
rpm-build d2b433
		LOGDBG1("JpegFromRaw not found\n");
rpm-build d2b433
		return 0;
rpm-build d2b433
	}
rpm-build d2b433
    uint32_t offset = e->offset();
rpm-build d2b433
    len = e->count();
rpm-build d2b433
    return offset;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
::or_error Rw2File::_getRawData(RawData & data, uint32_t /*options*/)
rpm-build d2b433
{
rpm-build d2b433
	::or_error ret = OR_ERROR_NONE;
rpm-build d2b433
	const IfdDir::Ref & _cfaIfd = cfaIfd();
rpm-build d2b433
	if(!_cfaIfd) {
rpm-build d2b433
		LOGDBG1("cfa IFD not found\n");
rpm-build d2b433
		return OR_ERROR_NOT_FOUND;
rpm-build d2b433
	}
rpm-build d2b433
rpm-build d2b433
	LOGDBG1("_getRawData()\n");
rpm-build d2b433
	uint32_t offset = 0;
rpm-build d2b433
	uint32_t byte_length = 0;
rpm-build d2b433
	// RW2 file
rpm-build d2b433
	auto result = _cfaIfd->getIntegerValue(IFD::RW2_TAG_STRIP_OFFSETS);
rpm-build d2b433
	if(result.ok()) {
rpm-build d2b433
		offset = result.unwrap();
rpm-build d2b433
        byte_length = m_container->file()->filesize() - offset;
rpm-build d2b433
    }
rpm-build d2b433
    else {
rpm-build d2b433
        // RAW file alternative.
rpm-build d2b433
		result = _cfaIfd->getIntegerValue(IFD::EXIF_TAG_STRIP_OFFSETS);
rpm-build d2b433
        if(result.empty()) {
rpm-build d2b433
            LOGDBG1("offset not found\n");
rpm-build d2b433
            return OR_ERROR_NOT_FOUND;
rpm-build d2b433
        }
rpm-build d2b433
		offset = result.unwrap();
rpm-build d2b433
        result = _cfaIfd->getIntegerValue(IFD::EXIF_TAG_STRIP_BYTE_COUNTS);
rpm-build d2b433
        if(result.empty()) {
rpm-build d2b433
            LOGDBG1("byte len not found\n");
rpm-build d2b433
            return OR_ERROR_NOT_FOUND;
rpm-build d2b433
        }
rpm-build d2b433
		byte_length = result.unwrap();
rpm-build d2b433
    }
rpm-build d2b433
rpm-build d2b433
	result = _cfaIfd->getIntegerValue(IFD::RW2_TAG_SENSOR_WIDTH);
rpm-build d2b433
	if(result.empty()) {
rpm-build d2b433
		LOGDBG1("X not found\n");
rpm-build d2b433
		return OR_ERROR_NOT_FOUND;
rpm-build d2b433
	}
rpm-build d2b433
	uint32_t x = result.unwrap();
rpm-build d2b433
rpm-build d2b433
	result = _cfaIfd->getIntegerValue(IFD::RW2_TAG_SENSOR_HEIGHT);
rpm-build d2b433
	if(result.empty()) {
rpm-build d2b433
		LOGDBG1("Y not found\n");
rpm-build d2b433
		return OR_ERROR_NOT_FOUND;
rpm-build d2b433
	}
rpm-build d2b433
	uint32_t y = result.unwrap();
rpm-build d2b433
rpm-build d2b433
	// this is were things are complicated. The real size of the raw data
rpm-build d2b433
	// is whatever is read (if compressed)
rpm-build d2b433
	void *p = data.allocData(byte_length);
rpm-build d2b433
	size_t real_size = m_container->fetchData(p, offset,
rpm-build d2b433
											  byte_length);
rpm-build d2b433
rpm-build d2b433
	if (real_size / (x * 8 / 7) == y) {
rpm-build d2b433
		data.setDataType(OR_DATA_TYPE_COMPRESSED_RAW);
rpm-build d2b433
		data.setCompression(PANA_RAW_COMPRESSION);
rpm-build d2b433
	}
rpm-build d2b433
	else if (real_size < byte_length) {
rpm-build d2b433
		LOGWARN("Size mismatch for data: expected %u got %lu ignoring.\n",
rpm-build d2b433
				byte_length, real_size);
rpm-build d2b433
		return OR_ERROR_NOT_FOUND;
rpm-build d2b433
	}
rpm-build d2b433
	else {
rpm-build d2b433
		data.setDataType(OR_DATA_TYPE_RAW);
rpm-build d2b433
	}
rpm-build d2b433
	data.setCfaPatternType(OR_CFA_PATTERN_BGGR);
rpm-build d2b433
rpm-build d2b433
rpm-build d2b433
	// they are not all RGGB.
rpm-build d2b433
	// but I don't seem to see where this is encoded.
rpm-build d2b433
	//
rpm-build d2b433
	data.setDimensions(x, y);
rpm-build d2b433
rpm-build d2b433
	LOGDBG1("In size is %ux%u\n", data.width(), data.height());
rpm-build d2b433
	// get the sensor info
rpm-build d2b433
	// XXX what if it is not found?
rpm-build d2b433
	IfdEntry::Ref e = _cfaIfd->getEntry(IFD::RW2_TAG_SENSOR_LEFTBORDER);
rpm-build d2b433
	x = e->getIntegerArrayItem(0);
rpm-build d2b433
	e = _cfaIfd->getEntry(IFD::RW2_TAG_SENSOR_TOPBORDER);
rpm-build d2b433
	y = e->getIntegerArrayItem(0);
rpm-build d2b433
	e = _cfaIfd->getEntry(IFD::RW2_TAG_IMAGE_HEIGHT);
rpm-build d2b433
	uint32_t h = e->getIntegerArrayItem(0);
rpm-build d2b433
	e = _cfaIfd->getEntry(IFD::RW2_TAG_IMAGE_WIDTH);
rpm-build d2b433
	uint32_t w = e->getIntegerArrayItem(0);
rpm-build d2b433
rpm-build d2b433
	data.setRoi(x, y, w, h);
rpm-build d2b433
rpm-build d2b433
	return ret;
rpm-build d2b433
}
rpm-build d2b433
rpm-build d2b433
}
rpm-build d2b433
}
rpm-build d2b433
/*
rpm-build d2b433
  Local Variables:
rpm-build d2b433
  mode:c++
rpm-build d2b433
  c-file-style:"stroustrup"
rpm-build d2b433
  c-file-offsets:((innamespace . 0))
rpm-build d2b433
  tab-width:2
rpm-build d2b433
  c-basic-offset:2
rpm-build d2b433
  indent-tabs-mode:nil
rpm-build d2b433
  fill-column:80
rpm-build d2b433
  End:
rpm-build d2b433
*/