public final class

TrackEncryptionBox

extends java.lang.Object

 java.lang.Object

↳androidx.media3.extractor.mp4.TrackEncryptionBox

Gradle dependencies

compile group: 'androidx.media3', name: 'media3-extractor', version: '1.5.0-alpha01'

  • groupId: androidx.media3
  • artifactId: media3-extractor
  • version: 1.5.0-alpha01

Artifact androidx.media3:media3-extractor:1.5.0-alpha01 it located at Google repository (https://maven.google.com/)

Overview

Encapsulates information parsed from a track encryption (tenc) box or sample group description (sgpd) box in an MP4 stream.

Summary

Fields
public final TrackOutput.CryptoDatacryptoData

A instance containing the encryption information from this TrackEncryptionBox.

public final byte[]defaultInitializationVector

If TrackEncryptionBox.perSampleIvSize is 0, holds the default initialization vector as defined in the track encryption box or sample group description box.

public final booleanisEncrypted

Indicates the encryption state of the samples in the sample group.

public final intperSampleIvSize

The initialization vector size in bytes for the samples in the corresponding sample group.

public final java.lang.StringschemeType

The protection scheme type, as defined by the 'schm' box, or null if unknown.

Constructors
publicTrackEncryptionBox(boolean isEncrypted, java.lang.String schemeType, int perSampleIvSize, byte[] keyId[], int defaultEncryptedBlocks, int defaultClearBlocks, byte[] defaultInitializationVector[])

Methods
from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Fields

public final boolean isEncrypted

Indicates the encryption state of the samples in the sample group.

public final java.lang.String schemeType

The protection scheme type, as defined by the 'schm' box, or null if unknown.

public final TrackOutput.CryptoData cryptoData

A instance containing the encryption information from this TrackEncryptionBox.

public final int perSampleIvSize

The initialization vector size in bytes for the samples in the corresponding sample group.

public final byte[] defaultInitializationVector

If TrackEncryptionBox.perSampleIvSize is 0, holds the default initialization vector as defined in the track encryption box or sample group description box. Null otherwise.

Constructors

public TrackEncryptionBox(boolean isEncrypted, java.lang.String schemeType, int perSampleIvSize, byte[] keyId[], int defaultEncryptedBlocks, int defaultClearBlocks, byte[] defaultInitializationVector[])

Parameters:

isEncrypted: See TrackEncryptionBox.isEncrypted.
schemeType: See TrackEncryptionBox.schemeType.
perSampleIvSize: See TrackEncryptionBox.perSampleIvSize.
keyId: See .
defaultEncryptedBlocks: See .
defaultClearBlocks: See .
defaultInitializationVector: See TrackEncryptionBox.defaultInitializationVector.

Source

/*
 * Copyright (C) 2016 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 androidx.media3.extractor.mp4;

import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.util.Assertions;
import androidx.media3.common.util.Log;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.extractor.TrackOutput;

/**
 * Encapsulates information parsed from a track encryption (tenc) box or sample group description
 * (sgpd) box in an MP4 stream.
 */
@UnstableApi
public final class TrackEncryptionBox {

  private static final String TAG = "TrackEncryptionBox";

  /** Indicates the encryption state of the samples in the sample group. */
  public final boolean isEncrypted;

  /** The protection scheme type, as defined by the 'schm' box, or null if unknown. */
  @Nullable public final String schemeType;

  /**
   * A {@link TrackOutput.CryptoData} instance containing the encryption information from this
   * {@link TrackEncryptionBox}.
   */
  public final TrackOutput.CryptoData cryptoData;

  /** The initialization vector size in bytes for the samples in the corresponding sample group. */
  public final int perSampleIvSize;

  /**
   * If {@link #perSampleIvSize} is 0, holds the default initialization vector as defined in the
   * track encryption box or sample group description box. Null otherwise.
   */
  @Nullable public final byte[] defaultInitializationVector;

  /**
   * @param isEncrypted See {@link #isEncrypted}.
   * @param schemeType See {@link #schemeType}.
   * @param perSampleIvSize See {@link #perSampleIvSize}.
   * @param keyId See {@link TrackOutput.CryptoData#encryptionKey}.
   * @param defaultEncryptedBlocks See {@link TrackOutput.CryptoData#encryptedBlocks}.
   * @param defaultClearBlocks See {@link TrackOutput.CryptoData#clearBlocks}.
   * @param defaultInitializationVector See {@link #defaultInitializationVector}.
   */
  public TrackEncryptionBox(
      boolean isEncrypted,
      @Nullable String schemeType,
      int perSampleIvSize,
      byte[] keyId,
      int defaultEncryptedBlocks,
      int defaultClearBlocks,
      @Nullable byte[] defaultInitializationVector) {
    Assertions.checkArgument(perSampleIvSize == 0 ^ defaultInitializationVector == null);
    this.isEncrypted = isEncrypted;
    this.schemeType = schemeType;
    this.perSampleIvSize = perSampleIvSize;
    this.defaultInitializationVector = defaultInitializationVector;
    cryptoData =
        new TrackOutput.CryptoData(
            schemeToCryptoMode(schemeType), keyId, defaultEncryptedBlocks, defaultClearBlocks);
  }

  private static @C.CryptoMode int schemeToCryptoMode(@Nullable String schemeType) {
    if (schemeType == null) {
      // If unknown, assume cenc.
      return C.CRYPTO_MODE_AES_CTR;
    }
    switch (schemeType) {
      case C.CENC_TYPE_cenc:
      case C.CENC_TYPE_cens:
        return C.CRYPTO_MODE_AES_CTR;
      case C.CENC_TYPE_cbc1:
      case C.CENC_TYPE_cbcs:
        return C.CRYPTO_MODE_AES_CBC;
      default:
        Log.w(
            TAG,
            "Unsupported protection scheme type '"
                + schemeType
                + "'. Assuming AES-CTR crypto mode.");
        return C.CRYPTO_MODE_AES_CTR;
    }
  }
}