1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * FLAC (Free Lossless Audio Codec) decoder/demuxer common functions 3cabdff1aSopenharmony_ci * Copyright (c) 2008 Justin Ruggles 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * FLAC (Free Lossless Audio Codec) decoder/demuxer common functions 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#ifndef AVCODEC_FLAC_H 28cabdff1aSopenharmony_ci#define AVCODEC_FLAC_H 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "avcodec.h" 31cabdff1aSopenharmony_ci#include "bytestream.h" 32cabdff1aSopenharmony_ci#include "get_bits.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define FLAC_STREAMINFO_SIZE 34 35cabdff1aSopenharmony_ci#define FLAC_MAX_CHANNELS 8 36cabdff1aSopenharmony_ci#define FLAC_MIN_BLOCKSIZE 16 37cabdff1aSopenharmony_ci#define FLAC_MAX_BLOCKSIZE 65535 38cabdff1aSopenharmony_ci#define FLAC_MIN_FRAME_SIZE 11 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_cienum { 41cabdff1aSopenharmony_ci FLAC_CHMODE_INDEPENDENT = 0, 42cabdff1aSopenharmony_ci FLAC_CHMODE_LEFT_SIDE = 1, 43cabdff1aSopenharmony_ci FLAC_CHMODE_RIGHT_SIDE = 2, 44cabdff1aSopenharmony_ci FLAC_CHMODE_MID_SIDE = 3, 45cabdff1aSopenharmony_ci}; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_cienum { 48cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_STREAMINFO = 0, 49cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_PADDING, 50cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_APPLICATION, 51cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_SEEKTABLE, 52cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_VORBIS_COMMENT, 53cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_CUESHEET, 54cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_PICTURE, 55cabdff1aSopenharmony_ci FLAC_METADATA_TYPE_INVALID = 127 56cabdff1aSopenharmony_ci}; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_cienum FLACExtradataFormat { 59cabdff1aSopenharmony_ci FLAC_EXTRADATA_FORMAT_STREAMINFO = 0, 60cabdff1aSopenharmony_ci FLAC_EXTRADATA_FORMAT_FULL_HEADER = 1 61cabdff1aSopenharmony_ci}; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci#define FLACCOMMONINFO \ 64cabdff1aSopenharmony_ci int samplerate; /**< sample rate */\ 65cabdff1aSopenharmony_ci int channels; /**< number of channels */\ 66cabdff1aSopenharmony_ci int bps; /**< bits-per-sample */\ 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci/** 69cabdff1aSopenharmony_ci * Data needed from the Streaminfo header for use by the raw FLAC demuxer 70cabdff1aSopenharmony_ci * and/or the FLAC decoder. 71cabdff1aSopenharmony_ci */ 72cabdff1aSopenharmony_ci#define FLACSTREAMINFO \ 73cabdff1aSopenharmony_ci FLACCOMMONINFO \ 74cabdff1aSopenharmony_ci int max_blocksize; /**< maximum block size, in samples */\ 75cabdff1aSopenharmony_ci int max_framesize; /**< maximum frame size, in bytes */\ 76cabdff1aSopenharmony_ci int64_t samples; /**< total number of samples */\ 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_citypedef struct FLACStreaminfo { 79cabdff1aSopenharmony_ci FLACSTREAMINFO 80cabdff1aSopenharmony_ci} FLACStreaminfo; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_citypedef struct FLACFrameInfo { 83cabdff1aSopenharmony_ci FLACCOMMONINFO 84cabdff1aSopenharmony_ci int blocksize; /**< block size of the frame */ 85cabdff1aSopenharmony_ci int ch_mode; /**< channel decorrelation mode */ 86cabdff1aSopenharmony_ci int64_t frame_or_sample_num; /**< frame number or sample number */ 87cabdff1aSopenharmony_ci int is_var_size; /**< specifies if the stream uses variable 88cabdff1aSopenharmony_ci block sizes or a fixed block size; 89cabdff1aSopenharmony_ci also determines the meaning of 90cabdff1aSopenharmony_ci frame_or_sample_num */ 91cabdff1aSopenharmony_ci} FLACFrameInfo; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci/** 94cabdff1aSopenharmony_ci * Parse the Streaminfo metadata block 95cabdff1aSopenharmony_ci * @param[out] avctx codec context to set basic stream parameters 96cabdff1aSopenharmony_ci * @param[out] s where parsed information is stored 97cabdff1aSopenharmony_ci * @param[in] buffer pointer to start of 34-byte streaminfo data 98cabdff1aSopenharmony_ci * 99cabdff1aSopenharmony_ci * @return negative error code on faiure or >= 0 on success 100cabdff1aSopenharmony_ci */ 101cabdff1aSopenharmony_ciint ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, 102cabdff1aSopenharmony_ci const uint8_t *buffer); 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci/** 105cabdff1aSopenharmony_ci * Validate the FLAC extradata. 106cabdff1aSopenharmony_ci * @param[in] avctx codec context containing the extradata. 107cabdff1aSopenharmony_ci * @param[out] format extradata format. 108cabdff1aSopenharmony_ci * @param[out] streaminfo_start pointer to start of 34-byte STREAMINFO data. 109cabdff1aSopenharmony_ci * @return 1 if valid, 0 if not valid. 110cabdff1aSopenharmony_ci */ 111cabdff1aSopenharmony_ciint ff_flac_is_extradata_valid(AVCodecContext *avctx, 112cabdff1aSopenharmony_ci enum FLACExtradataFormat *format, 113cabdff1aSopenharmony_ci uint8_t **streaminfo_start); 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci/** 116cabdff1aSopenharmony_ci * Calculate an estimate for the maximum frame size based on verbatim mode. 117cabdff1aSopenharmony_ci * @param blocksize block size, in samples 118cabdff1aSopenharmony_ci * @param ch number of channels 119cabdff1aSopenharmony_ci * @param bps bits-per-sample 120cabdff1aSopenharmony_ci */ 121cabdff1aSopenharmony_ciint ff_flac_get_max_frame_size(int blocksize, int ch, int bps); 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci/** 124cabdff1aSopenharmony_ci * Validate and decode a frame header. 125cabdff1aSopenharmony_ci * @param avctx AVCodecContext to use as av_log() context 126cabdff1aSopenharmony_ci * @param gb GetBitContext from which to read frame header 127cabdff1aSopenharmony_ci * @param[out] fi frame information 128cabdff1aSopenharmony_ci * @param log_level_offset log level offset. can be used to silence error messages. 129cabdff1aSopenharmony_ci * @return non-zero on error, 0 if ok 130cabdff1aSopenharmony_ci */ 131cabdff1aSopenharmony_ciint ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, 132cabdff1aSopenharmony_ci FLACFrameInfo *fi, int log_level_offset); 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_civoid ff_flac_set_channel_layout(AVCodecContext *avctx, int channels); 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci/** 137cabdff1aSopenharmony_ci * Parse the metadata block parameters from the header. 138cabdff1aSopenharmony_ci * @param[in] block_header header data, at least 4 bytes 139cabdff1aSopenharmony_ci * @param[out] last indicator for last metadata block 140cabdff1aSopenharmony_ci * @param[out] type metadata block type 141cabdff1aSopenharmony_ci * @param[out] size metadata block size 142cabdff1aSopenharmony_ci */ 143cabdff1aSopenharmony_cistatic av_always_inline void flac_parse_block_header(const uint8_t *block_header, 144cabdff1aSopenharmony_ci int *last, int *type, int *size) 145cabdff1aSopenharmony_ci{ 146cabdff1aSopenharmony_ci int tmp = bytestream_get_byte(&block_header); 147cabdff1aSopenharmony_ci if (last) 148cabdff1aSopenharmony_ci *last = tmp & 0x80; 149cabdff1aSopenharmony_ci if (type) 150cabdff1aSopenharmony_ci *type = tmp & 0x7F; 151cabdff1aSopenharmony_ci if (size) 152cabdff1aSopenharmony_ci *size = bytestream_get_be24(&block_header); 153cabdff1aSopenharmony_ci} 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci#endif /* AVCODEC_FLAC_H */ 156