|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* libopenraw - ordiag.cpp
|
|
rpm-build |
d2b433 |
*
|
|
rpm-build |
d2b433 |
* Copyright (C) 2007-2016 Hubert Figuiere
|
|
rpm-build |
d2b433 |
* Copyright (C) 2008 Novell, Inc.
|
|
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 |
|
|
rpm-build |
d2b433 |
#include <unistd.h>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include <algorithm>
|
|
rpm-build |
d2b433 |
#include <iostream>
|
|
rpm-build |
d2b433 |
#include <memory>
|
|
rpm-build |
d2b433 |
#include <set>
|
|
rpm-build |
d2b433 |
#include <string>
|
|
rpm-build |
d2b433 |
#include <vector>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include <boost/format.hpp>
|
|
rpm-build |
d2b433 |
#include <boost/lexical_cast.hpp>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include <libopenraw/libopenraw.h>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/**
|
|
rpm-build |
d2b433 |
* Dump on RawFile. (functor)
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
class OrDiag
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
public:
|
|
rpm-build |
d2b433 |
/** constructor
|
|
rpm-build |
d2b433 |
* @param out the output stream
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
OrDiag(std::ostream & out, const std::string & extract_thumbs)
|
|
rpm-build |
d2b433 |
: m_out(out)
|
|
rpm-build |
d2b433 |
, m_extract_all_thumbs(false)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
m_extract_all_thumbs = (extract_thumbs == "all");
|
|
rpm-build |
d2b433 |
if (!m_extract_all_thumbs) {
|
|
rpm-build |
d2b433 |
try {
|
|
rpm-build |
d2b433 |
int size = boost::lexical_cast<int>(extract_thumbs);
|
|
rpm-build |
d2b433 |
m_thumb_sizes.insert(size);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
catch(...) {
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
std::string cfaPatternToString(ORCfaPatternRef pattern)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
if(pattern == NULL) {
|
|
rpm-build |
d2b433 |
return "(null)";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
std::string out;
|
|
rpm-build |
d2b433 |
uint16_t size = 0;
|
|
rpm-build |
d2b433 |
const uint8_t* patternPattern
|
|
rpm-build |
d2b433 |
= or_cfapattern_get_pattern(pattern, &size);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
for(uint16_t i = 0; i < size; ++i) {
|
|
rpm-build |
d2b433 |
switch(patternPattern[i]) {
|
|
rpm-build |
d2b433 |
case OR_PATTERN_COLOUR_RED:
|
|
rpm-build |
d2b433 |
out.push_back('R');
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_PATTERN_COLOUR_GREEN:
|
|
rpm-build |
d2b433 |
out.push_back('G');
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
case OR_PATTERN_COLOUR_BLUE:
|
|
rpm-build |
d2b433 |
out.push_back('B');
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
default:
|
|
rpm-build |
d2b433 |
out.push_back('*');
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
return out;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
std::string cfaPatternToString(::or_cfa_pattern t)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
switch(t) {
|
|
rpm-build |
d2b433 |
case OR_CFA_PATTERN_NONE:
|
|
rpm-build |
d2b433 |
return "None";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_CFA_PATTERN_NON_RGB22:
|
|
rpm-build |
d2b433 |
return "Non RGB 2x2";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_CFA_PATTERN_RGGB:
|
|
rpm-build |
d2b433 |
return "R,G,G,B";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_CFA_PATTERN_GBRG:
|
|
rpm-build |
d2b433 |
return "G,B,R,G";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_CFA_PATTERN_BGGR:
|
|
rpm-build |
d2b433 |
return "B,G,G,R";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_CFA_PATTERN_GRBG:
|
|
rpm-build |
d2b433 |
return "G,R,B,G";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
default:
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
return str(boost::format("Unknown %1%") % t);
|
|
rpm-build |
d2b433 |
};
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
std::string dataTypeToString(or_data_type t)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
switch(t) {
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_NONE:
|
|
rpm-build |
d2b433 |
return "None";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_PIXMAP_8RGB:
|
|
rpm-build |
d2b433 |
return "8bits per channel RGB pixmap";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_JPEG:
|
|
rpm-build |
d2b433 |
return "JPEG data";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_TIFF:
|
|
rpm-build |
d2b433 |
return "TIFF container";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_PNG:
|
|
rpm-build |
d2b433 |
return "PNG container";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_RAW:
|
|
rpm-build |
d2b433 |
return "RAW data";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_COMPRESSED_RAW:
|
|
rpm-build |
d2b433 |
return "Compressed RAW data";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_UNKNOWN:
|
|
rpm-build |
d2b433 |
return "Unknown type";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
default:
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
return "Invalid";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/** return a string for the raw file type
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
std::string typeToString(or_rawfile_type t)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
switch(t) {
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_UNKNOWN:
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_CR2:
|
|
rpm-build |
d2b433 |
return "Canon CR2";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_CRW:
|
|
rpm-build |
d2b433 |
return "Canon CRW";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_NEF:
|
|
rpm-build |
d2b433 |
return "Nikon NEF";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_MRW:
|
|
rpm-build |
d2b433 |
return "Minolta MRW";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_ARW:
|
|
rpm-build |
d2b433 |
return "Sony ARW";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_DNG:
|
|
rpm-build |
d2b433 |
return "Adobe DNG";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_ORF:
|
|
rpm-build |
d2b433 |
return "Olympus ORF";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_PEF:
|
|
rpm-build |
d2b433 |
return "Pentax PEF";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_ERF:
|
|
rpm-build |
d2b433 |
return "Epson ERF";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_RW2:
|
|
rpm-build |
d2b433 |
return "Panasonic RAW";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_RAWFILE_TYPE_RAF:
|
|
rpm-build |
d2b433 |
return "FujiFilm RAF";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
default:
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
return "Unknown";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/** Extract thumbnail to a file
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
std::string extractThumb(ORThumbnailRef thumb)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
FILE* f;
|
|
rpm-build |
d2b433 |
size_t s;
|
|
rpm-build |
d2b433 |
std::string ext;
|
|
rpm-build |
d2b433 |
switch(or_thumbnail_format(thumb)) {
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_PIXMAP_8RGB:
|
|
rpm-build |
d2b433 |
ext = "ppm";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case OR_DATA_TYPE_JPEG:
|
|
rpm-build |
d2b433 |
ext = "jpg";
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
default:
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
if (ext.empty()) {
|
|
rpm-build |
d2b433 |
return "";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
uint32_t x, y;
|
|
rpm-build |
d2b433 |
or_thumbnail_dimensions(thumb, &x, &y);
|
|
rpm-build |
d2b433 |
uint32_t dim = std::max(x, y);
|
|
rpm-build |
d2b433 |
std::string name(str(boost::format("thumb_%1%.%2%") % dim % ext));
|
|
rpm-build |
d2b433 |
f = fopen(name.c_str(), "wb");
|
|
rpm-build |
d2b433 |
if (or_thumbnail_format(thumb) == OR_DATA_TYPE_PIXMAP_8RGB) {
|
|
rpm-build |
d2b433 |
// ppm preemble.
|
|
rpm-build |
d2b433 |
fprintf(f, "P6\n");
|
|
rpm-build |
d2b433 |
fprintf(f, "%d %d\n", x, y);
|
|
rpm-build |
d2b433 |
fprintf(f, "%d\n", /*(componentsize == 2) ? 0xffff :*/ 0xff);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
size_t dataSize = or_thumbnail_data_size(thumb);
|
|
rpm-build |
d2b433 |
s = fwrite(or_thumbnail_data(thumb), 1, dataSize, f);
|
|
rpm-build |
d2b433 |
if(s != dataSize) {
|
|
rpm-build |
d2b433 |
std::cerr << "short write of " << s << " bytes\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
fclose(f);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
return name;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
/** dump the previews of the raw file to mout
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
void dumpPreviews(ORRawFileRef rf)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
size_t size = 0;
|
|
rpm-build |
d2b433 |
const uint32_t * previews = or_rawfile_get_thumbnail_sizes(rf, &size);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tNumber of previews: %1%\n")
|
|
rpm-build |
d2b433 |
% size;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
m_out << "\tAvailable previews:\n";
|
|
rpm-build |
d2b433 |
for(size_t i = 0; i < size; i++) {
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tSize %1%\n") % previews[i];
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
ORThumbnailRef thumb = or_thumbnail_new();
|
|
rpm-build |
d2b433 |
::or_error err = or_rawfile_get_thumbnail(rf, previews[i], thumb);
|
|
rpm-build |
d2b433 |
if (err != OR_ERROR_NONE) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\t\tError getting thumbnail %1%\n") % err;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\t\tFormat %1%\n")
|
|
rpm-build |
d2b433 |
% dataTypeToString(or_thumbnail_format(thumb));
|
|
rpm-build |
d2b433 |
uint32_t x, y;
|
|
rpm-build |
d2b433 |
or_thumbnail_dimensions(thumb, &x, &y);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\t\tDimensions: width = %1% height = %2%\n")
|
|
rpm-build |
d2b433 |
% x % y;
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\t\tByte size: %1%\n")
|
|
rpm-build |
d2b433 |
% or_thumbnail_data_size(thumb);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
if (m_extract_all_thumbs
|
|
rpm-build |
d2b433 |
|| m_thumb_sizes.find(previews[i]) != m_thumb_sizes.end()) {
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
std::string name = extractThumb(thumb);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\t\tOutput as %1%\n") % name;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
or_thumbnail_release(thumb);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
void dumpRawData(ORRawFileRef rf)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
ORRawDataRef rd = or_rawdata_new();
|
|
rpm-build |
d2b433 |
::or_error err = or_rawfile_get_rawdata(rf, rd, 0);
|
|
rpm-build |
d2b433 |
if (err == OR_ERROR_NONE) {
|
|
rpm-build |
d2b433 |
m_out << "\tRAW data\n";
|
|
rpm-build |
d2b433 |
or_data_type dataType = or_rawdata_format(rd);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tType: %1%")
|
|
rpm-build |
d2b433 |
% dataTypeToString(dataType);
|
|
rpm-build |
d2b433 |
if(dataType == OR_DATA_TYPE_COMPRESSED_RAW) {
|
|
rpm-build |
d2b433 |
m_out << boost::format(" (compression = %1%)\n")
|
|
rpm-build |
d2b433 |
% or_rawdata_get_compression(rd);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
m_out << "\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tByte size: %1%\n")
|
|
rpm-build |
d2b433 |
% or_rawdata_data_size(rd);
|
|
rpm-build |
d2b433 |
uint32_t x, y;
|
|
rpm-build |
d2b433 |
or_rawdata_dimensions(rd, &x, &y);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tDimensions: width = %1% height = %2%\n")
|
|
rpm-build |
d2b433 |
% x % y;
|
|
rpm-build |
d2b433 |
uint32_t roi_x, roi_y, roi_width, roi_height;
|
|
rpm-build |
d2b433 |
or_rawdata_get_roi(rd, &roi_x, &roi_y, &roi_width, &roi_height);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tROI: %1% %2% %3% %4%\n")
|
|
rpm-build |
d2b433 |
% roi_x % roi_y % roi_width % roi_height;
|
|
rpm-build |
d2b433 |
ORCfaPatternRef pattern = or_rawdata_get_cfa_pattern(rd);
|
|
rpm-build |
d2b433 |
::or_cfa_pattern patternType
|
|
rpm-build |
d2b433 |
= pattern ? or_cfapattern_get_type(pattern)
|
|
rpm-build |
d2b433 |
: OR_CFA_PATTERN_NON_RGB22;
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tBayer Type: %1%\n")
|
|
rpm-build |
d2b433 |
% cfaPatternToString(patternType);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
if(patternType == OR_CFA_PATTERN_NON_RGB22) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tPattern: %1%\n")
|
|
rpm-build |
d2b433 |
% cfaPatternToString(pattern);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tBits per channel: %1%\n")
|
|
rpm-build |
d2b433 |
% or_rawdata_bpc(rd);
|
|
rpm-build |
d2b433 |
uint16_t black, white;
|
|
rpm-build |
d2b433 |
or_rawdata_get_levels(rd, &black, &white);
|
|
rpm-build |
d2b433 |
m_out << boost::format(
|
|
rpm-build |
d2b433 |
"\t\tValues: black = %1% white = %2%\n") % black % white;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
uint32_t matrix_size = 0;
|
|
rpm-build |
d2b433 |
const double *matrix = or_rawdata_get_colour_matrix(rd, 1, &matrix_size);
|
|
rpm-build |
d2b433 |
if (matrix) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tColour Matrix 1: ");
|
|
rpm-build |
d2b433 |
for (uint32_t i = 0; i < matrix_size; i++) {
|
|
rpm-build |
d2b433 |
if (i > 0) {
|
|
rpm-build |
d2b433 |
m_out << ", ";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
m_out << matrix[i];
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
m_out << "\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tNo Raw Data found! (error = %1%)\n")
|
|
rpm-build |
d2b433 |
% err;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
or_rawdata_release(rd);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
void dumpMetaData(ORRawFileRef rf)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
int32_t o = or_rawfile_get_orientation(rf);
|
|
rpm-build |
d2b433 |
m_out << "\tMeta data\n";
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tOrientation: %1%\n")
|
|
rpm-build |
d2b433 |
% o;
|
|
rpm-build |
d2b433 |
double matrix[9];
|
|
rpm-build |
d2b433 |
uint32_t size = 9;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
ExifLightsourceValue calIll;
|
|
rpm-build |
d2b433 |
calIll = or_rawfile_get_calibration_illuminant1(rf);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tCalibration Illuminant 1: %1%\n")
|
|
rpm-build |
d2b433 |
% static_cast<int>(calIll);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
::or_error err = or_rawfile_get_colourmatrix1(rf, matrix, &size);
|
|
rpm-build |
d2b433 |
if(err == OR_ERROR_NONE) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tColour Matrix 1: %1%, %2%, %3%, "
|
|
rpm-build |
d2b433 |
"%4%, %5%, %6%, %7%, %8%, %9%\n")
|
|
rpm-build |
d2b433 |
% matrix[0] % matrix[1] % matrix[2]
|
|
rpm-build |
d2b433 |
% matrix[3] % matrix[4] % matrix[5]
|
|
rpm-build |
d2b433 |
% matrix[6] % matrix[7] % matrix[8];
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
m_out << "\t\tNo Colour Matrix 1\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
calIll = or_rawfile_get_calibration_illuminant2(rf);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tCalibration Illuminant 2: %1%\n")
|
|
rpm-build |
d2b433 |
% static_cast<int>(calIll);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
size = 9;
|
|
rpm-build |
d2b433 |
err = or_rawfile_get_colourmatrix2(rf, matrix, &size);
|
|
rpm-build |
d2b433 |
if(err == OR_ERROR_NONE) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\t\tColour Matrix 2: %1%, %2%, %3%, "
|
|
rpm-build |
d2b433 |
"%4%, %5%, %6%, %7%, %8%, %9%\n")
|
|
rpm-build |
d2b433 |
% matrix[0] % matrix[1] % matrix[2]
|
|
rpm-build |
d2b433 |
% matrix[3] % matrix[4] % matrix[5]
|
|
rpm-build |
d2b433 |
% matrix[6] % matrix[7] % matrix[8];
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
m_out << "\t\tNo Colour Matrix 2\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
void operator()(const std::string &s)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
m_out << boost::format("Dumping %1%\n") % s;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
ORRawFileRef rf = or_rawfile_new(s.c_str(), OR_RAWFILE_TYPE_UNKNOWN);
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
//std::unique_ptr<RawFile> rf(RawFile::newRawFile(s.c_str()));
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
if (rf == NULL) {
|
|
rpm-build |
d2b433 |
m_out << "unrecognized file\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
or_rawfile_type fileType = or_rawfile_get_type(rf);
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tType = %1% (%2%)\n")
|
|
rpm-build |
d2b433 |
% fileType % typeToString(fileType);
|
|
rpm-build |
d2b433 |
or_rawfile_typeid fileTypeId = or_rawfile_get_typeid(rf);
|
|
rpm-build |
d2b433 |
std::string typeId
|
|
rpm-build |
d2b433 |
= str(boost::format("%1%, %2%")
|
|
rpm-build |
d2b433 |
% OR_GET_FILE_TYPEID_VENDOR(fileTypeId)
|
|
rpm-build |
d2b433 |
% OR_GET_FILE_TYPEID_CAMERA(fileTypeId));
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tType ID = %1%\n") % typeId;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
ORConstMetaValueRef make
|
|
rpm-build |
d2b433 |
= or_rawfile_get_metavalue(rf, META_NS_TIFF | EXIF_TAG_MAKE);
|
|
rpm-build |
d2b433 |
if (make) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tMake = %1%\n")
|
|
rpm-build |
d2b433 |
% or_metavalue_get_string(make, 0);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
ORConstMetaValueRef model
|
|
rpm-build |
d2b433 |
= or_rawfile_get_metavalue(rf, META_NS_TIFF | EXIF_TAG_MODEL);
|
|
rpm-build |
d2b433 |
if (model) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tModel = %1%\n")
|
|
rpm-build |
d2b433 |
% or_metavalue_get_string(model, 0);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
ORConstMetaValueRef uniqueCameraModel
|
|
rpm-build |
d2b433 |
= or_rawfile_get_metavalue(rf, META_NS_TIFF
|
|
rpm-build |
d2b433 |
| DNG_TAG_UNIQUE_CAMERA_MODEL);
|
|
rpm-build |
d2b433 |
if (uniqueCameraModel) {
|
|
rpm-build |
d2b433 |
m_out << boost::format("\tUnique Camera Model = %1%\n")
|
|
rpm-build |
d2b433 |
% or_metavalue_get_string(uniqueCameraModel, 0);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
dumpPreviews(rf);
|
|
rpm-build |
d2b433 |
dumpRawData(rf);
|
|
rpm-build |
d2b433 |
dumpMetaData(rf);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
or_rawfile_release(rf);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
private:
|
|
rpm-build |
d2b433 |
std::ostream & m_out;
|
|
rpm-build |
d2b433 |
bool m_extract_all_thumbs;
|
|
rpm-build |
d2b433 |
std::set<int> m_thumb_sizes;
|
|
rpm-build |
d2b433 |
};
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
void print_help()
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
std::cerr << "ordiag [-v] [-h] [-t all|<size>] [-d 0-9] [files...]\n";
|
|
rpm-build |
d2b433 |
std::cerr << "Print libopenraw diagnostics\n";
|
|
rpm-build |
d2b433 |
std::cerr << "\t-h: show this help\n";
|
|
rpm-build |
d2b433 |
std::cerr << "\t-v: show version\n";
|
|
rpm-build |
d2b433 |
std::cerr << "\t-d level: set debug / verbosity to level\n";
|
|
rpm-build |
d2b433 |
std::cerr << "\t-t [all|<size>]: extract thumbnails. all or <size>.\n";
|
|
rpm-build |
d2b433 |
std::cerr << "\tfiles: the files to diagnose\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
void print_version()
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
std::cerr << "ordiag version 0.1 - (c) 2007-2014 Hubert Figuiere\n";
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
int main(int argc, char **argv)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
int done = 0;
|
|
rpm-build |
d2b433 |
int dbl = 0;
|
|
rpm-build |
d2b433 |
std::string extract_thumbs;
|
|
rpm-build |
d2b433 |
std::vector<std::string> files;
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
int o;
|
|
rpm-build |
d2b433 |
while((o = getopt(argc, argv, "hvdt:")) != -1) {
|
|
rpm-build |
d2b433 |
switch (o) {
|
|
rpm-build |
d2b433 |
case 'h':
|
|
rpm-build |
d2b433 |
print_help();
|
|
rpm-build |
d2b433 |
done = 1;
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case 'v':
|
|
rpm-build |
d2b433 |
print_version();
|
|
rpm-build |
d2b433 |
done = 1;
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case 'd':
|
|
rpm-build |
d2b433 |
dbl++;
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case 't':
|
|
rpm-build |
d2b433 |
if(optarg) {
|
|
rpm-build |
d2b433 |
extract_thumbs = optarg;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
print_help();
|
|
rpm-build |
d2b433 |
done = 1;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
case '?':
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
default:
|
|
rpm-build |
d2b433 |
break;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
if (done) {
|
|
rpm-build |
d2b433 |
return 1;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
for ( ; optind < argc; optind++) {
|
|
rpm-build |
d2b433 |
files.push_back(argv[optind]);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
if (files.empty()) {
|
|
rpm-build |
d2b433 |
std::cerr << "missing file name.\n";
|
|
rpm-build |
d2b433 |
if (dbl) {
|
|
rpm-build |
d2b433 |
print_version();
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
print_help();
|
|
rpm-build |
d2b433 |
return 1;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
if (dbl >=2) {
|
|
rpm-build |
d2b433 |
or_debug_set_level(DEBUG2);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
// do the business.
|
|
rpm-build |
d2b433 |
for_each(files.begin(), files.end(), OrDiag(std::cout, extract_thumbs));
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
return 0;
|
|
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 |
indent-tabs-mode:nil
|
|
rpm-build |
d2b433 |
fill-column:80
|
|
rpm-build |
d2b433 |
End:
|
|
rpm-build |
d2b433 |
*/
|