From e3d4f59f9596539c3f454836c9b64e6565484a22 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:28:02 -0500 Subject: adxenc: remove unneeded comments --- libavcodec/adxenc.c | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index ae4b9f7d..fa97942 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -33,8 +33,6 @@ * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/ */ -/* 18 bytes <-> 32 samples */ - static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav, ADXChannelState *prev) { @@ -60,8 +58,6 @@ static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav, prev->s1 = s1; prev->s2 = s2; - /* -8..+7 */ - if (max==0 && min==0) { memset(adx,0,18); return; @@ -82,35 +78,12 @@ static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav, static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize) { -#if 0 - struct { - uint32_t offset; /* 0x80000000 + sample start - 4 */ - unsigned char unknown1[3]; /* 03 12 04 */ - unsigned char channel; /* 1 or 2 */ - uint32_t freq; - uint32_t size; - uint32_t unknown2; /* 01 f4 03 00 */ - uint32_t unknown3; /* 00 00 00 00 */ - uint32_t unknown4; /* 00 00 00 00 */ - - /* if loop - unknown3 00 15 00 01 - unknown4 00 00 00 01 - long loop_start_sample; - long loop_start_byte; - long loop_end_sample; - long loop_end_byte; - long - */ - } adxhdr; /* big endian */ - /* offset-6 "(c)CRI" */ -#endif ADXContext *c = avctx->priv_data; AV_WB32(buf+0x00,0x80000000|0x20); AV_WB32(buf+0x04,0x03120400|avctx->channels); AV_WB32(buf+0x08,avctx->sample_rate); - AV_WB32(buf+0x0c,0); /* FIXME: set after */ + AV_WB32(buf+0x0c,0); AV_WB16(buf + 0x10, c->cutoff); AV_WB32(buf + 0x12, 0x03000000); AV_WB32(buf + 0x16, 0x00000000); @@ -124,14 +97,12 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) ADXContext *c = avctx->priv_data; if (avctx->channels > 2) - return -1; /* only stereo or mono =) */ + return -1; avctx->frame_size = 32; avctx->coded_frame= avcodec_alloc_frame(); avctx->coded_frame->key_frame= 1; -// avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32; - /* the cutoff can be adjusted, but this seems to work pretty well */ c->cutoff = 500; ff_adx_calculate_coeffs(c->cutoff, avctx->sample_rate, COEFF_BITS, c->coeff); @@ -156,13 +127,6 @@ static int adx_encode_frame(AVCodecContext *avctx, unsigned char *dst = frame; int rest = avctx->frame_size; -/* - input data size = - avconv.c:do_audio_out() - frame_bytes = enc->frame_size * 2 * enc->channels; -*/ - -// printf("sz=%d ",buf_size); fflush(stdout); if (!c->header_parsed) { int hdrsize = adx_encode_header(avctx,dst,buf_size); dst+=hdrsize; -- cgit v1.1 From c98c6e18d82a34c7b02d9539d4a79ec3c60fc0b9 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:28:15 -0500 Subject: adxenc: remove unneeded log message --- libavcodec/adxenc.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index fa97942..7c3373c 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -107,8 +107,6 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) c->cutoff = 500; ff_adx_calculate_coeffs(c->cutoff, avctx->sample_rate, COEFF_BITS, c->coeff); - av_log(avctx, AV_LOG_DEBUG, "adx encode init\n"); - return 0; } -- cgit v1.1 From 25edfc88e3d2423cd95509f1270f6229660ee809 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:29:11 -0500 Subject: adxenc: change some data types --- libavcodec/adxenc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index 7c3373c..7705254 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -33,7 +33,7 @@ * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/ */ -static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav, +static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, ADXChannelState *prev) { PutBitContext pb; @@ -76,7 +76,7 @@ static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav, flush_put_bits(&pb); } -static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize) +static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize) { ADXContext *c = avctx->priv_data; @@ -121,9 +121,9 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, void *data) { ADXContext *c = avctx->priv_data; - const short *samples = data; - unsigned char *dst = frame; - int rest = avctx->frame_size; + const int16_t *samples = data; + uint8_t *dst = frame; + int rest = avctx->frame_size; if (!c->header_parsed) { int hdrsize = adx_encode_header(avctx,dst,buf_size); @@ -140,7 +140,7 @@ static int adx_encode_frame(AVCodecContext *avctx, } } else { while(rest>=32*2) { - short tmpbuf[32*2]; + int16_t tmpbuf[32*2]; int i; for(i=0;i<32;i++) { -- cgit v1.1 From a85ab8ad45bf2dc31c275bd04b2a740631ad6111 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:39:05 -0500 Subject: adxenc: cosmetics: pretty-printing --- libavcodec/adxenc.c | 87 ++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 41 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index 7705254..cff5bb8 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -39,40 +39,45 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, PutBitContext pb; int scale; int i; - int s0,s1,s2,d; - int max=0; - int min=0; + int s0, s1, s2, d; + int max = 0; + int min = 0; int data[32]; s1 = prev->s1; s2 = prev->s2; - for(i=0;i<32;i++) { + for (i = 0; i < 32; i++) { s0 = wav[i]; d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS; - data[i]=d; - if (maxd) min=d; + data[i] = d; + if (max < d) + max = d; + if (min > d) + min = d; s2 = s1; s1 = s0; } prev->s1 = s1; prev->s2 = s2; - if (max==0 && min==0) { - memset(adx,0,18); + if (max == 0 && min == 0) { + memset(adx, 0, 18); return; } - if (max/7>-min/8) scale = max/7; - else scale = -min/8; + if (max / 7 > -min / 8) + scale = max / 7; + else + scale = -min / 8; - if (scale==0) scale=1; + if (scale == 0) + scale = 1; AV_WB16(adx, scale); init_put_bits(&pb, adx + 2, 16); for (i = 0; i < 32; i++) - put_sbits(&pb, 4, av_clip(data[i]/scale, -8, 7)); + put_sbits(&pb, 4, av_clip(data[i] / scale, -8, 7)); flush_put_bits(&pb); } @@ -80,16 +85,16 @@ static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize) { ADXContext *c = avctx->priv_data; - AV_WB32(buf+0x00,0x80000000|0x20); - AV_WB32(buf+0x04,0x03120400|avctx->channels); - AV_WB32(buf+0x08,avctx->sample_rate); - AV_WB32(buf+0x0c,0); + AV_WB32(buf + 0x00, 0x80000000 | 0x20); + AV_WB32(buf + 0x04, 0x03120400 | avctx->channels); + AV_WB32(buf + 0x08, avctx->sample_rate); + AV_WB32(buf + 0x0c, 0); AV_WB16(buf + 0x10, c->cutoff); AV_WB32(buf + 0x12, 0x03000000); AV_WB32(buf + 0x16, 0x00000000); AV_WB32(buf + 0x1a, 0x00000000); memcpy (buf + 0x1e, "(c)CRI", 6); - return 0x20+4; + return 0x20 + 4; } static av_cold int adx_encode_init(AVCodecContext *avctx) @@ -100,8 +105,8 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) return -1; avctx->frame_size = 32; - avctx->coded_frame= avcodec_alloc_frame(); - avctx->coded_frame->key_frame= 1; + avctx->coded_frame = avcodec_alloc_frame(); + avctx->coded_frame->key_frame = 1; /* the cutoff can be adjusted, but this seems to work pretty well */ c->cutoff = 500; @@ -113,49 +118,48 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) static av_cold int adx_encode_close(AVCodecContext *avctx) { av_freep(&avctx->coded_frame); - return 0; } -static int adx_encode_frame(AVCodecContext *avctx, - uint8_t *frame, int buf_size, void *data) +static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, + int buf_size, void *data) { - ADXContext *c = avctx->priv_data; + ADXContext *c = avctx->priv_data; const int16_t *samples = data; uint8_t *dst = frame; int rest = avctx->frame_size; if (!c->header_parsed) { - int hdrsize = adx_encode_header(avctx,dst,buf_size); - dst+=hdrsize; + int hdrsize = adx_encode_header(avctx, dst, buf_size); + dst += hdrsize; c->header_parsed = 1; } - if (avctx->channels==1) { - while(rest>=32) { + if (avctx->channels == 1) { + while (rest >= 32) { adx_encode(c, dst, samples, c->prev); - dst+=18; - samples+=32; - rest-=32; + dst += 18; + samples += 32; + rest -= 32; } } else { - while(rest>=32*2) { + while (rest >= 32*2) { int16_t tmpbuf[32*2]; int i; - for(i=0;i<32;i++) { - tmpbuf[i] = samples[i*2]; + for (i = 0; i < 32; i++) { + tmpbuf[i ] = samples[i*2 ]; tmpbuf[i+32] = samples[i*2+1]; } - adx_encode(c, dst, tmpbuf, c->prev); + adx_encode(c, dst, tmpbuf, c->prev ); adx_encode(c, dst + 18, tmpbuf + 32, c->prev + 1); - dst+=18*2; - samples+=32*2; - rest-=32*2; + dst += 18*2; + samples += 32*2; + rest -= 32*2; } } - return dst-frame; + return dst - frame; } AVCodec ff_adpcm_adx_encoder = { @@ -166,6 +170,7 @@ AVCodec ff_adpcm_adx_encoder = { .init = adx_encode_init, .encode = adx_encode_frame, .close = adx_encode_close, - .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, - .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, + AV_SAMPLE_FMT_NONE }, + .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), }; -- cgit v1.1 From cc40c056d01a95b0a57950d4d8aec9e86060c6b6 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:45:17 -0500 Subject: adxenc: log an error message and return AVERROR(EINVAL) for invalid channels --- libavcodec/adxenc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index cff5bb8..a580bb3 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -101,8 +101,10 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) { ADXContext *c = avctx->priv_data; - if (avctx->channels > 2) - return -1; + if (avctx->channels > 2) { + av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n"); + return AVERROR(EINVAL); + } avctx->frame_size = 32; avctx->coded_frame = avcodec_alloc_frame(); -- cgit v1.1 From 6b77f07074bfdba7106fdbf20106da7d8522655a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:45:50 -0500 Subject: adxenc: remove unnecessary setting of coded_frame->key_frame. It is already set by avcodec_alloc_frame(). --- libavcodec/adxenc.c | 1 - 1 file changed, 1 deletion(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index a580bb3..43f7801 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -108,7 +108,6 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) avctx->frame_size = 32; avctx->coded_frame = avcodec_alloc_frame(); - avctx->coded_frame->key_frame = 1; /* the cutoff can be adjusted, but this seems to work pretty well */ c->cutoff = 500; -- cgit v1.1 From 613668210b87e4d7ceabf65c5939f9219570a6f2 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 09:52:32 -0500 Subject: adxenc: avoid stereo deinterleaving --- libavcodec/adxenc.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index 43f7801..4f434ba 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -34,11 +34,11 @@ */ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, - ADXChannelState *prev) + ADXChannelState *prev, int channels) { PutBitContext pb; int scale; - int i; + int i, j; int s0, s1, s2, d; int max = 0; int min = 0; @@ -46,10 +46,10 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, s1 = prev->s1; s2 = prev->s2; - for (i = 0; i < 32; i++) { + for (i = 0, j = 0; j < 32; i += channels, j++) { s0 = wav[i]; d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS; - data[i] = d; + data[j] = d; if (max < d) max = d; if (min > d) @@ -138,23 +138,15 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, if (avctx->channels == 1) { while (rest >= 32) { - adx_encode(c, dst, samples, c->prev); + adx_encode(c, dst, samples, c->prev, avctx->channels); dst += 18; samples += 32; rest -= 32; } } else { while (rest >= 32*2) { - int16_t tmpbuf[32*2]; - int i; - - for (i = 0; i < 32; i++) { - tmpbuf[i ] = samples[i*2 ]; - tmpbuf[i+32] = samples[i*2+1]; - } - - adx_encode(c, dst, tmpbuf, c->prev ); - adx_encode(c, dst + 18, tmpbuf + 32, c->prev + 1); + adx_encode(c, dst, samples, c->prev, avctx->channels); + adx_encode(c, dst + 18, samples + 1, c->prev + 1, avctx->channels); dst += 18*2; samples += 32*2; rest -= 32*2; -- cgit v1.1 From 6c117bd8e072319dd0895efd64c4470ad0872213 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 10:14:35 -0500 Subject: adxenc: remove unneeded loops avctx->frame_size is 32, so that is how many samples we process per call. --- libavcodec/adxenc.c | 9 --------- 1 file changed, 9 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index 4f434ba..12690d2 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -128,7 +128,6 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, ADXContext *c = avctx->priv_data; const int16_t *samples = data; uint8_t *dst = frame; - int rest = avctx->frame_size; if (!c->header_parsed) { int hdrsize = adx_encode_header(avctx, dst, buf_size); @@ -137,20 +136,12 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, } if (avctx->channels == 1) { - while (rest >= 32) { adx_encode(c, dst, samples, c->prev, avctx->channels); dst += 18; - samples += 32; - rest -= 32; - } } else { - while (rest >= 32*2) { adx_encode(c, dst, samples, c->prev, avctx->channels); adx_encode(c, dst + 18, samples + 1, c->prev + 1, avctx->channels); dst += 18*2; - samples += 32*2; - rest -= 32*2; - } } return dst - frame; } -- cgit v1.1 From f1be41c63d8c2f0d0ecc6cbde4eb50701f809834 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 10:18:09 -0500 Subject: adxenc: use a loop to encode each channel --- libavcodec/adxenc.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index 12690d2..aea4798 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -128,6 +128,7 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, ADXContext *c = avctx->priv_data; const int16_t *samples = data; uint8_t *dst = frame; + int ch; if (!c->header_parsed) { int hdrsize = adx_encode_header(avctx, dst, buf_size); @@ -135,13 +136,9 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, c->header_parsed = 1; } - if (avctx->channels == 1) { - adx_encode(c, dst, samples, c->prev, avctx->channels); - dst += 18; - } else { - adx_encode(c, dst, samples, c->prev, avctx->channels); - adx_encode(c, dst + 18, samples + 1, c->prev + 1, avctx->channels); - dst += 18*2; + for (ch = 0; ch < avctx->channels; ch++) { + adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels); + dst += 18; } return dst - frame; } -- cgit v1.1 From 656e606cae8cdb794c4d2640bbb27f96da3cc67e Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 10:23:21 -0500 Subject: adxenc: use BLOCK_SIZE and BLOCK_SAMPLES macros --- libavcodec/adxenc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index aea4798..bc6b0f1 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -42,7 +42,7 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, int s0, s1, s2, d; int max = 0; int min = 0; - int data[32]; + int data[BLOCK_SAMPLES]; s1 = prev->s1; s2 = prev->s2; @@ -61,7 +61,7 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, prev->s2 = s2; if (max == 0 && min == 0) { - memset(adx, 0, 18); + memset(adx, 0, BLOCK_SIZE); return; } @@ -76,7 +76,7 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, AV_WB16(adx, scale); init_put_bits(&pb, adx + 2, 16); - for (i = 0; i < 32; i++) + for (i = 0; i < BLOCK_SAMPLES; i++) put_sbits(&pb, 4, av_clip(data[i] / scale, -8, 7)); flush_put_bits(&pb); } @@ -105,7 +105,7 @@ static av_cold int adx_encode_init(AVCodecContext *avctx) av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n"); return AVERROR(EINVAL); } - avctx->frame_size = 32; + avctx->frame_size = BLOCK_SAMPLES; avctx->coded_frame = avcodec_alloc_frame(); @@ -138,7 +138,7 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, for (ch = 0; ch < avctx->channels; ch++) { adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels); - dst += 18; + dst += BLOCK_SIZE; } return dst - frame; } -- cgit v1.1 From 1fb47728cd0a38537c3db8eb23ceea26562e661f Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 10:51:03 -0500 Subject: adxenc: use bytestream functions for header writing. also add more documentation about the header structure --- libavcodec/adxenc.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index bc6b0f1..2664353 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -19,9 +19,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "libavutil/intreadwrite.h" #include "avcodec.h" #include "adx.h" +#include "bytestream.h" #include "put_bits.h" /** @@ -81,20 +81,29 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav, flush_put_bits(&pb); } +#define HEADER_SIZE 36 + static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize) { ADXContext *c = avctx->priv_data; - AV_WB32(buf + 0x00, 0x80000000 | 0x20); - AV_WB32(buf + 0x04, 0x03120400 | avctx->channels); - AV_WB32(buf + 0x08, avctx->sample_rate); - AV_WB32(buf + 0x0c, 0); - AV_WB16(buf + 0x10, c->cutoff); - AV_WB32(buf + 0x12, 0x03000000); - AV_WB32(buf + 0x16, 0x00000000); - AV_WB32(buf + 0x1a, 0x00000000); - memcpy (buf + 0x1e, "(c)CRI", 6); - return 0x20 + 4; + bytestream_put_be16(&buf, 0x8000); /* header signature */ + bytestream_put_be16(&buf, HEADER_SIZE - 4); /* copyright offset */ + bytestream_put_byte(&buf, 3); /* encoding */ + bytestream_put_byte(&buf, BLOCK_SIZE); /* block size */ + bytestream_put_byte(&buf, 4); /* sample size */ + bytestream_put_byte(&buf, avctx->channels); /* channels */ + bytestream_put_be32(&buf, avctx->sample_rate); /* sample rate */ + bytestream_put_be32(&buf, 0); /* total sample count */ + bytestream_put_be16(&buf, c->cutoff); /* cutoff frequency */ + bytestream_put_byte(&buf, 3); /* version */ + bytestream_put_byte(&buf, 0); /* flags */ + bytestream_put_be32(&buf, 0); /* unknown */ + bytestream_put_be32(&buf, 0); /* loop enabled */ + bytestream_put_be16(&buf, 0); /* padding */ + bytestream_put_buffer(&buf, "(c)CRI", 6); /* copyright signature */ + + return HEADER_SIZE; } static av_cold int adx_encode_init(AVCodecContext *avctx) -- cgit v1.1 From 754ebd1a5b68dd63ccceb50a8a852fe8d0c94354 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 19 Dec 2011 10:56:18 -0500 Subject: adxenc: check output buffer size before writing --- libavcodec/adxenc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/adxenc.c b/libavcodec/adxenc.c index 2664353..20f2798 100644 --- a/libavcodec/adxenc.c +++ b/libavcodec/adxenc.c @@ -87,6 +87,9 @@ static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize) { ADXContext *c = avctx->priv_data; + if (bufsize < HEADER_SIZE) + return AVERROR(EINVAL); + bytestream_put_be16(&buf, 0x8000); /* header signature */ bytestream_put_be16(&buf, HEADER_SIZE - 4); /* copyright offset */ bytestream_put_byte(&buf, 3); /* encoding */ @@ -140,10 +143,19 @@ static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame, int ch; if (!c->header_parsed) { - int hdrsize = adx_encode_header(avctx, dst, buf_size); - dst += hdrsize; + int hdrsize; + if ((hdrsize = adx_encode_header(avctx, dst, buf_size)) < 0) { + av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); + return AVERROR(EINVAL); + } + dst += hdrsize; + buf_size -= hdrsize; c->header_parsed = 1; } + if (buf_size < BLOCK_SIZE * avctx->channels) { + av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); + return AVERROR(EINVAL); + } for (ch = 0; ch < avctx->channels; ch++) { adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels); -- cgit v1.1 From 730280f90d36b5fd5fd400e183dfa4584b34990a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 3 Jan 2012 17:32:15 -0500 Subject: adxdec: clear eof flag and channel states when seeking --- libavcodec/adxdec.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'libavcodec') diff --git a/libavcodec/adxdec.c b/libavcodec/adxdec.c index 4ccaf2e..3f7f5f4 100644 --- a/libavcodec/adxdec.c +++ b/libavcodec/adxdec.c @@ -165,6 +165,13 @@ static int adx_decode_frame(AVCodecContext *avctx, void *data, return buf - avpkt->data; } +static void adx_decode_flush(AVCodecContext *avctx) +{ + ADXContext *c = avctx->priv_data; + memset(c->prev, 0, sizeof(c->prev)); + c->eof = 0; +} + AVCodec ff_adpcm_adx_decoder = { .name = "adpcm_adx", .type = AVMEDIA_TYPE_AUDIO, @@ -172,6 +179,7 @@ AVCodec ff_adpcm_adx_decoder = { .priv_data_size = sizeof(ADXContext), .init = adx_decode_init, .decode = adx_decode_frame, + .flush = adx_decode_flush, .capabilities = CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"), }; -- cgit v1.1 From 9785082c15360303510059a79b61c88c489548c5 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 30 Dec 2011 17:56:04 -0500 Subject: libspeexenc: fix pts calculations for more than 1 frame per packet --- libavcodec/libspeexenc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/libspeexenc.c b/libavcodec/libspeexenc.c index 18f973f..290718c 100644 --- a/libavcodec/libspeexenc.c +++ b/libavcodec/libspeexenc.c @@ -83,7 +83,8 @@ typedef struct { int abr; ///< flag to enable ABR int pkt_frame_count; ///< frame count for the current packet int lookahead; ///< encoder delay - int sample_count; ///< total sample count (used for pts) + int64_t next_pts; ///< next pts, in sample_rate time base + int pkt_sample_count; ///< sample count in the current packet } LibSpeexEncContext; static av_cold void print_enc_params(AVCodecContext *avctx, @@ -201,7 +202,7 @@ static av_cold int encode_init(AVCodecContext *avctx) /* set encoding delay */ speex_encoder_ctl(s->enc_state, SPEEX_GET_LOOKAHEAD, &s->lookahead); - s->sample_count = -s->lookahead; + s->next_pts = -s->lookahead; /* create header packet bytes from header struct */ /* note: libspeex allocates the memory for header_data, which is freed @@ -235,7 +236,6 @@ static int encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, { LibSpeexEncContext *s = avctx->priv_data; int16_t *samples = data; - int sample_count = s->sample_count; if (data) { /* encode Speex frame */ @@ -243,7 +243,7 @@ static int encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, speex_encode_stereo_int(samples, s->header.frame_size, &s->bits); speex_encode_int(s->enc_state, samples, &s->bits); s->pkt_frame_count++; - s->sample_count += avctx->frame_size; + s->pkt_sample_count += avctx->frame_size; } else { /* handle end-of-stream */ if (!s->pkt_frame_count) @@ -259,8 +259,10 @@ static int encode_frame(AVCodecContext *avctx, uint8_t *frame, int buf_size, if (s->pkt_frame_count == s->frames_per_packet) { s->pkt_frame_count = 0; avctx->coded_frame->pts = - av_rescale_q(sample_count, (AVRational){ 1, avctx->sample_rate }, + av_rescale_q(s->next_pts, (AVRational){ 1, avctx->sample_rate }, avctx->time_base); + s->next_pts += s->pkt_sample_count; + s->pkt_sample_count = 0; if (buf_size > speex_bits_nbytes(&s->bits)) { int ret = speex_bits_write(&s->bits, frame, buf_size); speex_bits_reset(&s->bits); -- cgit v1.1 From e451c26c5f0bff9ced74ff6dfa3fce111fed1dbb Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 27 Dec 2011 12:25:18 +0100 Subject: cabac: drop unused STRICT_LIMITS code branch --- libavcodec/cabac.c | 16 ---------------- libavcodec/cabac.h | 3 --- 2 files changed, 19 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c index 57ab395..25713ee 100644 --- a/libavcodec/cabac.c +++ b/libavcodec/cabac.c @@ -109,10 +109,6 @@ void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){ c->low= 0; c->range= 0x1FE; c->outstanding_count= 0; -#ifdef STRICT_LIMITS - c->sym_count =0; -#endif - c->pb.bit_left++; //avoids firstBitFlag } @@ -179,10 +175,6 @@ static void put_cabac(CABACContext *c, uint8_t * const state, int bit){ } renorm_cabac_encoder(c); - -#ifdef STRICT_LIMITS - c->symCount++; -#endif } /** @@ -204,10 +196,6 @@ static void put_cabac_bypass(CABACContext *c, int bit){ put_cabac_bit(c, 1); c->low -= 0x400; } - -#ifdef STRICT_LIMITS - c->symCount++; -#endif } /** @@ -232,10 +220,6 @@ static int put_cabac_terminate(CABACContext *c, int bit){ flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong } -#ifdef STRICT_LIMITS - c->symCount++; -#endif - return (put_bits_count(&c->pb)+7)>>3; } diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index 1260642..b3f8f55 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -41,9 +41,6 @@ typedef struct CABACContext{ int low; int range; int outstanding_count; -#ifdef STRICT_LIMITS - int symCount; -#endif const uint8_t *bytestream_start; const uint8_t *bytestream; const uint8_t *bytestream_end; -- cgit v1.1 From 9dec55748cd5cf371d8f3eb35bac073d285f0617 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 27 Dec 2011 11:51:28 +0100 Subject: cabac: drop unused and disabled get_cabac_u() / get_cabac_ueg() functions --- libavcodec/cabac.c | 15 -------------- libavcodec/cabac.h | 58 ------------------------------------------------------ 2 files changed, 73 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c index 25713ee..bcb2429 100644 --- a/libavcodec/cabac.c +++ b/libavcodec/cabac.c @@ -343,21 +343,6 @@ START_TIMER av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i); STOP_TIMER("get_cabac") } -#if 0 - for(i=0; i>=1){ - v+= v + get_cabac_bypass(c); - } - i += v; - - if(is_signed && get_cabac_bypass(c)){ - return -i; - }else - return i; -} -#endif /* 0 */ - #endif /* AVCODEC_CABAC_H */ -- cgit v1.1 From 54e68fb3b89247084dfaeb3697a18f8ba92c5ea5 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 3 Jan 2012 13:18:49 +0100 Subject: Merge some declarations and initializations. This fixes compilation failures related to START_TIMER/STOP_TIMER macros and -Werror=declaration-after-statement. START_TIMER declares variables and thus may not be placed after statements outside of a new block. --- libavcodec/dnxhdenc.c | 6 +++--- libavcodec/h264.c | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c index d1ab597..2b7089b 100644 --- a/libavcodec/dnxhdenc.c +++ b/libavcodec/dnxhdenc.c @@ -580,9 +580,9 @@ static int dnxhd_encode_thread(AVCodecContext *avctx, void *arg, int jobnr, int for (i = 0; i < 8; i++) { DCTELEM *block = ctx->blocks[i]; - int last_index, overflow; - int n = dnxhd_switch_matrix(ctx, i); - last_index = ctx->m.dct_quantize(&ctx->m, block, i, qscale, &overflow); + int overflow, n = dnxhd_switch_matrix(ctx, i); + int last_index = ctx->m.dct_quantize(&ctx->m, block, i, + qscale, &overflow); //START_TIMER; dnxhd_encode_block(ctx, block, last_index, n); //STOP_TIMER("encode_block"); diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 316a57d..bb7619d 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -4126,9 +4126,7 @@ int main(void){ init_get_bits(&gb, temp, 8*SIZE); for(i=0; i Date: Sat, 31 Dec 2011 09:12:53 -0800 Subject: h264: return index in buffer on end-of-sequence. Fixes hangs if the last packet contains an end-of-sequence NAL unit, bug 158. --- libavcodec/h264.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/h264.c b/libavcodec/h264.c index bb7619d..9502a7c 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -4008,7 +4008,7 @@ static int decode_frame(AVCodecContext *avctx, H264Context *h = avctx->priv_data; MpegEncContext *s = &h->s; AVFrame *pict = data; - int buf_index; + int buf_index = 0; s->flags= avctx->flags; s->flags2= avctx->flags2; @@ -4038,7 +4038,7 @@ static int decode_frame(AVCodecContext *avctx, *pict= *(AVFrame*)out; } - return 0; + return buf_index; } buf_index=decode_nal_units(h, buf, buf_size); -- cgit v1.1 From 98f24ecd6cfc9c57a555aae6bfcd3d9a4ce9503d Mon Sep 17 00:00:00 2001 From: Christophe GISQUET Date: Sun, 1 Jan 2012 15:28:47 +0100 Subject: rv34: joint coefficient decoding and dequantization Perform dequantization while decoding coefficients instead of performing it on the entire coefficients buffer. Since quantized coefficients are very sparse, this usually causes a small speedup. Speedup of around 1% on Panda board compared to the removed here neon code. Global speedup is probably around 3%. Signed-off-by: Kostya Shishkov --- libavcodec/arm/rv34dsp_init_neon.c | 3 -- libavcodec/arm/rv34dsp_neon.S | 24 ------------ libavcodec/rv34.c | 80 +++++++++++++++++++++----------------- libavcodec/rv34data.h | 10 ----- libavcodec/rv34dsp.c | 16 -------- libavcodec/rv34dsp.h | 1 - 6 files changed, 44 insertions(+), 90 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/arm/rv34dsp_init_neon.c b/libavcodec/arm/rv34dsp_init_neon.c index acf2a7d..9a09fde 100644 --- a/libavcodec/arm/rv34dsp_init_neon.c +++ b/libavcodec/arm/rv34dsp_init_neon.c @@ -25,12 +25,9 @@ void ff_rv34_inv_transform_neon(DCTELEM *block); void ff_rv34_inv_transform_noround_neon(DCTELEM *block); -void ff_rv34_dequant4x4_neon(DCTELEM *block, int Qdc, int Q); void ff_rv34dsp_init_neon(RV34DSPContext *c, DSPContext* dsp) { c->rv34_inv_transform_tab[0] = ff_rv34_inv_transform_neon; c->rv34_inv_transform_tab[1] = ff_rv34_inv_transform_noround_neon; - - c->rv34_dequant4x4 = ff_rv34_dequant4x4_neon; } diff --git a/libavcodec/arm/rv34dsp_neon.S b/libavcodec/arm/rv34dsp_neon.S index 423b537..f700f5c 100644 --- a/libavcodec/arm/rv34dsp_neon.S +++ b/libavcodec/arm/rv34dsp_neon.S @@ -107,27 +107,3 @@ function ff_rv34_inv_transform_noround_neon, export=1 vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r2,:64], r1 bx lr endfunc - -function ff_rv34_dequant4x4_neon, export=1 - mov r3, r0 - mov r12, #16 - vdup.16 q0, r2 - vmov.16 d0[0], r1 - vld1.16 {d2}, [r0,:64], r12 - vld1.16 {d4}, [r0,:64], r12 - vld1.16 {d6}, [r0,:64], r12 - vld1.16 {d16}, [r0,:64], r12 - vmull.s16 q1, d2, d0 - vmull.s16 q2, d4, d1 - vmull.s16 q3, d6, d1 - vmull.s16 q8, d16, d1 - vqrshrn.s32 d2, q1, #4 - vqrshrn.s32 d4, q2, #4 - vqrshrn.s32 d6, q3, #4 - vqrshrn.s32 d16, q8, #4 - vst1.16 {d2}, [r3,:64], r12 - vst1.16 {d4}, [r3,:64], r12 - vst1.16 {d6}, [r3,:64], r12 - vst1.16 {d16}, [r3,:64], r12 - bx lr -endfunc diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index 1a126be..db2e53a 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -212,7 +212,7 @@ static int rv34_decode_cbp(GetBitContext *gb, RV34VLC *vlc, int table) /** * Get one coefficient value from the bistream and store it. */ -static inline void decode_coeff(DCTELEM *dst, int coef, int esc, GetBitContext *gb, VLC* vlc) +static inline void decode_coeff(DCTELEM *dst, int coef, int esc, GetBitContext *gb, VLC* vlc, int q) { if(coef){ if(coef == esc){ @@ -225,14 +225,14 @@ static inline void decode_coeff(DCTELEM *dst, int coef, int esc, GetBitContext * } if(get_bits1(gb)) coef = -coef; - *dst = coef; + *dst = (coef*q + 8) >> 4; } } /** * Decode 2x2 subblock of coefficients. */ -static inline void decode_subblock(DCTELEM *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc) +static inline void decode_subblock(DCTELEM *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc, int q) { int coeffs[4]; @@ -240,15 +240,35 @@ static inline void decode_subblock(DCTELEM *dst, int code, const int is_block2, coeffs[1] = modulo_three_table[code][1]; coeffs[2] = modulo_three_table[code][2]; coeffs[3] = modulo_three_table[code][3]; - decode_coeff(dst , coeffs[0], 3, gb, vlc); + decode_coeff(dst , coeffs[0], 3, gb, vlc, q); if(is_block2){ - decode_coeff(dst+8, coeffs[1], 2, gb, vlc); - decode_coeff(dst+1, coeffs[2], 2, gb, vlc); + decode_coeff(dst+8, coeffs[1], 2, gb, vlc, q); + decode_coeff(dst+1, coeffs[2], 2, gb, vlc, q); }else{ - decode_coeff(dst+1, coeffs[1], 2, gb, vlc); - decode_coeff(dst+8, coeffs[2], 2, gb, vlc); + decode_coeff(dst+1, coeffs[1], 2, gb, vlc, q); + decode_coeff(dst+8, coeffs[2], 2, gb, vlc, q); } - decode_coeff(dst+9, coeffs[3], 2, gb, vlc); + decode_coeff(dst+9, coeffs[3], 2, gb, vlc, q); +} + +static inline void decode_subblock3(DCTELEM *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc, + int q_dc, int q_ac1, int q_ac2) +{ + int coeffs[4]; + + coeffs[0] = modulo_three_table[code][0]; + coeffs[1] = modulo_three_table[code][1]; + coeffs[2] = modulo_three_table[code][2]; + coeffs[3] = modulo_three_table[code][3]; + decode_coeff(dst , coeffs[0], 3, gb, vlc, q_dc); + if(is_block2){ + decode_coeff(dst+8, coeffs[1], 2, gb, vlc, q_ac1); + decode_coeff(dst+1, coeffs[2], 2, gb, vlc, q_ac1); + }else{ + decode_coeff(dst+1, coeffs[1], 2, gb, vlc, q_ac1); + decode_coeff(dst+8, coeffs[2], 2, gb, vlc, q_ac1); + } + decode_coeff(dst+9, coeffs[3], 2, gb, vlc, q_ac2); } /** @@ -262,7 +282,7 @@ static inline void decode_subblock(DCTELEM *dst, int code, const int is_block2, * o--o */ -static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc) +static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2) { int code, pattern; @@ -271,40 +291,24 @@ static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *r pattern = code & 0x7; code >>= 3; - decode_subblock(dst, code, 0, gb, &rvlc->coefficient); + decode_subblock3(dst, code, 0, gb, &rvlc->coefficient, q_dc, q_ac1, q_ac2); if(pattern & 4){ code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2); - decode_subblock(dst + 2, code, 0, gb, &rvlc->coefficient); + decode_subblock(dst + 2, code, 0, gb, &rvlc->coefficient, q_ac2); } if(pattern & 2){ // Looks like coefficients 1 and 2 are swapped for this block code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2); - decode_subblock(dst + 8*2, code, 1, gb, &rvlc->coefficient); + decode_subblock(dst + 8*2, code, 1, gb, &rvlc->coefficient, q_ac2); } if(pattern & 1){ code = get_vlc2(gb, rvlc->third_pattern[sc].table, 9, 2); - decode_subblock(dst + 8*2+2, code, 0, gb, &rvlc->coefficient); + decode_subblock(dst + 8*2+2, code, 0, gb, &rvlc->coefficient, q_ac2); } } /** - * Dequantize 4x4 block of DC values for 16x16 macroblock. - * @todo optimize - */ -static inline void rv34_dequant4x4_16x16(DCTELEM *block, int Qdc, int Q) -{ - int i; - - for(i = 0; i < 3; i++) - block[rv34_dezigzag[i]] = (block[rv34_dezigzag[i]] * Qdc + 8) >> 4; - for(; i < 16; i++) - block[rv34_dezigzag[i]] = (block[rv34_dezigzag[i]] * Q + 8) >> 4; -} -/** @} */ //block functions - - -/** * @name RV30/40 bitstream parsing * @{ */ @@ -1097,6 +1101,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) MpegEncContext *s = &r->s; GetBitContext *gb = &s->gb; int cbp, cbp2; + int q_dc, q_ac; int i, blknum, blkoff; LOCAL_ALIGNED_16(DCTELEM, block16, [64]); int luma_dc_quant; @@ -1133,31 +1138,34 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) luma_dc_quant = r->block_type == RV34_MB_P_MIX16x16 ? r->luma_dc_quant_p[s->qscale] : r->luma_dc_quant_i[s->qscale]; if(r->is16){ + q_dc = rv34_qscale_tab[luma_dc_quant]; + q_ac = rv34_qscale_tab[s->qscale]; memset(block16, 0, 64 * sizeof(*block16)); - rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0); - rv34_dequant4x4_16x16(block16, rv34_qscale_tab[luma_dc_quant],rv34_qscale_tab[s->qscale]); + rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, q_ac); r->rdsp.rv34_inv_transform_tab[1](block16); } + q_ac = rv34_qscale_tab[s->qscale]; for(i = 0; i < 16; i++, cbp >>= 1){ if(!r->is16 && !(cbp & 1)) continue; blknum = ((i & 2) >> 1) + ((i & 8) >> 2); blkoff = ((i & 1) << 2) + ((i & 4) << 3); if(cbp & 1) - rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->luma_vlc, 0); - r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[s->qscale],rv34_qscale_tab[s->qscale]); + rv34_decode_block(s->block[blknum] + blkoff, gb, + r->cur_vlcs, r->luma_vlc, 0, q_ac, q_ac, q_ac); if(r->is16) //FIXME: optimize s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)]; r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff); } if(r->block_type == RV34_MB_P_MIX16x16) r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1); + q_dc = rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]]; + q_ac = rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]]; for(; i < 24; i++, cbp >>= 1){ if(!(cbp & 1)) continue; blknum = ((i & 4) >> 2) + 4; blkoff = ((i & 1) << 2) + ((i & 2) << 4); - rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1); - r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]],rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]]); + rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1, q_dc, q_ac, q_ac); r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff); } if (IS_INTRA(s->current_picture_ptr->f.mb_type[mb_pos])) diff --git a/libavcodec/rv34data.h b/libavcodec/rv34data.h index f8f941d..fa41a88 100644 --- a/libavcodec/rv34data.h +++ b/libavcodec/rv34data.h @@ -101,16 +101,6 @@ static const uint16_t rv34_qscale_tab[32] = { }; /** - * 4x4 dezigzag pattern - */ -static const uint8_t rv34_dezigzag[16] = { - 0, 1, 8, 16, - 9, 2, 3, 10, - 17, 24, 25, 18, - 11, 19, 26, 27 -}; - -/** * tables used to translate a quantizer value into a VLC set for decoding * The first table is used for intraframes. */ diff --git a/libavcodec/rv34dsp.c b/libavcodec/rv34dsp.c index 974bf9e..1f4cea8 100644 --- a/libavcodec/rv34dsp.c +++ b/libavcodec/rv34dsp.c @@ -100,26 +100,10 @@ static void rv34_inv_transform_noround_c(DCTELEM *block){ /** @} */ // transform -/** - * Dequantize ordinary 4x4 block. - */ -void ff_rv34_dequant4x4_neon(DCTELEM *block, int Qdc, int Q); -static void rv34_dequant4x4_c(DCTELEM *block, int Qdc, int Q) -{ - int i, j; - - block[0] = (block[0] * Qdc + 8) >> 4; - for (i = 0; i < 4; i++) - for (j = !i; j < 4; j++) - block[j + i*8] = (block[j + i*8] * Q + 8) >> 4; -} - av_cold void ff_rv34dsp_init(RV34DSPContext *c, DSPContext* dsp) { c->rv34_inv_transform_tab[0] = rv34_inv_transform_c; c->rv34_inv_transform_tab[1] = rv34_inv_transform_noround_c; - c->rv34_dequant4x4 = rv34_dequant4x4_c; - if (HAVE_NEON) ff_rv34dsp_init_neon(c, dsp); } diff --git a/libavcodec/rv34dsp.h b/libavcodec/rv34dsp.h index 01352ea..f2bc20e 100644 --- a/libavcodec/rv34dsp.h +++ b/libavcodec/rv34dsp.h @@ -56,7 +56,6 @@ typedef struct RV34DSPContext { h264_chroma_mc_func avg_chroma_pixels_tab[3]; rv40_weight_func rv40_weight_pixels_tab[2]; rv34_inv_transform_func rv34_inv_transform_tab[2]; - void (*rv34_dequant4x4)(DCTELEM *block, int Qdc, int Q); rv40_weak_loop_filter_func rv40_weak_loop_filter[2]; rv40_strong_loop_filter_func rv40_strong_loop_filter[2]; rv40_loop_filter_strength_func rv40_loop_filter_strength[2]; -- cgit v1.1 From aacf6b3a2fd8bc8603e3deaa6e612ea03cf08707 Mon Sep 17 00:00:00 2001 From: John Brooks Date: Tue, 3 Jan 2012 23:27:35 -0700 Subject: rv34: fix invalid memory access for small video dimensions For small video dimensions calculations of the upper bound for pixel access may result in negative value. Using an unsigned comparison works only if the greater operand is non-negative. This is fixed by doing edge emulation explicitly for such conditions. Signed-off-by: Kostya Shishkov --- libavcodec/rv34.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index db2e53a..91d6788 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -680,8 +680,9 @@ static inline void rv34_mc(RV34DecContext *r, const int block_type, srcY += src_y * s->linesize + src_x; srcU += uvsrc_y * s->uvlinesize + uvsrc_x; srcV += uvsrc_y * s->uvlinesize + uvsrc_x; - if( (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4 - || (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4){ + if(s->h_edge_pos - (width << 3) < 6 || s->v_edge_pos - (height << 3) < 6 || + (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4 || + (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4) { uint8_t *uvbuf = s->edge_emu_buffer + 22 * s->linesize; srcY -= 2 + 2*s->linesize; -- cgit v1.1 From d209c27b09234cc40bbdbd680aa502b493edf595 Mon Sep 17 00:00:00 2001 From: John Brooks Date: Sun, 11 Dec 2011 02:37:21 -0700 Subject: vc1dec: fix invalid memory access for small video dimensions For small video dimensions, these calculations of the upper bound for pixel access may have a negative result. Using an unsigned comparison to bound a potentially negative value only works if the greater operand is non-negative. Fixed by doing edge emulation when the upper bound is probably negative, everywhere that this pattern appears. Signed-off-by: Kostya Shishkov --- libavcodec/vc1dec.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'libavcodec') diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 3cb7661..bc8daed 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -568,6 +568,7 @@ static void vc1_mc_1mv(VC1Context *v, int dir) } if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 22 || v_edge_pos < 22 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3 || (unsigned)(src_y - s->mspel) > v_edge_pos - (my&3) - 16 - s->mspel * 3) { uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize; @@ -799,6 +800,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir) if (fieldmv && (src_y & 1) && src_y < 4) src_y--; if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 13 || v_edge_pos < 23 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2 || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) { srcY -= s->mspel * (1 + (s->linesize << fieldmv)); @@ -998,6 +1000,7 @@ static void vc1_mc_4mv_chroma(VC1Context *v, int dir) } if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 18 || v_edge_pos < 18 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 || (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) { s->dsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize, @@ -1102,6 +1105,7 @@ static void vc1_mc_4mv_chroma4(VC1Context *v) if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2) uvsrc_y--; if ((v->mv_mode == MV_PMODE_INTENSITY_COMP) + || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv) || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5 || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) { s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize, @@ -2006,7 +2010,7 @@ static void vc1_interp_mc(VC1Context *v) srcV = s->edge_emu_buffer + 18 * s->linesize; } - if (v->rangeredfrm + if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 16 - s->mspel * 3 || (unsigned)(src_y - s->mspel) > v_edge_pos - (my & 3) - 16 - s->mspel * 3) { uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize; -- cgit v1.1 From 00a1cdd2645992c084a6c71746b04babb7cae364 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Tue, 3 Jan 2012 13:25:25 +0100 Subject: Place some START_TIMER invocations in separate blocks. This fixes compilation failures related to START_TIMER/STOP_TIMER macros and -Werror=declaration-after-statement. START_TIMER declares variables and thus may not be placed after statements outside of a new block. --- libavcodec/indeo5.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/indeo5.c b/libavcodec/indeo5.c index 8b72b1f..019fa2b 100644 --- a/libavcodec/indeo5.c +++ b/libavcodec/indeo5.c @@ -757,7 +757,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, switch_buffers(ctx); - //START_TIMER; + //{ START_TIMER; if (ctx->frame_type != FRAMETYPE_NULL) { for (p = 0; p < 3; p++) { @@ -772,7 +772,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, } } - //STOP_TIMER("decode_planes"); + //STOP_TIMER("decode_planes"); } if (ctx->frame.data[0]) avctx->release_buffer(avctx, &ctx->frame); -- cgit v1.1 From 89d26797f56ec52dae14f9c47b445c9a39e8ce56 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Tue, 3 Jan 2012 20:41:18 -0800 Subject: ulti: convert to new bytestream API. --- libavcodec/bytestream.h | 6 ++++- libavcodec/ulti.c | 72 +++++++++++++++++++++++-------------------------- 2 files changed, 38 insertions(+), 40 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/bytestream.h b/libavcodec/bytestream.h index ba3e4e8..8fbceac 100644 --- a/libavcodec/bytestream.h +++ b/libavcodec/bytestream.h @@ -39,11 +39,15 @@ static av_always_inline void bytestream_put_ ##name(uint8_t **b, const type valu write(*b, value);\ (*b) += bytes;\ }\ +static av_always_inline type bytestream2_get_ ## name ## u(GetByteContext *g)\ +{\ + return bytestream_get_ ## name(&g->buffer);\ +}\ static av_always_inline type bytestream2_get_ ## name(GetByteContext *g)\ {\ if (g->buffer_end - g->buffer < bytes)\ return 0;\ - return bytestream_get_ ## name(&g->buffer);\ + return bytestream2_get_ ## name ## u(g);\ }\ static av_always_inline type bytestream2_peek_ ## name(GetByteContext *g)\ {\ diff --git a/libavcodec/ulti.c b/libavcodec/ulti.c index 52092b5..62bab3c 100644 --- a/libavcodec/ulti.c +++ b/libavcodec/ulti.c @@ -38,16 +38,9 @@ typedef struct UltimotionDecodeContext { int width, height, blocks; AVFrame frame; const uint8_t *ulti_codebook; + GetByteContext gb; } UltimotionDecodeContext; -#define CHECK_OVERREAD_SIZE(size) \ - do { \ - if (buf_end - buf < (size)) { \ - av_log(avctx, AV_LOG_ERROR, "Insufficient data\n"); \ - return AVERROR_INVALIDDATA; \ - } \ - } while(0) - static av_cold int ulti_decode_init(AVCodecContext *avctx) { UltimotionDecodeContext *s = avctx->priv_data; @@ -231,7 +224,6 @@ static int ulti_decode_frame(AVCodecContext *avctx, int i; int skip; int tmp; - const uint8_t *buf_end = buf + buf_size; s->frame.reference = 1; s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; @@ -240,18 +232,20 @@ static int ulti_decode_frame(AVCodecContext *avctx, return -1; } + bytestream2_init(&s->gb, buf, buf_size); + while(!done) { int idx; if(blocks >= s->blocks || y >= s->height) break;//all blocks decoded - CHECK_OVERREAD_SIZE(1); - idx = *buf++; + if (bytestream2_get_bytes_left(&s->gb) < 1) + goto err; + idx = bytestream2_get_byteu(&s->gb); if((idx & 0xF8) == 0x70) { switch(idx) { case 0x70: //change modifier - CHECK_OVERREAD_SIZE(1); - modifier = *buf++; + modifier = bytestream2_get_byte(&s->gb); if(modifier>1) av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier); break; @@ -265,8 +259,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, done = 1; break; case 0x74: //skip some blocks - CHECK_OVERREAD_SIZE(1); - skip = *buf++; + skip = bytestream2_get_byte(&s->gb); if ((blocks + skip) >= s->blocks) break; blocks += skip; @@ -293,8 +286,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, } else { cf = 0; if (idx) { - CHECK_OVERREAD_SIZE(1); - chroma = *buf++; + chroma = bytestream2_get_byte(&s->gb); } } for (i = 0; i < 4; i++) { // for every subblock @@ -302,15 +294,13 @@ static int ulti_decode_frame(AVCodecContext *avctx, if(!code) //skip subblock continue; if(cf) { - CHECK_OVERREAD_SIZE(1); - chroma = *buf++; + chroma = bytestream2_get_byte(&s->gb); } tx = x + block_coords[i * 2]; ty = y + block_coords[(i * 2) + 1]; switch(code) { case 1: - CHECK_OVERREAD_SIZE(1); - tmp = *buf++; + tmp = bytestream2_get_byte(&s->gb); angle = angle_by_index[(tmp >> 6) & 0x3]; @@ -330,8 +320,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, case 2: if (modifier) { // unpack four luma samples - CHECK_OVERREAD_SIZE(3); - tmp = bytestream_get_be24(&buf); + tmp = bytestream2_get_be24(&s->gb); Y[0] = (tmp >> 18) & 0x3F; Y[1] = (tmp >> 12) & 0x3F; @@ -339,8 +328,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, Y[3] = tmp & 0x3F; angle = 16; } else { // retrieve luma samples from codebook - CHECK_OVERREAD_SIZE(2); - tmp = bytestream_get_be16(&buf); + tmp = bytestream2_get_be16(&s->gb); angle = (tmp >> 12) & 0xF; tmp &= 0xFFF; @@ -356,27 +344,27 @@ static int ulti_decode_frame(AVCodecContext *avctx, if (modifier) { // all 16 luma samples uint8_t Luma[16]; - CHECK_OVERREAD_SIZE(12); - - tmp = bytestream_get_be24(&buf); + if (bytestream2_get_bytes_left(&s->gb) < 12) + goto err; + tmp = bytestream2_get_be24u(&s->gb); Luma[0] = (tmp >> 18) & 0x3F; Luma[1] = (tmp >> 12) & 0x3F; Luma[2] = (tmp >> 6) & 0x3F; Luma[3] = tmp & 0x3F; - tmp = bytestream_get_be24(&buf); + tmp = bytestream2_get_be24u(&s->gb); Luma[4] = (tmp >> 18) & 0x3F; Luma[5] = (tmp >> 12) & 0x3F; Luma[6] = (tmp >> 6) & 0x3F; Luma[7] = tmp & 0x3F; - tmp = bytestream_get_be24(&buf); + tmp = bytestream2_get_be24u(&s->gb); Luma[8] = (tmp >> 18) & 0x3F; Luma[9] = (tmp >> 12) & 0x3F; Luma[10] = (tmp >> 6) & 0x3F; Luma[11] = tmp & 0x3F; - tmp = bytestream_get_be24(&buf); + tmp = bytestream2_get_be24u(&s->gb); Luma[12] = (tmp >> 18) & 0x3F; Luma[13] = (tmp >> 12) & 0x3F; Luma[14] = (tmp >> 6) & 0x3F; @@ -384,22 +372,23 @@ static int ulti_decode_frame(AVCodecContext *avctx, ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma); } else { - CHECK_OVERREAD_SIZE(4); - tmp = *buf++; + if (bytestream2_get_bytes_left(&s->gb) < 4) + goto err; + tmp = bytestream2_get_byteu(&s->gb); if(tmp & 0x80) { angle = (tmp >> 4) & 0x7; - tmp = (tmp << 8) + *buf++; + tmp = (tmp << 8) + bytestream2_get_byteu(&s->gb); Y[0] = (tmp >> 6) & 0x3F; Y[1] = tmp & 0x3F; - Y[2] = (*buf++) & 0x3F; - Y[3] = (*buf++) & 0x3F; + Y[2] = bytestream2_get_byteu(&s->gb) & 0x3F; + Y[3] = bytestream2_get_byteu(&s->gb) & 0x3F; ulti_grad(&s->frame, tx, ty, Y, chroma, angle); //draw block } else { // some patterns int f0, f1; - f0 = *buf++; + f0 = bytestream2_get_byteu(&s->gb); f1 = tmp; - Y[0] = (*buf++) & 0x3F; - Y[1] = (*buf++) & 0x3F; + Y[0] = bytestream2_get_byteu(&s->gb) & 0x3F; + Y[1] = bytestream2_get_byteu(&s->gb) & 0x3F; ulti_pattern(&s->frame, tx, ty, f1, f0, Y[0], Y[1], chroma); } } @@ -421,6 +410,11 @@ static int ulti_decode_frame(AVCodecContext *avctx, *(AVFrame*)data= s->frame; return buf_size; + +err: + av_log(avctx, AV_LOG_ERROR, + "Insufficient data\n"); + return AVERROR_INVALIDDATA; } AVCodec ff_ulti_decoder = { -- cgit v1.1