mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Use ParsableBitArray
instead of ParsableByteArray
To avoid complicated bit shifting and masking. Also makes the code more readable. PiperOrigin-RevId: 490749482 (cherry picked from commit 3d31e094a9e802354dce2f3dc5f33062f7624248)
This commit is contained in:
parent
fda132f926
commit
5ebbdc52cb
@ -151,16 +151,21 @@ public final class Ac3Util {
|
|||||||
*/
|
*/
|
||||||
public static Format parseAc3AnnexFFormat(
|
public static Format parseAc3AnnexFFormat(
|
||||||
ParsableByteArray data, String trackId, String language, @Nullable DrmInitData drmInitData) {
|
ParsableByteArray data, String trackId, String language, @Nullable DrmInitData drmInitData) {
|
||||||
int fscod = (data.readUnsignedByte() & 0xC0) >> 6;
|
ParsableBitArray dataBitArray = new ParsableBitArray();
|
||||||
|
dataBitArray.reset(data);
|
||||||
|
|
||||||
|
int fscod = dataBitArray.readBits(2);
|
||||||
int sampleRate = SAMPLE_RATE_BY_FSCOD[fscod];
|
int sampleRate = SAMPLE_RATE_BY_FSCOD[fscod];
|
||||||
int nextByte = data.readUnsignedByte();
|
dataBitArray.skipBits(8); // bsid, bsmod
|
||||||
int channelCount = CHANNEL_COUNT_BY_ACMOD[(nextByte & 0x38) >> 3];
|
int channelCount = CHANNEL_COUNT_BY_ACMOD[dataBitArray.readBits(3)]; // acmod
|
||||||
if ((nextByte & 0x04) != 0) { // lfeon
|
if (dataBitArray.readBits(1) != 0) { // lfeon
|
||||||
channelCount++;
|
channelCount++;
|
||||||
}
|
}
|
||||||
// bit_rate_code - 5 bits. 2 bits from previous byte and 3 bits from next.
|
int halfFrmsizecod = dataBitArray.readBits(5); // bit_rate_code
|
||||||
int halfFrmsizecod = ((nextByte & 0x03) << 3) | ((data.readUnsignedByte() & 0xE0) >> 5);
|
|
||||||
int constantBitrate = BITRATE_BY_HALF_FRMSIZECOD[halfFrmsizecod];
|
int constantBitrate = BITRATE_BY_HALF_FRMSIZECOD[halfFrmsizecod];
|
||||||
|
// Update data position
|
||||||
|
dataBitArray.byteAlign();
|
||||||
|
data.setPosition(dataBitArray.getBytePosition());
|
||||||
return new Format.Builder()
|
return new Format.Builder()
|
||||||
.setId(trackId)
|
.setId(trackId)
|
||||||
.setSampleMimeType(MimeTypes.AUDIO_AC3)
|
.setSampleMimeType(MimeTypes.AUDIO_AC3)
|
||||||
@ -185,37 +190,45 @@ public final class Ac3Util {
|
|||||||
*/
|
*/
|
||||||
public static Format parseEAc3AnnexFFormat(
|
public static Format parseEAc3AnnexFFormat(
|
||||||
ParsableByteArray data, String trackId, String language, @Nullable DrmInitData drmInitData) {
|
ParsableByteArray data, String trackId, String language, @Nullable DrmInitData drmInitData) {
|
||||||
// 13 bits for data_rate, 3 bits for num_ind_sub which are ignored.
|
ParsableBitArray dataBitArray = new ParsableBitArray();
|
||||||
int peakBitrate =
|
dataBitArray.reset(data);
|
||||||
((data.readUnsignedByte() & 0xFF) << 5) | ((data.readUnsignedByte() & 0xF8) >> 3);
|
|
||||||
|
int peakBitrate = dataBitArray.readBits(13); // data_rate
|
||||||
|
dataBitArray.skipBits(3); // num_ind_sub
|
||||||
|
|
||||||
// Read the first independent substream.
|
// Read the first independent substream.
|
||||||
int fscod = (data.readUnsignedByte() & 0xC0) >> 6;
|
int fscod = dataBitArray.readBits(2);
|
||||||
int sampleRate = SAMPLE_RATE_BY_FSCOD[fscod];
|
int sampleRate = SAMPLE_RATE_BY_FSCOD[fscod];
|
||||||
int nextByte = data.readUnsignedByte();
|
dataBitArray.skipBits(10); // bsid, reserved, asvc, bsmod
|
||||||
int channelCount = CHANNEL_COUNT_BY_ACMOD[(nextByte & 0x0E) >> 1];
|
int channelCount = CHANNEL_COUNT_BY_ACMOD[dataBitArray.readBits(3)]; // acmod
|
||||||
if ((nextByte & 0x01) != 0) { // lfeon
|
if (dataBitArray.readBits(1) != 0) { // lfeon
|
||||||
channelCount++;
|
channelCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the first dependent substream.
|
// Read the first dependent substream.
|
||||||
nextByte = data.readUnsignedByte();
|
dataBitArray.skipBits(3); // reserved
|
||||||
int numDepSub = ((nextByte & 0x1E) >> 1);
|
int numDepSub = dataBitArray.readBits(4); // num_dep_sub
|
||||||
|
dataBitArray.skipBits(1); // numDepSub > 0 ? LFE2 : reserved
|
||||||
if (numDepSub > 0) {
|
if (numDepSub > 0) {
|
||||||
int lowByteChanLoc = data.readUnsignedByte();
|
dataBitArray.skipBytes(6); // other channel configurations
|
||||||
// Read Lrs/Rrs pair
|
// Read Lrs/Rrs pair
|
||||||
// TODO: Read other channel configuration
|
// TODO: Read other channel configuration
|
||||||
if ((lowByteChanLoc & 0x02) != 0) {
|
if (dataBitArray.readBits(1) != 0) {
|
||||||
channelCount += 2;
|
channelCount += 2;
|
||||||
}
|
}
|
||||||
|
dataBitArray.skipBits(1); // Lc/Rc pair
|
||||||
}
|
}
|
||||||
|
|
||||||
String mimeType = MimeTypes.AUDIO_E_AC3;
|
String mimeType = MimeTypes.AUDIO_E_AC3;
|
||||||
if (data.bytesLeft() > 0) {
|
if (dataBitArray.bitsLeft() > 7) {
|
||||||
nextByte = data.readUnsignedByte();
|
dataBitArray.skipBits(7); // reserved
|
||||||
if ((nextByte & 0x01) != 0) { // flag_ec3_extension_type_a
|
if (dataBitArray.readBits(1) != 0) { // flag_ec3_extension_type_a
|
||||||
mimeType = MimeTypes.AUDIO_E_AC3_JOC;
|
mimeType = MimeTypes.AUDIO_E_AC3_JOC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Update data position
|
||||||
|
dataBitArray.byteAlign();
|
||||||
|
data.setPosition(dataBitArray.getBytePosition());
|
||||||
return new Format.Builder()
|
return new Format.Builder()
|
||||||
.setId(trackId)
|
.setId(trackId)
|
||||||
.setSampleMimeType(mimeType)
|
.setSampleMimeType(mimeType)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user