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
This commit is contained in:
andrewlewis 2020-01-24 12:20:55 +00:00 committed by Andrew Lewis
parent e73b5429db
commit 01bc853993
7 changed files with 38 additions and 36 deletions

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

@ -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<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.
*
@ -380,5 +406,4 @@ public final class CodecSpecificDataUtil {
bitArray.skipBits(1); // extensionFlag3.
}
}
}