Tim Yao | 72bc0fb | 2019-12-03 11:04:19 -0800 | [diff] [blame^] | 1 | /* |
| 2 | * Copyright 2014, The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #define LOG_TAG "AudioSPDIF" |
| 18 | |
| 19 | #include <string.h> |
| 20 | |
| 21 | #include <cutils/log.h> |
| 22 | #include <audio_utils/spdif/FrameScanner.h> |
| 23 | |
| 24 | #include "AC3FrameScanner.h" |
| 25 | |
| 26 | namespace android { |
| 27 | |
| 28 | // These values are from the AC3 spec. Do not change them. |
| 29 | |
| 30 | const uint8_t AC3FrameScanner::kSyncBytes[] = { 0x0B, 0x77 }; |
| 31 | |
| 32 | const uint16_t AC3FrameScanner::kAC3SampleRateTable[AC3_NUM_SAMPLE_RATE_TABLE_ENTRIES] |
| 33 | = { 48000, 44100, 32000 }; |
| 34 | |
| 35 | // Table contains number of 16-bit words in an AC3 frame. |
| 36 | // From AC3 spec table 5.13 |
| 37 | const uint16_t AC3FrameScanner::kAC3FrameSizeTable[AC3_NUM_FRAME_SIZE_TABLE_ENTRIES] |
| 38 | [AC3_NUM_SAMPLE_RATE_TABLE_ENTRIES] = { |
| 39 | { 64, 69, 96 }, |
| 40 | { 64, 70, 96 }, |
| 41 | { 80, 87, 120 }, |
| 42 | { 80, 88, 120 }, |
| 43 | { 96, 104, 144 }, |
| 44 | { 96, 105, 144 }, |
| 45 | { 112, 121, 168 }, |
| 46 | { 112, 122, 168 }, |
| 47 | { 128, 139, 192 }, |
| 48 | { 128, 140, 192 }, |
| 49 | { 160, 174, 240 }, |
| 50 | { 160, 175, 240 }, |
| 51 | { 192, 208, 288 }, |
| 52 | { 192, 209, 288 }, |
| 53 | { 224, 243, 336 }, |
| 54 | { 224, 244, 336 }, |
| 55 | { 256, 278, 384 }, |
| 56 | { 256, 279, 384 }, |
| 57 | { 320, 348, 480 }, |
| 58 | { 320, 349, 480 }, |
| 59 | { 384, 417, 576 }, |
| 60 | { 384, 418, 576 }, |
| 61 | { 448, 487, 672 }, |
| 62 | { 448, 488, 672 }, |
| 63 | { 512, 557, 768 }, |
| 64 | { 512, 558, 768 }, |
| 65 | { 640, 696, 960 }, |
| 66 | { 640, 697, 960 }, |
| 67 | { 768, 835, 1152 }, |
| 68 | { 768, 836, 1152 }, |
| 69 | { 896, 975, 1344 }, |
| 70 | { 896, 976, 1344 }, |
| 71 | { 1024, 1114, 1536 }, |
| 72 | { 1024, 1115, 1536 }, |
| 73 | { 1152, 1253, 1728 }, |
| 74 | { 1152, 1254, 1728 }, |
| 75 | { 1280, 1393, 1920 }, |
| 76 | { 1280, 1394, 1920 } |
| 77 | }; |
| 78 | |
| 79 | const uint16_t AC3FrameScanner::kEAC3ReducedSampleRateTable[AC3_NUM_SAMPLE_RATE_TABLE_ENTRIES] |
| 80 | = { 24000, 22050, 16000 }; |
| 81 | |
| 82 | const uint16_t |
| 83 | AC3FrameScanner::kEAC3BlocksPerFrameTable[EAC3_NUM_BLOCKS_PER_FRAME_TABLE_ENTRIES] |
| 84 | = { 1, 2, 3, 6 }; |
| 85 | |
| 86 | // Defined in IEC61937-2 |
| 87 | #define SPDIF_DATA_TYPE_AC3 1 |
| 88 | #define SPDIF_DATA_TYPE_E_AC3 21 |
| 89 | #define AC3_STREAM_TYPE_0 0 |
| 90 | #define AC3_STREAM_TYPE_1 1 |
| 91 | #define AC3_STREAM_TYPE_2 2 |
| 92 | // ----------------------------------------------------------------------------- |
| 93 | |
| 94 | // Scanner for AC3 byte streams. |
| 95 | AC3FrameScanner::AC3FrameScanner(audio_format_t format) |
| 96 | : FrameScanner(SPDIF_DATA_TYPE_AC3, |
| 97 | AC3FrameScanner::kSyncBytes, |
| 98 | sizeof(AC3FrameScanner::kSyncBytes), 6) |
| 99 | , mStreamType(0) |
| 100 | , mSubstreamID(0) |
| 101 | , mFormat(format) |
| 102 | { |
| 103 | mAudioBlocksPerSyncFrame = 6; |
| 104 | memset(mSubstreamBlockCounts, 0, sizeof(mSubstreamBlockCounts)); |
| 105 | } |
| 106 | |
| 107 | AC3FrameScanner::~AC3FrameScanner() |
| 108 | { |
| 109 | } |
| 110 | |
| 111 | int AC3FrameScanner::getSampleFramesPerSyncFrame() const |
| 112 | { |
| 113 | return mRateMultiplier |
| 114 | * AC3_MAX_BLOCKS_PER_SYNC_FRAME_BLOCK * AC3_PCM_FRAMES_PER_BLOCK; |
| 115 | } |
| 116 | |
| 117 | void AC3FrameScanner::resetBurst() |
| 118 | { |
| 119 | for (int i = 0; i < EAC3_MAX_SUBSTREAMS; i++) { |
| 120 | if (mSubstreamBlockCounts[i] >= AC3_MAX_BLOCKS_PER_SYNC_FRAME_BLOCK) { |
| 121 | mSubstreamBlockCounts[i] -= AC3_MAX_BLOCKS_PER_SYNC_FRAME_BLOCK; |
| 122 | } else if (mSubstreamBlockCounts[i] > 0) { |
| 123 | ALOGW("EAC3 substream[%d] has only %d audio blocks!", |
| 124 | i, mSubstreamBlockCounts[i]); |
| 125 | mSubstreamBlockCounts[i] = 0; |
| 126 | } |
| 127 | } |
| 128 | } |
| 129 | |
| 130 | // Per IEC 61973-3:5.3.3, for E-AC3 burst-length shall be in bytes. |
| 131 | uint16_t AC3FrameScanner::convertBytesToLengthCode(uint16_t numBytes) const |
| 132 | { |
| 133 | return (mDataType == SPDIF_DATA_TYPE_E_AC3) ? numBytes : numBytes * 8; |
| 134 | } |
| 135 | |
| 136 | // per IEC 61973-3 Paragraph 5.3.3 |
| 137 | // We have to send 6 audio blocks on all active substreams. |
| 138 | // Substream zero must be the first. |
| 139 | // We don't know if we have all the blocks we need until we see |
| 140 | // the 7th block of substream#0. |
| 141 | bool AC3FrameScanner::isFirstInBurst() |
| 142 | { |
| 143 | if (mDataType == SPDIF_DATA_TYPE_E_AC3) { |
| 144 | if (((mStreamType == AC3_STREAM_TYPE_0) |
| 145 | || (mStreamType == AC3_STREAM_TYPE_2)) |
| 146 | && (mSubstreamID == 0) |
| 147 | // The ">" is intentional. We have to see the beginning |
| 148 | // of the block in the next burst before we can send |
| 149 | // the current burst. |
| 150 | && (mSubstreamBlockCounts[0] > AC3_MAX_BLOCKS_PER_SYNC_FRAME_BLOCK)) { |
| 151 | return true; |
| 152 | } |
| 153 | } |
| 154 | return false; |
| 155 | } |
| 156 | |
| 157 | bool AC3FrameScanner::isLastInBurst() |
| 158 | { |
| 159 | // For EAC3 we don't know if we are the end until we see a |
| 160 | // frame that must be at the beginning. See isFirstInBurst(). |
| 161 | return (mDataType != SPDIF_DATA_TYPE_E_AC3); // Just one AC3 frame per burst. |
| 162 | } |
| 163 | |
| 164 | // TODO Use BitFieldParser |
| 165 | |
| 166 | // Parse AC3 header. |
| 167 | // Detect whether the stream is AC3 or EAC3. Extract data depending on type. |
| 168 | // |
| 169 | // @return true if valid |
| 170 | bool AC3FrameScanner::parseHeader() |
| 171 | { |
| 172 | // Interpret bsid based on paragraph E2.3.1.6 of EAC3 spec. |
| 173 | uint32_t bsid = mHeaderBuffer[5] >> 3; // bitstream ID |
| 174 | // Check BSID to see if this is EAC3 or regular AC3. |
| 175 | // These arbitrary BSID numbers do not have any names in the spec. |
| 176 | if ((bsid > 10) && (bsid <= 16)) { |
| 177 | mDataType = SPDIF_DATA_TYPE_E_AC3; |
| 178 | } else if (bsid <= 8) { |
| 179 | mDataType = SPDIF_DATA_TYPE_AC3; |
| 180 | } else { |
| 181 | ALOGW("AC3 bsid = %d not supported", bsid); |
| 182 | return false; |
| 183 | } |
| 184 | |
| 185 | // bitstream mode, main, commentary, etc. |
| 186 | uint32_t bsmod = mHeaderBuffer[5] & 7; |
| 187 | mDataTypeInfo = bsmod; // as per IEC61937-3, table 3. |
| 188 | |
| 189 | // The names fscod, frmsiz are from the AC3 spec. |
| 190 | uint32_t fscod = mHeaderBuffer[4] >> 6; |
| 191 | if (mDataType == SPDIF_DATA_TYPE_E_AC3) { |
| 192 | mStreamType = mHeaderBuffer[2] >> 6; // strmtyp in spec |
| 193 | mSubstreamID = (mHeaderBuffer[2] >> 3) & 0x07; |
| 194 | |
| 195 | // Frame size is explicit in EAC3. Paragraph E2.3.1.3 |
| 196 | uint32_t frmsiz = ((mHeaderBuffer[2] & 0x07) << 8) + mHeaderBuffer[3]; |
| 197 | mFrameSizeBytes = (frmsiz + 1) * sizeof(int16_t); |
| 198 | |
| 199 | uint32_t numblkscod = 3; // 6 blocks default |
| 200 | if (fscod == 3) { |
| 201 | uint32_t fscod2 = (mHeaderBuffer[4] >> 4) & 0x03; |
| 202 | if (fscod2 >= AC3_NUM_SAMPLE_RATE_TABLE_ENTRIES) { |
| 203 | ALOGW("Invalid EAC3 fscod2 = %d", fscod2); |
| 204 | return false; |
| 205 | } else { |
| 206 | mSampleRate = kEAC3ReducedSampleRateTable[fscod2]; |
| 207 | } |
| 208 | } else { |
| 209 | mSampleRate = kAC3SampleRateTable[fscod]; |
| 210 | numblkscod = (mHeaderBuffer[4] >> 4) & 0x03; |
| 211 | } |
| 212 | mRateMultiplier = EAC3_RATE_MULTIPLIER; // per IEC 61973-3 Paragraph 5.3.3 |
| 213 | // Don't send data burst until we have 6 blocks per substream. |
| 214 | mAudioBlocksPerSyncFrame = kEAC3BlocksPerFrameTable[numblkscod]; |
| 215 | // Keep track of how many audio blocks we have for each substream. |
| 216 | // This should be safe because mSubstreamID is ANDed with 0x07 above. |
| 217 | // And the array is allocated as [8]. |
| 218 | if ((mStreamType == AC3_STREAM_TYPE_0) |
| 219 | || (mStreamType == AC3_STREAM_TYPE_2)) { |
| 220 | mSubstreamBlockCounts[mSubstreamID] += mAudioBlocksPerSyncFrame; |
| 221 | } |
| 222 | |
| 223 | // Print enough so we can see all the substreams. |
| 224 | ALOGD_IF((mFormatDumpCount < 3*8 ), |
| 225 | "EAC3 mStreamType = %d, mSubstreamID = %d", |
| 226 | mStreamType, mSubstreamID); |
| 227 | } else { // regular AC3 |
| 228 | // Extract sample rate and frame size from codes. |
| 229 | uint32_t frmsizcod = mHeaderBuffer[4] & 0x3F; // frame size code |
| 230 | |
| 231 | if (fscod >= AC3_NUM_SAMPLE_RATE_TABLE_ENTRIES) { |
| 232 | ALOGW("Invalid AC3 sampleRateCode = %d", fscod); |
| 233 | return false; |
| 234 | } else if (frmsizcod >= AC3_NUM_FRAME_SIZE_TABLE_ENTRIES) { |
| 235 | ALOGW("Invalid AC3 frameSizeCode = %d", frmsizcod); |
| 236 | return false; |
| 237 | } else { |
| 238 | mSampleRate = kAC3SampleRateTable[fscod]; |
| 239 | mRateMultiplier = 1; |
| 240 | mFrameSizeBytes = sizeof(uint16_t) |
| 241 | * kAC3FrameSizeTable[frmsizcod][fscod]; |
| 242 | } |
| 243 | mAudioBlocksPerSyncFrame = 6; |
| 244 | if (mFormat == AUDIO_FORMAT_E_AC3) { |
| 245 | ALOGV("Its a Ac3 substream in EAC3 stream"); |
| 246 | mStreamType = 2; |
| 247 | mSubstreamID = 0; |
| 248 | mSubstreamBlockCounts[0] += mAudioBlocksPerSyncFrame; |
| 249 | mDataType = SPDIF_DATA_TYPE_E_AC3; |
| 250 | mRateMultiplier = EAC3_RATE_MULTIPLIER; |
| 251 | } |
| 252 | } |
| 253 | ALOGI_IF((mFormatDumpCount == 0), |
| 254 | "AC3 frame rate = %d * %d, size = %zu, audioBlocksPerSyncFrame = %d", |
| 255 | mSampleRate, mRateMultiplier, mFrameSizeBytes, mAudioBlocksPerSyncFrame); |
| 256 | mFormatDumpCount++; |
| 257 | return true; |
| 258 | } |
| 259 | |
| 260 | } // namespace android |