/src/ffmpeg/libavcodec/mlp_parse.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2007 Ian Caulfield |
3 | | * |
4 | | * This file is part of FFmpeg. |
5 | | * |
6 | | * FFmpeg is free software; you can redistribute it and/or |
7 | | * modify it under the terms of the GNU Lesser General Public |
8 | | * License as published by the Free Software Foundation; either |
9 | | * version 2.1 of the License, or (at your option) any later version. |
10 | | * |
11 | | * FFmpeg is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | | * Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public |
17 | | * License along with FFmpeg; if not, write to the Free Software |
18 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | | */ |
20 | | |
21 | | #ifndef AVCODEC_MLP_PARSE_H |
22 | | #define AVCODEC_MLP_PARSE_H |
23 | | |
24 | | #include <stdint.h> |
25 | | |
26 | | #include "libavutil/channel_layout.h" |
27 | | |
28 | | #include "get_bits.h" |
29 | | |
30 | | typedef struct MLPHeaderInfo |
31 | | { |
32 | | int stream_type; ///< 0xBB for MLP, 0xBA for TrueHD |
33 | | int header_size; ///< Size of the major sync header, in bytes |
34 | | |
35 | | int group1_bits; ///< The bit depth of the first substream |
36 | | int group2_bits; ///< Bit depth of the second substream (MLP only) |
37 | | |
38 | | int group1_samplerate; ///< Sample rate of first substream |
39 | | int group2_samplerate; ///< Sample rate of second substream (MLP only) |
40 | | |
41 | | int channel_arrangement; |
42 | | |
43 | | int channel_modifier_thd_stream0; ///< Channel modifier for substream 0 of TrueHD streams ("2-channel presentation") |
44 | | int channel_modifier_thd_stream1; ///< Channel modifier for substream 1 of TrueHD streams ("6-channel presentation") |
45 | | int channel_modifier_thd_stream2; ///< Channel modifier for substream 2 of TrueHD streams ("8-channel presentation") |
46 | | |
47 | | int channels_mlp; ///< Channel count for MLP streams |
48 | | int channels_thd_stream1; ///< Channel count for substream 1 of TrueHD streams ("6-channel presentation") |
49 | | int channels_thd_stream2; ///< Channel count for substream 2 of TrueHD streams ("8-channel presentation") |
50 | | uint64_t channel_layout_mlp; ///< Channel layout for MLP streams |
51 | | uint64_t channel_layout_thd_stream1; ///< Channel layout for substream 1 of TrueHD streams ("6-channel presentation") |
52 | | uint64_t channel_layout_thd_stream2; ///< Channel layout for substream 2 of TrueHD streams ("8-channel presentation") |
53 | | |
54 | | int access_unit_size; ///< Number of samples per coded frame |
55 | | int access_unit_size_pow2; ///< Next power of two above number of samples per frame |
56 | | |
57 | | int is_vbr; ///< Stream is VBR instead of CBR |
58 | | int peak_bitrate; ///< Peak bitrate for VBR, actual bitrate (==peak) for CBR |
59 | | |
60 | | int num_substreams; ///< Number of substreams within stream |
61 | | |
62 | | int extended_substream_info; ///< Which substream of substreams carry 16-channel presentation |
63 | | int substream_info; ///< Which substream of substreams carry 2/6/8-channel presentation |
64 | | } MLPHeaderInfo; |
65 | | |
66 | | static const uint8_t thd_chancount[13] = { |
67 | | // LR C LFE LRs LRvh LRc LRrs Cs Ts LRsd LRw Cvh LFE2 |
68 | | 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1 |
69 | | }; |
70 | | |
71 | | static const uint64_t thd_layout[13] = { |
72 | | AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT, // LR |
73 | | AV_CH_FRONT_CENTER, // C |
74 | | AV_CH_LOW_FREQUENCY, // LFE |
75 | | AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT, // LRs |
76 | | AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT, // LRvh |
77 | | AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER, // LRc |
78 | | AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT, // LRrs |
79 | | AV_CH_BACK_CENTER, // Cs |
80 | | AV_CH_TOP_CENTER, // Ts |
81 | | AV_CH_SURROUND_DIRECT_LEFT|AV_CH_SURROUND_DIRECT_RIGHT, // LRsd |
82 | | AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT, // LRw |
83 | | AV_CH_TOP_FRONT_CENTER, // Cvh |
84 | | AV_CH_LOW_FREQUENCY_2, // LFE2 |
85 | | }; |
86 | | |
87 | | static inline int mlp_samplerate(int in) |
88 | 685k | { |
89 | 685k | if (in == 0xF) |
90 | 31.1k | return 0; |
91 | | |
92 | 654k | return (in & 8 ? 44100 : 48000) << (in & 7) ; |
93 | 685k | } Unexecuted instantiation: truehd_core.c:mlp_samplerate mlp_parse.c:mlp_samplerate Line | Count | Source | 88 | 673k | { | 89 | 673k | if (in == 0xF) | 90 | 23.2k | return 0; | 91 | | | 92 | 650k | return (in & 8 ? 44100 : 48000) << (in & 7) ; | 93 | 673k | } |
Unexecuted instantiation: mlp_parser.c:mlp_samplerate Line | Count | Source | 88 | 2.67k | { | 89 | 2.67k | if (in == 0xF) | 90 | 180 | return 0; | 91 | | | 92 | 2.49k | return (in & 8 ? 44100 : 48000) << (in & 7) ; | 93 | 2.67k | } |
Line | Count | Source | 88 | 9.04k | { | 89 | 9.04k | if (in == 0xF) | 90 | 7.76k | return 0; | 91 | | | 92 | 1.28k | return (in & 8 ? 44100 : 48000) << (in & 7) ; | 93 | 9.04k | } |
Unexecuted instantiation: mlpenc.c:mlp_samplerate |
94 | | |
95 | | static inline int truehd_channels(int chanmap) |
96 | 150k | { |
97 | 150k | int channels = 0, i; |
98 | | |
99 | 2.10M | for (i = 0; i < 13; i++) |
100 | 1.95M | channels += thd_chancount[i] * ((chanmap >> i) & 1); |
101 | | |
102 | 150k | return channels; |
103 | 150k | } Unexecuted instantiation: truehd_core.c:truehd_channels mlp_parse.c:truehd_channels Line | Count | Source | 96 | 150k | { | 97 | 150k | int channels = 0, i; | 98 | | | 99 | 2.10M | for (i = 0; i < 13; i++) | 100 | 1.95M | channels += thd_chancount[i] * ((chanmap >> i) & 1); | 101 | | | 102 | 150k | return channels; | 103 | 150k | } |
Unexecuted instantiation: mlp_parser.c:truehd_channels Unexecuted instantiation: mlpdec.c:truehd_channels Unexecuted instantiation: mov.c:truehd_channels Unexecuted instantiation: mlpenc.c:truehd_channels |
104 | | |
105 | | static inline uint64_t truehd_layout(int chanmap) |
106 | 159k | { |
107 | 159k | int i; |
108 | 159k | uint64_t layout = 0; |
109 | | |
110 | 2.23M | for (i = 0; i < 13; i++) |
111 | 2.07M | layout |= thd_layout[i] * ((chanmap >> i) & 1); |
112 | | |
113 | 159k | return layout; |
114 | 159k | } Unexecuted instantiation: truehd_core.c:truehd_layout mlp_parse.c:truehd_layout Line | Count | Source | 106 | 150k | { | 107 | 150k | int i; | 108 | 150k | uint64_t layout = 0; | 109 | | | 110 | 2.10M | for (i = 0; i < 13; i++) | 111 | 1.95M | layout |= thd_layout[i] * ((chanmap >> i) & 1); | 112 | | | 113 | 150k | return layout; | 114 | 150k | } |
Unexecuted instantiation: mlp_parser.c:truehd_layout Unexecuted instantiation: mlpdec.c:truehd_layout Line | Count | Source | 106 | 9.04k | { | 107 | 9.04k | int i; | 108 | 9.04k | uint64_t layout = 0; | 109 | | | 110 | 126k | for (i = 0; i < 13; i++) | 111 | 117k | layout |= thd_layout[i] * ((chanmap >> i) & 1); | 112 | | | 113 | 9.04k | return layout; | 114 | 9.04k | } |
Unexecuted instantiation: mlpenc.c:truehd_layout |
115 | | |
116 | | static inline int layout_truehd(uint64_t layout) |
117 | 0 | { |
118 | 0 | int chanmap = 0; |
119 | |
|
120 | 0 | for (int i = 0; i < 13; i++) { |
121 | 0 | if ((layout & thd_layout[i]) == thd_layout[i]) |
122 | 0 | chanmap |= 1 << i; |
123 | 0 | } |
124 | |
|
125 | 0 | return chanmap; |
126 | 0 | } Unexecuted instantiation: truehd_core.c:layout_truehd Unexecuted instantiation: mlp_parse.c:layout_truehd Unexecuted instantiation: mlp_parser.c:layout_truehd Unexecuted instantiation: mlpdec.c:layout_truehd Unexecuted instantiation: mov.c:layout_truehd Unexecuted instantiation: mlpenc.c:layout_truehd |
127 | | |
128 | | int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb); |
129 | | |
130 | | #endif /* AVCODEC_MLP_PARSE_H */ |