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, 27 AVCodecContext *avctx, 28 const uint8_t **poutbuf, int *poutbuf_size, 29 const uint8_t *buf, int buf_size) 30{ 31 ParseContext *pc = s->priv_data; 32 PNMContext pnmctx; 33 int next; 34 35 for(; pc->overread>0; pc->overread--){ 36 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++]; 37 } 38retry: 39 if(pc->index){ 40 pnmctx.bytestream_start= 41 pnmctx.bytestream= pc->buffer; 42 pnmctx.bytestream_end= pc->buffer + pc->index; 43 }else{ 44 pnmctx.bytestream_start= 45 pnmctx.bytestream= (uint8_t *) buf; /* casts avoid warnings */ 46 pnmctx.bytestream_end= (uint8_t *) buf + buf_size; 47 } 48 if(ff_pnm_decode_header(avctx, &pnmctx) < 0){ 49 if(pnmctx.bytestream < pnmctx.bytestream_end){ 50 if(pc->index){ 51 pc->index=0; 52 }else{ 53 buf++; 54 buf_size--; 55 } 56 goto retry; 57 } 58#if 0 59 if(pc->index && pc->index*2 + FF_INPUT_BUFFER_PADDING_SIZE < pc->buffer_size && buf_size > pc->index){ 60 memcpy(pc->buffer + pc->index, buf, pc->index); 61 pc->index += pc->index; 62 buf += pc->index; 63 buf_size -= pc->index; 64 goto retry; 65 } 66#endif 67 next= END_NOT_FOUND; 68 }else{ 69 next= pnmctx.bytestream - pnmctx.bytestream_start 70 + avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height); 71 if(pnmctx.bytestream_start!=buf) 72 next-= pc->index; 73 if(next > buf_size) 74 next= END_NOT_FOUND; 75 } 76 77 if(ff_combine_frame(pc, next, &buf, &buf_size)<0){ 78 *poutbuf = NULL; 79 *poutbuf_size = 0; 80 return buf_size; 81 } 82 *poutbuf = buf; 83 *poutbuf_size = buf_size; 84 return next; 85} 86 87AVCodecParser pnm_parser = { 88 { CODEC_ID_PGM, CODEC_ID_PGMYUV, CODEC_ID_PPM, CODEC_ID_PBM, CODEC_ID_PAM}, 89 sizeof(ParseContext), 90 NULL, 91 pnm_parse, 92 ff_parse_close, 93}; 94