mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 19:30:05 +00:00
Merge commit 'fcae3ff124ee97c9265e3b93f3d41238b2aee9bd'
* commit 'fcae3ff124ee97c9265e3b93f3d41238b2aee9bd': dsicinav: K&R formatting cosmetics Conflicts: libavcodec/dsicinav.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
75fbe41fc6
@ -127,27 +127,30 @@ static av_cold int cinvideo_decode_init(AVCodecContext *avctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cin_apply_delta_data(const unsigned char *src, unsigned char *dst, int size)
|
static void cin_apply_delta_data(const unsigned char *src, unsigned char *dst,
|
||||||
|
int size)
|
||||||
{
|
{
|
||||||
while (size--)
|
while (size--)
|
||||||
*dst++ += *src++;
|
*dst++ += *src++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cin_decode_huffman(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
|
static int cin_decode_huffman(const unsigned char *src, int src_size,
|
||||||
|
unsigned char *dst, int dst_size)
|
||||||
{
|
{
|
||||||
int b, huff_code = 0;
|
int b, huff_code = 0;
|
||||||
unsigned char huff_code_table[15];
|
unsigned char huff_code_table[15];
|
||||||
unsigned char *dst_cur = dst;
|
unsigned char *dst_cur = dst;
|
||||||
unsigned char *dst_end = dst + dst_size;
|
unsigned char *dst_end = dst + dst_size;
|
||||||
const unsigned char *src_end = src + src_size;
|
const unsigned char *src_end = src + src_size;
|
||||||
|
|
||||||
memcpy(huff_code_table, src, 15); src += 15;
|
memcpy(huff_code_table, src, 15);
|
||||||
|
src += 15;
|
||||||
|
|
||||||
while (src < src_end) {
|
while (src < src_end) {
|
||||||
huff_code = *src++;
|
huff_code = *src++;
|
||||||
if ((huff_code >> 4) == 15) {
|
if ((huff_code >> 4) == 15) {
|
||||||
b = huff_code << 4;
|
b = huff_code << 4;
|
||||||
huff_code = *src++;
|
huff_code = *src++;
|
||||||
*dst_cur++ = b | (huff_code >> 4);
|
*dst_cur++ = b | (huff_code >> 4);
|
||||||
} else
|
} else
|
||||||
*dst_cur++ = huff_code_table[huff_code >> 4];
|
*dst_cur++ = huff_code_table[huff_code >> 4];
|
||||||
@ -166,11 +169,12 @@ static int cin_decode_huffman(const unsigned char *src, int src_size, unsigned c
|
|||||||
return dst_cur - dst;
|
return dst_cur - dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cin_decode_lzss(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
|
static int cin_decode_lzss(const unsigned char *src, int src_size,
|
||||||
|
unsigned char *dst, int dst_size)
|
||||||
{
|
{
|
||||||
uint16_t cmd;
|
uint16_t cmd;
|
||||||
int i, sz, offset, code;
|
int i, sz, offset, code;
|
||||||
unsigned char *dst_end = dst + dst_size, *dst_start = dst;
|
unsigned char *dst_end = dst + dst_size, *dst_start = dst;
|
||||||
const unsigned char *src_end = src + src_size;
|
const unsigned char *src_end = src + src_size;
|
||||||
|
|
||||||
while (src < src_end && dst < dst_end) {
|
while (src < src_end && dst < dst_end) {
|
||||||
@ -179,13 +183,15 @@ static int cin_decode_lzss(const unsigned char *src, int src_size, unsigned char
|
|||||||
if (code & (1 << i)) {
|
if (code & (1 << i)) {
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
} else {
|
} else {
|
||||||
cmd = AV_RL16(src); src += 2;
|
cmd = AV_RL16(src);
|
||||||
|
src += 2;
|
||||||
offset = cmd >> 4;
|
offset = cmd >> 4;
|
||||||
if ((int) (dst - dst_start) < offset + 1)
|
if ((int)(dst - dst_start) < offset + 1)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
sz = (cmd & 0xF) + 2;
|
sz = (cmd & 0xF) + 2;
|
||||||
/* don't use memcpy/memmove here as the decoding routine (ab)uses */
|
/* don't use memcpy/memmove here as the decoding routine
|
||||||
/* buffer overlappings to repeat bytes in the destination */
|
* (ab)uses buffer overlappings to repeat bytes in the
|
||||||
|
* destination */
|
||||||
sz = FFMIN(sz, dst_end - dst);
|
sz = FFMIN(sz, dst_end - dst);
|
||||||
while (sz--) {
|
while (sz--) {
|
||||||
*dst = *(dst - offset - 1);
|
*dst = *(dst - offset - 1);
|
||||||
@ -198,10 +204,11 @@ static int cin_decode_lzss(const unsigned char *src, int src_size, unsigned char
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cin_decode_rle(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
|
static int cin_decode_rle(const unsigned char *src, int src_size,
|
||||||
|
unsigned char *dst, int dst_size)
|
||||||
{
|
{
|
||||||
int len, code;
|
int len, code;
|
||||||
unsigned char *dst_end = dst + dst_size;
|
unsigned char *dst_end = dst + dst_size;
|
||||||
const unsigned char *src_end = src + src_size;
|
const unsigned char *src_end = src + src_size;
|
||||||
|
|
||||||
while (src + 1 < src_end && dst < dst_end) {
|
while (src + 1 < src_end && dst < dst_end) {
|
||||||
@ -227,15 +234,16 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
|||||||
void *data, int *got_frame,
|
void *data, int *got_frame,
|
||||||
AVPacket *avpkt)
|
AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
int buf_size = avpkt->size;
|
int buf_size = avpkt->size;
|
||||||
CinVideoContext *cin = avctx->priv_data;
|
CinVideoContext *cin = avctx->priv_data;
|
||||||
int i, y, palette_type, palette_colors_count, bitmap_frame_type, bitmap_frame_size, res = 0;
|
int i, y, palette_type, palette_colors_count,
|
||||||
|
bitmap_frame_type, bitmap_frame_size, res = 0;
|
||||||
|
|
||||||
palette_type = buf[0];
|
palette_type = buf[0];
|
||||||
palette_colors_count = AV_RL16(buf+1);
|
palette_colors_count = AV_RL16(buf + 1);
|
||||||
bitmap_frame_type = buf[3];
|
bitmap_frame_type = buf[3];
|
||||||
buf += 4;
|
buf += 4;
|
||||||
|
|
||||||
bitmap_frame_size = buf_size - 4;
|
bitmap_frame_size = buf_size - 4;
|
||||||
|
|
||||||
@ -246,46 +254,48 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
|||||||
if (palette_colors_count > 256)
|
if (palette_colors_count > 256)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
for (i = 0; i < palette_colors_count; ++i) {
|
for (i = 0; i < palette_colors_count; ++i) {
|
||||||
cin->palette[i] = 0xFFU << 24 | bytestream_get_le24(&buf);
|
cin->palette[i] = 0xFFU << 24 | bytestream_get_le24(&buf);
|
||||||
bitmap_frame_size -= 3;
|
bitmap_frame_size -= 3;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < palette_colors_count; ++i) {
|
for (i = 0; i < palette_colors_count; ++i) {
|
||||||
cin->palette[buf[0]] = 0xFFU << 24 | AV_RL24(buf+1);
|
cin->palette[buf[0]] = 0xFFU << 24 | AV_RL24(buf + 1);
|
||||||
buf += 4;
|
buf += 4;
|
||||||
bitmap_frame_size -= 4;
|
bitmap_frame_size -= 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* note: the decoding routines below assumes that surface.width = surface.pitch */
|
/* note: the decoding routines below assumes that
|
||||||
|
* surface.width = surface.pitch */
|
||||||
switch (bitmap_frame_type) {
|
switch (bitmap_frame_type) {
|
||||||
case 9:
|
case 9:
|
||||||
cin_decode_rle(buf, bitmap_frame_size,
|
cin_decode_rle(buf, bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
break;
|
break;
|
||||||
case 34:
|
case 34:
|
||||||
cin_decode_rle(buf, bitmap_frame_size,
|
cin_decode_rle(buf, bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
break;
|
break;
|
||||||
case 35:
|
case 35:
|
||||||
bitmap_frame_size = cin_decode_huffman(buf, bitmap_frame_size,
|
bitmap_frame_size = cin_decode_huffman(buf, bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_INT_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_INT_BMP], cin->bitmap_size);
|
||||||
cin_decode_rle(cin->bitmap_table[CIN_INT_BMP], bitmap_frame_size,
|
cin_decode_rle(cin->bitmap_table[CIN_INT_BMP], bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
break;
|
break;
|
||||||
case 36:
|
case 36:
|
||||||
bitmap_frame_size = cin_decode_huffman(buf, bitmap_frame_size,
|
bitmap_frame_size = cin_decode_huffman(buf, bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_INT_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_INT_BMP],
|
||||||
|
cin->bitmap_size);
|
||||||
cin_decode_rle(cin->bitmap_table[CIN_INT_BMP], bitmap_frame_size,
|
cin_decode_rle(cin->bitmap_table[CIN_INT_BMP], bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
break;
|
break;
|
||||||
case 37:
|
case 37:
|
||||||
cin_decode_huffman(buf, bitmap_frame_size,
|
cin_decode_huffman(buf, bitmap_frame_size,
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
break;
|
break;
|
||||||
case 38:
|
case 38:
|
||||||
res = cin_decode_lzss(buf, bitmap_frame_size,
|
res = cin_decode_lzss(buf, bitmap_frame_size,
|
||||||
@ -301,7 +311,7 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
|||||||
if (res < 0)
|
if (res < 0)
|
||||||
return res;
|
return res;
|
||||||
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
||||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,10 +322,11 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
|||||||
cin->frame.palette_has_changed = 1;
|
cin->frame.palette_has_changed = 1;
|
||||||
for (y = 0; y < cin->avctx->height; ++y)
|
for (y = 0; y < cin->avctx->height; ++y)
|
||||||
memcpy(cin->frame.data[0] + (cin->avctx->height - 1 - y) * cin->frame.linesize[0],
|
memcpy(cin->frame.data[0] + (cin->avctx->height - 1 - y) * cin->frame.linesize[0],
|
||||||
cin->bitmap_table[CIN_CUR_BMP] + y * cin->avctx->width,
|
cin->bitmap_table[CIN_CUR_BMP] + y * cin->avctx->width,
|
||||||
cin->avctx->width);
|
cin->avctx->width);
|
||||||
|
|
||||||
FFSWAP(uint8_t *, cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_table[CIN_PRE_BMP]);
|
FFSWAP(uint8_t *, cin->bitmap_table[CIN_CUR_BMP],
|
||||||
|
cin->bitmap_table[CIN_PRE_BMP]);
|
||||||
|
|
||||||
if ((res = av_frame_ref(data, &cin->frame)) < 0)
|
if ((res = av_frame_ref(data, &cin->frame)) < 0)
|
||||||
return res;
|
return res;
|
||||||
@ -352,9 +363,9 @@ static av_cold int cinaudio_decode_init(AVCodecContext *avctx)
|
|||||||
static int cinaudio_decode_frame(AVCodecContext *avctx, void *data,
|
static int cinaudio_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
int *got_frame_ptr, AVPacket *avpkt)
|
int *got_frame_ptr, AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
AVFrame *frame = data;
|
AVFrame *frame = data;
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
CinAudioContext *cin = avctx->priv_data;
|
CinAudioContext *cin = avctx->priv_data;
|
||||||
const uint8_t *buf_end = buf + avpkt->size;
|
const uint8_t *buf_end = buf + avpkt->size;
|
||||||
int16_t *samples;
|
int16_t *samples;
|
||||||
int delta, ret;
|
int delta, ret;
|
||||||
@ -368,13 +379,13 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
delta = cin->delta;
|
delta = cin->delta;
|
||||||
if (cin->initial_decode_frame) {
|
if (cin->initial_decode_frame) {
|
||||||
cin->initial_decode_frame = 0;
|
cin->initial_decode_frame = 0;
|
||||||
delta = sign_extend(AV_RL16(buf), 16);
|
delta = sign_extend(AV_RL16(buf), 16);
|
||||||
buf += 2;
|
buf += 2;
|
||||||
*samples++ = delta;
|
*samples++ = delta;
|
||||||
}
|
}
|
||||||
while (buf < buf_end) {
|
while (buf < buf_end) {
|
||||||
delta += cinaudio_delta16_table[*buf++];
|
delta += cinaudio_delta16_table[*buf++];
|
||||||
delta = av_clip_int16(delta);
|
delta = av_clip_int16(delta);
|
||||||
*samples++ = delta;
|
*samples++ = delta;
|
||||||
}
|
}
|
||||||
cin->delta = delta;
|
cin->delta = delta;
|
||||||
@ -384,7 +395,6 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
return avpkt->size;
|
return avpkt->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AVCodec ff_dsicinvideo_decoder = {
|
AVCodec ff_dsicinvideo_decoder = {
|
||||||
.name = "dsicinvideo",
|
.name = "dsicinvideo",
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
|
Loading…
Reference in New Issue
Block a user