diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java index 98263c92d4..d5375cca96 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java @@ -37,8 +37,8 @@ import com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom; import com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom; import com.google.android.exoplayer2.metadata.emsg.EventMessage; import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder; -import com.google.android.exoplayer2.text.cea.CeaUtil; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.CeaUtil; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.NalUnitUtil; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java index 480edb0a19..dcfa8ba9e9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java @@ -20,7 +20,7 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo; -import com.google.android.exoplayer2.text.cea.Cea708InitializationData; +import com.google.android.exoplayer2.util.CeaUtil; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import java.lang.annotation.Documented; @@ -253,7 +253,7 @@ public final class DefaultTsPayloadReaderFactory implements TsPayloadReader.Fact // The wide_aspect_ratio flag only has meaning for CEA-708. if (isDigital) { boolean isWideAspectRatio = (flags & 0x40) != 0; - initializationData = Cea708InitializationData.buildData(isWideAspectRatio); + initializationData = CeaUtil.getCea708InitializationData(isWideAspectRatio); } closedCaptionFormats.add( diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java index 2541db07a8..6d7196ead1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java @@ -21,8 +21,8 @@ import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator; -import com.google.android.exoplayer2.text.cea.CeaUtil; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.CeaUtil; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import java.util.List; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/UserDataReader.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/UserDataReader.java index 739e5341b8..3b20af1431 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/UserDataReader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/UserDataReader.java @@ -20,8 +20,8 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.TrackOutput; -import com.google.android.exoplayer2.text.cea.CeaUtil; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.CeaUtil; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import java.util.List; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java index 8262a6dabc..a3398894d0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.text.Subtitle; import com.google.android.exoplayer2.text.SubtitleDecoder; import com.google.android.exoplayer2.text.SubtitleInputBuffer; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.CeaUtil; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableBitArray; import com.google.android.exoplayer2.util.ParsableByteArray; @@ -144,6 +145,9 @@ public final class Cea708Decoder extends CeaDecoder { private final ParsableByteArray ccData; private final ParsableBitArray serviceBlockPacket; + // TODO: Use isWideAspectRatio in decoding. + @SuppressWarnings({"unused", "FieldCanBeLocal"}) + private final boolean isWideAspectRatio; private final int selectedServiceNumber; private final CueInfoBuilder[] cueInfoBuilders; @@ -155,11 +159,12 @@ public final class Cea708Decoder extends CeaDecoder { @Nullable private DtvCcPacket currentDtvCcPacket; private int currentWindow; - // TODO: Retrieve isWideAspectRatio from initializationData and use it. public Cea708Decoder(int accessibilityChannel, @Nullable List initializationData) { ccData = new ParsableByteArray(); serviceBlockPacket = new ParsableBitArray(); selectedServiceNumber = accessibilityChannel == Format.NO_VALUE ? 1 : accessibilityChannel; + isWideAspectRatio = + initializationData != null && CeaUtil.getIsWideAspectRatio(initializationData); cueInfoBuilders = new CueInfoBuilder[NUM_WINDOWS]; for (int i = 0; i < NUM_WINDOWS; i++) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708InitializationData.java b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708InitializationData.java deleted file mode 100644 index 10bed14adc..0000000000 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708InitializationData.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2018 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 com.google.android.exoplayer2.text.cea; - -import java.util.Collections; -import java.util.List; - -/** Initialization data for CEA-708 decoders. */ -public final class Cea708InitializationData { - - /** - * Whether the closed caption service is formatted for displays with 16:9 aspect ratio. If false, - * the closed caption service is formatted for 4:3 displays. - */ - public final boolean isWideAspectRatio; - - private Cea708InitializationData(List initializationData) { - isWideAspectRatio = initializationData.get(0)[0] != 0; - } - - /** - * Returns an object representation of CEA-708 initialization data - * - * @param initializationData Binary CEA-708 initialization data. - * @return The object representation. - */ - public static Cea708InitializationData fromData(List initializationData) { - return new Cea708InitializationData(initializationData); - } - - /** - * Builds binary CEA-708 initialization data. - * - * @param isWideAspectRatio Whether the closed caption service is formatted for displays with 16:9 - * aspect ratio. - * @return Binary CEA-708 initializaton data. - */ - public static List buildData(boolean isWideAspectRatio) { - return Collections.singletonList(new byte[] {(byte) (isWideAspectRatio ? 1 : 0)}); - } -} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/util/CeaUtil.java similarity index 81% rename from library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaUtil.java rename to library/core/src/main/java/com/google/android/exoplayer2/util/CeaUtil.java index cdc545e459..71b29db2d3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/CeaUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/CeaUtil.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.text.cea; +package com.google.android.exoplayer2.util; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.extractor.TrackOutput; -import com.google.android.exoplayer2.util.Log; -import com.google.android.exoplayer2.util.ParsableByteArray; +import java.util.Collections; +import java.util.List; /** Utility methods for handling CEA-608/708 messages. Defined in A/53 Part 4:2009. */ public final class CeaUtil { @@ -33,6 +33,30 @@ public final class CeaUtil { private static final int PROVIDER_CODE_ATSC = 0x31; private static final int PROVIDER_CODE_DIRECTV = 0x2F; + /** + * Returns initialization data for formats with MIME type {@link MimeTypes#APPLICATION_CEA708}. + * + * @param isWideAspectRatio Whether the closed caption service is formatted for displays with 16:9 + * aspect ratio. + * @return Initialization data for formats with MIME type {@link MimeTypes#APPLICATION_CEA708}. + */ + public static List getCea708InitializationData(boolean isWideAspectRatio) { + return Collections.singletonList(isWideAspectRatio ? new byte[] {1} : new byte[] {0}); + } + + /** + * Returns whether the closed caption service with the given initialization data is formatted for + * displays with 16:9 aspect ratio. + * + * @param initializationData The initialization data to parse. + * @return Whether the closed caption service is formatted for displays with 16:9 aspect ratio. + */ + public static boolean getIsWideAspectRatio(List initializationData) { + return initializationData.size() == 1 + && initializationData.get(0).length == 1 + && initializationData.get(0)[0] == 1; + } + /** * Consumes the unescaped content of an SEI NAL unit, writing the content of any CEA-608 messages * as samples to all of the provided outputs. @@ -41,8 +65,8 @@ public final class CeaUtil { * @param seiBuffer The unescaped SEI NAL unit data, excluding the NAL unit start code and type. * @param outputs The outputs to which any samples should be written. */ - public static void consume(long presentationTimeUs, ParsableByteArray seiBuffer, - TrackOutput[] outputs) { + public static void consume( + long presentationTimeUs, ParsableByteArray seiBuffer, TrackOutput[] outputs) { while (seiBuffer.bytesLeft() > 1 /* last byte will be rbsp_trailing_bits */) { int payloadType = readNon255TerminatedValue(seiBuffer); int payloadSize = readNon255TerminatedValue(seiBuffer);