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 26static 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 } 37retry: 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 86AVCodecParser pnm_parser = { 87 { CODEC_ID_PGM, CODEC_ID_PGMYUV, CODEC_ID_PPM, CODEC_ID_PBM, CODEC_ID_PAM}, 88 sizeof(ParseContext), 89 NULL, 90 pnm_parse, 91 ff_parse_close, 92}; 93