diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-04-19 21:47:18 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-04-19 21:47:58 +0400 |
commit | 0c67ef272943c10decb9243c95fc209a7d3f2e12 (patch) | |
tree | 2f31da67db1e439077fbef36257ff3a2d71d37e9 /libavcodec | |
parent | e37dbfddda0380fd9ea9ba1bbae8a5ab2afc6573 (diff) | |
parent | 86a0432688216562926d4aee36118f01be6d5e1b (diff) |
Merge commit '86a0432688216562926d4aee36118f01be6d5e1b'
* commit '86a0432688216562926d4aee36118f01be6d5e1b':
Silicon Graphics Motion Video Compressor 1 & 2 decoder
Conflicts:
Changelog
libavcodec/avcodec.h
libavcodec/mvcdec.c
libavcodec/version.h
See: 746b1dcc98b466e4abd301f304127583722ad80b
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/avcodec.h | 2 | ||||
-rw-r--r-- | libavcodec/mvcdec.c | 140 | ||||
-rw-r--r-- | libavcodec/utils.c | 2 | ||||
-rw-r--r-- | libavcodec/version.h | 2 |
4 files changed, 78 insertions, 68 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 701941c988..b02dadfcaf 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -293,6 +293,8 @@ enum AVCodecID { AV_CODEC_ID_VP7_DEPRECATED, AV_CODEC_ID_SANM_DEPRECATED, AV_CODEC_ID_SGIRLE_DEPRECATED, + AV_CODEC_ID_MVC1_DEPRECATED, + AV_CODEC_ID_MVC2_DEPRECATED, AV_CODEC_ID_BRENDER_PIX= MKBETAG('B','P','I','X'), AV_CODEC_ID_Y41P = MKBETAG('Y','4','1','P'), diff --git a/libavcodec/mvcdec.c b/libavcodec/mvcdec.c index 2cc7735cfb..f37b76da8c 100644 --- a/libavcodec/mvcdec.c +++ b/libavcodec/mvcdec.c @@ -25,6 +25,7 @@ */ #include "libavutil/intreadwrite.h" + #include "avcodec.h" #include "bytestream.h" #include "internal.h" @@ -37,8 +38,8 @@ typedef struct MvcContext { static av_cold int mvc_decode_init(AVCodecContext *avctx) { MvcContext *s = avctx->priv_data; - int width = avctx->width; - int height = avctx->height; + int width = avctx->width; + int height = avctx->height; int ret; if (avctx->codec_id == AV_CODEC_ID_MVC1) { @@ -50,62 +51,60 @@ static av_cold int mvc_decode_init(AVCodecContext *avctx) if ((ret = ff_set_dimensions(avctx, width, height)) < 0) return ret; - avctx->pix_fmt = (avctx->codec_id == AV_CODEC_ID_MVC1) ? AV_PIX_FMT_RGB555 : AV_PIX_FMT_BGRA; - s->frame = av_frame_alloc(); + avctx->pix_fmt = (avctx->codec_id == AV_CODEC_ID_MVC1) ? AV_PIX_FMT_RGB555 + : AV_PIX_FMT_BGRA; + s->frame = av_frame_alloc(); if (!s->frame) return AVERROR(ENOMEM); - s->vflip = avctx->extradata_size >= 9 && !memcmp(avctx->extradata + avctx->extradata_size - 9, "BottomUp", 9); + s->vflip = avctx->extradata_size >= 9 && + !memcmp(avctx->extradata + avctx->extradata_size - 9, "BottomUp", 9); return 0; } -static int decode_mvc1(AVCodecContext *avctx, GetByteContext *gb, uint8_t *dst_start, int width, int height, int linesize) +static int decode_mvc1(AVCodecContext *avctx, GetByteContext *gb, + uint8_t *dst_start, int width, int height, int linesize) { uint8_t *dst; uint16_t v[8]; int mask, x, y, i; - x = y= 0; - while (bytestream2_get_bytes_left(gb) >= 6) { - mask = bytestream2_get_be16u(gb); - v[0] = bytestream2_get_be16u(gb); - v[1] = bytestream2_get_be16u(gb); - if ((v[0] & 0x8000)) { - if (bytestream2_get_bytes_left(gb) < 12) { - av_log(avctx, AV_LOG_WARNING, "buffer overflow\n"); - return AVERROR_INVALIDDATA; + for (y = 0; y < height; y += 4) { + for (x = 0; x < width; x += 4) { + if (bytestream2_get_bytes_left(gb) < 6) + return 0; + + mask = bytestream2_get_be16u(gb); + v[0] = bytestream2_get_be16u(gb); + v[1] = bytestream2_get_be16u(gb); + if ((v[0] & 0x8000)) { + if (bytestream2_get_bytes_left(gb) < 12) { + av_log(avctx, AV_LOG_WARNING, "buffer overflow\n"); + return AVERROR_INVALIDDATA; + } + for (i = 2; i < 8; i++) + v[i] = bytestream2_get_be16u(gb); + } else { + v[2] = v[4] = v[6] = v[0]; + v[3] = v[5] = v[7] = v[1]; } - for (i = 2; i < 8; i++) - v[i] = bytestream2_get_be16u(gb); - } else { - v[2] = v[4] = v[6] = v[0]; - v[3] = v[5] = v[7] = v[1]; - } - -#define PIX16(target, true, false) \ - i = (mask & target) ? true : false; \ - AV_WN16A(dst, (v[i] & 0x7C00) | (v[i] & 0x3E0) | (v[i] & 0x1F)); \ - dst += 2; -#define ROW16(row, a1, a0, b1, b0) \ - dst = dst_start + (y + row) * linesize + x * 2; \ - PIX16(1 << (row * 4), a1, a0) \ - PIX16(1 << (row * 4 + 1), a1, a0) \ - PIX16(1 << (row * 4 + 2), b1, b0) \ - PIX16(1 << (row * 4 + 3), b1, b0) - - ROW16(0, 0, 1, 2, 3); - ROW16(1, 0, 1, 2, 3); - ROW16(2, 4, 5, 6, 7); - ROW16(3, 4, 5, 6, 7); - - x += 4; - if (x >= width) { - y += 4; - if (y >= height) { - break; - } - x = 0; +#define PIX16(target, true, false) \ + i = (mask & target) ? true : false; \ + AV_WN16A(dst, v[i] & 0x7FFF); \ + dst += 2; + +#define ROW16(row, a1, a0, b1, b0) \ + dst = dst_start + (y + row) * linesize + x * 2; \ + PIX16(1 << (row * 4), a1, a0) \ + PIX16(1 << (row * 4 + 1), a1, a0) \ + PIX16(1 << (row * 4 + 2), b1, b0) \ + PIX16(1 << (row * 4 + 3), b1, b0) + + ROW16(0, 0, 1, 2, 3); + ROW16(1, 0, 1, 2, 3); + ROW16(2, 4, 5, 6, 7); + ROW16(3, 4, 5, 6, 7); } } return 0; @@ -119,24 +118,26 @@ static void set_4x4_block(uint8_t *dst, int linesize, uint32_t pixel) AV_WN32A(dst + j * linesize + i * 4, pixel); } -#define PIX32(target, true, false) \ - AV_WN32A(dst, (mask & target) ? v[true] : v[false]); \ +#define PIX32(target, true, false) \ + AV_WN32A(dst, (mask & target) ? v[true] : v[false]); \ dst += 4; -#define ROW32(row, a1, a0, b1, b0) \ - dst = dst_start + (y + row) * linesize + x * 4; \ - PIX32(1 << (row * 4), a1, a0) \ - PIX32(1 << (row * 4 + 1), a1, a0) \ - PIX32(1 << (row * 4 + 2), b1, b0) \ +#define ROW32(row, a1, a0, b1, b0) \ + dst = dst_start + (y + row) * linesize + x * 4; \ + PIX32(1 << (row * 4), a1, a0) \ + PIX32(1 << (row * 4 + 1), a1, a0) \ + PIX32(1 << (row * 4 + 2), b1, b0) \ PIX32(1 << (row * 4 + 3), b1, b0) -#define MVC2_BLOCK \ - ROW32(0, 1, 0, 3, 2); \ - ROW32(1, 1, 0, 3, 2); \ - ROW32(2, 5, 4, 7, 6); \ +#define MVC2_BLOCK \ + ROW32(0, 1, 0, 3, 2); \ + ROW32(1, 1, 0, 3, 2); \ + ROW32(2, 5, 4, 7, 6); \ ROW32(3, 5, 4, 7, 6); -static int decode_mvc2(AVCodecContext *avctx, GetByteContext *gb, uint8_t *dst_start, int width, int height, int linesize, int vflip) +static int decode_mvc2(AVCodecContext *avctx, GetByteContext *gb, + uint8_t *dst_start, int width, int height, + int linesize, int vflip) { uint8_t *dst; uint32_t color[128], v[8]; @@ -165,7 +166,7 @@ static int decode_mvc2(AVCodecContext *avctx, GetByteContext *gb, uint8_t *dst_s if (vflip) { dst_start += (height - 1) * linesize; - linesize = -linesize; + linesize = -linesize; } x = y = 0; while (bytestream2_get_bytes_left(gb) >= 1) { @@ -173,17 +174,19 @@ static int decode_mvc2(AVCodecContext *avctx, GetByteContext *gb, uint8_t *dst_s if ((p0 & 0x80)) { if ((p0 & 0x40)) { p0 &= 0x3F; - p0 = (p0 << 2) | (p0 >> 4); - set_4x4_block(dst_start + y * linesize + x * 4, linesize, 0xFF000000 | (p0 << 16) | (p0 << 8) | p0); + p0 = (p0 << 2) | (p0 >> 4); + set_4x4_block(dst_start + y * linesize + x * 4, linesize, + 0xFF000000 | (p0 << 16) | (p0 << 8) | p0); } else { int g, r; p0 &= 0x3F; - p0 = (p0 << 2) | (p0 >> 4); + p0 = (p0 << 2) | (p0 >> 4); if (bytestream2_get_bytes_left(gb) < 2) return AVERROR_INVALIDDATA; g = bytestream2_get_byteu(gb); r = bytestream2_get_byteu(gb); - set_4x4_block(dst_start + y * linesize + x * 4, linesize, 0xFF000000 | (r << 16) | (g << 8) | p0); + set_4x4_block(dst_start + y * linesize + x * 4, linesize, + 0xFF000000 | (r << 16) | (g << 8) | p0); } } else { if (bytestream2_get_bytes_left(gb) < 1) @@ -191,7 +194,8 @@ static int decode_mvc2(AVCodecContext *avctx, GetByteContext *gb, uint8_t *dst_s p1 = bytestream2_get_byteu(gb); if ((p1 & 0x80)) { if ((p0 & 0x7F) == (p1 & 0x7F)) { - set_4x4_block(dst_start + y * linesize + x * 4, linesize, color[p0 & 0x7F]); + set_4x4_block(dst_start + y * linesize + x * 4, linesize, + color[p0 & 0x7F]); } else { if (bytestream2_get_bytes_left(gb) < 2) return AVERROR_INVALIDDATA; @@ -223,8 +227,7 @@ static int decode_mvc2(AVCodecContext *avctx, GetByteContext *gb, uint8_t *dst_s return 0; } -static int mvc_decode_frame(AVCodecContext *avctx, - void *data, int *got_frame, +static int mvc_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { MvcContext *s = avctx->priv_data; @@ -236,9 +239,12 @@ static int mvc_decode_frame(AVCodecContext *avctx, bytestream2_init(&gb, avpkt->data, avpkt->size); if (avctx->codec_id == AV_CODEC_ID_MVC1) - ret = decode_mvc1(avctx, &gb, s->frame->data[0], avctx->width, avctx->height, s->frame->linesize[0]); + ret = decode_mvc1(avctx, &gb, s->frame->data[0], + avctx->width, avctx->height, s->frame->linesize[0]); else - ret = decode_mvc2(avctx, &gb, s->frame->data[0], avctx->width, avctx->height, s->frame->linesize[0], s->vflip); + ret = decode_mvc2(avctx, &gb, s->frame->data[0], + avctx->width, avctx->height, s->frame->linesize[0], + s->vflip); if (ret < 0) return ret; diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 00efa12d99..291c910441 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -2689,6 +2689,8 @@ static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id) case AV_CODEC_ID_PAF_VIDEO_DEPRECATED : return AV_CODEC_ID_PAF_VIDEO; case AV_CODEC_ID_WEBP_DEPRECATED : return AV_CODEC_ID_WEBP; case AV_CODEC_ID_HEVC_DEPRECATED : return AV_CODEC_ID_HEVC; + case AV_CODEC_ID_MVC1_DEPRECATED : return AV_CODEC_ID_MVC1; + case AV_CODEC_ID_MVC2_DEPRECATED : return AV_CODEC_ID_MVC2; case AV_CODEC_ID_SANM_DEPRECATED : return AV_CODEC_ID_SANM; case AV_CODEC_ID_SGIRLE_DEPRECATED : return AV_CODEC_ID_SGIRLE; case AV_CODEC_ID_VP7_DEPRECATED : return AV_CODEC_ID_VP7; diff --git a/libavcodec/version.h b/libavcodec/version.h index 23c7a8516b..c45413308f 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -30,7 +30,7 @@ #define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MINOR 58 -#define LIBAVCODEC_VERSION_MICRO 104 +#define LIBAVCODEC_VERSION_MICRO 105 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ |