aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/dxtory.c
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2015-09-08 14:27:05 +0200
committerHendrik Leppkes <h.leppkes@gmail.com>2015-09-08 14:27:05 +0200
commitaa15e233c4cf8ac64ec73445675aa72baeae661f (patch)
tree5cfa8a1f17ff256d189f4afe08c7798703dbddb3 /libavcodec/dxtory.c
parent696634c5fa5894b4adeb240191a723ec77a30756 (diff)
parenta7e6fbd90e62d3320b1e26d8209fc0f55ee5b0be (diff)
downloadffmpeg-aa15e233c4cf8ac64ec73445675aa72baeae661f.tar.gz
Merge commit 'a7e6fbd90e62d3320b1e26d8209fc0f55ee5b0be'
* commit 'a7e6fbd90e62d3320b1e26d8209fc0f55ee5b0be': dxtory: Factorize the buffer loading Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
Diffstat (limited to 'libavcodec/dxtory.c')
-rw-r--r--libavcodec/dxtory.c102
1 files changed, 37 insertions, 65 deletions
diff --git a/libavcodec/dxtory.c b/libavcodec/dxtory.c
index 0631814aed..79e7ab2064 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) {
+ 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;
@@ -346,19 +358,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;
@@ -423,19 +425,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) {
- 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;
if ((avctx->width & 3) || (avctx->height & 3)) {
avpriv_request_sample(avctx, "Frame dimensions %dx%d",
@@ -516,19 +508,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) {
- 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;
if ((avctx->width & 1) || (avctx->height & 1)) {
avpriv_request_sample(avctx, "Frame dimensions %dx%d",
@@ -604,19 +586,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;