tiff_common.h 4.88 KB
Newer Older
1 2
/*
 * TIFF Common Routines
3
 * Copyright (c) 2013 Thilo Borgmann <thilo.borgmann _at_ mail.de>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg 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 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg 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 FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * TIFF Common Routines
25
 * @author Thilo Borgmann <thilo.borgmann _at_ mail.de>
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
 */

#ifndef AVCODEC_TIFF_COMMON_H
#define AVCODEC_TIFF_COMMON_H

#include "avcodec.h"
#include "tiff.h"
#include "bytestream.h"
#include "libavutil/bprint.h"

/** data type identifiers for TIFF tags */
enum TiffTypes {
    TIFF_BYTE = 1,
    TIFF_STRING,
    TIFF_SHORT,
    TIFF_LONG,
    TIFF_RATIONAL,
    TIFF_SBYTE,
    TIFF_UNDEFINED,
    TIFF_SSHORT,
    TIFF_SLONG,
    TIFF_SRATIONAL,
    TIFF_FLOAT,
    TIFF_DOUBLE,
    TIFF_IFD
};

/** sizes of various TIFF field types (string size = 100)*/
static const uint8_t type_sizes[14] = {
    0, 1, 100, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4
};

static const uint16_t ifd_tags[] = {
    0x8769, // EXIF IFD
    0x8825, // GPS IFD
    0xA005  // Interoperability IFD
};


/** Returns a value > 0 if the tag is a known IFD-tag.
 *  The return value is the array index + 1 within ifd_tags[].
 */
int ff_tis_ifd(unsigned tag);

/** Reads a short from the bytestream using given endianess. */
unsigned ff_tget_short(GetByteContext *gb, int le);

/** Reads a long from the bytestream using given endianess. */
unsigned ff_tget_long(GetByteContext *gb, int le);

/** Reads a double from the bytestream using given endianess. */
double   ff_tget_double(GetByteContext *gb, int le);

/** Reads a byte from the bytestream using given endianess. */
unsigned ff_tget(GetByteContext *gb, int type, int le);

/** Returns an allocated string containing count
83
 *  rational values using the given separator.
84 85 86 87
 */
char *ff_trationals2str(int *rp, int count, const char *sep);

/** Returns an allocated string containing count
88
 *  long values using the given separator.
89 90 91 92
 */
char *ff_tlongs2str(int32_t *lp, int count, const char *sep);

/** Returns an allocated string containing count
93
 *  double values using the given separator.
94 95 96 97
 */
char *ff_tdoubles2str(double *dp, int count, const char *sep);

/** Returns an allocated string containing count
98
 *  short values using the given separator.
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
 */
char *ff_tshorts2str(int16_t *sp, int count, const char *sep);

/** Adds count rationals converted to a string
 *  into the metadata dictionary.
 */
int ff_tadd_rational_metadata(int count, const char *name, const char *sep,
                              GetByteContext *gb, int le, AVDictionary **metadata);

/** Adds count longs converted to a string
 *  into the metadata dictionary.
 */
int ff_tadd_long_metadata(int count, const char *name, const char *sep,
                          GetByteContext *gb, int le, AVDictionary **metadata);

/** Adds count doubles converted to a string
 *  into the metadata dictionary.
 */
int ff_tadd_doubles_metadata(int count, const char *name, const char *sep,
                             GetByteContext *gb, int le, AVDictionary **metadata);

/** Adds count shorts converted to a string
 *  into the metadata dictionary.
 */
int ff_tadd_shorts_metadata(int count, const char *name, const char *sep,
                            GetByteContext *gb, int le, AVDictionary **metadata);

126 127 128 129 130 131
/** Adds count bytes converted to a string
 *  into the metadata dictionary.
 */
int ff_tadd_bytes_metadata(int count, const char *name, const char *sep,
                           GetByteContext *gb, int le, AVDictionary **metadata);

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
/** Adds a string of count characters
 *  into the metadata dictionary.
 */
int ff_tadd_string_metadata(int count, const char *name,
                            GetByteContext *gb, int le, AVDictionary **metadata);

/** Decodes a TIFF header from the input bytestream
 *  and sets the endianess in *le and the offset to
 *  the first IFD in *ifd_offset accordingly.
 */
int ff_tdecode_header(GetByteContext *gb, int *le, int *ifd_offset);

/** Reads the first 3 fields of a TIFF tag, which are
 *  the tag id, the tag type and the count of values for that tag.
 *  Afterwards the bytestream is located at the first value to read and
 *  *next holds the bytestream offset of the following tag.
 */
int ff_tread_tag(GetByteContext *gb, int le, unsigned *tag, unsigned *type,
                 unsigned *count, int *next);

#endif /* AVCODEC_TIFF_COMMON_H */