Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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. };
  93.