Blame tools/ordiag.cpp

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
*/