Commit 01bc8539 by andrewlewis Committed by Andrew Lewis

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
parent e73b5429
...@@ -13,12 +13,11 @@ ...@@ -13,12 +13,11 @@
* 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.util; package com.google.android.exoplayer2.extractor;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
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,30 +33,6 @@ public final class CeaUtil { ...@@ -34,30 +33,6 @@ 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.
* *
......
...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ParserException; ...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.audio.Ac4Util; import com.google.android.exoplayer2.audio.Ac4Util;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; 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.ChunkIndex;
import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
...@@ -38,7 +39,6 @@ import com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom; ...@@ -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.EventMessage;
import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder; import com.google.android.exoplayer2.metadata.emsg.EventMessageEncoder;
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.util.CeaUtil; import com.google.android.exoplayer2.util.CodecSpecificDataUtil;
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,8 @@ public final class DefaultTsPayloadReaderFactory implements TsPayloadReader.Fact ...@@ -253,7 +253,8 @@ 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 = CeaUtil.getCea708InitializationData(isWideAspectRatio); initializationData =
CodecSpecificDataUtil.buildCea708InitializationData(isWideAspectRatio);
} }
closedCaptionFormats.add( closedCaptionFormats.add(
......
...@@ -18,11 +18,11 @@ package com.google.android.exoplayer2.extractor.ts; ...@@ -18,11 +18,11 @@ package com.google.android.exoplayer2.extractor.ts;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; 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.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.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;
......
...@@ -18,10 +18,10 @@ package com.google.android.exoplayer2.extractor.ts; ...@@ -18,10 +18,10 @@ package com.google.android.exoplayer2.extractor.ts;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; 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.ExtractorOutput;
import com.google.android.exoplayer2.extractor.TrackOutput; import com.google.android.exoplayer2.extractor.TrackOutput;
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,7 +34,7 @@ import com.google.android.exoplayer2.text.Subtitle; ...@@ -34,7 +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.CodecSpecificDataUtil;
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;
...@@ -164,7 +164,8 @@ public final class Cea708Decoder extends CeaDecoder { ...@@ -164,7 +164,8 @@ public final class Cea708Decoder extends CeaDecoder {
serviceBlockPacket = new ParsableBitArray(); serviceBlockPacket = new ParsableBitArray();
selectedServiceNumber = accessibilityChannel == Format.NO_VALUE ? 1 : accessibilityChannel; selectedServiceNumber = accessibilityChannel == Format.NO_VALUE ? 1 : accessibilityChannel;
isWideAspectRatio = isWideAspectRatio =
initializationData != null && CeaUtil.getIsWideAspectRatio(initializationData); initializationData != null
&& CodecSpecificDataUtil.parseCea708InitializationData(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++) {
......
...@@ -20,6 +20,7 @@ import androidx.annotation.Nullable; ...@@ -20,6 +20,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
...@@ -222,6 +223,31 @@ public final class CodecSpecificDataUtil { ...@@ -222,6 +223,31 @@ public final class CodecSpecificDataUtil {
} }
/** /**
* 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<byte[]> 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<byte[]> 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. * Builds an RFC 6381 AVC codec string using the provided parameters.
* *
* @param profileIdc The encoding profile. * @param profileIdc The encoding profile.
...@@ -380,5 +406,4 @@ public final class CodecSpecificDataUtil { ...@@ -380,5 +406,4 @@ public final class CodecSpecificDataUtil {
bitArray.skipBits(1); // extensionFlag3. bitArray.skipBits(1); // extensionFlag3.
} }
} }
} }
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