FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
pnmdec.c
Go to the documentation of this file.
1
/*
2
* PNM image format
3
* Copyright (c) 2002, 2003 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 "
avcodec.h
"
23
#include "
internal.h
"
24
#include "
put_bits.h
"
25
#include "
pnm.h
"
26
27
28
static
int
pnm_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
29
int
*got_frame,
AVPacket
*avpkt)
30
{
31
const
uint8_t
*buf = avpkt->
data
;
32
int
buf_size = avpkt->
size
;
33
PNMContext
*
const
s = avctx->
priv_data
;
34
AVFrame
*picture =
data
;
35
AVFrame
*
const
p = &s->
picture
;
36
int
i, j, n, linesize, h, upgrade = 0, is_mono = 0;
37
unsigned
char
*ptr;
38
int
components, sample_len, ret;
39
40
s->
bytestream_start
=
41
s->
bytestream
= (
uint8_t
*)buf;
42
s->
bytestream_end
= (
uint8_t
*)buf + buf_size;
43
44
if
(
ff_pnm_decode_header
(avctx, s) < 0)
45
return
AVERROR_INVALIDDATA
;
46
47
if
(p->
data
[0])
48
avctx->
release_buffer
(avctx, p);
49
50
p->
reference
= 0;
51
if
((ret =
ff_get_buffer
(avctx, p)) < 0) {
52
av_log
(avctx,
AV_LOG_ERROR
,
"get_buffer() failed\n"
);
53
return
ret;
54
}
55
p->
pict_type
=
AV_PICTURE_TYPE_I
;
56
p->
key_frame
= 1;
57
58
switch
(avctx->
pix_fmt
) {
59
default
:
60
return
AVERROR_INVALIDDATA
;
61
case
AV_PIX_FMT_RGBA64BE
:
62
n = avctx->
width
* 8;
63
components=4;
64
sample_len=16;
65
goto
do_read;
66
case
AV_PIX_FMT_RGB48BE
:
67
n = avctx->
width
* 6;
68
components=3;
69
sample_len=16;
70
goto
do_read;
71
case
AV_PIX_FMT_RGBA
:
72
n = avctx->
width
* 4;
73
components=4;
74
sample_len=8;
75
goto
do_read;
76
case
AV_PIX_FMT_RGB24
:
77
n = avctx->
width
* 3;
78
components=3;
79
sample_len=8;
80
goto
do_read;
81
case
AV_PIX_FMT_GRAY8
:
82
n = avctx->
width
;
83
components=1;
84
sample_len=8;
85
if
(s->
maxval
< 255)
86
upgrade = 1;
87
goto
do_read;
88
case
AV_PIX_FMT_GRAY8A
:
89
n = avctx->
width
* 2;
90
components=2;
91
sample_len=8;
92
goto
do_read;
93
case
AV_PIX_FMT_GRAY16BE
:
94
case
AV_PIX_FMT_GRAY16LE
:
95
n = avctx->
width
* 2;
96
components=1;
97
sample_len=16;
98
if
(s->
maxval
< 65535)
99
upgrade = 2;
100
goto
do_read;
101
case
AV_PIX_FMT_MONOWHITE
:
102
case
AV_PIX_FMT_MONOBLACK
:
103
n = (avctx->
width
+ 7) >> 3;
104
components=1;
105
sample_len=1;
106
is_mono = 1;
107
do_read:
108
ptr = p->
data
[0];
109
linesize = p->
linesize
[0];
110
if
(s->
bytestream
+ n * avctx->
height
> s->
bytestream_end
)
111
return
AVERROR_INVALIDDATA
;
112
if
(s->
type
< 4 || (is_mono && s->
type
==7)){
113
for
(i=0; i<avctx->
height
; i++) {
114
PutBitContext
pb;
115
init_put_bits
(&pb, ptr, linesize);
116
for
(j=0; j<avctx->
width
* components; j++){
117
unsigned
int
c
=0;
118
int
v=0;
119
if
(s->
type
< 4)
120
while
(s->
bytestream
< s->
bytestream_end
&& (*s->
bytestream
<
'0'
|| *s->
bytestream
>
'9'
))
121
s->
bytestream
++;
122
if
(s->
bytestream
>= s->
bytestream_end
)
123
return
AVERROR_INVALIDDATA
;
124
if
(is_mono) {
125
/* read a single digit */
126
v = (*s->
bytestream
++)&1;
127
}
else
{
128
/* read a sequence of digits */
129
do
{
130
v = 10*v +
c
;
131
c = (*s->
bytestream
++) -
'0'
;
132
}
while
(c <= 9);
133
}
134
put_bits
(&pb, sample_len, (((1<<sample_len)-1)*v + (s->
maxval
>>1))/s->
maxval
);
135
}
136
flush_put_bits
(&pb);
137
ptr+= linesize;
138
}
139
}
else
{
140
for
(i = 0; i < avctx->
height
; i++) {
141
if
(!upgrade)
142
memcpy(ptr, s->
bytestream
, n);
143
else
if
(upgrade == 1) {
144
unsigned
int
j, f = (255 * 128 + s->
maxval
/ 2) / s->
maxval
;
145
for
(j = 0; j < n; j++)
146
ptr[j] = (s->
bytestream
[j] * f + 64) >> 7;
147
}
else
if
(upgrade == 2) {
148
unsigned
int
j, v, f = (65535 * 32768 + s->
maxval
/ 2) / s->
maxval
;
149
for
(j = 0; j < n / 2; j++) {
150
v =
av_be2ne16
(((uint16_t *)s->
bytestream
)[j]);
151
((uint16_t *)ptr)[j] = (v * f + 16384) >> 15;
152
}
153
}
154
s->
bytestream
+= n;
155
ptr += linesize;
156
}
157
}
158
break
;
159
case
AV_PIX_FMT_YUV420P
:
160
{
161
unsigned
char
*ptr1, *ptr2;
162
163
n = avctx->
width
;
164
ptr = p->
data
[0];
165
linesize = p->
linesize
[0];
166
if
(s->
bytestream
+ n * avctx->
height
* 3 / 2 > s->
bytestream_end
)
167
return
AVERROR_INVALIDDATA
;
168
for
(i = 0; i < avctx->
height
; i++) {
169
memcpy(ptr, s->
bytestream
, n);
170
s->
bytestream
+= n;
171
ptr += linesize;
172
}
173
ptr1 = p->
data
[1];
174
ptr2 = p->
data
[2];
175
n >>= 1;
176
h = avctx->
height
>> 1;
177
for
(i = 0; i < h; i++) {
178
memcpy(ptr1, s->
bytestream
, n);
179
s->
bytestream
+= n;
180
memcpy(ptr2, s->
bytestream
, n);
181
s->
bytestream
+= n;
182
ptr1 += p->
linesize
[1];
183
ptr2 += p->
linesize
[2];
184
}
185
}
186
break
;
187
}
188
*picture = s->
picture
;
189
*got_frame = 1;
190
191
return
s->
bytestream
- s->
bytestream_start
;
192
}
193
194
195
#if CONFIG_PGM_DECODER
196
AVCodec
ff_pgm_decoder = {
197
.
name
=
"pgm"
,
198
.type =
AVMEDIA_TYPE_VIDEO
,
199
.id =
AV_CODEC_ID_PGM
,
200
.priv_data_size =
sizeof
(
PNMContext
),
201
.
init
=
ff_pnm_init
,
202
.
close
=
ff_pnm_end
,
203
.
decode
=
pnm_decode_frame
,
204
.capabilities =
CODEC_CAP_DR1
,
205
.long_name =
NULL_IF_CONFIG_SMALL
(
"PGM (Portable GrayMap) image"
),
206
};
207
#endif
208
209
#if CONFIG_PGMYUV_DECODER
210
AVCodec
ff_pgmyuv_decoder = {
211
.
name
=
"pgmyuv"
,
212
.type =
AVMEDIA_TYPE_VIDEO
,
213
.id =
AV_CODEC_ID_PGMYUV
,
214
.priv_data_size =
sizeof
(
PNMContext
),
215
.
init
=
ff_pnm_init
,
216
.
close
=
ff_pnm_end
,
217
.
decode
=
pnm_decode_frame
,
218
.capabilities =
CODEC_CAP_DR1
,
219
.long_name =
NULL_IF_CONFIG_SMALL
(
"PGMYUV (Portable GrayMap YUV) image"
),
220
};
221
#endif
222
223
#if CONFIG_PPM_DECODER
224
AVCodec
ff_ppm_decoder = {
225
.
name
=
"ppm"
,
226
.type =
AVMEDIA_TYPE_VIDEO
,
227
.id =
AV_CODEC_ID_PPM
,
228
.priv_data_size =
sizeof
(
PNMContext
),
229
.
init
=
ff_pnm_init
,
230
.
close
=
ff_pnm_end
,
231
.
decode
=
pnm_decode_frame
,
232
.capabilities =
CODEC_CAP_DR1
,
233
.long_name =
NULL_IF_CONFIG_SMALL
(
"PPM (Portable PixelMap) image"
),
234
};
235
#endif
236
237
#if CONFIG_PBM_DECODER
238
AVCodec
ff_pbm_decoder = {
239
.
name
=
"pbm"
,
240
.type =
AVMEDIA_TYPE_VIDEO
,
241
.id =
AV_CODEC_ID_PBM
,
242
.priv_data_size =
sizeof
(
PNMContext
),
243
.
init
=
ff_pnm_init
,
244
.
close
=
ff_pnm_end
,
245
.
decode
=
pnm_decode_frame
,
246
.capabilities =
CODEC_CAP_DR1
,
247
.long_name =
NULL_IF_CONFIG_SMALL
(
"PBM (Portable BitMap) image"
),
248
};
249
#endif
250
251
#if CONFIG_PAM_DECODER
252
AVCodec
ff_pam_decoder = {
253
.
name
=
"pam"
,
254
.type =
AVMEDIA_TYPE_VIDEO
,
255
.id =
AV_CODEC_ID_PAM
,
256
.priv_data_size =
sizeof
(
PNMContext
),
257
.
init
=
ff_pnm_init
,
258
.
close
=
ff_pnm_end
,
259
.
decode
=
pnm_decode_frame
,
260
.capabilities =
CODEC_CAP_DR1
,
261
.long_name =
NULL_IF_CONFIG_SMALL
(
"PAM (Portable AnyMap) image"
),
262
};
263
#endif
Generated on Sat May 25 2013 03:58:39 for FFmpeg by
1.8.2