1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

flac fixes:

fix data types of residual&decoded
fix twos complement bitfields
fix utf8 (no, utf8 is not the same as the simple and compact uvlc used in nut)
add truncated bitstream support, both ogg and flac demuxers in mplayer cvs provide incomplete frames, and furthermore it isnt possible to find frameboundaries in flac without decoding it completly
add escape-less golomb rice decoder (=flac style golomb rice) (ultra efficient, the longest vlc code is just 2^32-1 bits)
printf->av_log
fix bps for non independant channels
fix a few +-1 bugs
fix sample order for independant channels
fix data_size

Originally committed as revision 2791 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2004-02-18 01:49:30 +00:00
parent 4f52c3126b
commit ac2570a8b0
5 changed files with 265 additions and 173 deletions

View File

@ -19,7 +19,8 @@ OBJS= common.o utils.o mem.o allcodecs.o \
vp3.o asv1.o 4xm.o cabac.o ffv1.o ra144.o ra288.o vcr1.o cljr.o \ vp3.o asv1.o 4xm.o cabac.o ffv1.o ra144.o ra288.o vcr1.o cljr.o \
roqvideo.o dpcm.o interplayvideo.o xan.o rpza.o cinepak.o msrle.o \ roqvideo.o dpcm.o interplayvideo.o xan.o rpza.o cinepak.o msrle.o \
msvideo1.o vqavideo.o idcinvideo.o adx.o rational.o faandct.o 8bps.o \ msvideo1.o vqavideo.o idcinvideo.o adx.o rational.o faandct.o 8bps.o \
smc.o parser.o flicvideo.o truemotion1.o vmdav.o lcl.o qtrle.o g726.o smc.o parser.o flicvideo.o truemotion1.o vmdav.o lcl.o qtrle.o g726.o \
flac.o
ifeq ($(AMR_NB),yes) ifeq ($(AMR_NB),yes)
ifeq ($(AMR_NB_FIXED),yes) ifeq ($(AMR_NB_FIXED),yes)

View File

@ -154,6 +154,7 @@ void avcodec_register_all(void)
register_avcodec(&interplay_dpcm_decoder); register_avcodec(&interplay_dpcm_decoder);
register_avcodec(&xan_dpcm_decoder); register_avcodec(&xan_dpcm_decoder);
register_avcodec(&qtrle_decoder); register_avcodec(&qtrle_decoder);
register_avcodec(&flac_decoder);
#endif /* CONFIG_DECODERS */ #endif /* CONFIG_DECODERS */
#ifdef AMR_NB #ifdef AMR_NB

View File

@ -17,7 +17,7 @@ extern "C" {
#define FFMPEG_VERSION_INT 0x000408 #define FFMPEG_VERSION_INT 0x000408
#define FFMPEG_VERSION "0.4.8" #define FFMPEG_VERSION "0.4.8"
#define LIBAVCODEC_BUILD 4702 #define LIBAVCODEC_BUILD 4703
#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVCODEC_VERSION FFMPEG_VERSION #define LIBAVCODEC_VERSION FFMPEG_VERSION
@ -132,6 +132,8 @@ enum CodecID {
CODEC_ID_INTERPLAY_DPCM, CODEC_ID_INTERPLAY_DPCM,
CODEC_ID_XAN_DPCM, CODEC_ID_XAN_DPCM,
CODEC_ID_FLAC,
CODEC_ID_MPEG2TS, /* _FAKE_ codec to indicate a raw MPEG2 transport CODEC_ID_MPEG2TS, /* _FAKE_ codec to indicate a raw MPEG2 transport
stream (only used by libavformat) */ stream (only used by libavformat) */
}; };
@ -623,11 +625,6 @@ typedef struct AVCodecContext {
*/ */
int width, height; int width, height;
#define FF_ASPECT_SQUARE 1
#define FF_ASPECT_4_3_625 2
#define FF_ASPECT_4_3_525 3
#define FF_ASPECT_16_9_625 4
#define FF_ASPECT_16_9_525 5
#define FF_ASPECT_EXTENDED 15 #define FF_ASPECT_EXTENDED 15
/** /**
@ -1729,6 +1726,7 @@ extern AVCodec roq_dpcm_decoder;
extern AVCodec interplay_dpcm_decoder; extern AVCodec interplay_dpcm_decoder;
extern AVCodec xan_dpcm_decoder; extern AVCodec xan_dpcm_decoder;
extern AVCodec qtrle_decoder; extern AVCodec qtrle_decoder;
extern AVCodec flac_decoder;
/* pcm codecs */ /* pcm codecs */
#define PCM_CODEC(id, name) \ #define PCM_CODEC(id, name) \

View File

@ -23,9 +23,14 @@
* @author Alex Beregszaszi * @author Alex Beregszaszi
*/ */
#include <limits.h>
#include "avcodec.h" #include "avcodec.h"
#include "golomb.h" #include "golomb.h"
#undef NDEBUG
#include <assert.h>
#define MAX_CHANNELS 8 #define MAX_CHANNELS 8
#define MAX_BLOCKSIZE 65535 #define MAX_BLOCKSIZE 65535
@ -43,12 +48,16 @@ typedef struct FLACContext {
int min_blocksize, max_blocksize; int min_blocksize, max_blocksize;
int min_framesize, max_framesize; int min_framesize, max_framesize;
int samplerate, channels; int samplerate, channels;
int blocksize, last_blocksize; int blocksize/*, last_blocksize*/;
int bps, curr_bps; int bps, curr_bps;
enum channel_order order; enum channel_order order;
uint8_t *residual[MAX_CHANNELS]; int32_t *residual[MAX_CHANNELS];
uint32_t *decoded[MAX_CHANNELS]; int32_t *decoded[MAX_CHANNELS];
uint8_t *bitstream;
int bitstream_size;
int bitstream_index;
int allocated_bitstream_size;
} FLACContext; } FLACContext;
#define METADATA_TYPE_STREAMINFO 0 #define METADATA_TYPE_STREAMINFO 0
@ -61,21 +70,28 @@ static int sample_rate_table[] =
static int sample_size_table[] = static int sample_size_table[] =
{ 0, 8, 12, 0, 16, 20, 24, 0 }; { 0, 8, 12, 0, 16, 20, 24, 0 };
static uint64_t get_uvlc(GetBitContext *gb, int is64) static int64_t get_utf8(GetBitContext *gb)
{ {
uint64_t val = 0; uint64_t val;
int i = 0; int ones=0, bytes;
while(i++ < 5+is64) while(get_bits1(gb))
{ ones++;
if (ones==0) bytes=0;
else if(ones==1) return -1;
else bytes= ones - 1;
val= get_bits(gb, 7-ones);
while(bytes--){
const int tmp = get_bits(gb, 8); const int tmp = get_bits(gb, 8);
if (tmp & 0x80) if((tmp>>6) != 2)
val = (val << 7) + tmp - 0x80; return -1;
else val<<=6;
return (val << 7) + tmp; val|= tmp&0x3F;
} }
return -1; return val;
} }
static int flac_decode_init(AVCodecContext * avctx) static int flac_decode_init(AVCodecContext * avctx)
@ -85,17 +101,34 @@ static int flac_decode_init(AVCodecContext * avctx)
static void dump_headers(FLACContext *s) static void dump_headers(FLACContext *s)
{ {
printf(" Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize); av_log(s->avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize);
printf(" Framesize: %d .. %d\n", s->min_framesize, s->max_framesize); av_log(s->avctx, AV_LOG_DEBUG, " Framesize: %d .. %d\n", s->min_framesize, s->max_framesize);
printf(" Samplerate: %d\n", s->samplerate); av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
printf(" Channels: %d\n", s->channels); av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
printf(" Bits: %d\n", s->bps); av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
}
static void allocate_buffers(FLACContext *s){
int i;
assert(s->max_blocksize);
if(s->max_framesize == 0 && s->max_blocksize){
s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
}
for (i = 0; i < s->channels; i++)
{
s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
s->residual[i] = av_realloc(s->residual[i], sizeof(int32_t)*s->max_blocksize);
}
s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
// s->bitstream= av_realloc(s->bitstream, s->max_framesize);
} }
static void metadata_streaminfo(FLACContext *s) static void metadata_streaminfo(FLACContext *s)
{ {
int i;
/* mandatory streaminfo */ /* mandatory streaminfo */
s->min_blocksize = get_bits(&s->gb, 16); s->min_blocksize = get_bits(&s->gb, 16);
s->max_blocksize = get_bits(&s->gb, 16); s->max_blocksize = get_bits(&s->gb, 16);
@ -115,11 +148,7 @@ static void metadata_streaminfo(FLACContext *s)
skip_bits(&s->gb, 64); /* md5 sum */ skip_bits(&s->gb, 64); /* md5 sum */
skip_bits(&s->gb, 64); /* md5 sum */ skip_bits(&s->gb, 64); /* md5 sum */
for (i = 0; i < s->channels; i++) allocate_buffers(s);
{
s->decoded[i] = av_realloc(s->decoded[i], sizeof(uint32_t)*s->max_blocksize);
s->residual[i] = av_realloc(s->residual[i], sizeof(uint8_t)*s->max_blocksize);
}
} }
static int decode_residuals(FLACContext *s, int channel, int pred_order) static int decode_residuals(FLACContext *s, int channel, int pred_order)
@ -128,49 +157,42 @@ static int decode_residuals(FLACContext *s, int channel, int pred_order)
int sample = 0, samples; int sample = 0, samples;
method_type = get_bits(&s->gb, 2); method_type = get_bits(&s->gb, 2);
if (method_type != 0) if (method_type != 0){
av_log(s->avctx, AV_LOG_DEBUG, "illegal residual coding method %d\n", method_type);
return -1; return -1;
}
rice_order = get_bits(&s->gb, 4); rice_order = get_bits(&s->gb, 4);
samples = (rice_order > 0) ? samples= s->blocksize >> rice_order;
(s->blocksize >> rice_order) : (s->blocksize - pred_order);
sample=
i= pred_order;
for (partition = 0; partition < (1 << rice_order); partition++) for (partition = 0; partition < (1 << rice_order); partition++)
{ {
tmp = get_bits(&s->gb, 4); tmp = get_bits(&s->gb, 4);
if (tmp == 0) if (tmp == 15)
{ {
i = (!rice_order || partition) ? 0 : pred_order; av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
for (; i < samples; i++, sample++)
s->residual[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, 0, 0);
printf("zero k\n");
}
else if (tmp == 15)
{
printf("fixed len partition\n");
tmp = get_bits(&s->gb, 5); tmp = get_bits(&s->gb, 5);
i = (!rice_order || partition) ? 0 : pred_order;
for (; i < samples; i++, sample++) for (; i < samples; i++, sample++)
s->residual[channel][sample] = get_bits(&s->gb, tmp); s->residual[channel][sample] = get_sbits(&s->gb, tmp);
} }
else else
{ {
// printf("rice coded partition\n"); // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
#if 1 for (; i < samples; i++, sample++){
i = (!rice_order || partition) ? 0 : pred_order; s->residual[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
for (; i < samples; i++, sample++) if(get_bits_count(&s->gb) > s->gb.size_in_bits){
s->residual[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, 0, 0); av_log(s->avctx, AV_LOG_ERROR, "fucking FLAC\n");
#else return -1;
i = ((!rice_order || partition) ? samples : samples - pred_order) + sample; }
for (; sample < i; sample++) }
s->residual[channel][sample] = get_ur_golomb(&s->gb, tmp, 0, 0);
// s->residual[channel][sample] = get_se_golomb(&s->gb);
#endif
} }
i= 0;
} }
printf("partitions: %d, samples: %d\n", 1 << rice_order, sample); // av_log(s->avctx, AV_LOG_DEBUG, "partitions: %d, samples: %d\n", 1 << rice_order, sample);
return 0; return 0;
} }
@ -179,15 +201,15 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
{ {
int i; int i;
printf(" SUBFRAME FIXED\n"); av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n");
/* warm up samples */ /* warm up samples */
printf(" warm up samples: %d\n", pred_order); av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
for (i = 0; i < pred_order; i++) for (i = 0; i < pred_order; i++)
{ {
s->decoded[channel][i] = get_bits(&s->gb, s->curr_bps); s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
printf(" %d: %d\n", i, s->decoded[channel][i]); // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]);
} }
if (decode_residuals(s, channel, pred_order) < 0) if (decode_residuals(s, channel, pred_order) < 0)
@ -213,11 +235,8 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
case 3: case 3:
for (i = pred_order; i < s->blocksize; i++) for (i = pred_order; i < s->blocksize; i++)
s->decoded[channel][i] = s->residual[channel][i] + s->decoded[channel][i] = s->residual[channel][i] +
(((s->decoded[channel][i-1] - 3*(s->decoded[channel][i-1] - s->decoded[channel][i-2])
s->decoded[channel][i-2]) << 1) + + s->decoded[channel][i-3];
(s->decoded[channel][i-1] -
s->decoded[channel][i-2])) +
s->decoded[channel][i-3];
break; break;
case 4: case 4:
for (i = pred_order; i < s->blocksize; i++) for (i = pred_order; i < s->blocksize; i++)
@ -228,6 +247,9 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
(s->decoded[channel][i-2] << 1)) - (s->decoded[channel][i-2] << 1)) -
s->decoded[channel][i-4]; s->decoded[channel][i-4];
break; break;
default:
av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
return -1;
} }
return 0; return 0;
@ -239,31 +261,31 @@ static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order)
int coeff_prec, qlevel; int coeff_prec, qlevel;
int coeffs[pred_order]; int coeffs[pred_order];
printf(" SUBFRAME LPC\n"); // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
/* warm up samples */ /* warm up samples */
printf(" warm up samples: %d\n", pred_order); // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
for (i = 0; i < pred_order; i++) for (i = 0; i < pred_order; i++)
{ {
s->decoded[channel][i] = get_bits(&s->gb, s->curr_bps); s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
printf(" %d: %d\n", i, s->decoded[channel][i]); // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]);
} }
coeff_prec = get_bits(&s->gb, 4) + 1; coeff_prec = get_bits(&s->gb, 4) + 1;
if (coeff_prec == 16) if (coeff_prec == 16)
{ {
printf("invalid coeff precision\n"); av_log(s->avctx, AV_LOG_DEBUG, "invalid coeff precision\n");
return -1; return -1;
} }
printf(" qlp coeff prec: %d\n", coeff_prec); av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
qlevel = get_bits(&s->gb, 5); qlevel = get_sbits(&s->gb, 5);
printf(" quant level: %d\n", qlevel); av_log(s->avctx, AV_LOG_DEBUG, " quant level: %d\n", qlevel);
assert(qlevel >= 0); //FIXME
for (i = 0; i < pred_order; i++) for (i = 0; i < pred_order; i++)
{ {
coeffs[i] = get_bits(&s->gb, coeff_prec); coeffs[i] = get_sbits(&s->gb, coeff_prec);
printf(" %d: %d\n", i, coeffs[i]); // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, coeffs[i]);
} }
if (decode_residuals(s, channel, pred_order) < 0) if (decode_residuals(s, channel, pred_order) < 0)
@ -286,10 +308,17 @@ static inline int decode_subframe(FLACContext *s, int channel)
int i, tmp; int i, tmp;
s->curr_bps = s->bps; s->curr_bps = s->bps;
if(channel == 0){
if(s->order == RIGHT_SIDE)
s->curr_bps++;
}else{
if(s->order == LEFT_SIDE || s->order == MID_SIDE)
s->curr_bps++;
}
if (get_bits1(&s->gb)) if (get_bits1(&s->gb))
{ {
printf("invalid subframe padding\n"); av_log(s->avctx, AV_LOG_DEBUG, "invalid subframe padding\n");
return -1; return -1;
} }
type = get_bits(&s->gb, 6); type = get_bits(&s->gb, 6);
@ -303,43 +332,49 @@ static inline int decode_subframe(FLACContext *s, int channel)
// wasted++; // wasted++;
// s->curr_bps -= wasted; // s->curr_bps -= wasted;
// } // }
#if 0
wasted= 16 - av_log2(show_bits(&s->gb, 17));
skip_bits(&s->gb, wasted+1);
s->curr_bps -= wasted;
#else
if (get_bits1(&s->gb)) if (get_bits1(&s->gb))
{ {
wasted = 1; wasted = 1;
while (!get_bits1(&s->gb)) while (!get_bits1(&s->gb))
wasted++; wasted++;
s->curr_bps -= wasted; s->curr_bps -= wasted;
av_log(s->avctx, AV_LOG_DEBUG, "%d wasted bits\n", wasted);
} }
#endif
//FIXME use av_log2 for types
if (type == 0) if (type == 0)
{ {
printf("coding type: constant\n"); av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
tmp = get_bits(&s->gb, s->curr_bps); tmp = get_sbits(&s->gb, s->curr_bps);
for (i = 0; i < s->blocksize; i++) for (i = 0; i < s->blocksize; i++)
s->decoded[channel][i] = tmp; s->decoded[channel][i] = tmp;
} }
else if (type == 1) else if (type == 1)
{ {
printf("coding type: verbatim\n"); av_log(s->avctx, AV_LOG_DEBUG, "coding type: verbatim\n");
for (i = 0; i < s->blocksize; i++) for (i = 0; i < s->blocksize; i++)
s->decoded[channel][i] = get_bits(&s->gb, s->curr_bps); s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
} }
else if ((type >= 8) && (type <= 12)) else if ((type >= 8) && (type <= 12))
{ {
printf("coding type: fixed\n"); av_log(s->avctx, AV_LOG_DEBUG, "coding type: fixed\n");
if (decode_subframe_fixed(s, channel, type & ~0x8) < 0) if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
return -1; return -1;
} }
else if (type >= 32) else if (type >= 32)
{ {
printf("coding type: lpc\n"); // av_log(s->avctx, AV_LOG_DEBUG, "coding type: lpc\n");
if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0) if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0)
return -1; return -1;
} }
else else
{ {
printf("invalid coding type\n"); av_log(s->avctx, AV_LOG_DEBUG, "invalid coding type\n");
return -1; return -1;
} }
@ -358,45 +393,35 @@ static int decode_frame(FLACContext *s)
int blocksize_code, sample_rate_code, sample_size_code, assignment, i; int blocksize_code, sample_rate_code, sample_size_code, assignment, i;
blocksize_code = get_bits(&s->gb, 4); blocksize_code = get_bits(&s->gb, 4);
if (blocksize_code == 0)
s->blocksize = s->min_blocksize;
else if (blocksize_code == 1)
s->blocksize = 192;
else if (blocksize_code <= 5)
s->blocksize = 576 << (blocksize_code - 2);
else if (blocksize_code >= 8)
s->blocksize = 256 << (blocksize_code - 8);
sample_rate_code = get_bits(&s->gb, 4); sample_rate_code = get_bits(&s->gb, 4);
if ((sample_rate_code > 3) && (sample_rate_code < 12))
s->samplerate = sample_rate_table[sample_rate_code];
assignment = get_bits(&s->gb, 4); /* channel assignment */ assignment = get_bits(&s->gb, 4); /* channel assignment */
if (assignment < 8) if (assignment < 8)
{ {
s->order = INDEPENDENT; s->order = INDEPENDENT;
if (s->channels != assignment+1) if (s->channels != assignment+1)
printf("channel number and number of assigned channels differ!\n"); av_log(s->avctx, AV_LOG_DEBUG, "channel number and number of assigned channels differ!\n");
printf("channels: %d\n", assignment+1); av_log(s->avctx, AV_LOG_DEBUG, "channels: %d\n", assignment+1);
} }
else if (assignment == 8) else if (assignment == 8)
{ {
s->order = LEFT_SIDE; s->order = LEFT_SIDE;
printf("left/side\n"); av_log(s->avctx, AV_LOG_DEBUG, "left/side\n");
} }
else if (assignment == 9) else if (assignment == 9)
{ {
s->order = RIGHT_SIDE; s->order = RIGHT_SIDE;
printf("right/side\n"); av_log(s->avctx, AV_LOG_DEBUG, "right/side\n");
} }
else if (assignment == 10) else if (assignment == 10)
{ {
s->order = MID_SIDE; s->order = MID_SIDE;
printf("mid/side\n"); av_log(s->avctx, AV_LOG_DEBUG, "mid/side\n");
} }
else else
{ {
printf("unsupported channel assignment\n"); av_log(s->avctx, AV_LOG_DEBUG, "unsupported channel assignment\n");
return -1; return -1;
} }
@ -406,63 +431,80 @@ static int decode_frame(FLACContext *s)
} }
sample_size_code = get_bits(&s->gb, 3); sample_size_code = get_bits(&s->gb, 3);
if (s->bps != 0) if (sample_size_code != 0)
s->bps = sample_size_table[sample_size_code]; s->bps = sample_size_table[sample_size_code];
if ((sample_size_code == 3) || (sample_size_code == 7)) if ((sample_size_code == 3) || (sample_size_code == 7))
{ {
printf("invalid sample size code (%d)\n", sample_size_code); av_log(s->avctx, AV_LOG_DEBUG, "invalid sample size code (%d)\n", sample_size_code);
return -1; return -1;
} }
if (get_bits1(&s->gb)) if (get_bits1(&s->gb))
{ {
printf("broken stream, invalid padding\n"); av_log(s->avctx, AV_LOG_DEBUG, "broken stream, invalid padding\n");
// return -1; // return -1;
} }
if (((blocksize_code == 6) || (blocksize_code == 7)) && if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
(s->min_blocksize != s->max_blocksize)) (s->min_blocksize != s->max_blocksize)){
{ if(get_utf8(&s->gb) < 0){
get_uvlc(&s->gb, 1); av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
} return -1;
else
get_uvlc(&s->gb, 0);
if (blocksize_code == 6)
s->blocksize = get_bits(&s->gb, 8)+1;
if (blocksize_code == 7)
s->blocksize = get_bits(&s->gb, 16)+1;
if ((sample_rate_code > 11) && (sample_rate_code < 15))
{
switch(sample_rate_code)
{
case 12:
s->samplerate = get_bits(&s->gb, 8) * 1000;
break;
case 13:
s->samplerate = get_bits(&s->gb, 16);
break;
case 14:
s->samplerate = get_bits(&s->gb, 16) * 10;
break;
} }
}else{
if(get_utf8(&s->gb) < 0){
av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
return -1;
}
}
if (blocksize_code == 0)
s->blocksize = s->min_blocksize;
else if (blocksize_code == 1)
s->blocksize = 192;
else if (blocksize_code <= 5)
s->blocksize = 576 << (blocksize_code - 2);
else if (blocksize_code == 6)
s->blocksize = get_bits(&s->gb, 8)+1;
else if (blocksize_code == 7)
s->blocksize = get_bits(&s->gb, 16)+1;
else if (blocksize_code >= 8)
s->blocksize = 256 << (blocksize_code - 8);
if(s->blocksize > s->max_blocksize){
av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", s->blocksize, s->max_blocksize);
return -1;
}
if (sample_rate_code == 0){
//Streaminfo
}else if ((sample_rate_code > 3) && (sample_rate_code < 12))
s->samplerate = sample_rate_table[sample_rate_code];
else if (sample_rate_code == 12)
s->samplerate = get_bits(&s->gb, 8) * 1000;
else if (sample_rate_code == 13)
s->samplerate = get_bits(&s->gb, 16);
else if (sample_rate_code == 14)
s->samplerate = get_bits(&s->gb, 16) * 10;
else{
av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
return -1;
} }
skip_bits(&s->gb, 8); /* header crc */ skip_bits(&s->gb, 8); /* header crc */
dump_headers(s); // dump_headers(s);
/* subframes */ /* subframes */
for (i = 0; i < s->channels; i++) for (i = 0; i < s->channels; i++)
{ {
if (s->blocksize != s->last_blocksize) /* if (s->blocksize != s->last_blocksize)
{ {
s->decoded[i] = av_realloc(s->decoded[i], sizeof(uint32_t)*s->blocksize); s->decoded[i] = av_realloc(s->decoded[i], sizeof(uint32_t)*s->blocksize);
s->residual[i] = av_realloc(s->residual[i], sizeof(uint8_t)*s->blocksize); s->residual[i] = av_realloc(s->residual[i], sizeof(uint8_t)*s->blocksize);
} }*/
printf("decoded: %x residual: %x\n", s->decoded[i], s->residual[i]); // av_log(s->avctx, AV_LOG_DEBUG, "decoded: %x residual: %x\n", s->decoded[i], s->residual[i]);
if (decode_subframe(s, i) < 0) if (decode_subframe(s, i) < 0)
return -1; return -1;
} }
@ -480,52 +522,88 @@ static int flac_decode_frame(AVCodecContext *avctx,
uint8_t *buf, int buf_size) uint8_t *buf, int buf_size)
{ {
FLACContext *s = avctx->priv_data; FLACContext *s = avctx->priv_data;
int metadata_flag, metadata_type, metadata_size; int metadata_last, metadata_type, metadata_size;
int tmp = 0, i, j = 0; int tmp = 0, i, j = 0, input_buf_size;
int16_t *samples = data, *left, *right; int16_t *samples = data, *left, *right;
*data_size = 0; *data_size = 0;
s->avctx = avctx; s->avctx = avctx;
if(s->max_framesize == 0){
s->max_framesize= 8192; // should hopefully be enough for the first header
s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
}
if(1 && s->max_framesize){//FIXME truncated
buf_size= FFMIN(buf_size, s->max_framesize - s->bitstream_size);
input_buf_size= buf_size;
if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
// printf("memmove\n");
memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
s->bitstream_index=0;
}
memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
buf= &s->bitstream[s->bitstream_index];
buf_size += s->bitstream_size;
s->bitstream_size= buf_size;
if(buf_size < s->max_framesize){
// printf("wanna more data ...\n");
return input_buf_size;
}
}
init_get_bits(&s->gb, buf, buf_size*8); init_get_bits(&s->gb, buf, buf_size*8);
/* fLaC signature (be) */ /* fLaC signature (be) */
if (get_bits_long(&s->gb, 32) == bswap_32(ff_get_fourcc("fLaC"))) if (show_bits_long(&s->gb, 32) == bswap_32(ff_get_fourcc("fLaC")))
{ {
printf("STREAM HEADER\n"); skip_bits(&s->gb, 32);
av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n");
do { do {
metadata_flag = get_bits(&s->gb, 1); metadata_last = get_bits(&s->gb, 1);
metadata_type = get_bits(&s->gb, 7); metadata_type = get_bits(&s->gb, 7);
metadata_size = get_bits_long(&s->gb, 24); metadata_size = get_bits_long(&s->gb, 24);
printf(" metadata block: flag = %d, type = %d, size = %d\n", av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n",
metadata_flag, metadata_type, metadata_last, metadata_type,
metadata_size); metadata_size);
if(metadata_size){
switch(metadata_type) switch(metadata_type)
{ {
case METADATA_TYPE_STREAMINFO: case METADATA_TYPE_STREAMINFO:
if(metadata_size == 0)
av_log(s->avctx, AV_LOG_DEBUG, "size= 0 WTF!?\n");
metadata_streaminfo(s); metadata_streaminfo(s);
dump_headers(s); dump_headers(s);
break; break;
default: default:
while ((metadata_size -= 8) > 0) for(i=0; i<metadata_size; i++)
skip_bits(&s->gb, 8); skip_bits(&s->gb, 8);
}
} }
} while(metadata_flag != 1); } while(!metadata_last);
} }
else else
{ {
init_get_bits(&s->gb, buf, buf_size*8);
tmp = get_bits(&s->gb, 16);
if (tmp == 0xfff8)
printf("FRAME HEADER\n");
tmp = show_bits(&s->gb, 16);
if(tmp != 0xFFF8){
av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
skip_bits(&s->gb, 8);
goto end; // we may not have enough bits left to decode a frame, so try next time
}
skip_bits(&s->gb, 16);
if (decode_frame(s) < 0) if (decode_frame(s) < 0)
return -1; return -1;
} }
#if 0 #if 0
/* fix the channel order here */ /* fix the channel order here */
if (s->order == MID_SIDE) if (s->order == MID_SIDE)
@ -562,7 +640,7 @@ static int flac_decode_frame(AVCodecContext *avctx,
samples[(s->blocksize*i)+j] = s->decoded[0][j] - s->decoded[i][j]; samples[(s->blocksize*i)+j] = s->decoded[0][j] - s->decoded[i][j];
break; break;
// case MID_SIDE: // case MID_SIDE:
// printf("mid-side unsupported\n"); // av_log(s->avctx, AV_LOG_DEBUG, "mid-side unsupported\n");
} }
*data_size += s->blocksize; *data_size += s->blocksize;
} }
@ -571,11 +649,10 @@ static int flac_decode_frame(AVCodecContext *avctx,
switch(s->order) switch(s->order)
{ {
case INDEPENDENT: case INDEPENDENT:
for (i = 0; i < s->channels; i++) for (j = 0; j < s->blocksize; j++)
{ {
for (j = 0; j < s->blocksize; j++) for (i = 0; i < s->channels; i++)
*(samples++) = s->decoded[i][j]; *(samples++) = s->decoded[i][j];
*data_size += s->blocksize;
} }
break; break;
case LEFT_SIDE: case LEFT_SIDE:
@ -585,7 +662,6 @@ static int flac_decode_frame(AVCodecContext *avctx,
*(samples++) = s->decoded[0][i]; *(samples++) = s->decoded[0][i];
*(samples++) = s->decoded[0][i] - s->decoded[1][i]; *(samples++) = s->decoded[0][i] - s->decoded[1][i];
} }
*data_size = 2*s->blocksize;
break; break;
case RIGHT_SIDE: case RIGHT_SIDE:
assert(s->channels == 2); assert(s->channels == 2);
@ -594,13 +670,12 @@ static int flac_decode_frame(AVCodecContext *avctx,
*(samples++) = s->decoded[0][i] + s->decoded[1][i]; *(samples++) = s->decoded[0][i] + s->decoded[1][i];
*(samples++) = s->decoded[1][i]; *(samples++) = s->decoded[1][i];
} }
*data_size = 2*s->blocksize;
break; break;
case MID_SIDE: case MID_SIDE:
assert(s->channels == 2); assert(s->channels == 2);
for (i = 0; i < s->blocksize; i++) for (i = 0; i < s->blocksize; i++)
{ {
int16_t mid, side; int mid, side;
mid = s->decoded[0][i]; mid = s->decoded[0][i];
side = s->decoded[1][i]; side = s->decoded[1][i];
@ -610,17 +685,27 @@ static int flac_decode_frame(AVCodecContext *avctx,
*(samples++) = (mid + side) >> 1; *(samples++) = (mid + side) >> 1;
*(samples++) = (mid - side) >> 1; *(samples++) = (mid - side) >> 1;
} }
*data_size = 2*s->blocksize;
break; break;
} }
#endif #endif
// *data_size = (int8_t *)samples - (int8_t *)data; *data_size = (int8_t *)samples - (int8_t *)data;
printf("data size: %d\n", *data_size); av_log(s->avctx, AV_LOG_DEBUG, "data size: %d\n", *data_size);
s->last_blocksize = s->blocksize; // s->last_blocksize = s->blocksize;
end:
i= (get_bits_count(&s->gb)+7)/8;;
if(i > buf_size){
av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size);
return -1;
}
return (get_bits_count(&s->gb)+7)/8; if(s->bitstream_size){
s->bitstream_index += i;
s->bitstream_size -= i;
return input_buf_size;
}else
return i;
} }
static int flac_decode_close(AVCodecContext *avctx) static int flac_decode_close(AVCodecContext *avctx)
@ -630,11 +715,10 @@ static int flac_decode_close(AVCodecContext *avctx)
for (i = 0; i < s->channels; i++) for (i = 0; i < s->channels; i++)
{ {
if (s->decoded[i]) av_freep(&s->decoded[i]);
av_free(s->decoded[i]); av_freep(&s->residual[i]);
if (s->residual[i])
av_free(s->residual[i]);
} }
av_freep(&s->bitstream);
return 0; return 0;
} }

View File

@ -256,6 +256,14 @@ static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int
} }
} }
/**
* read unsigned golomb rice code (flac).
*/
static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len){
int v= get_ur_golomb_jpegls(gb, k, limit, esc_len);
return (v>>1) ^ -(v&1);
}
#ifdef TRACE #ifdef TRACE
static inline int get_ue(GetBitContext *s, char *file, char *func, int line){ static inline int get_ue(GetBitContext *s, char *file, char *func, int line){