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
pnm_parser.c
Go to the documentation of this file.
1
/*
2
* PNM image parser
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 "
parser.h
"
//for ParseContext
23
#include "
pnm.h
"
24
25
26
static
int
pnm_parse
(
AVCodecParserContext
*
s
,
AVCodecContext
*avctx,
27
const
uint8_t
**poutbuf,
int
*poutbuf_size,
28
const
uint8_t
*
buf
,
int
buf_size)
29
{
30
ParseContext
*pc = s->
priv_data
;
31
PNMContext
pnmctx;
32
int
next;
33
34
for
(; pc->
overread
> 0; pc->
overread
--) {
35
pc->
buffer
[pc->
index
++]= pc->
buffer
[pc->
overread_index
++];
36
}
37
retry:
38
if
(pc->
index
) {
39
pnmctx.
bytestream_start
=
40
pnmctx.
bytestream
= pc->
buffer
;
41
pnmctx.
bytestream_end
= pc->
buffer
+ pc->
index
;
42
}
else
{
43
pnmctx.
bytestream_start
=
44
pnmctx.
bytestream
= (
uint8_t
*) buf;
/* casts avoid warnings */
45
pnmctx.
bytestream_end
= (
uint8_t
*) buf + buf_size;
46
}
47
if
(
ff_pnm_decode_header
(avctx, &pnmctx) < 0) {
48
if
(pnmctx.
bytestream
< pnmctx.
bytestream_end
) {
49
if
(pc->
index
) {
50
pc->
index
= 0;
51
}
else
{
52
buf++;
53
buf_size--;
54
}
55
goto
retry;
56
}
57
#if 0
58
if
(pc->
index
&& pc->
index
* 2 + FF_INPUT_BUFFER_PADDING_SIZE < pc->buffer_size && buf_size > pc->
index
) {
59
memcpy(pc->
buffer
+ pc->
index
, buf, pc->
index
);
60
pc->
index
+= pc->
index
;
61
buf += pc->
index
;
62
buf_size -= pc->
index
;
63
goto
retry;
64
}
65
#endif
66
next =
END_NOT_FOUND
;
67
}
else
{
68
next = pnmctx.
bytestream
- pnmctx.
bytestream_start
69
+
avpicture_get_size
(avctx->
pix_fmt
, avctx->
width
, avctx->
height
);
70
if
(pnmctx.
bytestream_start
!= buf)
71
next -= pc->
index
;
72
if
(next > buf_size)
73
next =
END_NOT_FOUND
;
74
}
75
76
if
(
ff_combine_frame
(pc, next, &buf, &buf_size) < 0) {
77
*poutbuf = NULL;
78
*poutbuf_size = 0;
79
return
buf_size;
80
}
81
*poutbuf =
buf
;
82
*poutbuf_size = buf_size;
83
return
next;
84
}
85
86
AVCodecParser
ff_pnm_parser
= {
87
.
codec_ids
= {
AV_CODEC_ID_PGM
,
AV_CODEC_ID_PGMYUV
,
AV_CODEC_ID_PPM
,
88
AV_CODEC_ID_PBM
,
AV_CODEC_ID_PAM
},
89
.priv_data_size =
sizeof
(
ParseContext
),
90
.parser_parse =
pnm_parse
,
91
.parser_close =
ff_parse_close
,
92
};
Generated on Sat Jan 25 2014 19:51:53 for FFmpeg by
1.8.2