frame size and use the function in the FLAC decoder and FLAC encoder Originally committed as revision 18092 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -83,8 +83,8 @@ OBJS-$(CONFIG_FFV1_DECODER) += ffv1.o rangecoder.o | |||||
| OBJS-$(CONFIG_FFV1_ENCODER) += ffv1.o rangecoder.o | OBJS-$(CONFIG_FFV1_ENCODER) += ffv1.o rangecoder.o | ||||
| OBJS-$(CONFIG_FFVHUFF_DECODER) += huffyuv.o | OBJS-$(CONFIG_FFVHUFF_DECODER) += huffyuv.o | ||||
| OBJS-$(CONFIG_FFVHUFF_ENCODER) += 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_DECODER) += flashsv.o | ||||
| OBJS-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.o | OBJS-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.o | ||||
| OBJS-$(CONFIG_FLIC_DECODER) += flicvideo.o | OBJS-$(CONFIG_FLIC_DECODER) += flicvideo.o | ||||
| @@ -346,17 +346,17 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcm.o | |||||
| # libavformat dependencies | # libavformat dependencies | ||||
| OBJS-$(CONFIG_EAC3_DEMUXER) += ac3_parser.o ac3tab.o aac_ac3_parser.o | 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_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_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_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o | ||||
| OBJS-$(CONFIG_MPEGTS_MUXER) += mpegvideo.o | OBJS-$(CONFIG_MPEGTS_MUXER) += mpegvideo.o | ||||
| OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.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 | OBJS-$(CONFIG_RTP_MUXER) += mpegvideo.o | ||||
| # external codec libraries | # external codec libraries | ||||
| @@ -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; | |||||
| } | |||||
| @@ -103,4 +103,12 @@ int ff_flac_is_extradata_valid(AVCodecContext *avctx, | |||||
| void ff_flac_parse_block_header(const uint8_t *block_header, | void ff_flac_parse_block_header(const uint8_t *block_header, | ||||
| int *last, int *type, int *size); | 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 */ | #endif /* AVCODEC_FLAC_H */ | ||||
| @@ -147,7 +147,8 @@ static void allocate_buffers(FLACContext *s) | |||||
| assert(s->max_blocksize); | assert(s->max_blocksize); | ||||
| if (s->max_framesize == 0 && 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++) { | for (i = 0; i < s->channels; i++) { | ||||
| @@ -345,11 +345,8 @@ static av_cold int flac_encode_init(AVCodecContext *avctx) | |||||
| s->options.lpc_coeff_precision); | s->options.lpc_coeff_precision); | ||||
| /* set maximum encoded frame size in verbatim mode */ | /* 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 */ | /* initialize MD5 context */ | ||||
| s->md5ctx = av_malloc(av_md5_size); | s->md5ctx = av_malloc(av_md5_size); | ||||