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