mov: parse custom "----" Metadata
[ffmpeg.git] / libavcodec / mjpegdec.c
index 4fb2f3e..5fbda48 100644 (file)
@@ -158,18 +158,19 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
     int len, index, i, class, n, v, code_max;
     uint8_t bits_table[17];
     uint8_t val_table[256];
+    int ret = 0;
 
     len = get_bits(&s->gb, 16) - 2;
 
     while (len > 0) {
         if (len < 17)
-            return -1;
+            return AVERROR_INVALIDDATA;
         class = get_bits(&s->gb, 4);
         if (class >= 2)
-            return -1;
+            return AVERROR_INVALIDDATA;
         index = get_bits(&s->gb, 4);
         if (index >= 4)
-            return -1;
+            return AVERROR_INVALIDDATA;
         n = 0;
         for (i = 1; i <= 16; i++) {
             bits_table[i] = get_bits(&s->gb, 8);
@@ -177,7 +178,7 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
         }
         len -= 17;
         if (len < n || n > 256)
-            return -1;
+            return AVERROR_INVALIDDATA;
 
         code_max = 0;
         for (i = 0; i < n; i++) {
@@ -192,15 +193,15 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
         ff_free_vlc(&s->vlcs[class][index]);
         av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
                class, index, code_max + 1);
-        if (build_vlc(&s->vlcs[class][index], bits_table, val_table,
-                      code_max + 1, 0, class > 0) < 0)
-            return -1;
+        if ((ret = build_vlc(&s->vlcs[class][index], bits_table, val_table,
+                             code_max + 1, 0, class > 0)) < 0)
+            return ret;
 
         if (class > 0) {
             ff_free_vlc(&s->vlcs[2][index]);
-            if (build_vlc(&s->vlcs[2][index], bits_table, val_table,
-                          code_max + 1, 0, 0) < 0)
-                return -1;
+            if ((ret = build_vlc(&s->vlcs[2][index], bits_table, val_table,
+                                 code_max + 1, 0, 0)) < 0)
+                return ret;
         }
     }
     return 0;
@@ -241,7 +242,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
 
     av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
     if (av_image_check_size(width, height, 0, s->avctx))
-        return -1;
+        return AVERROR_INVALIDDATA;
 
     nb_components = get_bits(&s->gb, 8);
     if (nb_components <= 0 ||
@@ -254,9 +255,10 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
         }
     }
     if (s->ls && !(s->bits <= 8 || nb_components == 1)) {
-        av_log(s->avctx, AV_LOG_ERROR,
-               "only <= 8 bits/component or 16-bit gray accepted for JPEG-LS\n");
-        return -1;
+        av_log_missing_feature(s->avctx,
+                               "only <= 8 bits/component or "
+                               "16-bit gray accepted for JPEG-LS\n", 0);
+        return AVERROR_PATCHWELCOME;
     }
     s->nb_components = nb_components;
     s->h_max         = 1;
@@ -277,16 +279,16 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
         }
         s->quant_index[i] = get_bits(&s->gb, 8);
         if (s->quant_index[i] >= 4)
-            return -1;
+            return AVERROR_INVALIDDATA;
         av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
                i, s->h_count[i], s->v_count[i],
                s->component_id[i], s->quant_index[i]);
     }
 
     if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
-        av_log(s->avctx, AV_LOG_ERROR,
-               "Subsampling in JPEG-LS is not supported.\n");
-        return -1;
+        av_log_missing_feature(s->avctx,
+                               "Subsampling in JPEG-LS is not supported.\n", 0);
+        return AVERROR_PATCHWELCOME;
     }
 
     if (s->v_max == 1 && s->h_max == 1 && s->lossless==1 && nb_components==3)
@@ -404,7 +406,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
         break;
     default:
         av_log(s->avctx, AV_LOG_ERROR, "Unhandled pixel format 0x%x\n", pix_fmt_id);
-        return -1;
+        return AVERROR_PATCHWELCOME;
     }
     if ((s->upscale_h || s->upscale_v) && s->avctx->lowres) {
         av_log(s->avctx, AV_LOG_ERROR, "lowres not supported for weird subsampling\n");
@@ -486,7 +488,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int component,
     val = mjpeg_decode_dc(s, dc_index);
     if (val == 0xffff) {
         av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
     val = val * quant_matrix[0] + s->last_dc[component];
     s->last_dc[component] = val;
@@ -514,7 +516,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, int component,
 
             if (i > 63) {
                 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
             j        = s->scantable.permutated[i];
             block[j] = level * quant_matrix[j];
@@ -534,7 +536,7 @@ static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block,
     val = mjpeg_decode_dc(s, dc_index);
     if (val == 0xffff) {
         av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
     val = (val * quant_matrix[0] << Al) + s->last_dc[component];
     s->last_dc[component] = val;
@@ -583,7 +585,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
                         break;
                     }
                     av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
-                    return -1;
+                    return AVERROR_INVALIDDATA;
                 }
                 j = s->scantable.permutated[i];
                 block[j] = level * quant_matrix[j] << Al;
@@ -592,7 +594,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
                     i += 15;
                     if (i >= se) {
                         av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
-                        return -1;
+                        return AVERROR_INVALIDDATA;
                     }
                 } else {
                     val = (1 << run);
@@ -1001,7 +1003,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
             if (get_bits_left(&s->gb) < 0) {
                 av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
                        -get_bits_left(&s->gb));
-                return -1;
+                return AVERROR_INVALIDDATA;
             }
             for (i = 0; i < nb_components; i++) {
                 uint8_t *ptr;
@@ -1031,7 +1033,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
                                              s->quant_matrixes[s->quant_index[c]]) < 0) {
                                 av_log(s->avctx, AV_LOG_ERROR,
                                        "error y=%d x=%d\n", mb_y, mb_x);
-                                return -1;
+                                return AVERROR_INVALIDDATA;
                             }
                             s->dsp.idct_put(ptr, linesize[c], s->block);
                         }
@@ -1047,7 +1049,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int Ah,
                                                        Al) < 0) {
                             av_log(s->avctx, AV_LOG_ERROR,
                                    "error y=%d x=%d\n", mb_y, mb_x);
-                            return -1;
+                            return AVERROR_INVALIDDATA;
                         }
                     }
                     // av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n",
@@ -1124,7 +1126,7 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
                 if (ret < 0) {
                     av_log(s->avctx, AV_LOG_ERROR,
                            "error y=%d x=%d\n", mb_y, mb_x);
-                    return -1;
+                    return AVERROR_INVALIDDATA;
                 }
 
             if (last_scan) {
@@ -1140,7 +1142,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
                         const AVFrame *reference)
 {
     int len, nb_components, i, h, v, predictor, point_transform;
-    int index, id;
+    int index, id, ret;
     const int block_size = s->lossless ? 1 : 8;
     int ilv, prev_shift;
 
@@ -1157,11 +1159,11 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
     if (nb_components == 0 || nb_components > MAX_COMPONENTS) {
         av_log(s->avctx, AV_LOG_ERROR,
                "decode_sos: nb_components (%d) unsupported\n", nb_components);
-        return -1;
+        return AVERROR_PATCHWELCOME;
     }
     if (len != 6 + 2 * nb_components) {
         av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
     for (i = 0; i < nb_components; i++) {
         id = get_bits(&s->gb, 8) - 1;
@@ -1173,7 +1175,7 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask,
         if (index == s->nb_components) {
             av_log(s->avctx, AV_LOG_ERROR,
                    "decode_sos: index(%d) out of components\n", index);
-            return -1;
+            return AVERROR_INVALIDDATA;
         }
         /* Metasoft MJPEG codec has Cb and Cr swapped */
         if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
@@ -1243,27 +1245,30 @@ next_field:
 //            for () {
 //            reset_ls_coding_parameters(s, 0);
 
-            if (ff_jpegls_decode_picture(s, predictor, point_transform, ilv) < 0)
-                return -1;
+            if ((ret = ff_jpegls_decode_picture(s, predictor,
+                                                point_transform, ilv)) < 0)
+                return ret;
         } else {
             if (s->rgb) {
-                if (ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform) < 0)
-                    return -1;
+                if ((ret = ljpeg_decode_rgb_scan(s, nb_components, predictor, point_transform)) < 0)
+                    return ret;
             } else {
-                if (ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
-                    return -1;
+                if ((ret = ljpeg_decode_yuv_scan(s, predictor, point_transform)) < 0)
+                    return ret;
             }
         }
     } else {
         if (s->progressive && predictor) {
             av_assert0(s->picture_ptr == &s->picture);
-            if (mjpeg_decode_scan_progressive_ac(s, predictor, ilv, prev_shift,
-                                                 point_transform) < 0)
-                return -1;
+            if ((ret = mjpeg_decode_scan_progressive_ac(s, predictor,
+                                                        ilv, prev_shift,
+                                                        point_transform)) < 0)
+                return ret;
         } else {
-            if (mjpeg_decode_scan(s, nb_components, prev_shift, point_transform,
-                                  mb_bitmask, reference) < 0)
-                return -1;
+            if ((ret = mjpeg_decode_scan(s, nb_components,
+                                         prev_shift, point_transform,
+                                         mb_bitmask, reference)) < 0)
+                return ret;
         }
     }
     if(s->interlaced && get_bits_left(&s->gb) > 32 && show_bits(&s->gb, 8) == 0xFF) {
@@ -1283,13 +1288,13 @@ next_field:
     return 0;
  out_of_range:
     av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
-    return -1;
+    return AVERROR_INVALIDDATA;
 }
 
 static int mjpeg_decode_dri(MJpegDecodeContext *s)
 {
     if (get_bits(&s->gb, 16) != 4)
-        return -1;
+        return AVERROR_INVALIDDATA;
     s->restart_interval = get_bits(&s->gb, 16);
     s->restart_count    = 0;
     av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
@@ -1304,9 +1309,9 @@ static int mjpeg_decode_app(MJpegDecodeContext *s)
 
     len = get_bits(&s->gb, 16);
     if (len < 5)
-        return -1;
+        return AVERROR_INVALIDDATA;
     if (8 * len > get_bits_left(&s->gb))
-        return -1;
+        return AVERROR_INVALIDDATA;
 
     id   = get_bits_long(&s->gb, 32);
     id   = av_be2ne32(id);
@@ -1596,6 +1601,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
     int unescaped_buf_size;
     int start_code;
     int i, index;
+    int ret = 0;
     AVFrame *picture = data;
 
     s->got_picture = 0; // picture from previous image can not be reused
@@ -1644,9 +1650,9 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
                 ff_mjpeg_decode_dqt(s);
                 break;
             case DHT:
-                if (ff_mjpeg_decode_dht(s) < 0) {
+                if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
                     av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
-                    return -1;
+                    return ret;
                 }
                 break;
             case SOF0:
@@ -1654,33 +1660,34 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
                 s->lossless    = 0;
                 s->ls          = 0;
                 s->progressive = 0;
-                if (ff_mjpeg_decode_sof(s) < 0)
-                    return -1;
+                if ((ret = ff_mjpeg_decode_sof(s)) < 0)
+                    return ret;
                 break;
             case SOF2:
                 s->lossless    = 0;
                 s->ls          = 0;
                 s->progressive = 1;
-                if (ff_mjpeg_decode_sof(s) < 0)
-                    return -1;
+                if ((ret = ff_mjpeg_decode_sof(s)) < 0)
+                    return ret;
                 break;
             case SOF3:
                 s->lossless    = 1;
                 s->ls          = 0;
                 s->progressive = 0;
-                if (ff_mjpeg_decode_sof(s) < 0)
-                    return -1;
+                if ((ret = ff_mjpeg_decode_sof(s)) < 0)
+                    return ret;
                 break;
             case SOF48:
                 s->lossless    = 1;
                 s->ls          = 1;
                 s->progressive = 0;
-                if (ff_mjpeg_decode_sof(s) < 0)
-                    return -1;
+                if ((ret = ff_mjpeg_decode_sof(s)) < 0)
+                    return ret;
                 break;
             case LSE:
-                if (!CONFIG_JPEGLS_DECODER || ff_jpegls_decode_lse(s) < 0)
-                    return -1;
+                if (!CONFIG_JPEGLS_DECODER ||
+                    (ret = ff_jpegls_decode_lse(s)) < 0)
+                    return ret;
                 break;
             case EOI:
 eoi_parser:
@@ -1715,9 +1722,9 @@ eoi_parser:
 
                 goto the_end;
             case SOS:
-                if (ff_mjpeg_decode_sos(s, NULL, NULL) < 0 &&
+                if ((ret = ff_mjpeg_decode_sos(s, NULL, NULL)) < 0 &&
                     (avctx->err_recognition & AV_EF_EXPLODE))
-                    return AVERROR_INVALIDDATA;
+                    return ret;
                 break;
             case DRI:
                 mjpeg_decode_dri(s);
@@ -1752,7 +1759,7 @@ eoi_parser:
         goto eoi_parser;
     }
     av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
-    return -1;
+    return AVERROR_INVALIDDATA;
 the_end:
     if (s->upscale_h) {
         uint8_t *line = s->picture_ptr->data[s->upscale_h];