annotate pnm_parser.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents a6bb56636f90
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
1 /*
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
2 * PNM image parser
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4978
diff changeset
3 * Copyright (c) 2002, 2003 Fabrice Bellard
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
4 *
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
5 * This file is part of FFmpeg.
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
6 *
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
11 *
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
15 * Lesser General Public License for more details.
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
16 *
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
20 */
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
21
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
22 #include "parser.h" //for ParseContext
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
23 #include "pnm.h"
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
24
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
25
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
26 static int pnm_parse(AVCodecParserContext *s, AVCodecContext *avctx,
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
27 const uint8_t **poutbuf, int *poutbuf_size,
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
28 const uint8_t *buf, int buf_size)
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
29 {
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
30 ParseContext *pc = s->priv_data;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
31 PNMContext pnmctx;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
32 int next;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
33
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
34 for (; pc->overread > 0; pc->overread--) {
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
35 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
36 }
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
37 retry:
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
38 if (pc->index) {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
39 pnmctx.bytestream_start =
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
40 pnmctx.bytestream = pc->buffer;
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
41 pnmctx.bytestream_end = pc->buffer + pc->index;
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
42 } else {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
43 pnmctx.bytestream_start =
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
44 pnmctx.bytestream = (uint8_t *) buf; /* casts avoid warnings */
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
45 pnmctx.bytestream_end = (uint8_t *) buf + buf_size;
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
46 }
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
47 if (ff_pnm_decode_header(avctx, &pnmctx) < 0) {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
48 if (pnmctx.bytestream < pnmctx.bytestream_end) {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
49 if (pc->index) {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
50 pc->index = 0;
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
51 } else {
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
52 buf++;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
53 buf_size--;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
54 }
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
55 goto retry;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
56 }
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
57 #if 0
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
58 if (pc->index && pc->index * 2 + FF_INPUT_BUFFER_PADDING_SIZE < pc->buffer_size && buf_size > pc->index) {
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
59 memcpy(pc->buffer + pc->index, buf, pc->index);
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
60 pc->index += pc->index;
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
61 buf += pc->index;
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
62 buf_size -= pc->index;
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
63 goto retry;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
64 }
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
65 #endif
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
66 next = END_NOT_FOUND;
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
67 } else {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
68 next = pnmctx.bytestream - pnmctx.bytestream_start
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
69 + avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
70 if (pnmctx.bytestream_start != buf)
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
71 next -= pc->index;
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
72 if (next > buf_size)
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
73 next = END_NOT_FOUND;
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
74 }
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
75
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
76 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
77 *poutbuf = NULL;
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
78 *poutbuf_size = 0;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
79 return buf_size;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
80 }
10459
a6bb56636f90 whitespace cosmetics: K&R coding style, prettyprinting
diego
parents: 8629
diff changeset
81 *poutbuf = buf;
4978
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
82 *poutbuf_size = buf_size;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
83 return next;
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
84 }
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
85
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
86 AVCodecParser pnm_parser = {
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
87 { CODEC_ID_PGM, CODEC_ID_PGMYUV, CODEC_ID_PPM, CODEC_ID_PBM, CODEC_ID_PAM},
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
88 sizeof(ParseContext),
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
89 NULL,
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
90 pnm_parse,
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
91 ff_parse_close,
95934eef9589 move pnm parser in its own file
aurel
parents:
diff changeset
92 };