[FFmpeg-cvslog] dxtory: Factorize the buffer loading

Luca Barbato git at videolan.org
Tue Sep 8 14:28:01 CEST 2015


ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Thu Sep  3 16:13:04 2015 +0200| [a7e6fbd90e62d3320b1e26d8209fc0f55ee5b0be] | committer: Luca Barbato

dxtory: Factorize the buffer loading

And the checks nearby it.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a7e6fbd90e62d3320b1e26d8209fc0f55ee5b0be
---

 libavcodec/dxtory.c |  102 +++++++++++++++++++--------------------------------
 1 file changed, 37 insertions(+), 65 deletions(-)

diff --git a/libavcodec/dxtory.c b/libavcodec/dxtory.c
index 1bb2bc1..dd0d512 100644
--- a/libavcodec/dxtory.c
+++ b/libavcodec/dxtory.c
@@ -220,6 +220,28 @@ static int check_slice_size(AVCodecContext *avctx,
     return 0;
 }
 
+static int load_buffer(AVCodecContext *avctx,
+                       const uint8_t *src, int src_size,
+                       GetByteContext *gb,
+                       int *nslices, int *off)
+{
+    bytestream2_init(gb, src, src_size);
+    *nslices = bytestream2_get_le16(gb);
+    *off = FFALIGN(*nslices * 4 + 2, 16);
+    if (src_size < *off) {
+        av_log(avctx, AV_LOG_ERROR, "no slice data\n");
+        return AVERROR_INVALIDDATA;
+    }
+
+    if (!*nslices || avctx->height % *nslices) {
+        avpriv_request_sample(avctx, "%d slices for %dx%d", *nslices,
+                              avctx->width, avctx->height);
+        return AVERROR_PATCHWELCOME;
+    }
+
+    return 0;
+}
+
 static inline uint8_t decode_sym_565(GetBitContext *gb, uint8_t lru[8],
                                      int bits)
 {
@@ -275,19 +297,9 @@ static int dxtory_decode_v2_565(AVCodecContext *avctx, AVFrame *pic,
     uint8_t *dst;
     int ret;
 
-    bytestream2_init(&gb, src, src_size);
-    nslices = bytestream2_get_le16(&gb);
-    off = FFALIGN(nslices * 4 + 2, 16);
-    if (src_size < off) {
-        av_log(avctx, AV_LOG_ERROR, "no slice data\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    if (!nslices || avctx->height % nslices) {
-        avpriv_request_sample(avctx, "%d slices for %dx%d", nslices,
-                              avctx->width, avctx->height);
-        return AVERROR_PATCHWELCOME;
-    }
+    ret = load_buffer(avctx, src, src_size, &gb, &nslices, &off);
+    if (ret < 0)
+        return ret;
 
     slice_height = avctx->height / nslices;
     avctx->pix_fmt = AV_PIX_FMT_RGB24;
@@ -345,19 +357,9 @@ static int dxtory_decode_v2_rgb(AVCodecContext *avctx, AVFrame *pic,
     uint8_t *dst;
     int ret;
 
-    bytestream2_init(&gb, src, src_size);
-    nslices = bytestream2_get_le16(&gb);
-    off = FFALIGN(nslices * 4 + 2, 16);
-    if (src_size < off) {
-        av_log(avctx, AV_LOG_ERROR, "no slice data\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    if (!nslices || avctx->height % nslices) {
-        avpriv_request_sample(avctx, "%d slices for %dx%d", nslices,
-                              avctx->width, avctx->height);
-        return AVERROR_PATCHWELCOME;
-    }
+    ret = load_buffer(avctx, src, src_size, &gb, &nslices, &off);
+    if (ret < 0)
+        return ret;
 
     slice_height = avctx->height / nslices;
     avctx->pix_fmt = AV_PIX_FMT_BGR24;
@@ -421,19 +423,9 @@ static int dxtory_decode_v2_410(AVCodecContext *avctx, AVFrame *pic,
     uint8_t *Y, *U, *V;
     int ret;
 
-    bytestream2_init(&gb, src, src_size);
-    nslices = bytestream2_get_le16(&gb);
-    off = FFALIGN(nslices * 4 + 2, 16);
-    if (src_size < off) {
-        av_log(avctx, AV_LOG_ERROR, "no slice data\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    if (!nslices || avctx->height % nslices) {
-        avpriv_request_sample(avctx, "%d slices for %dx%d", nslices,
-                              avctx->width, avctx->height);
-        return AVERROR_PATCHWELCOME;
-    }
+    ret = load_buffer(avctx, src, src_size, &gb, &nslices, &off);
+    if (ret < 0)
+        return ret;
 
     ref_slice_height = avctx->height / nslices;
     if ((avctx->width & 3) || (avctx->height & 3)) {
@@ -514,19 +506,9 @@ static int dxtory_decode_v2_420(AVCodecContext *avctx, AVFrame *pic,
     uint8_t *Y, *U, *V;
     int ret;
 
-    bytestream2_init(&gb, src, src_size);
-    nslices = bytestream2_get_le16(&gb);
-    off = FFALIGN(nslices * 4 + 2, 16);
-    if (src_size < off) {
-        av_log(avctx, AV_LOG_ERROR, "no slice data\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    if (!nslices || avctx->height % nslices) {
-        avpriv_request_sample(avctx, "%d slices for %dx%d", nslices,
-                              avctx->width, avctx->height);
-        return AVERROR_PATCHWELCOME;
-    }
+    ret = load_buffer(avctx, src, src_size, &gb, &nslices, &off);
+    if (ret < 0)
+        return ret;
 
     ref_slice_height = avctx->height / nslices;
     if ((avctx->width & 1) || (avctx->height & 1)) {
@@ -603,19 +585,9 @@ static int dxtory_decode_v2_444(AVCodecContext *avctx, AVFrame *pic,
     uint8_t *Y, *U, *V;
     int ret;
 
-    bytestream2_init(&gb, src, src_size);
-    nslices = bytestream2_get_le16(&gb);
-    off = FFALIGN(nslices * 4 + 2, 16);
-    if (src_size < off) {
-        av_log(avctx, AV_LOG_ERROR, "no slice data\n");
-        return AVERROR_INVALIDDATA;
-    }
-
-    if (!nslices || avctx->height % nslices) {
-        avpriv_request_sample(avctx, "%d slices for %dx%d", nslices,
-                              avctx->width, avctx->height);
-        return AVERROR_PATCHWELCOME;
-    }
+    ret = load_buffer(avctx, src, src_size, &gb, &nslices, &off);
+    if (ret < 0)
+        return ret;
 
     slice_height = avctx->height / nslices;
 



More information about the ffmpeg-cvslog mailing list