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:
parent
6b03d4bc40
commit
0f63c501a8
@ -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.extractor.mp4.Atom.LeafAtom;
|
||||||
import com.google.android.exoplayer2.metadata.emsg.EventMessage;
|
import com.google.android.exoplayer2.metadata.emsg.EventMessage;
|
||||||
import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder;
|
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.Assertions;
|
||||||
|
import com.google.android.exoplayer2.util.CeaUtil;
|
||||||
import com.google.android.exoplayer2.util.Log;
|
import com.google.android.exoplayer2.util.Log;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.NalUnitUtil;
|
import com.google.android.exoplayer2.util.NalUnitUtil;
|
||||||
|
@ -20,7 +20,7 @@ import androidx.annotation.IntDef;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
import com.google.android.exoplayer2.extractor.ts.TsPayloadReader.EsInfo;
|
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.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||||
import java.lang.annotation.Documented;
|
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.
|
// The wide_aspect_ratio flag only has meaning for CEA-708.
|
||||||
if (isDigital) {
|
if (isDigital) {
|
||||||
boolean isWideAspectRatio = (flags & 0x40) != 0;
|
boolean isWideAspectRatio = (flags & 0x40) != 0;
|
||||||
initializationData = Cea708InitializationData.buildData(isWideAspectRatio);
|
initializationData = CeaUtil.getCea708InitializationData(isWideAspectRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
closedCaptionFormats.add(
|
closedCaptionFormats.add(
|
||||||
|
@ -21,8 +21,8 @@ import com.google.android.exoplayer2.Format;
|
|||||||
import com.google.android.exoplayer2.extractor.ExtractorOutput;
|
import com.google.android.exoplayer2.extractor.ExtractorOutput;
|
||||||
import com.google.android.exoplayer2.extractor.TrackOutput;
|
import com.google.android.exoplayer2.extractor.TrackOutput;
|
||||||
import com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerator;
|
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.Assertions;
|
||||||
|
import com.google.android.exoplayer2.util.CeaUtil;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -20,8 +20,8 @@ import com.google.android.exoplayer2.C;
|
|||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
import com.google.android.exoplayer2.extractor.ExtractorOutput;
|
import com.google.android.exoplayer2.extractor.ExtractorOutput;
|
||||||
import com.google.android.exoplayer2.extractor.TrackOutput;
|
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.Assertions;
|
||||||
|
import com.google.android.exoplayer2.util.CeaUtil;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -34,6 +34,7 @@ import com.google.android.exoplayer2.text.Subtitle;
|
|||||||
import com.google.android.exoplayer2.text.SubtitleDecoder;
|
import com.google.android.exoplayer2.text.SubtitleDecoder;
|
||||||
import com.google.android.exoplayer2.text.SubtitleInputBuffer;
|
import com.google.android.exoplayer2.text.SubtitleInputBuffer;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
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.Log;
|
||||||
import com.google.android.exoplayer2.util.ParsableBitArray;
|
import com.google.android.exoplayer2.util.ParsableBitArray;
|
||||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||||
@ -144,6 +145,9 @@ public final class Cea708Decoder extends CeaDecoder {
|
|||||||
|
|
||||||
private final ParsableByteArray ccData;
|
private final ParsableByteArray ccData;
|
||||||
private final ParsableBitArray serviceBlockPacket;
|
private final ParsableBitArray serviceBlockPacket;
|
||||||
|
// TODO: Use isWideAspectRatio in decoding.
|
||||||
|
@SuppressWarnings({"unused", "FieldCanBeLocal"})
|
||||||
|
private final boolean isWideAspectRatio;
|
||||||
|
|
||||||
private final int selectedServiceNumber;
|
private final int selectedServiceNumber;
|
||||||
private final CueInfoBuilder[] cueInfoBuilders;
|
private final CueInfoBuilder[] cueInfoBuilders;
|
||||||
@ -155,11 +159,12 @@ public final class Cea708Decoder extends CeaDecoder {
|
|||||||
@Nullable private DtvCcPacket currentDtvCcPacket;
|
@Nullable private DtvCcPacket currentDtvCcPacket;
|
||||||
private int currentWindow;
|
private int currentWindow;
|
||||||
|
|
||||||
// TODO: Retrieve isWideAspectRatio from initializationData and use it.
|
|
||||||
public Cea708Decoder(int accessibilityChannel, @Nullable List<byte[]> initializationData) {
|
public Cea708Decoder(int accessibilityChannel, @Nullable List<byte[]> initializationData) {
|
||||||
ccData = new ParsableByteArray();
|
ccData = new ParsableByteArray();
|
||||||
serviceBlockPacket = new ParsableBitArray();
|
serviceBlockPacket = new ParsableBitArray();
|
||||||
selectedServiceNumber = accessibilityChannel == Format.NO_VALUE ? 1 : accessibilityChannel;
|
selectedServiceNumber = accessibilityChannel == Format.NO_VALUE ? 1 : accessibilityChannel;
|
||||||
|
isWideAspectRatio =
|
||||||
|
initializationData != null && CeaUtil.getIsWideAspectRatio(initializationData);
|
||||||
|
|
||||||
cueInfoBuilders = new CueInfoBuilder[NUM_WINDOWS];
|
cueInfoBuilders = new CueInfoBuilder[NUM_WINDOWS];
|
||||||
for (int i = 0; i < NUM_WINDOWS; i++) {
|
for (int i = 0; i < NUM_WINDOWS; i++) {
|
||||||
|
@ -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)});
|
|
||||||
}
|
|
||||||
}
|
|
@ -13,12 +13,12 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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.C;
|
||||||
import com.google.android.exoplayer2.extractor.TrackOutput;
|
import com.google.android.exoplayer2.extractor.TrackOutput;
|
||||||
import com.google.android.exoplayer2.util.Log;
|
import java.util.Collections;
|
||||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
import java.util.List;
|
||||||
|
|
||||||
/** Utility methods for handling CEA-608/708 messages. Defined in A/53 Part 4:2009. */
|
/** Utility methods for handling CEA-608/708 messages. Defined in A/53 Part 4:2009. */
|
||||||
public final class CeaUtil {
|
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_ATSC = 0x31;
|
||||||
private static final int PROVIDER_CODE_DIRECTV = 0x2F;
|
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
|
* 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.
|
* 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 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.
|
* @param outputs The outputs to which any samples should be written.
|
||||||
*/
|
*/
|
||||||
public static void consume(long presentationTimeUs, ParsableByteArray seiBuffer,
|
public static void consume(
|
||||||
TrackOutput[] outputs) {
|
long presentationTimeUs, ParsableByteArray seiBuffer, TrackOutput[] outputs) {
|
||||||
while (seiBuffer.bytesLeft() > 1 /* last byte will be rbsp_trailing_bits */) {
|
while (seiBuffer.bytesLeft() > 1 /* last byte will be rbsp_trailing_bits */) {
|
||||||
int payloadType = readNon255TerminatedValue(seiBuffer);
|
int payloadType = readNon255TerminatedValue(seiBuffer);
|
||||||
int payloadSize = readNon255TerminatedValue(seiBuffer);
|
int payloadSize = readNon255TerminatedValue(seiBuffer);
|
Loading…
x
Reference in New Issue
Block a user