]> git.sesse.net Git - ffmpeg/blob - libavcodec/tak.h
Merge commit '97bf7c03b1338a867da52c159a2afecbdedcfa88'
[ffmpeg] / libavcodec / tak.h
1 /*
2  * TAK decoder/demuxer common code
3  * Copyright (c) 2012 Paul B Mahol
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * TAK (Tom's lossless Audio Kompressor) decoder/demuxer common functions
25  */
26
27 #ifndef AVCODEC_TAK_H
28 #define AVCODEC_TAK_H
29
30 #define BITSTREAM_READER_LE
31 #include "get_bits.h"
32 #include "avcodec.h"
33
34 #define TAK_FORMAT_DATA_TYPE_BITS    3
35 #define TAK_FORMAT_SAMPLE_RATE_BITS  18
36 #define TAK_FORMAT_BPS_BITS          5
37 #define TAK_FORMAT_CHANNEL_BITS      4
38 #define TAK_FORMAT_VALID_BITS        5
39 #define TAK_FORMAT_CH_LAYOUT_BITS    6
40 #define TAK_SIZE_FRAME_DURATION_BITS 4
41 #define TAK_SIZE_SAMPLES_NUM_BITS    35
42 #define TAK_LAST_FRAME_POS_BITS      40
43 #define TAK_LAST_FRAME_SIZE_BITS     24
44 #define TAK_ENCODER_CODEC_BITS       6
45 #define TAK_ENCODER_PROFILE_BITS     4
46 #define TAK_ENCODER_VERSION_BITS     24
47 #define TAK_SAMPLE_RATE_MIN          6000
48 #define TAK_CHANNELS_MIN             1
49 #define TAK_BPS_MIN                  8
50 #define TAK_FRAME_HEADER_FLAGS_BITS         3
51 #define TAK_FRAME_HEADER_SYNC_ID            0xA0FF
52 #define TAK_FRAME_HEADER_SYNC_ID_BITS       16
53 #define TAK_FRAME_HEADER_SAMPLE_COUNT_BITS  14
54 #define TAK_FRAME_HEADER_NO_BITS            21
55 #define TAK_FRAME_DURATION_QUANT_SHIFT      5
56 #define TAK_CRC24_BITS                      24
57
58 #define TAK_MAX_CHANNELS                  ( 1 << TAK_FORMAT_CHANNEL_BITS )
59
60 #define TAK_MIN_FRAME_HEADER_BITS         ( TAK_FRAME_HEADER_SYNC_ID_BITS + \
61                                             TAK_FRAME_HEADER_FLAGS_BITS   + \
62                                             TAK_FRAME_HEADER_NO_BITS      + \
63                                             TAK_CRC24_BITS )
64
65 #define TAK_MIN_FRAME_HEADER_LAST_BITS    ( TAK_MIN_FRAME_HEADER_BITS + 2 + \
66                                             TAK_FRAME_HEADER_SAMPLE_COUNT_BITS )
67
68 #define TAK_ENCODER_BITS         ( TAK_ENCODER_CODEC_BITS        + \
69                                    TAK_ENCODER_PROFILE_BITS )
70
71 #define TAK_SIZE_BITS            ( TAK_SIZE_SAMPLES_NUM_BITS     + \
72                                    TAK_SIZE_FRAME_DURATION_BITS )
73
74 #define TAK_FORMAT_BITS          ( TAK_FORMAT_DATA_TYPE_BITS     + \
75                                    TAK_FORMAT_SAMPLE_RATE_BITS   + \
76                                    TAK_FORMAT_BPS_BITS           + \
77                                    TAK_FORMAT_CHANNEL_BITS + 1   + \
78                                    TAK_FORMAT_VALID_BITS   + 1   + \
79                                    TAK_FORMAT_CH_LAYOUT_BITS     * \
80                                    TAK_MAX_CHANNELS )
81
82 #define TAK_STREAMINFO_BITS      ( TAK_ENCODER_BITS              + \
83                                    TAK_SIZE_BITS                 + \
84                                    TAK_FORMAT_BITS )
85
86 #define TAK_MAX_FRAME_HEADER_BITS  ( TAK_MIN_FRAME_HEADER_LAST_BITS + \
87                                      TAK_STREAMINFO_BITS + 31 )
88
89 #define TAK_STREAMINFO_BYTES        (( TAK_STREAMINFO_BITS + 7 ) / 8)
90 #define TAK_MAX_FRAME_HEADER_BYTES  (( TAK_MAX_FRAME_HEADER_BITS + 7 ) / 8)
91 #define TAK_MIN_FRAME_HEADER_BYTES  (( TAK_MIN_FRAME_HEADER_BITS + 7 ) / 8)
92
93 enum TAKMetaDataType {
94     TAK_METADATA_END = 0,
95     TAK_METADATA_STREAMINFO,
96     TAK_METADATA_SEEKTABLE,
97     TAK_METADATA_SIMPLE_WAVE_DATA,
98     TAK_METADATA_ENCODER,
99     TAK_METADATA_PADDING,
100     TAK_METADATA_MD5,
101     TAK_METADATA_LAST_FRAME,
102 };
103
104 enum TAKFrameSizeType {
105     TAK_FST_94ms = 0,
106     TAK_FST_125ms,
107     TAK_FST_188ms,
108     TAK_FST_250ms,
109     TAK_FST_4096,
110     TAK_FST_8192,
111     TAK_FST_16384,
112     TAK_FST_512,
113     TAK_FST_1024,
114     TAK_FST_2048,
115 };
116
117 typedef struct TAKStreamInfo {
118     int      codec;
119     int      data_type;
120     int      sample_rate;
121     int      channels;
122     int      bps;
123     int      frame_num;
124     int      frame_samples;
125     int      last_frame_samples;
126     uint64_t ch_layout;
127     int64_t  samples;
128 } TAKStreamInfo;
129
130 void ff_tak_init_crc(void);
131
132 int ff_tak_check_crc(const uint8_t *buf, unsigned int buf_size);
133
134 /**
135  * Parse the Streaminfo metadata block
136  * @param[in]  gb      pointer to GetBitContext
137  * @param[out] s       where parsed information is stored
138  */
139 void avpriv_tak_parse_streaminfo(GetBitContext *gb, TAKStreamInfo *s);
140
141 /**
142  * Validate and decode a frame header.
143  * @param      avctx AVCodecContext to use as av_log() context
144  * @param[in]  gb    GetBitContext from which to read frame header
145  * @param[out] s     frame information
146  * @param      log_level_offset  log level offset. can be used to silence error messages.
147  * @return non-zero on error, 0 if ok
148  */
149 int ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
150                                TAKStreamInfo *s, int log_level_offset);
151 #endif /* AVCODEC_TAK_H */