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