Commit 5ed39dc2 authored by kostya's avatar kostya

Add the handling of the INT32INFO block to the WavPack decoder.

Patch by David Bryant david at $codecname dot com
Thread: [FFmpeg-devel] [PATCH] handle INT32INFO in WavPack decoder


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@9932 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent c6a06063
...@@ -76,6 +76,7 @@ typedef struct WavpackContext { ...@@ -76,6 +76,7 @@ typedef struct WavpackContext {
int terms; int terms;
Decorr decorr[MAX_TERMS]; Decorr decorr[MAX_TERMS];
int zero, one, zeroes; int zero, one, zeroes;
int and, or, shift;
} WavpackContext; } WavpackContext;
// exponent table copied from WavPack source // exponent table copied from WavPack source
...@@ -235,7 +236,7 @@ static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst) ...@@ -235,7 +236,7 @@ static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
{ {
int i, j, count = 0; int i, j, count = 0;
int last, t; int last, t;
int A, B, L, L2, R, R2; int A, B, L, L2, R, R2, bit;
int pos = 0; int pos = 0;
uint32_t crc = 0xFFFFFFFF; uint32_t crc = 0xFFFFFFFF;
...@@ -299,9 +300,10 @@ static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst) ...@@ -299,9 +300,10 @@ static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
if(s->joint) if(s->joint)
L += (R -= (L >> 1)); L += (R -= (L >> 1));
crc = (crc * 3 + L) * 3 + R; crc = (crc * 3 + L) * 3 + R;
*dst++ = L; bit = (L & s->and) | s->or;
*dst++ = R; *dst++ = ((L + bit) << s->shift) - bit;
bit = (R & s->and) | s->or;
*dst++ = ((R + bit) << s->shift) - bit;
count++; count++;
}while(!last && count < s->samples); }while(!last && count < s->samples);
...@@ -316,7 +318,7 @@ static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst) ...@@ -316,7 +318,7 @@ static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
{ {
int i, j, count = 0; int i, j, count = 0;
int last, t; int last, t;
int A, S, T; int A, S, T, bit;
int pos = 0; int pos = 0;
uint32_t crc = 0xFFFFFFFF; uint32_t crc = 0xFFFFFFFF;
...@@ -344,7 +346,8 @@ static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst) ...@@ -344,7 +346,8 @@ static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
} }
pos = (pos + 1) & 7; pos = (pos + 1) & 7;
crc = crc * 3 + S; crc = crc * 3 + S;
*dst++ = S; bit = (S & s->and) | s->or;
*dst++ = ((S + bit) << s->shift) - bit;
count++; count++;
}while(!last && count < s->samples); }while(!last && count < s->samples);
...@@ -389,6 +392,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, ...@@ -389,6 +392,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
} }
memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
s->and = s->or = s->shift = 0;
s->samples = AV_RL32(buf); buf += 4; s->samples = AV_RL32(buf); buf += 4;
if(!s->samples){ if(!s->samples){
...@@ -509,6 +513,23 @@ static int wavpack_decode_frame(AVCodecContext *avctx, ...@@ -509,6 +513,23 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
} }
got_entropy = 1; got_entropy = 1;
break; break;
case WP_ID_INT32INFO:
if(size != 4 || *buf){
av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
buf += ssize;
continue;
}
if(buf[1])
s->shift = buf[1];
else if(buf[2]){
s->and = s->or = 1;
s->shift = buf[2];
}else if(buf[3]){
s->and = 1;
s->shift = buf[3];
}
buf += 4;
break;
case WP_ID_DATA: case WP_ID_DATA:
init_get_bits(&s->gb, buf, size * 8); init_get_bits(&s->gb, buf, size * 8);
s->data_size = size * 8; s->data_size = size * 8;
......
...@@ -105,10 +105,6 @@ static int wv_read_block_header(AVFormatContext *ctx, ByteIOContext *pb) ...@@ -105,10 +105,6 @@ static int wv_read_block_header(AVFormatContext *ctx, ByteIOContext *pb)
av_log(ctx, AV_LOG_ERROR, "Hybrid coding mode is not supported\n"); av_log(ctx, AV_LOG_ERROR, "Hybrid coding mode is not supported\n");
return -1; return -1;
} }
if(wc->flags & WV_INT32){
av_log(ctx, AV_LOG_ERROR, "Integer point data is not supported\n");
return -1;
}
bpp = ((wc->flags & 3) + 1) << 3; bpp = ((wc->flags & 3) + 1) << 3;
chan = 1 + !(wc->flags & WV_MONO); chan = 1 + !(wc->flags & WV_MONO);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment