mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 11:19:55 +00:00
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: 746b1dcc98
Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
0c67ef2729
@ -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'),
|
||||
|
@ -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 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)
|
||||
#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;
|
||||
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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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, \
|
||||
|
Loading…
Reference in New Issue
Block a user