# HG changeset patch # User jbr # Date 1237600471 0 # Node ID 64246d9e583ae1db5940cde345591a0c8825568d # Parent d6b9123556fb17cb3a78884f4b0050d88598c5e5 add a function to calculate a more accurate estimate for maximum FLAC frame size and use the function in the FLAC decoder and FLAC encoder diff -r d6b9123556fb -r 64246d9e583a Makefile --- a/Makefile Sat Mar 21 01:27:28 2009 +0000 +++ b/Makefile Sat Mar 21 01:54:31 2009 +0000 @@ -83,8 +83,8 @@ OBJS-$(CONFIG_FFV1_ENCODER) += ffv1.o rangecoder.o OBJS-$(CONFIG_FFVHUFF_DECODER) += huffyuv.o OBJS-$(CONFIG_FFVHUFF_ENCODER) += huffyuv.o -OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o -OBJS-$(CONFIG_FLAC_ENCODER) += flacenc.o flacdata.o lpc.o +OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o flac.o +OBJS-$(CONFIG_FLAC_ENCODER) += flacenc.o flacdata.o flac.o lpc.o OBJS-$(CONFIG_FLASHSV_DECODER) += flashsv.o OBJS-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.o OBJS-$(CONFIG_FLIC_DECODER) += flicvideo.o @@ -346,17 +346,17 @@ # libavformat dependencies OBJS-$(CONFIG_EAC3_DEMUXER) += ac3_parser.o ac3tab.o aac_ac3_parser.o -OBJS-$(CONFIG_FLAC_DEMUXER) += flacdec.o flacdata.o -OBJS-$(CONFIG_FLAC_MUXER) += flacdec.o flacdata.o +OBJS-$(CONFIG_FLAC_DEMUXER) += flacdec.o flacdata.o flac.o +OBJS-$(CONFIG_FLAC_MUXER) += flacdec.o flacdata.o flac.o OBJS-$(CONFIG_GXF_DEMUXER) += mpeg12data.o -OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += xiph.o mpeg4audio.o flacdec.o flacdata.o +OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += xiph.o mpeg4audio.o flacdec.o flacdata.o flac.o OBJS-$(CONFIG_MATROSKA_DEMUXER) += mpeg4audio.o -OBJS-$(CONFIG_MATROSKA_MUXER) += xiph.o mpeg4audio.o flacdec.o flacdata.o +OBJS-$(CONFIG_MATROSKA_MUXER) += xiph.o mpeg4audio.o flacdec.o flacdata.o flac.o OBJS-$(CONFIG_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o OBJS-$(CONFIG_MPEGTS_MUXER) += mpegvideo.o OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o -OBJS-$(CONFIG_OGG_DEMUXER) += flacdec.o flacdata.o -OBJS-$(CONFIG_OGG_MUXER) += xiph.o flacdec.o flacdata.o +OBJS-$(CONFIG_OGG_DEMUXER) += flacdec.o flacdata.o flac.o +OBJS-$(CONFIG_OGG_MUXER) += xiph.o flacdec.o flacdata.o flac.o OBJS-$(CONFIG_RTP_MUXER) += mpegvideo.o # external codec libraries diff -r d6b9123556fb -r 64246d9e583a flac.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flac.c Sat Mar 21 01:54:31 2009 +0000 @@ -0,0 +1,43 @@ +/* + * FLAC common code + * Copyright (c) 2009 Justin Ruggles + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "flac.h" + +int ff_flac_get_max_frame_size(int blocksize, int ch, int bps) +{ + /* Technically, there is no limit to FLAC frame size, but an encoder + should not write a frame that is larger than if verbatim encoding mode + were to be used. */ + + int count; + + count = 16; /* frame header */ + count += ch * ((7+bps+7)/8); /* subframe headers */ + if (ch == 2) { + /* for stereo, need to account for using decorrelation */ + count += (( 2*bps+1) * blocksize + 7) / 8; + } else { + count += ( ch*bps * blocksize + 7) / 8; + } + count += 2; /* frame footer */ + + return count; +} diff -r d6b9123556fb -r 64246d9e583a flac.h --- a/flac.h Sat Mar 21 01:27:28 2009 +0000 +++ b/flac.h Sat Mar 21 01:54:31 2009 +0000 @@ -103,4 +103,12 @@ void ff_flac_parse_block_header(const uint8_t *block_header, int *last, int *type, int *size); +/** + * Calculate an estimate for the maximum frame size based on verbatim mode. + * @param blocksize block size, in samples + * @param ch number of channels + * @param bps bits-per-sample + */ +int ff_flac_get_max_frame_size(int blocksize, int ch, int bps); + #endif /* AVCODEC_FLAC_H */ diff -r d6b9123556fb -r 64246d9e583a flacdec.c --- a/flacdec.c Sat Mar 21 01:27:28 2009 +0000 +++ b/flacdec.c Sat Mar 21 01:54:31 2009 +0000 @@ -147,7 +147,8 @@ assert(s->max_blocksize); if (s->max_framesize == 0 && s->max_blocksize) { - s->max_framesize = 23 + (s->channels * s->bps * s->max_blocksize + 7) / 8; + s->max_framesize = ff_flac_get_max_frame_size(s->max_blocksize, + s->channels, s->bps); } for (i = 0; i < s->channels; i++) { diff -r d6b9123556fb -r 64246d9e583a flacenc.c --- a/flacenc.c Sat Mar 21 01:27:28 2009 +0000 +++ b/flacenc.c Sat Mar 21 01:54:31 2009 +0000 @@ -345,11 +345,8 @@ s->options.lpc_coeff_precision); /* set maximum encoded frame size in verbatim mode */ - if(s->channels == 2) { - s->max_framesize = 14 + ((s->avctx->frame_size * 33 + 7) >> 3); - } else { - s->max_framesize = 14 + (s->avctx->frame_size * s->channels * 2); - } + s->max_framesize = ff_flac_get_max_frame_size(s->avctx->frame_size, + s->channels, 16); /* initialize MD5 context */ s->md5ctx = av_malloc(av_md5_size);