[FFmpeg-devel] [PATCH] aasc: 8bit support
Paul B Mahol
onemda at gmail.com
Wed Aug 8 16:14:12 CEST 2012
Closes #1319.
Signed-off-by: Paul B Mahol <onemda at gmail.com>
---
libavcodec/aasc.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/libavcodec/aasc.c b/libavcodec/aasc.c
index bdb948e..98533a9 100644
--- a/libavcodec/aasc.c
+++ b/libavcodec/aasc.c
@@ -36,14 +36,29 @@ typedef struct AascContext {
AVCodecContext *avctx;
GetByteContext gb;
AVFrame frame;
+
+ uint32_t palette[AVPALETTE_COUNT];
+ int palette_size;
} AascContext;
static av_cold int aasc_decode_init(AVCodecContext *avctx)
{
AascContext *s = avctx->priv_data;
+ uint8_t *ptr;
+ int i;
s->avctx = avctx;
switch (avctx->bits_per_coded_sample) {
+ case 8:
+ avctx->pix_fmt = PIX_FMT_PAL8;
+
+ ptr = avctx->extradata;
+ s->palette_size = FFMIN(avctx->extradata_size, AVPALETTE_SIZE);
+ for (i = 0; i < s->palette_size / 4; i++) {
+ s->palette[i] = 0xFFU << 24 | AV_RL32(ptr);
+ ptr += 4;
+ }
+ break;
case 16:
avctx->pix_fmt = PIX_FMT_RGB555;
break;
@@ -66,7 +81,7 @@ static int aasc_decode_frame(AVCodecContext *avctx,
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
AascContext *s = avctx->priv_data;
- int compr, i, stride;
+ int compr, i, stride, psize;
s->frame.reference = 3;
s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
@@ -78,6 +93,7 @@ static int aasc_decode_frame(AVCodecContext *avctx,
compr = AV_RL32(buf);
buf += 4;
buf_size -= 4;
+ psize = avctx->bits_per_coded_sample / 8;
switch (avctx->codec_tag) {
case MKTAG('A', 'A', 'S', '4'):
bytestream2_init(&s->gb, buf - 4, buf_size + 4);
@@ -86,13 +102,13 @@ static int aasc_decode_frame(AVCodecContext *avctx,
case MKTAG('A', 'A', 'S', 'C'):
switch(compr){
case 0:
- stride = (avctx->width * 3 + 3) & ~3;
+ stride = (avctx->width * psize + psize) & ~psize;
for(i = avctx->height - 1; i >= 0; i--){
- if(avctx->width*3 > buf_size){
+ if(avctx->width * psize > buf_size){
av_log(avctx, AV_LOG_ERROR, "Next line is beyond buffer bounds\n");
break;
}
- memcpy(s->frame.data[0] + i*s->frame.linesize[0], buf, avctx->width*3);
+ memcpy(s->frame.data[0] + i*s->frame.linesize[0], buf, avctx->width * psize);
buf += stride;
buf_size -= stride;
}
@@ -111,6 +127,9 @@ static int aasc_decode_frame(AVCodecContext *avctx,
return -1;
}
+ if (avctx->pix_fmt = PIX_FMT_PAL8)
+ memcpy(s->frame.data[1], s->palette, s->palette_size);
+
*data_size = sizeof(AVFrame);
*(AVFrame*)data = s->frame;
--
1.7.11.2
More information about the ffmpeg-devel
mailing list