---
 libavcodec/pnm.c | 171 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 96 insertions(+), 75 deletions(-)

diff --git a/libavcodec/pnm.c b/libavcodec/pnm.c
index a7f4ae6..bcc128d 100644
--- a/libavcodec/pnm.c
+++ b/libavcodec/pnm.c
@@ -57,93 +57,73 @@ static void pnm_get(PNMContext *sc, char *str, int buf_size)
     *s = '\0';
 }
 
-int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s)
+static int decode_header_p7(AVCodecContext *avctx, PNMContext * const s)
 {
     char buf1[32], tuple_type[32];
-    int h, w, depth, maxval;
+    int w      = -1;
+    int h      = -1;
+    int maxval = -1;
+    int depth  = -1;
 
-    pnm_get(s, buf1, sizeof(buf1));
-    s->type= buf1[1]-'0';
-    if(buf1[0] != 'P')
+    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, "TUPLTYPE") ||
+                   /* libavcodec used to write invalid files */
+                   !strcmp(buf1, "TUPLETYPE")) {
+            pnm_get(s, tuple_type, sizeof(tuple_type));
+        } else if (!strcmp(buf1, "ENDHDR")) {
+            break;
+        } else {
+            return AVERROR_INVALIDDATA;
+        }
+    }
+    /* check that all tags are present */
+    if (w <= 0 || h <= 0 || maxval <= 0 || depth <= 0 ||
+        tuple_type[0] == '\0' || av_image_check_size(w, h, 0, avctx))
         return AVERROR_INVALIDDATA;
 
-    if (s->type==1 || s->type==4) {
-        avctx->pix_fmt = AV_PIX_FMT_MONOWHITE;
-    } else if (s->type==2 || s->type==5) {
-        if (avctx->codec_id == AV_CODEC_ID_PGMYUV)
-            avctx->pix_fmt = AV_PIX_FMT_YUV420P;
+    avctx->width  = w;
+    avctx->height = h;
+    if (depth == 1) {
+        if (maxval == 1)
+            avctx->pix_fmt = AV_PIX_FMT_MONOWHITE;
         else
             avctx->pix_fmt = AV_PIX_FMT_GRAY8;
-    } else if (s->type==3 || s->type==6) {
+    } else if (depth == 3) {
+        if (maxval < 256) {
         avctx->pix_fmt = AV_PIX_FMT_RGB24;
-    } else if (s->type==7) {
-        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, "TUPLTYPE") ||
-                       /* libavcodec used to write invalid files */
-                       !strcmp(buf1, "TUPLETYPE")) {
-                pnm_get(s, tuple_type, sizeof(tuple_type));
-            } else if (!strcmp(buf1, "ENDHDR")) {
-                break;
-            } else {
-                return AVERROR_INVALIDDATA;
-            }
-        }
-        /* check that all tags are present */
-        if (w <= 0 || h <= 0 || maxval <= 0 || depth <= 0 || tuple_type[0] == 
'\0' || av_image_check_size(w, h, 0, avctx))
-            return AVERROR_INVALIDDATA;
-
-        avctx->width  = w;
-        avctx->height = h;
-        if (depth == 1) {
-            if (maxval == 1)
-                avctx->pix_fmt = AV_PIX_FMT_MONOWHITE;
-            else
-                avctx->pix_fmt = AV_PIX_FMT_GRAY8;
-        } else if (depth == 3) {
-            if (maxval < 256) {
-            avctx->pix_fmt = AV_PIX_FMT_RGB24;
-            } else {
-                av_log(avctx, AV_LOG_ERROR, "16-bit components are only 
supported for grayscale\n");
-                avctx->pix_fmt = AV_PIX_FMT_NONE;
-                return AVERROR_INVALIDDATA;
-            }
-        } else if (depth == 4) {
-            avctx->pix_fmt = AV_PIX_FMT_RGB32;
         } else {
+            av_log(avctx, AV_LOG_ERROR, "16-bit components are only supported 
for grayscale\n");
+            avctx->pix_fmt = AV_PIX_FMT_NONE;
             return AVERROR_INVALIDDATA;
         }
-        return 0;
+    } else if (depth == 4) {
+        avctx->pix_fmt = AV_PIX_FMT_RGB32;
     } else {
         return AVERROR_INVALIDDATA;
     }
-    pnm_get(s, buf1, sizeof(buf1));
-    avctx->width = atoi(buf1);
-    if (avctx->width <= 0)
-        return AVERROR_INVALIDDATA;
-    pnm_get(s, buf1, sizeof(buf1));
-    avctx->height = atoi(buf1);
-    if (avctx->height <= 0)
-        return AVERROR_INVALIDDATA;
-    if(av_image_check_size(avctx->width, avctx->height, 0, avctx))
-        return AVERROR_INVALIDDATA;
+
+    return 0;
+}
+
+static int check_maxval(AVCodecContext *avctx, PNMContext * const s)
+{
+    char buf1[32];
+
     if (avctx->pix_fmt != AV_PIX_FMT_MONOWHITE) {
         pnm_get(s, buf1, sizeof(buf1));
         s->maxval = atoi(buf1);
@@ -172,10 +152,51 @@ int ff_pnm_decode_header(AVCodecContext *avctx, 
PNMContext * const s)
                 return AVERROR_INVALIDDATA;
             }
         }
-    }else
-        s->maxval=1;
+    } else
+        s->maxval = 1;
+
+    return 0;
+}
+
+int ff_pnm_decode_header(AVCodecContext *avctx, PNMContext * const s)
+{
+    char buf1[32];
+    int ret;
+
+    pnm_get(s, buf1, sizeof(buf1));
+    s->type= buf1[1]-'0';
+    if(buf1[0] != 'P')
+        return AVERROR_INVALIDDATA;
+
+    if (s->type==1 || s->type==4) {
+        avctx->pix_fmt = AV_PIX_FMT_MONOWHITE;
+    } else if (s->type==2 || s->type==5) {
+        if (avctx->codec_id == AV_CODEC_ID_PGMYUV)
+            avctx->pix_fmt = AV_PIX_FMT_YUV420P;
+        else
+            avctx->pix_fmt = AV_PIX_FMT_GRAY8;
+    } else if (s->type==3 || s->type==6) {
+        avctx->pix_fmt = AV_PIX_FMT_RGB24;
+    } else if (s->type==7) {
+        return decode_header_p7(avctx, s);
+    } else {
+        return AVERROR_INVALIDDATA;
+    }
+    pnm_get(s, buf1, sizeof(buf1));
+    avctx->width = atoi(buf1);
+    if (avctx->width <= 0)
+        return AVERROR_INVALIDDATA;
+    pnm_get(s, buf1, sizeof(buf1));
+    avctx->height = atoi(buf1);
+    if (avctx->height <= 0)
+        return AVERROR_INVALIDDATA;
+    if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
+        return ret;
+    if ((ret = check_maxval(avctx, s)) < 0)
+        return ret;
     /* more check if YUV420 */
     if (av_pix_fmt_desc_get(avctx->pix_fmt)->flags & AV_PIX_FMT_FLAG_PLANAR) {
+        int h;
         if ((avctx->width & 1) != 0)
             return AVERROR_INVALIDDATA;
         h = (avctx->height * 2);
-- 
2.3.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to