From 01bc853993930d92d5e94115ab2367aa152c6f9a Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Fri, 24 Jan 2020 12:20:55 +0000 Subject: [PATCH] Move CeaUtil to extractors package CeaUtil depends on TrackOutput so should live in the extractors package. To avoid having Cea708Decoder depend on extractors, this change also moves the initialization data building/parsing to CodecSpecificDataUtil. PiperOrigin-RevId: 291348317 --- .../{util => extractor}/CeaUtil.java | 31 ++----------------- .../extractor/mp4/FragmentedMp4Extractor.java | 2 +- .../ts/DefaultTsPayloadReaderFactory.java | 5 +-- .../exoplayer2/extractor/ts/SeiReader.java | 2 +- .../extractor/ts/UserDataReader.java | 2 +- .../exoplayer2/text/cea/Cea708Decoder.java | 5 +-- .../util/CodecSpecificDataUtil.java | 27 +++++++++++++++- 7 files changed, 38 insertions(+), 36 deletions(-) rename library/core/src/main/java/com/google/android/exoplayer2/{util => extractor}/CeaUtil.java (81%) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/CeaUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java similarity index 81% rename from library/core/src/main/java/com/google/android/exoplayer2/util/CeaUtil.java rename to library/core/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java index 71b29db2d3..4c3f97975e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/CeaUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.util; +package com.google.android.exoplayer2.extractor; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.extractor.TrackOutput; -import java.util.Collections; -import java.util.List; +import com.google.android.exoplayer2.util.Log; +import com.google.android.exoplayer2.util.ParsableByteArray; /** Utility methods for handling CEA-608/708 messages. Defined in A/53 Part 4:2009. */ public final class CeaUtil { @@ -33,30 +32,6 @@ 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. 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 d5375cca96..19dbe6bc69 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 @@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.audio.Ac4Util; import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; +import com.google.android.exoplayer2.extractor.CeaUtil; import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; @@ -38,7 +39,6 @@ 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.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 dcfa8ba9e9..ad1e8cc264 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.util.CeaUtil; +import com.google.android.exoplayer2.util.CodecSpecificDataUtil; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.ParsableByteArray; import java.lang.annotation.Documented; @@ -253,7 +253,8 @@ 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 = CeaUtil.getCea708InitializationData(isWideAspectRatio); + initializationData = + CodecSpecificDataUtil.buildCea708InitializationData(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 6d7196ead1..38db71565a 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 @@ -18,11 +18,11 @@ package com.google.android.exoplayer2.extractor.ts; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.extractor.CeaUtil; 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.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 3b20af1431..64f9a9d128 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 @@ -18,10 +18,10 @@ package com.google.android.exoplayer2.extractor.ts; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.extractor.CeaUtil; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.TrackOutput; 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 a3398894d0..182fe7a2fe 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,7 +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.CodecSpecificDataUtil; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableBitArray; import com.google.android.exoplayer2.util.ParsableByteArray; @@ -164,7 +164,8 @@ public final class Cea708Decoder extends CeaDecoder { serviceBlockPacket = new ParsableBitArray(); selectedServiceNumber = accessibilityChannel == Format.NO_VALUE ? 1 : accessibilityChannel; isWideAspectRatio = - initializationData != null && CeaUtil.getIsWideAspectRatio(initializationData); + initializationData != null + && CodecSpecificDataUtil.parseCea708InitializationData(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/util/CodecSpecificDataUtil.java b/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java index 3372f23971..4a2959a5c8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/CodecSpecificDataUtil.java @@ -20,6 +20,7 @@ import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -221,6 +222,31 @@ public final class CodecSpecificDataUtil { return Pair.create(sampleRate, channelCount); } + /** + * Returns initialization data for formats with MIME type {@link MimeTypes#APPLICATION_CEA708}. + * + * @param isWideAspectRatio Whether the CEA-708 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 buildCea708InitializationData(boolean isWideAspectRatio) { + return Collections.singletonList(isWideAspectRatio ? new byte[] {1} : new byte[] {0}); + } + + /** + * Returns whether the CEA-708 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 CEA-708 closed caption service is formatted for displays with 16:9 aspect + * ratio. + */ + public static boolean parseCea708InitializationData(List initializationData) { + return initializationData.size() == 1 + && initializationData.get(0).length == 1 + && initializationData.get(0)[0] == 1; + } + /** * Builds an RFC 6381 AVC codec string using the provided parameters. * @@ -380,5 +406,4 @@ public final class CodecSpecificDataUtil { bitArray.skipBits(1); // extensionFlag3. } } - }