X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdsicinav.c;h=6e5ff1244607007c74f72dbea94c8fae421f0fa5;hb=67e19a9e4b6b48ecedc6a64210ef6f69edce9119;hp=30027b1d921cdeeff2c2efd6ffaf3b16ad5feac8;hpb=e4141433ead866d1b359c0cbf3e4d5180477206d;p=ffmpeg diff --git a/libavcodec/dsicinav.c b/libavcodec/dsicinav.c index 30027b1d921..6e5ff124460 100644 --- a/libavcodec/dsicinav.c +++ b/libavcodec/dsicinav.c @@ -20,12 +20,12 @@ */ /** - * @file dsicinav.c + * @file libavcodec/dsicinav.c * Delphine Software International CIN audio/video decoders */ #include "avcodec.h" -#include "common.h" +#include "bytestream.h" typedef enum CinVideoBitmapIndex { @@ -86,7 +86,7 @@ static const int16_t cinaudio_delta16_table[256] = { }; -static int cinvideo_decode_init(AVCodecContext *avctx) +static av_cold int cinvideo_decode_init(AVCodecContext *avctx) { CinVideoContext *cin = avctx->priv_data; unsigned int i; @@ -195,8 +195,10 @@ static void cin_decode_rle(const unsigned char *src, int src_size, unsigned char static int cinvideo_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size) + AVPacket *avpkt) { + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; CinVideoContext *cin = avctx->priv_data; int i, y, palette_type, palette_colors_count, bitmap_frame_type, bitmap_frame_size; @@ -207,7 +209,7 @@ static int cinvideo_decode_frame(AVCodecContext *avctx, } palette_type = buf[0]; - palette_colors_count = buf[1] | (buf[2] << 8); + palette_colors_count = AV_RL16(buf+1); bitmap_frame_type = buf[3]; buf += 4; @@ -216,13 +218,12 @@ static int cinvideo_decode_frame(AVCodecContext *avctx, /* handle palette */ if (palette_type == 0) { for (i = 0; i < palette_colors_count; ++i) { - cin->palette[i] = (buf[2] << 16) | (buf[1] << 8) | buf[0]; - buf += 3; + cin->palette[i] = bytestream_get_le24(&buf); bitmap_frame_size -= 3; } } else { for (i = 0; i < palette_colors_count; ++i) { - cin->palette[buf[0]] = (buf[3] << 16) | (buf[2] << 8) | buf[1]; + cin->palette[buf[0]] = AV_RL24(buf+1); buf += 4; bitmap_frame_size -= 4; } @@ -285,7 +286,7 @@ static int cinvideo_decode_frame(AVCodecContext *avctx, return buf_size; } -static int cinvideo_decode_end(AVCodecContext *avctx) +static av_cold int cinvideo_decode_end(AVCodecContext *avctx) { CinVideoContext *cin = avctx->priv_data; int i; @@ -299,25 +300,30 @@ static int cinvideo_decode_end(AVCodecContext *avctx) return 0; } -static int cinaudio_decode_init(AVCodecContext *avctx) +static av_cold int cinaudio_decode_init(AVCodecContext *avctx) { CinAudioContext *cin = avctx->priv_data; cin->avctx = avctx; cin->initial_decode_frame = 1; cin->delta = 0; + avctx->sample_fmt = SAMPLE_FMT_S16; return 0; } static int cinaudio_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size) + AVPacket *avpkt) { + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; CinAudioContext *cin = avctx->priv_data; - uint8_t *src = buf; + const uint8_t *src = buf; int16_t *samples = (int16_t *)data; + buf_size = FFMIN(buf_size, *data_size/2); + if (cin->initial_decode_frame) { cin->initial_decode_frame = 0; cin->delta = (int16_t)AV_RL16(src); src += 2; @@ -326,7 +332,7 @@ static int cinaudio_decode_frame(AVCodecContext *avctx, } while (buf_size > 0) { cin->delta += cinaudio_delta16_table[*src++]; - cin->delta = av_clip(cin->delta, -32768, 32767); + cin->delta = av_clip_int16(cin->delta); *samples++ = cin->delta; --buf_size; } @@ -347,6 +353,7 @@ AVCodec dsicinvideo_decoder = { cinvideo_decode_end, cinvideo_decode_frame, CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Delphine Software International CIN video"), }; AVCodec dsicinaudio_decoder = { @@ -358,4 +365,5 @@ AVCodec dsicinaudio_decoder = { NULL, NULL, cinaudio_decode_frame, + .long_name = NULL_IF_CONFIG_SMALL("Delphine Software International CIN audio"), };