Tidy CEA utils

Move Cea708InitializationData functionality into CeaUtil and delete the
class.

Move CeaUtil to the util package as it needs to be used both in
extraction and decoding.

PiperOrigin-RevId: 291128220
This commit is contained in:
andrewlewis 2020-01-23 10:38:40 +00:00 committed by Ian Baker
parent 6b03d4bc40
commit 0f63c501a8
7 changed files with 40 additions and 65 deletions

View File

@ -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;

View File

@ -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(

View File

@ -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;

View File

@ -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;

View File

@ -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<byte[]> 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++) {

View File

@ -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<byte[]> 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<byte[]> 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<byte[]> buildData(boolean isWideAspectRatio) {
return Collections.singletonList(new byte[] {(byte) (isWideAspectRatio ? 1 : 0)});
}
}

View File

@ -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<byte[]> 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<byte[]> 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);