Commit 0f63c501 by andrewlewis Committed by Ian Baker

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
parent 6b03d4bc
...@@ -37,8 +37,8 @@ import com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom; ...@@ -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; ...@@ -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 ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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 { ...@@ -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 { ...@@ -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++) {
......
/*
* 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 @@ ...@@ -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 {
...@@ -34,6 +34,30 @@ public final class CeaUtil { ...@@ -34,6 +34,30 @@ public final class CeaUtil {
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 { ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment