Merge commit '57231e4d5b467833fb289439cd35a92513bb55c1'
[ffmpeg.git] / 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 #include <stdint.h>
31
32 #define BITSTREAM_READER_LE
33 #include "get_bits.h"
34 #include "avcodec.h"
35
36 #define TAK_FORMAT_DATA_TYPE_BITS              3
37 #define TAK_FORMAT_SAMPLE_RATE_BITS            18
38 #define TAK_FORMAT_BPS_BITS                    5
39 #define TAK_FORMAT_CHANNEL_BITS                4
40 #define TAK_FORMAT_VALID_BITS                  5
41 #define TAK_FORMAT_CH_LAYOUT_BITS              6
42 #define TAK_SIZE_FRAME_DURATION_BITS           4
43 #define TAK_SIZE_SAMPLES_NUM_BITS              35
44 #define TAK_LAST_FRAME_POS_BITS                40
45 #define TAK_LAST_FRAME_SIZE_BITS               24
46 #define TAK_ENCODER_CODEC_BITS                 6
47 #define TAK_ENCODER_PROFILE_BITS               4
48 #define TAK_ENCODER_VERSION_BITS               24
49 #define TAK_SAMPLE_RATE_MIN                    6000
50 #define TAK_CHANNELS_MIN                       1
51 #define TAK_BPS_MIN                            8
52 #define TAK_FRAME_HEADER_FLAGS_BITS            3
53 #define TAK_FRAME_HEADER_SYNC_ID               0xA0FF
54 #define TAK_FRAME_HEADER_SYNC_ID_BITS          16
55 #define TAK_FRAME_HEADER_SAMPLE_COUNT_BITS     14
56 #define TAK_FRAME_HEADER_NO_BITS               21
57 #define TAK_FRAME_DURATION_QUANT_SHIFT         5
58 #define TAK_CRC24_BITS                         24
59
60 #define TAK_MAX_CHANNELS                  ( 1 << TAK_FORMAT_CHANNEL_BITS )
61
62 #define TAK_MIN_FRAME_HEADER_BITS         ( TAK_FRAME_HEADER_SYNC_ID_BITS + \
63                                             TAK_FRAME_HEADER_FLAGS_BITS   + \
64                                             TAK_FRAME_HEADER_NO_BITS      + \
65                                             TAK_CRC24_BITS )
66
67 #define TAK_MIN_FRAME_HEADER_LAST_BITS    ( TAK_MIN_FRAME_HEADER_BITS + 2 + \
68                                             TAK_FRAME_HEADER_SAMPLE_COUNT_BITS )
69
70 #define TAK_ENCODER_BITS         ( TAK_ENCODER_CODEC_BITS        + \
71                                    TAK_ENCODER_PROFILE_BITS )
72
73 #define TAK_SIZE_BITS            ( TAK_SIZE_SAMPLES_NUM_BITS     + \
74                                    TAK_SIZE_FRAME_DURATION_BITS )
75
76 #define TAK_FORMAT_BITS          ( TAK_FORMAT_DATA_TYPE_BITS     + \
77                                    TAK_FORMAT_SAMPLE_RATE_BITS   + \
78                                    TAK_FORMAT_BPS_BITS           + \
79                                    TAK_FORMAT_CHANNEL_BITS + 1   + \
80                                    TAK_FORMAT_VALID_BITS   + 1   + \
81                                    TAK_FORMAT_CH_LAYOUT_BITS     * \
82                                    TAK_MAX_CHANNELS )
83
84 #define TAK_STREAMINFO_BITS      ( TAK_ENCODER_BITS              + \
85                                    TAK_SIZE_BITS                 + \
86                                    TAK_FORMAT_BITS )
87
88 #define TAK_MAX_FRAME_HEADER_BITS  ( TAK_MIN_FRAME_HEADER_LAST_BITS + \
89                                      TAK_STREAMINFO_BITS + 31 )
90
91 #define TAK_STREAMINFO_BYTES        (( TAK_STREAMINFO_BITS + 7 ) / 8)
92 #define TAK_MAX_FRAME_HEADER_BYTES  (( TAK_MAX_FRAME_HEADER_BITS + 7 ) / 8)
93 #define TAK_MIN_FRAME_HEADER_BYTES  (( TAK_MIN_FRAME_HEADER_BITS + 7 ) / 8)
94
95 enum TAKMetaDataType {
96     TAK_METADATA_END = 0,
97     TAK_METADATA_STREAMINFO,
98     TAK_METADATA_SEEKTABLE,
99     TAK_METADATA_SIMPLE_WAVE_DATA,
100     TAK_METADATA_ENCODER,
101     TAK_METADATA_PADDING,
102     TAK_METADATA_MD5,
103     TAK_METADATA_LAST_FRAME,
104 };
105
106 enum TAKFrameSizeType {
107     TAK_FST_94ms = 0,
108     TAK_FST_125ms,
109     TAK_FST_188ms,
110     TAK_FST_250ms,
111     TAK_FST_4096,
112     TAK_FST_8192,
113     TAK_FST_16384,
114     TAK_FST_512,
115     TAK_FST_1024,
116     TAK_FST_2048,
117 };
118
119 typedef struct TAKStreamInfo {
120     int      codec;
121     int      data_type;
122     int      sample_rate;
123     int      channels;
124     int      bps;
125     int      frame_num;
126     int      frame_samples;
127     int      last_frame_samples;
128     uint64_t ch_layout;
129     int64_t  samples;
130 } TAKStreamInfo;
131
132 void ff_tak_init_crc(void);
133
134 int ff_tak_check_crc(const uint8_t *buf, unsigned int buf_size);
135
136 /**
137  * Parse the Streaminfo metadata block.
138  * @param[in]  gb pointer to GetBitContext
139  * @param[out] s  storage for parsed information
140  */
141 void avpriv_tak_parse_streaminfo(GetBitContext *gb, TAKStreamInfo *s);
142
143 /**
144  * Validate and decode a frame header.
145  * @param      avctx             AVCodecContext to use as av_log() context
146  * @param[in]  gb                GetBitContext from which to read frame header
147  * @param[out] s                 frame information
148  * @param      log_level_offset  log level offset. can be used to silence error messages.
149  * @return non-zero on error, 0 if ok
150  */
151 int ff_tak_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb,
152                                TAKStreamInfo *s, int log_level_offset);
153 #endif /* AVCODEC_TAK_H */