yading@10: /* yading@10: * FLAC (Free Lossless Audio Codec) decoder/demuxer common functions yading@10: * Copyright (c) 2008 Justin Ruggles yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: /** yading@10: * @file yading@10: * FLAC (Free Lossless Audio Codec) decoder/demuxer common functions yading@10: */ yading@10: yading@10: #ifndef AVCODEC_FLAC_H yading@10: #define AVCODEC_FLAC_H yading@10: yading@10: #include "avcodec.h" yading@10: #include "get_bits.h" yading@10: yading@10: #define FLAC_STREAMINFO_SIZE 34 yading@10: #define FLAC_MAX_CHANNELS 8 yading@10: #define FLAC_MIN_BLOCKSIZE 16 yading@10: #define FLAC_MAX_BLOCKSIZE 65535 yading@10: #define FLAC_MIN_FRAME_SIZE 11 yading@10: yading@10: enum { yading@10: FLAC_CHMODE_INDEPENDENT = 0, yading@10: FLAC_CHMODE_LEFT_SIDE = 1, yading@10: FLAC_CHMODE_RIGHT_SIDE = 2, yading@10: FLAC_CHMODE_MID_SIDE = 3, yading@10: }; yading@10: yading@10: enum { yading@10: FLAC_METADATA_TYPE_STREAMINFO = 0, yading@10: FLAC_METADATA_TYPE_PADDING, yading@10: FLAC_METADATA_TYPE_APPLICATION, yading@10: FLAC_METADATA_TYPE_SEEKTABLE, yading@10: FLAC_METADATA_TYPE_VORBIS_COMMENT, yading@10: FLAC_METADATA_TYPE_CUESHEET, yading@10: FLAC_METADATA_TYPE_PICTURE, yading@10: FLAC_METADATA_TYPE_INVALID = 127 yading@10: }; yading@10: yading@10: enum FLACExtradataFormat { yading@10: FLAC_EXTRADATA_FORMAT_STREAMINFO = 0, yading@10: FLAC_EXTRADATA_FORMAT_FULL_HEADER = 1 yading@10: }; yading@10: yading@10: #define FLACCOMMONINFO \ yading@10: int samplerate; /**< sample rate */\ yading@10: int channels; /**< number of channels */\ yading@10: int bps; /**< bits-per-sample */\ yading@10: yading@10: /** yading@10: * Data needed from the Streaminfo header for use by the raw FLAC demuxer yading@10: * and/or the FLAC decoder. yading@10: */ yading@10: #define FLACSTREAMINFO \ yading@10: FLACCOMMONINFO \ yading@10: int max_blocksize; /**< maximum block size, in samples */\ yading@10: int max_framesize; /**< maximum frame size, in bytes */\ yading@10: int64_t samples; /**< total number of samples */\ yading@10: yading@10: typedef struct FLACStreaminfo { yading@10: FLACSTREAMINFO yading@10: } FLACStreaminfo; yading@10: yading@10: typedef struct FLACFrameInfo { yading@10: FLACCOMMONINFO yading@10: int blocksize; /**< block size of the frame */ yading@10: int ch_mode; /**< channel decorrelation mode */ yading@10: int64_t frame_or_sample_num; /**< frame number or sample number */ yading@10: int is_var_size; /**< specifies if the stream uses variable yading@10: block sizes or a fixed block size; yading@10: also determines the meaning of yading@10: frame_or_sample_num */ yading@10: } FLACFrameInfo; yading@10: yading@10: /** yading@10: * Parse the Streaminfo metadata block yading@10: * @param[out] avctx codec context to set basic stream parameters yading@10: * @param[out] s where parsed information is stored yading@10: * @param[in] buffer pointer to start of 34-byte streaminfo data yading@10: */ yading@10: void avpriv_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, yading@10: const uint8_t *buffer); yading@10: yading@10: /** yading@10: * Validate the FLAC extradata. yading@10: * @param[in] avctx codec context containing the extradata. yading@10: * @param[out] format extradata format. yading@10: * @param[out] streaminfo_start pointer to start of 34-byte STREAMINFO data. yading@10: * @return 1 if valid, 0 if not valid. yading@10: */ yading@10: int avpriv_flac_is_extradata_valid(AVCodecContext *avctx, yading@10: enum FLACExtradataFormat *format, yading@10: uint8_t **streaminfo_start); yading@10: yading@10: /** yading@10: * Parse the metadata block parameters from the header. yading@10: * @param[in] block_header header data, at least 4 bytes yading@10: * @param[out] last indicator for last metadata block yading@10: * @param[out] type metadata block type yading@10: * @param[out] size metadata block size yading@10: */ yading@10: void avpriv_flac_parse_block_header(const uint8_t *block_header, yading@10: int *last, int *type, int *size); yading@10: yading@10: /** yading@10: * Calculate an estimate for the maximum frame size based on verbatim mode. yading@10: * @param blocksize block size, in samples yading@10: * @param ch number of channels yading@10: * @param bps bits-per-sample yading@10: */ yading@10: int ff_flac_get_max_frame_size(int blocksize, int ch, int bps); yading@10: yading@10: /** yading@10: * Validate and decode a frame header. yading@10: * @param avctx AVCodecContext to use as av_log() context yading@10: * @param gb GetBitContext from which to read frame header yading@10: * @param[out] fi frame information yading@10: * @param log_level_offset log level offset. can be used to silence error messages. yading@10: * @return non-zero on error, 0 if ok yading@10: */ yading@10: int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, yading@10: FLACFrameInfo *fi, int log_level_offset); yading@10: yading@10: void ff_flac_set_channel_layout(AVCodecContext *avctx); yading@10: yading@10: #endif /* AVCODEC_FLAC_H */