1*b9df5ad1SAndroid Build Coastguard Worker /* 2*b9df5ad1SAndroid Build Coastguard Worker * Copyright 2015, The Android Open Source Project 3*b9df5ad1SAndroid Build Coastguard Worker * 4*b9df5ad1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*b9df5ad1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*b9df5ad1SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*b9df5ad1SAndroid Build Coastguard Worker * 8*b9df5ad1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*b9df5ad1SAndroid Build Coastguard Worker * 10*b9df5ad1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*b9df5ad1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*b9df5ad1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*b9df5ad1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*b9df5ad1SAndroid Build Coastguard Worker * limitations under the License. 15*b9df5ad1SAndroid Build Coastguard Worker */ 16*b9df5ad1SAndroid Build Coastguard Worker 17*b9df5ad1SAndroid Build Coastguard Worker #define LOG_TAG "AudioSPDIF" 18*b9df5ad1SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0 19*b9df5ad1SAndroid Build Coastguard Worker 20*b9df5ad1SAndroid Build Coastguard Worker #include <string.h> 21*b9df5ad1SAndroid Build Coastguard Worker #include <assert.h> 22*b9df5ad1SAndroid Build Coastguard Worker 23*b9df5ad1SAndroid Build Coastguard Worker #include <log/log.h> 24*b9df5ad1SAndroid Build Coastguard Worker #include "BitFieldParser.h" 25*b9df5ad1SAndroid Build Coastguard Worker 26*b9df5ad1SAndroid Build Coastguard Worker namespace android { 27*b9df5ad1SAndroid Build Coastguard Worker BitFieldParser(uint8_t * data)28*b9df5ad1SAndroid Build Coastguard WorkerBitFieldParser::BitFieldParser(uint8_t *data) 29*b9df5ad1SAndroid Build Coastguard Worker : mData(data) 30*b9df5ad1SAndroid Build Coastguard Worker , mBitCursor(0) 31*b9df5ad1SAndroid Build Coastguard Worker { 32*b9df5ad1SAndroid Build Coastguard Worker } 33*b9df5ad1SAndroid Build Coastguard Worker ~BitFieldParser()34*b9df5ad1SAndroid Build Coastguard WorkerBitFieldParser::~BitFieldParser() 35*b9df5ad1SAndroid Build Coastguard Worker { 36*b9df5ad1SAndroid Build Coastguard Worker } 37*b9df5ad1SAndroid Build Coastguard Worker readBits(uint32_t numBits)38*b9df5ad1SAndroid Build Coastguard Workeruint32_t BitFieldParser::readBits(uint32_t numBits) 39*b9df5ad1SAndroid Build Coastguard Worker { 40*b9df5ad1SAndroid Build Coastguard Worker ALOG_ASSERT(numBits <= 32); 41*b9df5ad1SAndroid Build Coastguard Worker 42*b9df5ad1SAndroid Build Coastguard Worker // Extract some bits from the current byte. 43*b9df5ad1SAndroid Build Coastguard Worker uint32_t byteCursor = mBitCursor >> 3; // 8 bits per byte 44*b9df5ad1SAndroid Build Coastguard Worker uint8_t byte = mData[byteCursor]; 45*b9df5ad1SAndroid Build Coastguard Worker 46*b9df5ad1SAndroid Build Coastguard Worker uint32_t bitsLeftInByte = 8 - (mBitCursor & 7); 47*b9df5ad1SAndroid Build Coastguard Worker uint32_t bitsFromByte = (bitsLeftInByte < numBits) ? bitsLeftInByte : numBits; 48*b9df5ad1SAndroid Build Coastguard Worker uint32_t result = byte >> (bitsLeftInByte - bitsFromByte); 49*b9df5ad1SAndroid Build Coastguard Worker result &= (1 << bitsFromByte) - 1; // mask 50*b9df5ad1SAndroid Build Coastguard Worker mBitCursor += bitsFromByte; 51*b9df5ad1SAndroid Build Coastguard Worker 52*b9df5ad1SAndroid Build Coastguard Worker uint32_t bitsRemaining = numBits - bitsFromByte; 53*b9df5ad1SAndroid Build Coastguard Worker if (bitsRemaining == 0) { 54*b9df5ad1SAndroid Build Coastguard Worker return result; 55*b9df5ad1SAndroid Build Coastguard Worker } else { 56*b9df5ad1SAndroid Build Coastguard Worker // Use recursion to get remaining bits. 57*b9df5ad1SAndroid Build Coastguard Worker return (result << bitsRemaining) | readBits(bitsRemaining); 58*b9df5ad1SAndroid Build Coastguard Worker } 59*b9df5ad1SAndroid Build Coastguard Worker } 60*b9df5ad1SAndroid Build Coastguard Worker 61*b9df5ad1SAndroid Build Coastguard Worker } // namespace android 62