1/*
2 * TIFF Common Routines
3 * Copyright (c) 2013 Thilo Borgmann <thilo.borgmann _at_ mail.de>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * TIFF Common Routines
25 * @author Thilo Borgmann <thilo.borgmann _at_ mail.de>
26 */
27
28#ifndef AVCODEC_TIFF_COMMON_H
29#define AVCODEC_TIFF_COMMON_H
30
31#include <stdint.h>
32#include "libavutil/dict.h"
33#include "bytestream.h"
34
35/** data type identifiers for TIFF tags */
36enum TiffTypes {
37    TIFF_BYTE = 1,
38    TIFF_STRING,
39    TIFF_SHORT,
40    TIFF_LONG,
41    TIFF_RATIONAL,
42    TIFF_SBYTE,
43    TIFF_UNDEFINED,
44    TIFF_SSHORT,
45    TIFF_SLONG,
46    TIFF_SRATIONAL,
47    TIFF_FLOAT,
48    TIFF_DOUBLE,
49    TIFF_IFD
50};
51
52/** sizes of various TIFF field types (string size = 100)*/
53static const uint8_t type_sizes[14] = {
54    0, 1, 100, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4
55};
56
57static const uint16_t ifd_tags[] = {
58    0x8769, // EXIF IFD
59    0x8825, // GPS IFD
60    0xA005  // Interoperability IFD
61};
62
63
64/** Returns a value > 0 if the tag is a known IFD-tag.
65 *  The return value is the array index + 1 within ifd_tags[].
66 */
67int ff_tis_ifd(unsigned tag);
68
69/** Reads a short from the bytestream using given endianness. */
70unsigned ff_tget_short(GetByteContext *gb, int le);
71
72/** Reads a long from the bytestream using given endianness. */
73unsigned ff_tget_long(GetByteContext *gb, int le);
74
75/** Reads a double from the bytestream using given endianness. */
76double   ff_tget_double(GetByteContext *gb, int le);
77
78/** Reads a byte from the bytestream using given endianness. */
79unsigned ff_tget(GetByteContext *gb, int type, int le);
80
81/** Adds count rationals converted to a string
82 *  into the metadata dictionary.
83 */
84int ff_tadd_rational_metadata(int count, const char *name, const char *sep,
85                              GetByteContext *gb, int le, AVDictionary **metadata);
86
87/** Adds count longs converted to a string
88 *  into the metadata dictionary.
89 */
90int ff_tadd_long_metadata(int count, const char *name, const char *sep,
91                          GetByteContext *gb, int le, AVDictionary **metadata);
92
93/** Adds count doubles converted to a string
94 *  into the metadata dictionary.
95 */
96int ff_tadd_doubles_metadata(int count, const char *name, const char *sep,
97                             GetByteContext *gb, int le, AVDictionary **metadata);
98
99/** Adds count shorts converted to a string
100 *  into the metadata dictionary.
101 */
102int ff_tadd_shorts_metadata(int count, const char *name, const char *sep,
103                            GetByteContext *gb, int le, int is_signed, AVDictionary **metadata);
104
105/** Adds count bytes converted to a string
106 *  into the metadata dictionary.
107 */
108int ff_tadd_bytes_metadata(int count, const char *name, const char *sep,
109                           GetByteContext *gb, int le, int is_signed, AVDictionary **metadata);
110
111/** Adds a string of count characters
112 *  into the metadata dictionary.
113 */
114int ff_tadd_string_metadata(int count, const char *name,
115                            GetByteContext *gb, int le, AVDictionary **metadata);
116
117/** Decodes a TIFF header from the input bytestream
118 *  and sets the endianness in *le and the offset to
119 *  the first IFD in *ifd_offset accordingly.
120 */
121int ff_tdecode_header(GetByteContext *gb, int *le, int *ifd_offset);
122
123/** Reads the first 3 fields of a TIFF tag, which are
124 *  the tag id, the tag type and the count of values for that tag.
125 *  Afterwards the bytestream is located at the first value to read and
126 *  *next holds the bytestream offset of the following tag.
127 */
128int ff_tread_tag(GetByteContext *gb, int le, unsigned *tag, unsigned *type,
129                 unsigned *count, int *next);
130
131#endif /* AVCODEC_TIFF_COMMON_H */
132