move pnm parser in its own file
authorAurelien Jacobs <aurel@gnuage.org>
Thu, 10 May 2007 23:03:14 +0000 (23:03 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Thu, 10 May 2007 23:03:14 +0000 (23:03 +0000)
Originally committed as revision 8988 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/Makefile
libavcodec/pnm.c
libavcodec/pnm.h [new file with mode: 0644]
libavcodec/pnm_common.c [new file with mode: 0644]
libavcodec/pnm_parser.c [new file with mode: 0644]

index d2641fd..1ebb953 100644 (file)
@@ -35,7 +35,7 @@ OBJS= bitstream.o \
       vp3dsp.o \
       h264idct.o \
       rangecoder.o \
-      pnm.o \
+      pnm.o pnm_common.o \
       h263.o \
       opt.o \
       bitstream_filter.o \
@@ -295,7 +295,7 @@ OBJS-$(CONFIG_MJPEG_PARSER)            += mjpeg_parser.o
 OBJS-$(CONFIG_MPEG4VIDEO_PARSER)       += mpeg4video_parser.o
 OBJS-$(CONFIG_MPEGAUDIO_PARSER)        += mpegaudio_parser.o
 OBJS-$(CONFIG_MPEGVIDEO_PARSER)        += mpegvideo_parser.o
-OBJS-$(CONFIG_PNM_PARSER)              += pnm.o
+OBJS-$(CONFIG_PNM_PARSER)              += pnm_parser.o pnm_common.o
 OBJS-$(CONFIG_VC1_PARSER)              += vc1_parser.o
 
 OBJS-$(HAVE_PTHREADS)                  += pthread.o
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 = {
diff --git a/libavcodec/pnm.h b/libavcodec/pnm.h
new file mode 100644 (file)
index 0000000..fa5e55e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * PNM image format
+ * Copyright (c) 2002, 2003 Fabrice Bellard.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef PNM_H
+#define PNM_H
+
+#include "avcodec.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;
+
+int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s);
+
+#endif /* PNM_H */
diff --git a/libavcodec/pnm_common.c b/libavcodec/pnm_common.c
new file mode 100644 (file)
index 0000000..1f28ace
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * PNM image format
+ * Copyright (c) 2002, 2003 Fabrice Bellard.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "avcodec.h"
+#include "pnm.h"
+
+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';
+}
+
+int ff_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;
+}
diff --git a/libavcodec/pnm_parser.c b/libavcodec/pnm_parser.c
new file mode 100644 (file)
index 0000000..f5212f0
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * PNM image parser
+ * Copyright (c) 2002, 2003 Fabrice Bellard.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "parser.h" //for ParseContext
+#include "pnm.h"
+
+
+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(ff_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,
+};