diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-03 17:27:31 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-11 12:49:22 -0500 |
commit | b590f3a7bf9103ac7a7a61c48568676201d6824b (patch) | |
tree | f8b6cdf3b6f40899885ae3ad3698a7f4ff6e9313 | |
parent | ba821b098b5748e46db0fea875679365b33110e3 (diff) | |
download | ffmpeg-b590f3a7bf9103ac7a7a61c48568676201d6824b.tar.gz |
alacenc: only encode frame size in header for a final smaller frame
Otherwise it is not needed because it matches the frame size as encoded in
the extradata.
-rw-r--r-- | libavcodec/alacenc.c | 13 | ||||
-rw-r--r-- | tests/ref/acodec/alac | 4 |
2 files changed, 12 insertions, 5 deletions
diff --git a/libavcodec/alacenc.c b/libavcodec/alacenc.c index 88b2f82669..d2a24b145c 100644 --- a/libavcodec/alacenc.c +++ b/libavcodec/alacenc.c @@ -120,12 +120,18 @@ static void encode_scalar(AlacEncodeContext *s, int x, static void write_frame_header(AlacEncodeContext *s, int is_verbatim) { + int encode_fs = 0; + + if (s->frame_size < DEFAULT_FRAME_SIZE) + encode_fs = 1; + put_bits(&s->pbctx, 3, s->avctx->channels-1); // No. of channels -1 put_bits(&s->pbctx, 16, 0); // Seems to be zero - put_bits(&s->pbctx, 1, 1); // Sample count is in the header + put_bits(&s->pbctx, 1, encode_fs); // 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_bits32(&s->pbctx, s->frame_size); // No. of samples in the frame + if (encode_fs) + put_bits32(&s->pbctx, s->frame_size); // No. of samples in the frame } static void calc_predictor_params(AlacEncodeContext *s, int ch) @@ -380,7 +386,8 @@ static void write_compressed_frame(AlacEncodeContext *s) static av_always_inline int get_max_frame_size(int frame_size, int ch, int bps) { - return FFALIGN(55 + bps * ch * frame_size + 3, 8) / 8; + int header_bits = 23 + 32 * (frame_size < DEFAULT_FRAME_SIZE); + return FFALIGN(header_bits + bps * ch * frame_size + 3, 8) / 8; } static av_cold int alac_encode_close(AVCodecContext *avctx) diff --git a/tests/ref/acodec/alac b/tests/ref/acodec/alac index cef12d0744..02752cf31d 100644 --- a/tests/ref/acodec/alac +++ b/tests/ref/acodec/alac @@ -1,4 +1,4 @@ -db1806d9ffd85c168c2c71a28e6d9229 *./tests/data/acodec/alac.m4a -389410 ./tests/data/acodec/alac.m4a +b9e78aa8b8774a63d187380a47201a37 *./tests/data/acodec/alac.m4a +389154 ./tests/data/acodec/alac.m4a 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/alac.acodec.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 |