OpusDecoder.smali

.class final Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;
.super Lcom/google/android/exoplayer2/decoder/SimpleDecoder;
.source "OpusDecoder.java"


# annotations
.annotation system Ldalvik/annotation/Signature;
    value = {
        "Lcom/google/android/exoplayer2/decoder/SimpleDecoder<",
        "Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;",
        "Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;",
        "Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;",
        ">;"
    }
.end annotation


# static fields
.field private static final DECODE_ERROR:I

.field private static final DEFAULT_SEEK_PRE_ROLL_SAMPLES:I

.field private static final DRM_ERROR:I

.field private static final NO_ERROR:I

.field private static final SAMPLE_RATE:I


# instance fields
.field private final channelCount:I

.field private final exoMediaCrypto:Lcom/google/android/exoplayer2/drm/ExoMediaCrypto;

.field private final headerSeekPreRollSamples:I

.field private final headerSkipSamples:I

.field private final nativeDecoderContext:J

.field private skipSamples:I


# direct methods
.method static constructor <clinit>()V
    .registers 1

    const v0, -0x1570

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->DECODE_ERROR:I

    const v0, 0x1a6f

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->DEFAULT_SEEK_PRE_ROLL_SAMPLES:I

    const v0, -0x156f

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->DRM_ERROR:I

    const v0, 0x156f

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->NO_ERROR:I

    const v0, 0xaeef

    invoke-static {v0}, Lnp/NPFog;->d(I)I

    move-result v0

    sput v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->SAMPLE_RATE:I

    return-void
.end method

.method public constructor <init>(IIILjava/util/List;Lcom/google/android/exoplayer2/drm/ExoMediaCrypto;)V
    .registers 24
    .param p1, "numInputBuffers"    # I
    .param p2, "numOutputBuffers"    # I
    .param p3, "initialInputBufferSize"    # I
    .param p5, "exoMediaCrypto"    # Lcom/google/android/exoplayer2/drm/ExoMediaCrypto;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(III",
            "Ljava/util/List<",
            "[B>;",
            "Lcom/google/android/exoplayer2/drm/ExoMediaCrypto;",
            ")V"
        }
    .end annotation

    .annotation system Ldalvik/annotation/Throws;
        value = {
            Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;
        }
    .end annotation

    .line 70
    .local p4, "initializationData":Ljava/util/List;, "Ljava/util/List<[B>;"
    move-object/from16 v7, p0

    move-object/from16 v8, p4

    move-object/from16 v9, p5

    move/from16 v10, p1

    new-array v0, v10, [Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;

    move/from16 v11, p2

    new-array v1, v11, [Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;

    invoke-direct {v7, v0, v1}, Lcom/google/android/exoplayer2/decoder/SimpleDecoder;-><init>([Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;[Lcom/google/android/exoplayer2/decoder/OutputBuffer;)V

    .line 71
    iput-object v9, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->exoMediaCrypto:Lcom/google/android/exoplayer2/drm/ExoMediaCrypto;

    .line 72
    if-eqz v9, :cond_24

    invoke-static {}, Lcom/google/android/exoplayer2/ext/opus/OpusLibrary;->opusIsSecureDecodeSupported()Z

    move-result v0

    if-eqz v0, :cond_1c

    goto :goto_24

    .line 73
    :cond_1c
    new-instance v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    const-string v1, "Opus decoder does not support secure decode."

    invoke-direct {v0, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 75
    :cond_24
    :goto_24
    const/4 v0, 0x0

    invoke-interface {v8, v0}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v1

    move-object v12, v1

    check-cast v12, [B

    .line 76
    .local v12, "headerBytes":[B
    array-length v1, v12

    const-string v2, "Header size is too small."

    const/16 v3, 0x13

    if-lt v1, v3, :cond_13c

    .line 79
    const/16 v1, 0x9

    aget-byte v1, v12, v1

    and-int/lit16 v1, v1, 0xff

    iput v1, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    .line 80
    const/16 v4, 0x8

    if-gt v1, v4, :cond_121

    .line 83
    const/16 v1, 0xa

    invoke-static {v12, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->readLittleEndian16([BI)I

    move-result v13

    .line 84
    .local v13, "preskip":I
    const/16 v1, 0x10

    invoke-static {v12, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->readLittleEndian16([BI)I

    move-result v14

    .line 86
    .local v14, "gain":I
    new-array v15, v4, [B

    .line 89
    .local v15, "streamMap":[B
    const/16 v1, 0x12

    aget-byte v1, v12, v1

    const/4 v5, 0x2

    const/4 v6, 0x1

    if-nez v1, :cond_70

    .line 91
    iget v1, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    if-gt v1, v5, :cond_68

    .line 94
    const/4 v2, 0x1

    .line 95
    .local v2, "numStreams":I
    if-ne v1, v5, :cond_5e

    const/4 v1, 0x1

    goto :goto_5f

    :cond_5e
    const/4 v1, 0x0

    .line 96
    .local v1, "numCoupled":I
    :goto_5f
    aput-byte v0, v15, v0

    .line 97
    aput-byte v6, v15, v6

    move/from16 v16, v1

    move/from16 v17, v2

    goto :goto_8a

    .line 92
    .end local v1    # "numCoupled":I
    .end local v2    # "numStreams":I
    :cond_68
    new-instance v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    const-string v1, "Invalid Header, missing stream map."

    invoke-direct {v0, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 99
    :cond_70
    array-length v1, v12

    iget v5, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    add-int/lit8 v4, v5, 0x15

    if-lt v1, v4, :cond_119

    .line 103
    aget-byte v1, v12, v3

    and-int/lit16 v2, v1, 0xff

    .line 104
    .restart local v2    # "numStreams":I
    const/16 v1, 0x14

    aget-byte v1, v12, v1

    and-int/lit16 v1, v1, 0xff

    .line 105
    .restart local v1    # "numCoupled":I
    const/16 v3, 0x15

    invoke-static {v12, v3, v15, v0, v5}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

    move/from16 v16, v1

    move/from16 v17, v2

    .line 107
    .end local v1    # "numCoupled":I
    .end local v2    # "numStreams":I
    .local v16, "numCoupled":I
    .local v17, "numStreams":I
    :goto_8a
    invoke-interface/range {p4 .. p4}, Ljava/util/List;->size()I

    move-result v0

    const/4 v1, 0x3

    if-ne v0, v1, :cond_ea

    .line 108
    invoke-interface {v8, v6}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, [B

    array-length v0, v0

    const/16 v1, 0x8

    if-ne v0, v1, :cond_e2

    const/4 v0, 0x2

    invoke-interface {v8, v0}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v2

    check-cast v2, [B

    array-length v0, v2

    if-ne v0, v1, :cond_e2

    .line 111
    nop

    .line 112
    invoke-interface {v8, v6}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, [B

    invoke-static {v0}, Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;

    move-result-object v0

    invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;

    move-result-object v1

    invoke-virtual {v0, v1}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;

    move-result-object v0

    invoke-virtual {v0}, Ljava/nio/ByteBuffer;->getLong()J

    move-result-wide v0

    .line 113
    .local v0, "codecDelayNs":J
    nop

    .line 114
    const/4 v2, 0x2

    invoke-interface {v8, v2}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v2

    check-cast v2, [B

    invoke-static {v2}, Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer;

    move-result-object v2

    invoke-static {}, Ljava/nio/ByteOrder;->nativeOrder()Ljava/nio/ByteOrder;

    move-result-object v3

    invoke-virtual {v2, v3}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;

    move-result-object v2

    invoke-virtual {v2}, Ljava/nio/ByteBuffer;->getLong()J

    move-result-wide v2

    .line 115
    .local v2, "seekPreRollNs":J
    invoke-static {v0, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nsToSamples(J)I

    move-result v4

    iput v4, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->headerSkipSamples:I

    .line 116
    invoke-static {v2, v3}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nsToSamples(J)I

    move-result v4

    iput v4, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->headerSeekPreRollSamples:I

    .line 117
    .end local v0    # "codecDelayNs":J
    .end local v2    # "seekPreRollNs":J
    goto :goto_f0

    .line 109
    :cond_e2
    new-instance v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    const-string v1, "Invalid Codec Delay or Seek Preroll"

    invoke-direct {v0, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v0

    .line 118
    :cond_ea
    iput v13, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->headerSkipSamples:I

    .line 119
    const/16 v0, 0xf00

    iput v0, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->headerSeekPreRollSamples:I

    .line 121
    :goto_f0
    const v1, 0xbb80

    iget v2, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    move-object/from16 v0, p0

    move/from16 v3, v17

    move/from16 v4, v16

    move v5, v14

    move-object v6, v15

    invoke-direct/range {v0 .. v6}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusInit(IIIII[B)J

    move-result-wide v0

    iput-wide v0, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    .line 123
    const-wide/16 v2, 0x0

    cmp-long v4, v0, v2

    if-eqz v4, :cond_10f

    .line 126
    move/from16 v0, p3

    invoke-virtual {v7, v0}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->setInitialInputBufferSize(I)V

    .line 127
    return-void

    .line 124
    :cond_10f
    move/from16 v0, p3

    new-instance v1, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    const-string v2, "Failed to initialize decoder"

    invoke-direct {v1, v2}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v1

    .line 100
    .end local v16    # "numCoupled":I
    .end local v17    # "numStreams":I
    :cond_119
    move/from16 v0, p3

    new-instance v1, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    invoke-direct {v1, v2}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v1

    .line 81
    .end local v13    # "preskip":I
    .end local v14    # "gain":I
    .end local v15    # "streamMap":[B
    :cond_121
    move/from16 v0, p3

    new-instance v1, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v3, "Invalid channel count: "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    iget v3, v7, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-direct {v1, v2}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v1

    .line 77
    :cond_13c
    move/from16 v0, p3

    new-instance v1, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    invoke-direct {v1, v2}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    throw v1
.end method

.method private static nsToSamples(J)I
    .registers 6
    .param p0, "ns"    # J

    .line 217
    const-wide/32 v0, 0xbb80

    mul-long v0, v0, p0

    const-wide/32 v2, 0x3b9aca00

    div-long/2addr v0, v2

    long-to-int v1, v0

    return v1
.end method

.method private native opusClose(J)V
.end method

.method private native opusDecode(JJLjava/nio/ByteBuffer;ILcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;)I
.end method

.method private native opusGetErrorCode(J)I
.end method

.method private native opusGetErrorMessage(J)Ljava/lang/String;
.end method

.method private native opusInit(IIIII[B)J
.end method

.method private native opusReset(J)V
.end method

.method private native opusSecureDecode(JJLjava/nio/ByteBuffer;ILcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;ILcom/google/android/exoplayer2/drm/ExoMediaCrypto;I[B[BI[I[I)I
.end method

.method private static readLittleEndian16([BI)I
    .registers 4
    .param p0, "input"    # [B
    .param p1, "offset"    # I

    .line 221
    aget-byte v0, p0, p1

    and-int/lit16 v0, v0, 0xff

    .line 222
    .local v0, "value":I
    add-int/lit8 v1, p1, 0x1

    aget-byte v1, p0, v1

    and-int/lit16 v1, v1, 0xff

    shl-int/lit8 v1, v1, 0x8

    or-int/2addr v0, v1

    .line 223
    return v0
.end method


# virtual methods
.method protected createInputBuffer()Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;
    .registers 3

    .line 136
    new-instance v0, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;

    const/4 v1, 0x2

    invoke-direct {v0, v1}, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;-><init>(I)V

    return-object v0
.end method

.method protected bridge synthetic createOutputBuffer()Lcom/google/android/exoplayer2/decoder/OutputBuffer;
    .registers 2

    .line 32
    invoke-virtual {p0}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->createOutputBuffer()Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;

    move-result-object v0

    return-object v0
.end method

.method protected createOutputBuffer()Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;
    .registers 2

    .line 141
    new-instance v0, Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;

    invoke-direct {v0, p0}, Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;-><init>(Lcom/google/android/exoplayer2/decoder/SimpleDecoder;)V

    return-object v0
.end method

.method protected createUnexpectedDecodeException(Ljava/lang/Throwable;)Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;
    .registers 4
    .param p1, "error"    # Ljava/lang/Throwable;

    .line 146
    new-instance v0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    const-string v1, "Unexpected decode error"

    invoke-direct {v0, v1, p1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V

    return-object v0
.end method

.method protected bridge synthetic createUnexpectedDecodeException(Ljava/lang/Throwable;)Ljava/lang/Exception;
    .registers 2

    .line 32
    invoke-virtual {p0, p1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->createUnexpectedDecodeException(Ljava/lang/Throwable;)Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    move-result-object p1

    return-object p1
.end method

.method protected decode(Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;Z)Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;
    .registers 26
    .param p1, "inputBuffer"    # Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;
    .param p2, "outputBuffer"    # Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;
    .param p3, "reset"    # Z

    .line 152
    move-object/from16 v15, p0

    move-object/from16 v14, p1

    move-object/from16 v13, p2

    if-eqz p3, :cond_1c

    .line 153
    iget-wide v0, v15, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    invoke-direct {v15, v0, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusReset(J)V

    .line 156
    iget-wide v0, v14, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;->timeUs:J

    const-wide/16 v2, 0x0

    cmp-long v4, v0, v2

    if-nez v4, :cond_18

    iget v0, v15, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->headerSkipSamples:I

    goto :goto_1a

    :cond_18
    iget v0, v15, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->headerSeekPreRollSamples:I

    :goto_1a
    iput v0, v15, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->skipSamples:I

    .line 158
    :cond_1c
    iget-object v12, v14, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;->data:Ljava/nio/ByteBuffer;

    .line 159
    .local v12, "inputData":Ljava/nio/ByteBuffer;
    iget-object v11, v14, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;->cryptoInfo:Lcom/google/android/exoplayer2/decoder/CryptoInfo;

    .line 160
    .local v11, "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    invoke-virtual/range {p1 .. p1}, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;->isEncrypted()Z

    move-result v0

    if-eqz v0, :cond_67

    iget-wide v1, v15, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    iget-wide v3, v14, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;->timeUs:J

    .line 161
    invoke-virtual {v12}, Ljava/nio/ByteBuffer;->limit()I

    move-result v6

    iget-object v9, v15, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->exoMediaCrypto:Lcom/google/android/exoplayer2/drm/ExoMediaCrypto;

    iget v10, v11, Lcom/google/android/exoplayer2/decoder/CryptoInfo;->mode:I

    iget-object v7, v11, Lcom/google/android/exoplayer2/decoder/CryptoInfo;->key:[B

    iget-object v5, v11, Lcom/google/android/exoplayer2/decoder/CryptoInfo;->iv:[B

    iget v0, v11, Lcom/google/android/exoplayer2/decoder/CryptoInfo;->numSubSamples:I

    iget-object v8, v11, Lcom/google/android/exoplayer2/decoder/CryptoInfo;->numBytesOfClearData:[I

    move-object/from16 v17, v8

    iget-object v8, v11, Lcom/google/android/exoplayer2/decoder/CryptoInfo;->numBytesOfEncryptedData:[I

    move/from16 v18, v0

    move-object/from16 v0, p0

    move-object/from16 v19, v5

    move-object v5, v12

    move-object/from16 v20, v7

    move-object/from16 v7, p2

    move-object/from16 v16, v17

    move-object/from16 v17, v8

    const v8, 0xbb80

    move-object/from16 v21, v11

    .end local v11    # "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    .local v21, "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    move-object/from16 v11, v20

    move-object/from16 v20, v12

    .end local v12    # "inputData":Ljava/nio/ByteBuffer;
    .local v20, "inputData":Ljava/nio/ByteBuffer;
    move-object/from16 v12, v19

    move/from16 v13, v18

    move-object/from16 v14, v16

    move-object/from16 v15, v17

    invoke-direct/range {v0 .. v15}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusSecureDecode(JJLjava/nio/ByteBuffer;ILcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;ILcom/google/android/exoplayer2/drm/ExoMediaCrypto;I[B[BI[I[I)I

    move-result v0

    move-object/from16 v8, p0

    move-object/from16 v9, p1

    goto :goto_81

    .end local v20    # "inputData":Ljava/nio/ByteBuffer;
    .end local v21    # "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    .restart local v11    # "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    .restart local v12    # "inputData":Ljava/nio/ByteBuffer;
    :cond_67
    move-object/from16 v21, v11

    move-object/from16 v20, v12

    .end local v11    # "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    .end local v12    # "inputData":Ljava/nio/ByteBuffer;
    .restart local v20    # "inputData":Ljava/nio/ByteBuffer;
    .restart local v21    # "cryptoInfo":Lcom/google/android/exoplayer2/decoder/CryptoInfo;
    move-object/from16 v8, p0

    iget-wide v1, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    move-object/from16 v9, p1

    iget-wide v3, v9, Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;->timeUs:J

    .line 165
    invoke-virtual/range {v20 .. v20}, Ljava/nio/ByteBuffer;->limit()I

    move-result v6

    move-object/from16 v0, p0

    move-object/from16 v5, v20

    move-object/from16 v7, p2

    invoke-direct/range {v0 .. v7}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusDecode(JJLjava/nio/ByteBuffer;ILcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;)I

    move-result v0

    :goto_81
    nop

    .line 167
    .local v0, "result":I
    if-gez v0, :cond_cb

    .line 168
    const/4 v1, -0x2

    if-ne v0, v1, :cond_af

    .line 169
    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

    const-string v2, "Drm error: "

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    iget-wide v2, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    invoke-direct {v8, v2, v3}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusGetErrorMessage(J)Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    .line 170
    .local v1, "message":Ljava/lang/String;
    new-instance v2, Lcom/google/android/exoplayer2/drm/DecryptionException;

    iget-wide v3, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    .line 171
    invoke-direct {v8, v3, v4}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusGetErrorCode(J)I

    move-result v3

    invoke-direct {v2, v3, v1}, Lcom/google/android/exoplayer2/drm/DecryptionException;-><init>(ILjava/lang/String;)V

    .line 172
    .local v2, "cause":Lcom/google/android/exoplayer2/drm/DecryptionException;
    new-instance v3, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    invoke-direct {v3, v1, v2}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V

    return-object v3

    .line 174
    .end local v1    # "message":Ljava/lang/String;
    .end local v2    # "cause":Lcom/google/android/exoplayer2/drm/DecryptionException;
    :cond_af
    new-instance v1, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v3, "Decode error: "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    int-to-long v3, v0

    invoke-direct {v8, v3, v4}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusGetErrorMessage(J)Ljava/lang/String;

    move-result-object v3

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-direct {v1, v2}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;-><init>(Ljava/lang/String;)V

    return-object v1

    .line 178
    :cond_cb
    move-object/from16 v1, p2

    iget-object v2, v1, Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;->data:Ljava/nio/ByteBuffer;

    .line 179
    .local v2, "outputData":Ljava/nio/ByteBuffer;
    const/4 v3, 0x0

    invoke-virtual {v2, v3}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;

    .line 180
    invoke-virtual {v2, v0}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;

    .line 181
    iget v4, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->skipSamples:I

    if-lez v4, :cond_f5

    .line 182
    iget v5, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    mul-int/lit8 v5, v5, 0x2

    .line 183
    .local v5, "bytesPerSample":I
    mul-int v6, v4, v5

    .line 184
    .local v6, "skipBytes":I
    if-gt v0, v6, :cond_f0

    .line 185
    div-int v3, v0, v5

    sub-int/2addr v4, v3

    iput v4, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->skipSamples:I

    .line 186
    const/high16 v3, -0x80000000

    invoke-virtual {v1, v3}, Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;->addFlag(I)V

    .line 187
    invoke-virtual {v2, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;

    goto :goto_f5

    .line 189
    :cond_f0
    iput v3, v8, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->skipSamples:I

    .line 190
    invoke-virtual {v2, v6}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;

    .line 193
    .end local v5    # "bytesPerSample":I
    .end local v6    # "skipBytes":I
    :cond_f5
    :goto_f5
    const/4 v3, 0x0

    return-object v3
.end method

.method protected bridge synthetic decode(Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;Lcom/google/android/exoplayer2/decoder/OutputBuffer;Z)Ljava/lang/Exception;
    .registers 4

    .line 32
    check-cast p2, Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;

    invoke-virtual {p0, p1, p2, p3}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->decode(Lcom/google/android/exoplayer2/decoder/DecoderInputBuffer;Lcom/google/android/exoplayer2/decoder/SimpleOutputBuffer;Z)Lcom/google/android/exoplayer2/ext/opus/OpusDecoderException;

    move-result-object p1

    return-object p1
.end method

.method public getChannelCount()I
    .registers 2

    .line 206
    iget v0, p0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->channelCount:I

    return v0
.end method

.method public getName()Ljava/lang/String;
    .registers 3

    .line 131
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    const-string v1, "libopus"

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-static {}, Lcom/google/android/exoplayer2/ext/opus/OpusLibrary;->getVersion()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    return-object v0
.end method

.method public getSampleRate()I
    .registers 2

    .line 213
    const v0, 0xbb80

    return v0
.end method

.method public release()V
    .registers 3

    .line 198
    invoke-super {p0}, Lcom/google/android/exoplayer2/decoder/SimpleDecoder;->release()V

    .line 199
    iget-wide v0, p0, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->nativeDecoderContext:J

    invoke-direct {p0, v0, v1}, Lcom/google/android/exoplayer2/ext/opus/OpusDecoder;->opusClose(J)V

    .line 200
    return-void
.end method