FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
exif.c
Go to the documentation of this file.
1
/*
2
* EXIF metadata parser
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
* EXIF metadata parser
25
* @author Thilo Borgmann <thilo.borgmann _at_ mail.de>
26
*/
27
28
#include "
exif.h
"
29
30
31
static
const
char
*
exif_get_tag_name
(uint16_t
id
)
32
{
33
int
i;
34
35
for
(i = 0; i <
FF_ARRAY_ELEMS
(
tag_list
); i++) {
36
if
(
tag_list
[i].
id
==
id
)
37
return
tag_list
[i].
name
;
38
}
39
40
return
NULL;
41
}
42
43
44
static
int
exif_add_metadata
(
AVCodecContext
*avctx,
int
count
,
int
type
,
45
const
char
*
name
,
const
char
*sep,
46
GetByteContext
*gb,
int
le
,
47
AVDictionary
**metadata)
48
{
49
switch
(type) {
50
case
TIFF_DOUBLE
:
return
ff_tadd_doubles_metadata
(count, name, sep, gb, le, metadata);
51
case
TIFF_SHORT
:
return
ff_tadd_shorts_metadata
(count, name, sep, gb, le, metadata);
52
case
TIFF_BYTE
:
53
case
TIFF_UNDEFINED
:
return
ff_tadd_bytes_metadata
(count, name, sep, gb, le, metadata);
54
case
TIFF_STRING
:
return
ff_tadd_string_metadata
(count, name, gb, le, metadata);
55
case
TIFF_SRATIONAL
:
56
case
TIFF_RATIONAL
:
return
ff_tadd_rational_metadata
(count, name, sep, gb, le, metadata);
57
case
TIFF_SLONG
:
58
case
TIFF_LONG
:
return
ff_tadd_long_metadata
(count, name, sep, gb, le, metadata);
59
default
:
60
avpriv_request_sample
(avctx,
"TIFF tag type (%u)"
, type);
61
return
0;
62
};
63
}
64
65
66
static
int
exif_decode_tag
(
AVCodecContext
*avctx,
GetByteContext
*gbytes,
int
le
,
67
int
depth
,
AVDictionary
**metadata)
68
{
69
int
ret
, cur_pos;
70
unsigned
id
,
count
;
71
enum
TiffTypes
type
;
72
73
if
(depth > 2) {
74
return
0;
75
}
76
77
ff_tread_tag
(gbytes, le, &
id
, &type, &count, &cur_pos);
78
79
// read count values and add it metadata
80
// store metadata or proceed with next IFD
81
ret =
ff_tis_ifd
(
id
);
82
if
(ret) {
83
ret =
ff_exif_decode_ifd
(avctx, gbytes, le, depth + 1, metadata);
84
}
else
{
85
const
char
*
name
=
exif_get_tag_name
(
id
);
86
char
*use_name = (
char
*) name;
87
88
if
(!use_name) {
89
use_name =
av_malloc
(7);
90
if
(!use_name) {
91
return
AVERROR
(ENOMEM);
92
}
93
snprintf
(use_name, 7,
"0x%04X"
,
id
);
94
}
95
96
ret =
exif_add_metadata
(avctx, count, type, use_name, NULL,
97
gbytes, le, metadata);
98
99
if
(!name) {
100
av_freep
(&use_name);
101
}
102
}
103
104
bytestream2_seek
(gbytes, cur_pos, SEEK_SET);
105
106
return
ret
;
107
}
108
109
110
int
ff_exif_decode_ifd
(
AVCodecContext
*avctx,
GetByteContext
*gbytes,
int
le
,
111
int
depth
,
AVDictionary
**metadata)
112
{
113
int
i,
ret
;
114
int
entries;
115
116
entries =
ff_tget_short
(gbytes, le);
117
118
if
(
bytestream2_get_bytes_left
(gbytes) < entries * 12) {
119
return
AVERROR_INVALIDDATA
;
120
}
121
122
for
(i = 0; i < entries; i++) {
123
if
((ret =
exif_decode_tag
(avctx, gbytes, le, depth, metadata)) < 0) {
124
return
ret
;
125
}
126
}
127
128
// return next IDF offset or 0x000000000 or a value < 0 for failure
129
return
ff_tget_long
(gbytes, le);
130
}
Generated on Sun Mar 23 2014 23:49:54 for FFmpeg by
1.8.2