summaryrefslogtreecommitdiffstats
path: root/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
commit6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch)
treea68f146d7fa01f0134297619fbe7e33db084e0aa /mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java
parentInitial commit. (diff)
downloadthunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz
thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java')
-rw-r--r--mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java97
1 files changed, 97 insertions, 0 deletions
diff --git a/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java
new file mode 100644
index 0000000000..2026a27ff7
--- /dev/null
+++ b/mobile/android/exoplayer2/src/main/java/org/mozilla/thirdparty/com/google/android/exoplayer2/video/AvcConfig.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.mozilla.thirdparty.com.google.android.exoplayer2.video;
+
+import org.mozilla.thirdparty.com.google.android.exoplayer2.Format;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.ParserException;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.CodecSpecificDataUtil;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.NalUnitUtil;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.NalUnitUtil.SpsData;
+import org.mozilla.thirdparty.com.google.android.exoplayer2.util.ParsableByteArray;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * AVC configuration data.
+ */
+public final class AvcConfig {
+
+ public final List<byte[]> initializationData;
+ public final int nalUnitLengthFieldLength;
+ public final int width;
+ public final int height;
+ public final float pixelWidthAspectRatio;
+
+ /**
+ * Parses AVC configuration data.
+ *
+ * @param data A {@link ParsableByteArray}, whose position is set to the start of the AVC
+ * configuration data to parse.
+ * @return A parsed representation of the HEVC configuration data.
+ * @throws ParserException If an error occurred parsing the data.
+ */
+ public static AvcConfig parse(ParsableByteArray data) throws ParserException {
+ try {
+ data.skipBytes(4); // Skip to the AVCDecoderConfigurationRecord (defined in 14496-15)
+ int nalUnitLengthFieldLength = (data.readUnsignedByte() & 0x3) + 1;
+ if (nalUnitLengthFieldLength == 3) {
+ throw new IllegalStateException();
+ }
+ List<byte[]> initializationData = new ArrayList<>();
+ int numSequenceParameterSets = data.readUnsignedByte() & 0x1F;
+ for (int j = 0; j < numSequenceParameterSets; j++) {
+ initializationData.add(buildNalUnitForChild(data));
+ }
+ int numPictureParameterSets = data.readUnsignedByte();
+ for (int j = 0; j < numPictureParameterSets; j++) {
+ initializationData.add(buildNalUnitForChild(data));
+ }
+
+ int width = Format.NO_VALUE;
+ int height = Format.NO_VALUE;
+ float pixelWidthAspectRatio = 1;
+ if (numSequenceParameterSets > 0) {
+ byte[] sps = initializationData.get(0);
+ SpsData spsData = NalUnitUtil.parseSpsNalUnit(initializationData.get(0),
+ nalUnitLengthFieldLength, sps.length);
+ width = spsData.width;
+ height = spsData.height;
+ pixelWidthAspectRatio = spsData.pixelWidthAspectRatio;
+ }
+ return new AvcConfig(initializationData, nalUnitLengthFieldLength, width, height,
+ pixelWidthAspectRatio);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ throw new ParserException("Error parsing AVC config", e);
+ }
+ }
+
+ private AvcConfig(List<byte[]> initializationData, int nalUnitLengthFieldLength,
+ int width, int height, float pixelWidthAspectRatio) {
+ this.initializationData = initializationData;
+ this.nalUnitLengthFieldLength = nalUnitLengthFieldLength;
+ this.width = width;
+ this.height = height;
+ this.pixelWidthAspectRatio = pixelWidthAspectRatio;
+ }
+
+ private static byte[] buildNalUnitForChild(ParsableByteArray data) {
+ int length = data.readUnsignedShort();
+ int offset = data.getPosition();
+ data.skipBytes(length);
+ return CodecSpecificDataUtil.buildNalUnit(data.data, offset, length);
+ }
+
+}