3 * Copyright (c) 2002, 2003 Fabrice Bellard
5 * This file is part of FFmpeg.
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.
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.
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
23 #include "bytestream.h"
28 static int pnm_decode_frame(AVCodecContext
*avctx
, void *data
,
29 int *data_size
, AVPacket
*avpkt
)
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
= (AVFrame
*)&s
->picture
;
36 int i
, j
, n
, linesize
, h
, upgrade
= 0;
38 int components
, sample_len
;
42 s
->bytestream_end
= buf
+ buf_size
;
44 if (ff_pnm_decode_header(avctx
, s
) < 0)
48 avctx
->release_buffer(avctx
, p
);
51 if (avctx
->get_buffer(avctx
, p
) < 0) {
52 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
55 p
->pict_type
= FF_I_TYPE
;
58 switch (avctx
->pix_fmt
) {
78 case PIX_FMT_GRAY16BE
:
79 case PIX_FMT_GRAY16LE
:
83 if (s
->maxval
< 65535)
86 case PIX_FMT_MONOWHITE
:
87 case PIX_FMT_MONOBLACK
:
88 n
= (avctx
->width
+ 7) >> 3;
93 linesize
= p
->linesize
[0];
94 if (s
->bytestream
+ n
* avctx
->height
> s
->bytestream_end
)
97 for (i
=0; i
<avctx
->height
; i
++) {
99 init_put_bits(&pb
, ptr
, linesize
);
100 for(j
=0; j
<avctx
->width
* components
; j
++){
103 while(s
->bytestream
< s
->bytestream_end
&& (*s
->bytestream
< '0' || *s
->bytestream
> '9' ))
105 if(s
->bytestream
>= s
->bytestream_end
)
109 c
= (*s
->bytestream
++) - '0';
111 put_bits(&pb
, sample_len
, (((1<<sample_len
)-1)*v
+ (s
->maxval
>>1))/s
->maxval
);
117 for (i
= 0; i
< avctx
->height
; i
++) {
119 memcpy(ptr
, s
->bytestream
, n
);
120 else if (upgrade
== 1) {
121 unsigned int j
, f
= (255 * 128 + s
->maxval
/ 2) / s
->maxval
;
122 for (j
= 0; j
< n
; j
++)
123 ptr
[j
] = (s
->bytestream
[j
] * f
+ 64) >> 7;
124 } else if (upgrade
== 2) {
125 unsigned int j
, v
, f
= (65535 * 32768 + s
->maxval
/ 2) / s
->maxval
;
126 for (j
= 0; j
< n
/ 2; j
++) {
127 v
= av_be2ne16(((uint16_t *)s
->bytestream
)[j
]);
128 ((uint16_t *)ptr
)[j
] = (v
* f
+ 16384) >> 15;
136 case PIX_FMT_YUV420P
:
138 unsigned char *ptr1
, *ptr2
;
142 linesize
= p
->linesize
[0];
143 if (s
->bytestream
+ n
* avctx
->height
* 3 / 2 > s
->bytestream_end
)
145 for (i
= 0; i
< avctx
->height
; i
++) {
146 memcpy(ptr
, s
->bytestream
, n
);
153 h
= avctx
->height
>> 1;
154 for (i
= 0; i
< h
; i
++) {
155 memcpy(ptr1
, s
->bytestream
, n
);
157 memcpy(ptr2
, s
->bytestream
, n
);
159 ptr1
+= p
->linesize
[1];
160 ptr2
+= p
->linesize
[2];
166 linesize
= p
->linesize
[0];
167 if (s
->bytestream
+ avctx
->width
* avctx
->height
* 4 > s
->bytestream_end
)
169 for (i
= 0; i
< avctx
->height
; i
++) {
172 for (j
= 0; j
< avctx
->width
; j
++) {
173 r
= *s
->bytestream
++;
174 g
= *s
->bytestream
++;
175 b
= *s
->bytestream
++;
176 a
= *s
->bytestream
++;
177 ((uint32_t *)ptr
)[j
] = (a
<< 24) | (r
<< 16) | (g
<< 8) | b
;
183 *picture
= *(AVFrame
*)&s
->picture
;
184 *data_size
= sizeof(AVPicture
);
186 return s
->bytestream
- s
->bytestream_start
;
190 #if CONFIG_PGM_DECODER
191 AVCodec ff_pgm_decoder
= {
201 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_GRAY8
, PIX_FMT_GRAY16BE
, PIX_FMT_NONE
},
203 .long_name
= NULL_IF_CONFIG_SMALL("PGM (Portable GrayMap) image"),
207 #if CONFIG_PGMYUV_DECODER
208 AVCodec ff_pgmyuv_decoder
= {
218 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
220 .long_name
= NULL_IF_CONFIG_SMALL("PGMYUV (Portable GrayMap YUV) image"),
224 #if CONFIG_PPM_DECODER
225 AVCodec ff_ppm_decoder
= {
235 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_RGB24
, PIX_FMT_RGB48BE
, PIX_FMT_NONE
},
237 .long_name
= NULL_IF_CONFIG_SMALL("PPM (Portable PixelMap) image"),
241 #if CONFIG_PBM_DECODER
242 AVCodec ff_pbm_decoder
= {
252 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_MONOWHITE
, PIX_FMT_NONE
},
254 .long_name
= NULL_IF_CONFIG_SMALL("PBM (Portable BitMap) image"),
258 #if CONFIG_PAM_DECODER
259 AVCodec ff_pam_decoder
= {
269 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_RGB24
, PIX_FMT_RGB32
, PIX_FMT_GRAY8
, PIX_FMT_MONOWHITE
, PIX_FMT_NONE
},
271 .long_name
= NULL_IF_CONFIG_SMALL("PAM (Portable AnyMap) image"),