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
libavformat
flac_picture.c
Go to the documentation of this file.
1
/*
2
* Raw FLAC picture parser
3
* Copyright (c) 2001 Fabrice Bellard
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
#include "
libavutil/avassert.h
"
23
#include "
avformat.h
"
24
#include "
flac_picture.h
"
25
#include "
id3v2.h
"
26
#include "
internal.h
"
27
28
int
ff_flac_parse_picture
(
AVFormatContext
*
s
,
uint8_t
*
buf
,
int
buf_size)
29
{
30
const
CodecMime
*mime =
ff_id3v2_mime_tags
;
31
enum
AVCodecID
id
=
AV_CODEC_ID_NONE
;
32
AVBufferRef
*
data
= NULL;
33
uint8_t
mimetype[64], *desc = NULL;
34
AVIOContext
*pb = NULL;
35
AVStream
*st;
36
int
type
,
width
,
height
;
37
int
len
,
ret
= 0;
38
39
pb =
avio_alloc_context
(buf, buf_size, 0, NULL, NULL, NULL, NULL);
40
if
(!pb)
41
return
AVERROR
(ENOMEM);
42
43
/* read the picture type */
44
type =
avio_rb32
(pb);
45
if
(type >=
FF_ARRAY_ELEMS
(
ff_id3v2_picture_types
) || type < 0) {
46
av_log
(s,
AV_LOG_ERROR
,
"Invalid picture type: %d.\n"
, type);
47
if
(s->
error_recognition
&
AV_EF_EXPLODE
) {
48
RETURN_ERROR
(
AVERROR_INVALIDDATA
);
49
}
50
type = 0;
51
}
52
53
/* picture mimetype */
54
len =
avio_rb32
(pb);
55
if
(len <= 0 ||
56
avio_read
(pb, mimetype,
FFMIN
(len,
sizeof
(mimetype) - 1)) != len) {
57
av_log
(s,
AV_LOG_ERROR
,
"Could not read mimetype from an attached "
58
"picture.\n"
);
59
if
(s->
error_recognition
&
AV_EF_EXPLODE
)
60
ret =
AVERROR_INVALIDDATA
;
61
goto
fail;
62
}
63
av_assert0
(len <
sizeof
(mimetype));
64
mimetype[
len
] = 0;
65
66
while
(mime->
id
!=
AV_CODEC_ID_NONE
) {
67
if
(!strncmp(mime->
str
, mimetype,
sizeof
(mimetype))) {
68
id
= mime->
id
;
69
break
;
70
}
71
mime++;
72
}
73
if
(
id
==
AV_CODEC_ID_NONE
) {
74
av_log
(s,
AV_LOG_ERROR
,
"Unknown attached picture mimetype: %s.\n"
,
75
mimetype);
76
if
(s->
error_recognition
&
AV_EF_EXPLODE
)
77
ret =
AVERROR_INVALIDDATA
;
78
goto
fail;
79
}
80
81
/* picture description */
82
len =
avio_rb32
(pb);
83
if
(len > 0) {
84
if
(!(desc =
av_malloc
(len + 1))) {
85
RETURN_ERROR
(
AVERROR
(ENOMEM));
86
}
87
88
if
(
avio_read
(pb, desc, len) != len) {
89
av_log
(s,
AV_LOG_ERROR
,
"Error reading attached picture description.\n"
);
90
if
(s->
error_recognition
&
AV_EF_EXPLODE
)
91
ret =
AVERROR
(EIO);
92
goto
fail;
93
}
94
desc[
len
] = 0;
95
}
96
97
/* picture metadata */
98
width =
avio_rb32
(pb);
99
height =
avio_rb32
(pb);
100
avio_skip
(pb, 8);
101
102
/* picture data */
103
len =
avio_rb32
(pb);
104
if
(len <= 0) {
105
av_log
(s,
AV_LOG_ERROR
,
"Invalid attached picture size: %d.\n"
, len);
106
if
(s->
error_recognition
&
AV_EF_EXPLODE
)
107
ret =
AVERROR_INVALIDDATA
;
108
goto
fail;
109
}
110
if
(!(data =
av_buffer_alloc
(len +
FF_INPUT_BUFFER_PADDING_SIZE
))) {
111
RETURN_ERROR
(
AVERROR
(ENOMEM));
112
}
113
memset(data->
data
+ len, 0,
FF_INPUT_BUFFER_PADDING_SIZE
);
114
if
(
avio_read
(pb, data->
data
, len) != len) {
115
av_log
(s,
AV_LOG_ERROR
,
"Error reading attached picture data.\n"
);
116
if
(s->
error_recognition
&
AV_EF_EXPLODE
)
117
ret =
AVERROR
(EIO);
118
goto
fail;
119
}
120
121
st =
avformat_new_stream
(s, NULL);
122
if
(!st) {
123
RETURN_ERROR
(
AVERROR
(ENOMEM));
124
}
125
126
av_init_packet
(&st->
attached_pic
);
127
st->
attached_pic
.
buf
=
data
;
128
st->
attached_pic
.
data
= data->
data
;
129
st->
attached_pic
.
size
=
len
;
130
st->
attached_pic
.
stream_index
= st->
index
;
131
st->
attached_pic
.
flags
|=
AV_PKT_FLAG_KEY
;
132
133
st->
disposition
|=
AV_DISPOSITION_ATTACHED_PIC
;
134
st->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
135
st->
codec
->
codec_id
=
id
;
136
st->
codec
->
width
=
width
;
137
st->
codec
->
height
=
height
;
138
av_dict_set
(&st->
metadata
,
"comment"
,
ff_id3v2_picture_types
[type], 0);
139
if
(desc)
140
av_dict_set
(&st->
metadata
,
"title"
, desc,
AV_DICT_DONT_STRDUP_VAL
);
141
142
av_freep
(&pb);
143
144
return
0;
145
146
fail:
147
av_buffer_unref
(&data);
148
av_freep
(&desc);
149
av_freep
(&pb);
150
151
return
ret
;
152
}
Generated on Sun Mar 23 2014 23:50:10 for FFmpeg by
1.8.2