move pnm parser in its own file
[ffmpeg.git] / libavcodec / pnm.c
index 1056164..46f7e6e 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 #include "avcodec.h"
-#include "parser.h" //for ParseContext
+#include "pnm.h"
 
-typedef struct PNMContext {
-    uint8_t *bytestream;
-    uint8_t *bytestream_start;
-    uint8_t *bytestream_end;
-    AVFrame picture;
-    int maxval;                 ///< maximum value of a pixel
-} PNMContext;
-
-static inline int pnm_space(int c)
-{
-    return (c == ' ' || c == '\n' || c == '\r' || c == '\t');
-}
-
-static void pnm_get(PNMContext *sc, char *str, int buf_size)
-{
-    char *s;
-    int c;
-
-    /* skip spaces and comments */
-    for(;;) {
-        c = *sc->bytestream++;
-        if (c == '#')  {
-            do  {
-                c = *sc->bytestream++;
-            } while (c != '\n' && sc->bytestream < sc->bytestream_end);
-        } else if (!pnm_space(c)) {
-            break;
-        }
-    }
-
-    s = str;
-    while (sc->bytestream < sc->bytestream_end && !pnm_space(c)) {
-        if ((s - str)  < buf_size - 1)
-            *s++ = c;
-        c = *sc->bytestream++;
-    }
-    *s = '\0';
-}
 
 static int common_init(AVCodecContext *avctx){
     PNMContext *s = avctx->priv_data;
@@ -69,100 +31,6 @@ static int common_init(AVCodecContext *avctx){
     return 0;
 }
 
-static int pnm_decode_header(AVCodecContext *avctx, PNMContext * const s){
-    char buf1[32], tuple_type[32];
-    int h, w, depth, maxval;
-
-    pnm_get(s, buf1, sizeof(buf1));
-    if (!strcmp(buf1, "P4")) {
-        avctx->pix_fmt = PIX_FMT_MONOWHITE;
-    } else if (!strcmp(buf1, "P5")) {
-        if (avctx->codec_id == CODEC_ID_PGMYUV)
-            avctx->pix_fmt = PIX_FMT_YUV420P;
-        else
-            avctx->pix_fmt = PIX_FMT_GRAY8;
-    } else if (!strcmp(buf1, "P6")) {
-        avctx->pix_fmt = PIX_FMT_RGB24;
-    } else if (!strcmp(buf1, "P7")) {
-        w = -1;
-        h = -1;
-        maxval = -1;
-        depth = -1;
-        tuple_type[0] = '\0';
-        for(;;) {
-            pnm_get(s, buf1, sizeof(buf1));
-            if (!strcmp(buf1, "WIDTH")) {
-                pnm_get(s, buf1, sizeof(buf1));
-                w = strtol(buf1, NULL, 10);
-            } else if (!strcmp(buf1, "HEIGHT")) {
-                pnm_get(s, buf1, sizeof(buf1));
-                h = strtol(buf1, NULL, 10);
-            } else if (!strcmp(buf1, "DEPTH")) {
-                pnm_get(s, buf1, sizeof(buf1));
-                depth = strtol(buf1, NULL, 10);
-            } else if (!strcmp(buf1, "MAXVAL")) {
-                pnm_get(s, buf1, sizeof(buf1));
-                maxval = strtol(buf1, NULL, 10);
-            } else if (!strcmp(buf1, "TUPLETYPE")) {
-                pnm_get(s, tuple_type, sizeof(tuple_type));
-            } else if (!strcmp(buf1, "ENDHDR")) {
-                break;
-            } else {
-                return -1;
-            }
-        }
-        /* check that all tags are present */
-        if (w <= 0 || h <= 0 || maxval <= 0 || depth <= 0 || tuple_type[0] == '\0' || avcodec_check_dimensions(avctx, w, h))
-            return -1;
-
-        avctx->width = w;
-        avctx->height = h;
-        if (depth == 1) {
-            if (maxval == 1)
-                avctx->pix_fmt = PIX_FMT_MONOWHITE;
-            else
-                avctx->pix_fmt = PIX_FMT_GRAY8;
-        } else if (depth == 3) {
-            avctx->pix_fmt = PIX_FMT_RGB24;
-        } else if (depth == 4) {
-            avctx->pix_fmt = PIX_FMT_RGB32;
-        } else {
-            return -1;
-        }
-        return 0;
-    } else {
-        return -1;
-    }
-    pnm_get(s, buf1, sizeof(buf1));
-    avctx->width = atoi(buf1);
-    if (avctx->width <= 0)
-        return -1;
-    pnm_get(s, buf1, sizeof(buf1));
-    avctx->height = atoi(buf1);
-    if(avcodec_check_dimensions(avctx, avctx->width, avctx->height))
-        return -1;
-    if (avctx->pix_fmt != PIX_FMT_MONOWHITE) {
-        pnm_get(s, buf1, sizeof(buf1));
-        s->maxval = atoi(buf1);
-        if(s->maxval >= 256 && avctx->pix_fmt == PIX_FMT_GRAY8) {
-            avctx->pix_fmt = PIX_FMT_GRAY16BE;
-            if (s->maxval != 65535)
-                avctx->pix_fmt = PIX_FMT_GRAY16;
-        }
-    }
-    /* more check if YUV420 */
-    if (avctx->pix_fmt == PIX_FMT_YUV420P) {
-        if ((avctx->width & 1) != 0)
-            return -1;
-        h = (avctx->height * 2);
-        if ((h % 3) != 0)
-            return -1;
-        h /= 3;
-        avctx->height = h;
-    }
-    return 0;
-}
-
 static int pnm_decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
                         uint8_t *buf, int buf_size)
@@ -177,7 +45,7 @@ static int pnm_decode_frame(AVCodecContext *avctx,
     s->bytestream= buf;
     s->bytestream_end= buf + buf_size;
 
-    if(pnm_decode_header(avctx, s) < 0)
+    if(ff_pnm_decode_header(avctx, s) < 0)
         return -1;
 
     if(p->data[0])
@@ -486,76 +354,6 @@ static int pam_probe(AVProbeData *pd)
 }
 #endif
 
-#ifdef CONFIG_PNM_PARSER
-static int pnm_parse(AVCodecParserContext *s,
-                           AVCodecContext *avctx,
-                           const uint8_t **poutbuf, int *poutbuf_size,
-                           const uint8_t *buf, int buf_size)
-{
-    ParseContext *pc = s->priv_data;
-    PNMContext pnmctx;
-    int next;
-
-    for(; pc->overread>0; pc->overread--){
-        pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
-    }
-retry:
-    if(pc->index){
-        pnmctx.bytestream_start=
-        pnmctx.bytestream= pc->buffer;
-        pnmctx.bytestream_end= pc->buffer + pc->index;
-    }else{
-        pnmctx.bytestream_start=
-        pnmctx.bytestream= (uint8_t *) buf; /* casts avoid warnings */
-        pnmctx.bytestream_end= (uint8_t *) buf + buf_size;
-    }
-    if(pnm_decode_header(avctx, &pnmctx) < 0){
-        if(pnmctx.bytestream < pnmctx.bytestream_end){
-            if(pc->index){
-                pc->index=0;
-            }else{
-                buf++;
-                buf_size--;
-            }
-            goto retry;
-        }
-#if 0
-        if(pc->index && pc->index*2 + FF_INPUT_BUFFER_PADDING_SIZE < pc->buffer_size && buf_size > pc->index){
-            memcpy(pc->buffer + pc->index, buf, pc->index);
-            pc->index += pc->index;
-            buf += pc->index;
-            buf_size -= pc->index;
-            goto retry;
-        }
-#endif
-        next= END_NOT_FOUND;
-    }else{
-        next= pnmctx.bytestream - pnmctx.bytestream_start
-            + avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);
-        if(pnmctx.bytestream_start!=buf)
-            next-= pc->index;
-        if(next > buf_size)
-            next= END_NOT_FOUND;
-    }
-
-    if(ff_combine_frame(pc, next, &buf, &buf_size)<0){
-        *poutbuf = NULL;
-        *poutbuf_size = 0;
-        return buf_size;
-    }
-    *poutbuf = buf;
-    *poutbuf_size = buf_size;
-    return next;
-}
-
-AVCodecParser pnm_parser = {
-    { CODEC_ID_PGM, CODEC_ID_PGMYUV, CODEC_ID_PPM, CODEC_ID_PBM, CODEC_ID_PAM},
-    sizeof(ParseContext),
-    NULL,
-    pnm_parse,
-    ff_parse_close,
-};
-#endif /* CONFIG_PNM_PARSER */
 
 #ifdef CONFIG_PGM_ENCODER
 AVCodec pgm_encoder = {