mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
put_bits can only reliably write up to 31 bit bits, above it relies on
undefined shift behaviour. Document this, fix the assert and add a put_bits32 to handle writing 32 bits and use that where necessary. Originally committed as revision 20124 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
ec65675504
commit
43d7c6118d
@ -123,7 +123,7 @@ static void write_frame_header(AlacEncodeContext *s, int is_verbatim)
|
||||
put_bits(&s->pbctx, 1, 1); // Sample count is in the header
|
||||
put_bits(&s->pbctx, 2, 0); // FIXME: Wasted bytes field
|
||||
put_bits(&s->pbctx, 1, is_verbatim); // Audio block is verbatim
|
||||
put_bits(&s->pbctx, 32, s->avctx->frame_size); // No. of samples in the frame
|
||||
put_bits32(&s->pbctx, s->avctx->frame_size); // No. of samples in the frame
|
||||
}
|
||||
|
||||
static void calc_predictor_params(AlacEncodeContext *s, int ch)
|
||||
|
@ -136,6 +136,10 @@ void ff_put_string(PutBitContext * pbc, const char *s, int terminate_string);
|
||||
*/
|
||||
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length);
|
||||
|
||||
/**
|
||||
* Write up to 31 bits into a bitstream.
|
||||
* Use put_bits32 to write 32 bits.
|
||||
*/
|
||||
static inline void put_bits(PutBitContext *s, int n, unsigned int value)
|
||||
#ifndef ALT_BITSTREAM_WRITER
|
||||
{
|
||||
@ -143,7 +147,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value)
|
||||
int bit_left;
|
||||
|
||||
// printf("put_bits=%d %x\n", n, value);
|
||||
assert(n == 32 || value < (1U << n));
|
||||
assert(n <= 31 && value < (1U << n));
|
||||
|
||||
bit_buf = s->bit_buf;
|
||||
bit_left = s->bit_left;
|
||||
@ -259,6 +263,22 @@ static inline void put_sbits(PutBitContext *pb, int bits, int32_t val)
|
||||
put_bits(pb, bits, val & ((1<<bits)-1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Write exactly 32 bits into a bitstream
|
||||
*/
|
||||
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
|
||||
{
|
||||
int lo = value & 0xffff;
|
||||
int hi = value >> 16;
|
||||
#ifdef ALT_BITSTREAM_WRITER_LE
|
||||
put_bits(s, 16, lo);
|
||||
put_bits(s, 16, hi);
|
||||
#else
|
||||
put_bits(s, 16, hi);
|
||||
put_bits(s, 16, lo);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the pointer to the byte where the bitstream writer will put
|
||||
* the next bit.
|
||||
|
@ -386,7 +386,7 @@ static void put_float(PutBitContext *pb, float f)
|
||||
mant = -mant;
|
||||
}
|
||||
res |= mant | (exp << 21);
|
||||
put_bits(pb, 32, res);
|
||||
put_bits32(pb, res);
|
||||
}
|
||||
|
||||
static void put_codebook_header(PutBitContext *pb, vorbis_enc_codebook *cb)
|
||||
@ -531,12 +531,12 @@ static int put_main_header(vorbis_enc_context *venc, uint8_t **out)
|
||||
init_put_bits(&pb, p, buffer_len);
|
||||
put_bits(&pb, 8, 1); //magic
|
||||
ff_put_string(&pb, "vorbis", 0);
|
||||
put_bits(&pb, 32, 0); // version
|
||||
put_bits32(&pb, 0); // version
|
||||
put_bits(&pb, 8, venc->channels);
|
||||
put_bits(&pb, 32, venc->sample_rate);
|
||||
put_bits(&pb, 32, 0); // bitrate
|
||||
put_bits(&pb, 32, 0); // bitrate
|
||||
put_bits(&pb, 32, 0); // bitrate
|
||||
put_bits32(&pb, venc->sample_rate);
|
||||
put_bits32(&pb, 0); // bitrate
|
||||
put_bits32(&pb, 0); // bitrate
|
||||
put_bits32(&pb, 0); // bitrate
|
||||
put_bits(&pb, 4, venc->log2_blocksize[0]);
|
||||
put_bits(&pb, 4, venc->log2_blocksize[1]);
|
||||
put_bits(&pb, 1, 1); // framing
|
||||
@ -550,8 +550,8 @@ static int put_main_header(vorbis_enc_context *venc, uint8_t **out)
|
||||
init_put_bits(&pb, p, buffer_len);
|
||||
put_bits(&pb, 8, 3); //magic
|
||||
ff_put_string(&pb, "vorbis", 0);
|
||||
put_bits(&pb, 32, 0); // vendor length TODO
|
||||
put_bits(&pb, 32, 0); // amount of comments
|
||||
put_bits32(&pb, 0); // vendor length TODO
|
||||
put_bits32(&pb, 0); // amount of comments
|
||||
put_bits(&pb, 1, 1); // framing
|
||||
|
||||
flush_put_bits(&pb);
|
||||
|
@ -89,7 +89,7 @@ static int put_pack_header(AVFormatContext *ctx,
|
||||
|
||||
init_put_bits(&pb, buf, 128);
|
||||
|
||||
put_bits(&pb, 32, PACK_START_CODE);
|
||||
put_bits32(&pb, PACK_START_CODE);
|
||||
if (s->is_mpeg2) {
|
||||
put_bits(&pb, 2, 0x1);
|
||||
} else {
|
||||
@ -125,7 +125,7 @@ static int put_system_header(AVFormatContext *ctx, uint8_t *buf,int only_for_str
|
||||
|
||||
init_put_bits(&pb, buf, 128);
|
||||
|
||||
put_bits(&pb, 32, SYSTEM_HEADER_START_CODE);
|
||||
put_bits32(&pb, SYSTEM_HEADER_START_CODE);
|
||||
put_bits(&pb, 16, 0);
|
||||
put_bits(&pb, 1, 1);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user