HardwareVideoDecoder.smali

.class Lorg/webrtc/ali/HardwareVideoDecoder;
.super Ljava/lang/Object;
.source "HardwareVideoDecoder.java"

# interfaces
.implements Lorg/webrtc/ali/VideoDecoder;


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;
    }
.end annotation


# static fields
.field private static final DEQUEUE_INPUT_TIMEOUT_US:I

.field private static final DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US:I

.field private static final MEDIA_CODEC_RELEASE_TIMEOUT_MS:I

.field private static final MEDIA_FORMAT_KEY_CROP_BOTTOM:Ljava/lang/String; = "crop-bottom"

.field private static final MEDIA_FORMAT_KEY_CROP_LEFT:Ljava/lang/String; = "crop-left"

.field private static final MEDIA_FORMAT_KEY_CROP_RIGHT:Ljava/lang/String; = "crop-right"

.field private static final MEDIA_FORMAT_KEY_CROP_TOP:Ljava/lang/String; = "crop-top"

.field private static final MEDIA_FORMAT_KEY_SLICE_HEIGHT:Ljava/lang/String; = "slice-height"

.field private static final MEDIA_FORMAT_KEY_STRIDE:Ljava/lang/String; = "stride"

.field private static final TAG:Ljava/lang/String; = "HardwareVideoDecoder"


# instance fields
.field private activeOutputBuffers:I

.field private final activeOutputBuffersLock:Ljava/lang/Object;

.field private callback:Lorg/webrtc/ali/VideoDecoder$Callback;

.field private codec:Landroid/media/MediaCodec;

.field private final codecName:Ljava/lang/String;

.field private final codecType:Lorg/webrtc/ali/VideoCodecType;

.field private colorFormat:I

.field private decoderThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

.field private final dimensionLock:Ljava/lang/Object;

.field private final frameInfos:Ljava/util/Deque;
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "Ljava/util/Deque<",
            "Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;",
            ">;"
        }
    .end annotation
.end field

.field private hasDecodedFirstFrame:Z

.field private height:I

.field private keyFrameRequired:Z

.field private outputThread:Ljava/lang/Thread;

.field private outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

.field private volatile running:Z

.field private volatile shutdownException:Ljava/lang/Exception;

.field private sliceHeight:I

.field private stride:I

.field private width:I


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

    const v0, 0x7b44f

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

    move-result v0

    sput v0, Lorg/webrtc/ali/HardwareVideoDecoder;->DEQUEUE_INPUT_TIMEOUT_US:I

    const v0, 0x193cf

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

    move-result v0

    sput v0, Lorg/webrtc/ali/HardwareVideoDecoder;->DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US:I

    const v0, 0x6e7

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

    move-result v0

    sput v0, Lorg/webrtc/ali/HardwareVideoDecoder;->MEDIA_CODEC_RELEASE_TIMEOUT_MS:I

    return-void
.end method

.method constructor <init>(Ljava/lang/String;Lorg/webrtc/ali/VideoCodecType;I)V
    .registers 7
    .param p1, "codecName"    # Ljava/lang/String;
    .param p2, "codecType"    # Lorg/webrtc/ali/VideoCodecType;
    .param p3, "colorFormat"    # I

    .line 108
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 82
    const/4 v0, 0x0

    iput-boolean v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->running:Z

    .line 83
    const/4 v1, 0x0

    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->shutdownException:Ljava/lang/Exception;

    .line 86
    new-instance v2, Ljava/lang/Object;

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

    iput-object v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffersLock:Ljava/lang/Object;

    .line 87
    iput v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffers:I

    .line 91
    new-instance v0, Ljava/lang/Object;

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

    iput-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->dimensionLock:Ljava/lang/Object;

    .line 106
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    .line 109
    invoke-direct {p0, p3}, Lorg/webrtc/ali/HardwareVideoDecoder;->isSupportedColorFormat(I)Z

    move-result v0

    if-eqz v0, :cond_2f

    .line 112
    iput-object p1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codecName:Ljava/lang/String;

    .line 113
    iput-object p2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codecType:Lorg/webrtc/ali/VideoCodecType;

    .line 114
    iput p3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

    .line 115
    new-instance v0, Ljava/util/concurrent/LinkedBlockingDeque;

    invoke-direct {v0}, Ljava/util/concurrent/LinkedBlockingDeque;-><init>()V

    iput-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    .line 116
    return-void

    .line 110
    :cond_2f
    new-instance v0, Ljava/lang/IllegalArgumentException;

    new-instance v1, Ljava/lang/StringBuilder;

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

    const-string v2, "Unsupported color format: "

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

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

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

    move-result-object v1

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

    throw v0
.end method

.method static synthetic access$002(Lorg/webrtc/ali/HardwareVideoDecoder;Lorg/webrtc/ali/ThreadUtils$ThreadChecker;)Lorg/webrtc/ali/ThreadUtils$ThreadChecker;
    .registers 2
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;
    .param p1, "x1"    # Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    .line 30
    iput-object p1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    return-object p1
.end method

.method static synthetic access$100(Lorg/webrtc/ali/HardwareVideoDecoder;)Z
    .registers 2
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;

    .line 30
    iget-boolean v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->running:Z

    return v0
.end method

.method static synthetic access$200(Lorg/webrtc/ali/HardwareVideoDecoder;)V
    .registers 1
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;

    .line 30
    invoke-direct {p0}, Lorg/webrtc/ali/HardwareVideoDecoder;->deliverDecodedFrame()V

    return-void
.end method

.method static synthetic access$300(Lorg/webrtc/ali/HardwareVideoDecoder;)V
    .registers 1
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;

    .line 30
    invoke-direct {p0}, Lorg/webrtc/ali/HardwareVideoDecoder;->releaseCodecOnOutputThread()V

    return-void
.end method

.method static synthetic access$400(Lorg/webrtc/ali/HardwareVideoDecoder;)Landroid/media/MediaCodec;
    .registers 2
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;

    .line 30
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    return-object v0
.end method

.method static synthetic access$500(Lorg/webrtc/ali/HardwareVideoDecoder;)Ljava/lang/Object;
    .registers 2
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;

    .line 30
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffersLock:Ljava/lang/Object;

    return-object v0
.end method

.method static synthetic access$610(Lorg/webrtc/ali/HardwareVideoDecoder;)I
    .registers 3
    .param p0, "x0"    # Lorg/webrtc/ali/HardwareVideoDecoder;

    .line 30
    iget v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffers:I

    add-int/lit8 v1, v0, -0x1

    iput v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffers:I

    return v0
.end method

.method private static copyI420(Ljava/nio/ByteBuffer;ILorg/webrtc/ali/VideoFrame$I420Buffer;IIII)V
    .registers 21
    .param p0, "src"    # Ljava/nio/ByteBuffer;
    .param p1, "offset"    # I
    .param p2, "frameBuffer"    # Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .param p3, "stride"    # I
    .param p4, "sliceHeight"    # I
    .param p5, "width"    # I
    .param p6, "height"    # I

    .line 601
    div-int/lit8 v8, p3, 0x2

    .line 602
    .local v8, "uvStride":I
    add-int/lit8 v0, p5, 0x1

    div-int/lit8 v9, v0, 0x2

    .line 605
    .local v9, "chromaWidth":I
    rem-int/lit8 v0, p4, 0x2

    if-nez v0, :cond_f

    add-int/lit8 v0, p6, 0x1

    div-int/lit8 v0, v0, 0x2

    goto :goto_11

    :cond_f
    div-int/lit8 v0, p6, 0x2

    :goto_11
    move v10, v0

    .line 607
    .local v10, "chromaHeight":I
    move v11, p1

    .line 608
    .local v11, "yPos":I
    mul-int v0, p3, p4

    add-int v12, v11, v0

    .line 609
    .local v12, "uPos":I
    mul-int v0, v8, p4

    div-int/lit8 v0, v0, 0x2

    add-int v13, v12, v0

    .line 611
    .local v13, "vPos":I
    nop

    .line 612
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataY()Ljava/nio/ByteBuffer;

    move-result-object v3

    const/4 v4, 0x0

    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideY()I

    move-result v5

    .line 611
    move-object v0, p0

    move v1, v11

    move/from16 v2, p3

    move/from16 v6, p5

    move/from16 v7, p6

    invoke-static/range {v0 .. v7}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyPlane(Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIII)V

    .line 613
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataU()Ljava/nio/ByteBuffer;

    move-result-object v3

    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideU()I

    move-result v5

    move v1, v12

    move v2, v8

    move v6, v9

    move v7, v10

    invoke-static/range {v0 .. v7}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyPlane(Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIII)V

    .line 615
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataV()Ljava/nio/ByteBuffer;

    move-result-object v3

    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideV()I

    move-result v5

    move v1, v13

    invoke-static/range {v0 .. v7}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyPlane(Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIII)V

    .line 620
    rem-int/lit8 v0, p4, 0x2

    if-eqz v0, :cond_77

    .line 621
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideU()I

    move-result v0

    .line 622
    .local v0, "strideU":I
    mul-int v1, v10, v0

    .line 623
    .local v1, "endU":I
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataU()Ljava/nio/ByteBuffer;

    move-result-object v2

    sub-int v3, v1, v0

    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataU()Ljava/nio/ByteBuffer;

    move-result-object v4

    invoke-static {v2, v3, v4, v1, v9}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyRow(Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;II)V

    .line 624
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideV()I

    move-result v2

    .line 625
    .local v2, "strideV":I
    mul-int v3, v10, v2

    .line 626
    .local v3, "endV":I
    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataV()Ljava/nio/ByteBuffer;

    move-result-object v4

    sub-int v5, v3, v2

    invoke-interface/range {p2 .. p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataV()Ljava/nio/ByteBuffer;

    move-result-object v6

    invoke-static {v4, v5, v6, v3, v9}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyRow(Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;II)V

    .line 628
    .end local v0    # "strideU":I
    .end local v1    # "endU":I
    .end local v2    # "strideV":I
    .end local v3    # "endV":I
    :cond_77
    return-void
.end method

.method private static copyPlane(Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIII)V
    .registers 9
    .param p0, "src"    # Ljava/nio/ByteBuffer;
    .param p1, "srcPos"    # I
    .param p2, "srcStride"    # I
    .param p3, "dst"    # Ljava/nio/ByteBuffer;
    .param p4, "dstPos"    # I
    .param p5, "dstStride"    # I
    .param p6, "width"    # I
    .param p7, "height"    # I

    .line 656
    const/4 v0, 0x0

    .local v0, "i":I
    :goto_1
    if-ge v0, p7, :cond_b

    .line 657
    invoke-static {p0, p1, p3, p4, p6}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyRow(Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;II)V

    .line 658
    add-int/2addr p1, p2

    .line 659
    add-int/2addr p4, p5

    .line 656
    add-int/lit8 v0, v0, 0x1

    goto :goto_1

    .line 661
    .end local v0    # "i":I
    :cond_b
    return-void
.end method

.method private static copyRow(Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;II)V
    .registers 8
    .param p0, "src"    # Ljava/nio/ByteBuffer;
    .param p1, "srcPos"    # I
    .param p2, "dst"    # Ljava/nio/ByteBuffer;
    .param p3, "dstPos"    # I
    .param p4, "width"    # I

    .line 664
    const/4 v0, 0x0

    .local v0, "i":I
    :goto_1
    if-ge v0, p4, :cond_11

    .line 665
    add-int v1, p3, v0

    add-int v2, p1, v0

    invoke-virtual {p0, v2}, Ljava/nio/ByteBuffer;->get(I)B

    move-result v2

    invoke-virtual {p2, v1, v2}, Ljava/nio/ByteBuffer;->put(IB)Ljava/nio/ByteBuffer;

    .line 664
    add-int/lit8 v0, v0, 0x1

    goto :goto_1

    .line 667
    .end local v0    # "i":I
    :cond_11
    return-void
.end method

.method private createBufferFromI420(Ljava/nio/ByteBuffer;IIIIII)Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .registers 28
    .param p1, "buffer"    # Ljava/nio/ByteBuffer;
    .param p2, "outputBufferIndex"    # I
    .param p3, "offset"    # I
    .param p4, "stride"    # I
    .param p5, "sliceHeight"    # I
    .param p6, "width"    # I
    .param p7, "height"    # I

    .line 511
    move-object/from16 v13, p0

    div-int/lit8 v14, p4, 0x2

    .line 512
    .local v14, "uvStride":I
    add-int/lit8 v0, p6, 0x1

    div-int/lit8 v15, v0, 0x2

    .line 513
    .local v15, "chromaWidth":I
    add-int/lit8 v0, p7, 0x1

    div-int/lit8 v16, v0, 0x2

    .line 515
    .local v16, "chromaHeight":I
    move/from16 v17, p3

    .line 516
    .local v17, "yPos":I
    mul-int v0, p4, p5

    add-int v18, v17, v0

    .line 517
    .local v18, "uPos":I
    mul-int v0, v14, p5

    div-int/lit8 v0, v0, 0x2

    add-int v19, v18, v0

    .line 519
    .local v19, "vPos":I
    iget-object v1, v13, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffersLock:Ljava/lang/Object;

    monitor-enter v1

    .line 520
    :try_start_1b
    iget v0, v13, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffers:I

    add-int/lit8 v0, v0, 0x1

    iput v0, v13, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffers:I

    .line 521
    monitor-exit v1
    :try_end_22
    .catchall {:try_start_1b .. :try_end_22} :catchall_3e

    .line 522
    new-instance v0, Lorg/webrtc/ali/HardwareVideoDecoder$2;

    move-object v1, v0

    move-object/from16 v2, p0

    move-object/from16 v3, p1

    move/from16 v4, v17

    move/from16 v5, p7

    move/from16 v6, v18

    move/from16 v7, v16

    move/from16 v8, v19

    move/from16 v9, p4

    move v10, v14

    move/from16 v11, p6

    move/from16 v12, p2

    invoke-direct/range {v1 .. v12}, Lorg/webrtc/ali/HardwareVideoDecoder$2;-><init>(Lorg/webrtc/ali/HardwareVideoDecoder;Ljava/nio/ByteBuffer;IIIIIIIII)V

    return-object v0

    .line 521
    :catchall_3e
    move-exception v0

    :try_start_3f
    monitor-exit v1
    :try_end_40
    .catchall {:try_start_3f .. :try_end_40} :catchall_3e

    throw v0
.end method

.method private createOutputThread()Ljava/lang/Thread;
    .registers 3

    .line 305
    new-instance v0, Lorg/webrtc/ali/HardwareVideoDecoder$1;

    const-string v1, "HardwareVideoDecoder.outputThread"

    invoke-direct {v0, p0, v1}, Lorg/webrtc/ali/HardwareVideoDecoder$1;-><init>(Lorg/webrtc/ali/HardwareVideoDecoder;Ljava/lang/String;)V

    return-object v0
.end method

.method private deliverDecodedFrame()V
    .registers 22

    .line 318
    move-object/from16 v9, p0

    iget-object v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 320
    :try_start_7
    new-instance v0, Landroid/media/MediaCodec$BufferInfo;

    invoke-direct {v0}, Landroid/media/MediaCodec$BufferInfo;-><init>()V

    move-object v10, v0

    .line 325
    .local v10, "info":Landroid/media/MediaCodec$BufferInfo;
    iget-object v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    const-wide/32 v1, 0x186a0

    invoke-virtual {v0, v10, v1, v2}, Landroid/media/MediaCodec;->dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I

    move-result v0

    move v11, v0

    .line 326
    .local v11, "result":I
    const/4 v0, -0x2

    if-ne v11, v0, :cond_24

    .line 327
    iget-object v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v0}, Landroid/media/MediaCodec;->getOutputFormat()Landroid/media/MediaFormat;

    move-result-object v0

    invoke-direct {v9, v0}, Lorg/webrtc/ali/HardwareVideoDecoder;->reformat(Landroid/media/MediaFormat;)V

    .line 328
    return-void

    .line 331
    :cond_24
    if-gez v11, :cond_3d

    .line 332
    const-string v0, "HardwareVideoDecoder"

    new-instance v1, Ljava/lang/StringBuilder;

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

    const-string v2, "dequeueOutputBuffer returned "

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

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

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

    move-result-object v1

    invoke-static {v0, v1}, Lorg/webrtc/ali/Logging;->v(Ljava/lang/String;Ljava/lang/String;)V

    .line 333
    return-void

    .line 336
    :cond_3d
    iget-object v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v0}, Ljava/util/Deque;->poll()Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;

    move-object v12, v0

    .line 337
    .local v12, "frameInfo":Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;
    const/4 v0, 0x0

    .line 338
    .local v0, "decodeTimeMs":Ljava/lang/Integer;
    const/4 v1, 0x0

    .line 339
    .local v1, "rotation":I
    if-eqz v12, :cond_5d

    .line 340
    invoke-static {}, Landroid/os/SystemClock;->elapsedRealtime()J

    move-result-wide v2

    iget-wide v4, v12, Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;->decodeStartTimeMs:J

    sub-long/2addr v2, v4

    long-to-int v3, v2

    invoke-static {v3}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;

    move-result-object v2

    move-object v0, v2

    .line 341
    iget v2, v12, Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;->rotation:I

    move v1, v2

    move-object v13, v0

    move v14, v1

    goto :goto_5f

    .line 339
    :cond_5d
    move-object v13, v0

    move v14, v1

    .line 344
    .end local v0    # "decodeTimeMs":Ljava/lang/Integer;
    .end local v1    # "rotation":I
    .local v13, "decodeTimeMs":Ljava/lang/Integer;
    .local v14, "rotation":I
    :goto_5f
    const/4 v0, 0x1

    iput-boolean v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->hasDecodedFirstFrame:Z

    .line 348
    iget-object v1, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->dimensionLock:Ljava/lang/Object;

    monitor-enter v1
    :try_end_65
    .catch Ljava/lang/IllegalStateException; {:try_start_7 .. :try_end_65} :catch_142

    .line 349
    :try_start_65
    iget v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

    move v15, v0

    .line 350
    .local v15, "width":I
    iget v0, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

    .line 351
    .local v0, "height":I
    iget v2, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->stride:I

    .line 352
    .local v2, "stride":I
    iget v3, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->sliceHeight:I

    move v8, v3

    .line 353
    .local v8, "sliceHeight":I
    monitor-exit v1
    :try_end_70
    .catchall {:try_start_65 .. :try_end_70} :catchall_13f

    .line 357
    :try_start_70
    iget v1, v10, Landroid/media/MediaCodec$BufferInfo;->size:I

    mul-int v3, v15, v0

    mul-int/lit8 v3, v3, 0x3

    div-int/lit8 v3, v3, 0x2

    if-ge v1, v3, :cond_93

    .line 358
    const-string v1, "HardwareVideoDecoder"

    new-instance v3, Ljava/lang/StringBuilder;

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

    const-string v4, "Insufficient output buffer size: "

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

    iget v4, v10, Landroid/media/MediaCodec$BufferInfo;->size:I

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

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

    move-result-object v3

    invoke-static {v1, v3}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 359
    return-void

    .line 362
    :cond_93
    iget v1, v10, Landroid/media/MediaCodec$BufferInfo;->size:I

    mul-int v3, v2, v0

    mul-int/lit8 v3, v3, 0x3

    div-int/lit8 v3, v3, 0x2

    if-ge v1, v3, :cond_ac

    if-ne v8, v0, :cond_ac

    if-le v2, v15, :cond_ac

    .line 366
    iget v1, v10, Landroid/media/MediaCodec$BufferInfo;->size:I

    mul-int/lit8 v1, v1, 0x2

    mul-int/lit8 v3, v0, 0x3

    div-int/2addr v1, v3

    move v2, v1

    move/from16 v16, v2

    goto :goto_ae

    .line 369
    :cond_ac
    move/from16 v16, v2

    .end local v2    # "stride":I
    .local v16, "stride":I
    :goto_ae
    iget-object v1, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v1}, Landroid/media/MediaCodec;->getOutputBuffers()[Ljava/nio/ByteBuffer;

    move-result-object v1

    aget-object v1, v1, v11

    move-object v7, v1

    .line 370
    .local v7, "buffer":Ljava/nio/ByteBuffer;
    iget v1, v10, Landroid/media/MediaCodec$BufferInfo;->offset:I

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

    .line 371
    iget v1, v10, Landroid/media/MediaCodec$BufferInfo;->size:I

    invoke-virtual {v7, v1}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;

    .line 376
    iget v1, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

    const/16 v2, 0x13

    const/4 v6, 0x0

    if-ne v1, v2, :cond_ff

    .line 377
    rem-int/lit8 v1, v8, 0x2

    if-nez v1, :cond_e1

    .line 378
    iget v4, v10, Landroid/media/MediaCodec$BufferInfo;->offset:I

    .line 379
    move-object/from16 v1, p0

    move-object v2, v7

    move v3, v11

    move/from16 v5, v16

    move v6, v8

    move-object/from16 v17, v7

    .end local v7    # "buffer":Ljava/nio/ByteBuffer;
    .local v17, "buffer":Ljava/nio/ByteBuffer;
    move v7, v15

    move/from16 v18, v8

    .end local v8    # "sliceHeight":I
    .local v18, "sliceHeight":I
    move v8, v0

    invoke-direct/range {v1 .. v8}, Lorg/webrtc/ali/HardwareVideoDecoder;->createBufferFromI420(Ljava/nio/ByteBuffer;IIIIII)Lorg/webrtc/ali/VideoFrame$I420Buffer;

    move-result-object v1

    move-object v6, v1

    .local v1, "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    goto :goto_11c

    .line 381
    .end local v1    # "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .end local v17    # "buffer":Ljava/nio/ByteBuffer;
    .end local v18    # "sliceHeight":I
    .restart local v7    # "buffer":Ljava/nio/ByteBuffer;
    .restart local v8    # "sliceHeight":I
    :cond_e1
    move-object/from16 v17, v7

    move/from16 v18, v8

    .end local v7    # "buffer":Ljava/nio/ByteBuffer;
    .end local v8    # "sliceHeight":I
    .restart local v17    # "buffer":Ljava/nio/ByteBuffer;
    .restart local v18    # "sliceHeight":I
    new-instance v4, Lorg/webrtc/ali/I420BufferImpl;

    invoke-direct {v4, v15, v0}, Lorg/webrtc/ali/I420BufferImpl;-><init>(II)V

    .line 383
    .local v4, "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    iget v3, v10, Landroid/media/MediaCodec$BufferInfo;->offset:I

    move-object/from16 v2, v17

    move/from16 v5, v16

    const/4 v1, 0x0

    move/from16 v6, v18

    move v7, v15

    move v8, v0

    invoke-static/range {v2 .. v8}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyI420(Ljava/nio/ByteBuffer;ILorg/webrtc/ali/VideoFrame$I420Buffer;IIII)V

    .line 384
    iget-object v2, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v2, v11, v1}, Landroid/media/MediaCodec;->releaseOutputBuffer(IZ)V

    move-object v6, v4

    goto :goto_11c

    .line 387
    .end local v4    # "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .end local v17    # "buffer":Ljava/nio/ByteBuffer;
    .end local v18    # "sliceHeight":I
    .restart local v7    # "buffer":Ljava/nio/ByteBuffer;
    .restart local v8    # "sliceHeight":I
    :cond_ff
    move-object/from16 v17, v7

    move/from16 v18, v8

    const/4 v1, 0x0

    .end local v7    # "buffer":Ljava/nio/ByteBuffer;
    .end local v8    # "sliceHeight":I
    .restart local v17    # "buffer":Ljava/nio/ByteBuffer;
    .restart local v18    # "sliceHeight":I
    new-instance v4, Lorg/webrtc/ali/I420BufferImpl;

    invoke-direct {v4, v15, v0}, Lorg/webrtc/ali/I420BufferImpl;-><init>(II)V

    .line 389
    .restart local v4    # "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    iget v3, v10, Landroid/media/MediaCodec$BufferInfo;->offset:I

    move-object/from16 v2, v17

    move/from16 v5, v16

    move/from16 v6, v18

    move v7, v15

    move v8, v0

    invoke-static/range {v2 .. v8}, Lorg/webrtc/ali/HardwareVideoDecoder;->nv12ToI420(Ljava/nio/ByteBuffer;ILorg/webrtc/ali/VideoFrame$I420Buffer;IIII)V

    .line 390
    iget-object v2, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v2, v11, v1}, Landroid/media/MediaCodec;->releaseOutputBuffer(IZ)V

    move-object v6, v4

    .line 393
    .end local v4    # "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .local v6, "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    :goto_11c
    iget-wide v1, v10, Landroid/media/MediaCodec$BufferInfo;->presentationTimeUs:J

    const-wide/16 v3, 0x3e8

    mul-long v7, v1, v3

    .line 394
    .local v7, "presentationTimeNs":J
    new-instance v19, Lorg/webrtc/ali/VideoFrame;

    new-instance v5, Landroid/graphics/Matrix;

    invoke-direct {v5}, Landroid/graphics/Matrix;-><init>()V

    move/from16 v20, v0

    .end local v0    # "height":I
    .local v20, "height":I
    move-object/from16 v0, v19

    move-object v1, v6

    move v2, v14

    move-wide v3, v7

    invoke-direct/range {v0 .. v5}, Lorg/webrtc/ali/VideoFrame;-><init>(Lorg/webrtc/ali/VideoFrame$Buffer;IJLandroid/graphics/Matrix;)V

    move-object/from16 v0, v19

    .line 397
    .local v0, "frame":Lorg/webrtc/ali/VideoFrame;
    iget-object v1, v9, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    const/4 v2, 0x0

    invoke-interface {v1, v0, v13, v2}, Lorg/webrtc/ali/VideoDecoder$Callback;->onDecodedFrame(Lorg/webrtc/ali/VideoFrame;Ljava/lang/Integer;Ljava/lang/Integer;)V

    .line 398
    invoke-virtual {v0}, Lorg/webrtc/ali/VideoFrame;->release()V
    :try_end_13e
    .catch Ljava/lang/IllegalStateException; {:try_start_70 .. :try_end_13e} :catch_142

    .line 401
    .end local v0    # "frame":Lorg/webrtc/ali/VideoFrame;
    .end local v6    # "frameBuffer":Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .end local v7    # "presentationTimeNs":J
    .end local v10    # "info":Landroid/media/MediaCodec$BufferInfo;
    .end local v11    # "result":I
    .end local v12    # "frameInfo":Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;
    .end local v13    # "decodeTimeMs":Ljava/lang/Integer;
    .end local v14    # "rotation":I
    .end local v15    # "width":I
    .end local v16    # "stride":I
    .end local v17    # "buffer":Ljava/nio/ByteBuffer;
    .end local v18    # "sliceHeight":I
    .end local v20    # "height":I
    goto :goto_14a

    .line 353
    .restart local v10    # "info":Landroid/media/MediaCodec$BufferInfo;
    .restart local v11    # "result":I
    .restart local v12    # "frameInfo":Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;
    .restart local v13    # "decodeTimeMs":Ljava/lang/Integer;
    .restart local v14    # "rotation":I
    :catchall_13f
    move-exception v0

    :try_start_140
    monitor-exit v1
    :try_end_141
    .catchall {:try_start_140 .. :try_end_141} :catchall_13f

    :try_start_141
    throw v0
    :try_end_142
    .catch Ljava/lang/IllegalStateException; {:try_start_141 .. :try_end_142} :catch_142

    .line 399
    .end local v10    # "info":Landroid/media/MediaCodec$BufferInfo;
    .end local v11    # "result":I
    .end local v12    # "frameInfo":Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;
    .end local v13    # "decodeTimeMs":Ljava/lang/Integer;
    .end local v14    # "rotation":I
    :catch_142
    move-exception v0

    .line 400
    .local v0, "e":Ljava/lang/IllegalStateException;
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "deliverDecodedFrame failed"

    invoke-static {v1, v2, v0}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 402
    .end local v0    # "e":Ljava/lang/IllegalStateException;
    :goto_14a
    return-void
.end method

.method private initDecodeInternal(IILorg/webrtc/ali/VideoDecoder$Callback;)Lorg/webrtc/ali/VideoCodecStatus;
    .registers 10
    .param p1, "width"    # I
    .param p2, "height"    # I
    .param p3, "callback"    # Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 125
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->decoderThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 126
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    const-string v1, "HardwareVideoDecoder"

    if-eqz v0, :cond_13

    .line 127
    const-string v0, "initDecodeInternal called while the codec is already running"

    invoke-static {v1, v0}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 128
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v0

    .line 133
    :cond_13
    iput-object p3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 134
    iput p1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

    .line 135
    iput p2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

    .line 137
    iput p1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->stride:I

    .line 138
    iput p2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->sliceHeight:I

    .line 139
    const/4 v0, 0x0

    iput-boolean v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->hasDecodedFirstFrame:Z

    .line 140
    const/4 v2, 0x1

    iput-boolean v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->keyFrameRequired:Z

    .line 143
    :try_start_23
    iget-object v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codecName:Ljava/lang/String;

    invoke-static {v3}, Landroid/media/MediaCodec;->createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec;

    move-result-object v3

    iput-object v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;
    :try_end_2b
    .catch Ljava/io/IOException; {:try_start_23 .. :try_end_2b} :catch_65
    .catch Ljava/lang/IllegalArgumentException; {:try_start_23 .. :try_end_2b} :catch_63

    .line 147
    nop

    .line 149
    :try_start_2c
    iget-object v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codecType:Lorg/webrtc/ali/VideoCodecType;

    invoke-virtual {v3}, Lorg/webrtc/ali/VideoCodecType;->mimeType()Ljava/lang/String;

    move-result-object v3

    invoke-static {v3, p1, p2}, Landroid/media/MediaFormat;->createVideoFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;

    move-result-object v3

    .line 150
    .local v3, "format":Landroid/media/MediaFormat;
    const-string v4, "color-format"

    iget v5, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

    invoke-virtual {v3, v4, v5}, Landroid/media/MediaFormat;->setInteger(Ljava/lang/String;I)V

    .line 151
    iget-object v4, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    const/4 v5, 0x0

    invoke-virtual {v4, v3, v5, v5, v0}, Landroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V

    .line 152
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v0}, Landroid/media/MediaCodec;->start()V
    :try_end_48
    .catch Ljava/lang/IllegalStateException; {:try_start_2c .. :try_end_48} :catch_57

    .line 157
    .end local v3    # "format":Landroid/media/MediaFormat;
    nop

    .line 159
    iput-boolean v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->running:Z

    .line 160
    invoke-direct {p0}, Lorg/webrtc/ali/HardwareVideoDecoder;->createOutputThread()Ljava/lang/Thread;

    move-result-object v0

    iput-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    .line 161
    invoke-virtual {v0}, Ljava/lang/Thread;->start()V

    .line 163
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->OK:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v0

    .line 153
    :catch_57
    move-exception v0

    .line 154
    .local v0, "e":Ljava/lang/IllegalStateException;
    const-string v2, "initDecode failed"

    invoke-static {v1, v2, v0}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 155
    invoke-virtual {p0}, Lorg/webrtc/ali/HardwareVideoDecoder;->release()Lorg/webrtc/ali/VideoCodecStatus;

    .line 156
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 144
    .end local v0    # "e":Ljava/lang/IllegalStateException;
    :catch_63
    move-exception v0

    goto :goto_66

    :catch_65
    move-exception v0

    .line 145
    .local v0, "e":Ljava/lang/Exception;
    :goto_66
    new-instance v2, Ljava/lang/StringBuilder;

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

    const-string v3, "Cannot create media decoder "

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

    iget-object v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codecName:Ljava/lang/String;

    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-static {v1, v2}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 146
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1
.end method

.method private isSupportedColorFormat(I)Z
    .registers 7
    .param p1, "colorFormat"    # I

    .line 500
    sget-object v0, Lorg/webrtc/ali/MediaCodecUtils;->DECODER_COLOR_FORMATS:[I

    array-length v1, v0

    const/4 v2, 0x0

    const/4 v3, 0x0

    :goto_5
    if-ge v3, v1, :cond_10

    aget v4, v0, v3

    .line 501
    .local v4, "supported":I
    if-ne v4, p1, :cond_d

    .line 502
    const/4 v0, 0x1

    return v0

    .line 500
    .end local v4    # "supported":I
    :cond_d
    add-int/lit8 v3, v3, 0x1

    goto :goto_5

    .line 505
    :cond_10
    return v2
.end method

.method private static nv12ToI420(Ljava/nio/ByteBuffer;ILorg/webrtc/ali/VideoFrame$I420Buffer;IIII)V
    .registers 20
    .param p0, "src"    # Ljava/nio/ByteBuffer;
    .param p1, "offset"    # I
    .param p2, "frameBuffer"    # Lorg/webrtc/ali/VideoFrame$I420Buffer;
    .param p3, "stride"    # I
    .param p4, "sliceHeight"    # I
    .param p5, "width"    # I
    .param p6, "height"    # I

    .line 632
    move-object v8, p0

    move v9, p1

    .line 633
    .local v9, "yPos":I
    mul-int v0, p3, p4

    add-int v10, v9, v0

    .line 634
    .local v10, "uvPos":I
    add-int/lit8 v0, p5, 0x1

    div-int/lit8 v11, v0, 0x2

    .line 635
    .local v11, "chromaWidth":I
    add-int/lit8 v0, p6, 0x1

    div-int/lit8 v12, v0, 0x2

    .line 637
    .local v12, "chromaHeight":I
    nop

    .line 638
    invoke-interface {p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataY()Ljava/nio/ByteBuffer;

    move-result-object v3

    invoke-interface {p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideY()I

    move-result v5

    .line 637
    const/4 v4, 0x0

    move-object v0, p0

    move v1, v9

    move/from16 v2, p3

    move/from16 v6, p5

    move/from16 v7, p6

    invoke-static/range {v0 .. v7}, Lorg/webrtc/ali/HardwareVideoDecoder;->copyPlane(Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;IIII)V

    .line 641
    const/4 v0, 0x0

    .line 642
    .local v0, "dstUPos":I
    const/4 v1, 0x0

    .line 643
    .local v1, "dstVPos":I
    const/4 v2, 0x0

    .local v2, "i":I
    :goto_26
    if-ge v2, v12, :cond_5f

    .line 644
    const/4 v3, 0x0

    .local v3, "j":I
    :goto_29
    if-ge v3, v11, :cond_50

    .line 645
    invoke-interface {p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataU()Ljava/nio/ByteBuffer;

    move-result-object v4

    add-int v5, v0, v3

    mul-int/lit8 v6, v3, 0x2

    add-int/2addr v6, v10

    invoke-virtual {p0, v6}, Ljava/nio/ByteBuffer;->get(I)B

    move-result v6

    invoke-virtual {v4, v5, v6}, Ljava/nio/ByteBuffer;->put(IB)Ljava/nio/ByteBuffer;

    .line 646
    invoke-interface {p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getDataV()Ljava/nio/ByteBuffer;

    move-result-object v4

    add-int v5, v1, v3

    mul-int/lit8 v6, v3, 0x2

    add-int/2addr v6, v10

    add-int/lit8 v6, v6, 0x1

    invoke-virtual {p0, v6}, Ljava/nio/ByteBuffer;->get(I)B

    move-result v6

    invoke-virtual {v4, v5, v6}, Ljava/nio/ByteBuffer;->put(IB)Ljava/nio/ByteBuffer;

    .line 644
    add-int/lit8 v3, v3, 0x1

    goto :goto_29

    .line 648
    .end local v3    # "j":I
    :cond_50
    invoke-interface {p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideU()I

    move-result v3

    add-int/2addr v0, v3

    .line 649
    invoke-interface {p2}, Lorg/webrtc/ali/VideoFrame$I420Buffer;->getStrideV()I

    move-result v3

    add-int/2addr v1, v3

    .line 650
    add-int v10, v10, p3

    .line 643
    add-int/lit8 v2, v2, 0x1

    goto :goto_26

    .line 652
    .end local v2    # "i":I
    :cond_5f
    return-void
.end method

.method private reformat(Landroid/media/MediaFormat;)V
    .registers 8
    .param p1, "format"    # Landroid/media/MediaFormat;

    .line 405
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

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

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

    const-string v1, "Decoder format changed: "

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

    invoke-virtual {p1}, Landroid/media/MediaFormat;->toString()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

    const-string v1, "HardwareVideoDecoder"

    invoke-static {v1, v0}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V

    .line 409
    const-string v0, "crop-left"

    invoke-virtual {p1, v0}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v0

    if-eqz v0, :cond_5e

    .line 410
    const-string v0, "crop-right"

    invoke-virtual {p1, v0}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v0

    if-eqz v0, :cond_5e

    .line 411
    const-string v0, "crop-bottom"

    invoke-virtual {p1, v0}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v0

    if-eqz v0, :cond_5e

    .line 412
    const-string v0, "crop-top"

    invoke-virtual {p1, v0}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v0

    if-eqz v0, :cond_5e

    .line 413
    const-string v0, "crop-right"

    invoke-virtual {p1, v0}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v0

    add-int/lit8 v0, v0, 0x1

    .line 414
    const-string v1, "crop-left"

    invoke-virtual {p1, v1}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v1

    sub-int/2addr v0, v1

    .line 415
    .local v0, "newWidth":I
    const-string v1, "crop-bottom"

    invoke-virtual {p1, v1}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v1

    add-int/lit8 v1, v1, 0x1

    .line 416
    const-string v2, "crop-top"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v2

    sub-int/2addr v1, v2

    .local v1, "newHeight":I
    goto :goto_6a

    .line 418
    .end local v0    # "newWidth":I
    .end local v1    # "newHeight":I
    :cond_5e
    const-string v0, "width"

    invoke-virtual {p1, v0}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v0

    .line 419
    .restart local v0    # "newWidth":I
    const-string v1, "height"

    invoke-virtual {p1, v1}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v1

    .line 422
    .restart local v1    # "newHeight":I
    :goto_6a
    iget-object v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->dimensionLock:Ljava/lang/Object;

    monitor-enter v2

    .line 423
    :try_start_6d
    iget-boolean v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->hasDecodedFirstFrame:Z

    if-eqz v3, :cond_b0

    iget v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

    if-ne v3, v0, :cond_79

    iget v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

    if-eq v3, v1, :cond_b0

    .line 424
    :cond_79
    new-instance v3, Ljava/lang/RuntimeException;

    new-instance v4, Ljava/lang/StringBuilder;

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

    const-string v5, "Unexpected size change. Configured "

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

    iget v5, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

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

    const-string v5, "*"

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

    iget v5, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

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

    const-string v5, ". New "

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

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

    const-string v5, "*"

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

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

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

    move-result-object v4

    invoke-direct {v3, v4}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V

    invoke-direct {p0, v3}, Lorg/webrtc/ali/HardwareVideoDecoder;->stopOnOutputThread(Ljava/lang/Exception;)V

    .line 426
    monitor-exit v2

    return-void

    .line 428
    :cond_b0
    iput v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

    .line 429
    iput v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

    .line 430
    monitor-exit v2
    :try_end_b5
    .catchall {:try_start_6d .. :try_end_b5} :catchall_163

    .line 432
    const-string v2, "color-format"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_105

    .line 433
    const-string v2, "color-format"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v2

    iput v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

    .line 434
    new-instance v2, Ljava/lang/StringBuilder;

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

    const-string v3, "Color: 0x"

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

    iget v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

    invoke-static {v3}, Ljava/lang/Integer;->toHexString(I)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

    const-string v3, "HardwareVideoDecoder"

    invoke-static {v3, v2}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V

    .line 435
    iget v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

    invoke-direct {p0, v2}, Lorg/webrtc/ali/HardwareVideoDecoder;->isSupportedColorFormat(I)Z

    move-result v2

    if-nez v2, :cond_105

    .line 436
    new-instance v2, Ljava/lang/IllegalStateException;

    new-instance v3, Ljava/lang/StringBuilder;

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

    const-string v4, "Unsupported color format: "

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

    iget v4, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->colorFormat:I

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

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

    move-result-object v3

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

    invoke-direct {p0, v2}, Lorg/webrtc/ali/HardwareVideoDecoder;->stopOnOutputThread(Ljava/lang/Exception;)V

    .line 437
    return-void

    .line 442
    :cond_105
    iget-object v3, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->dimensionLock:Ljava/lang/Object;

    monitor-enter v3

    .line 443
    :try_start_108
    const-string v2, "stride"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_118

    .line 444
    const-string v2, "stride"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v2

    iput v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->stride:I

    .line 446
    :cond_118
    const-string v2, "slice-height"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->containsKey(Ljava/lang/String;)Z

    move-result v2

    if-eqz v2, :cond_128

    .line 447
    const-string v2, "slice-height"

    invoke-virtual {p1, v2}, Landroid/media/MediaFormat;->getInteger(Ljava/lang/String;)I

    move-result v2

    iput v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->sliceHeight:I

    .line 449
    :cond_128
    const-string v2, "HardwareVideoDecoder"

    new-instance v4, Ljava/lang/StringBuilder;

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

    const-string v5, "Frame stride and slice height: "

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

    iget v5, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->stride:I

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

    const-string v5, " x "

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

    iget v5, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->sliceHeight:I

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

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

    move-result-object v4

    invoke-static {v2, v4}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V

    .line 450
    iget v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

    iget v4, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->stride:I

    invoke-static {v2, v4}, Ljava/lang/Math;->max(II)I

    move-result v2

    iput v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->stride:I

    .line 451
    iget v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

    iget v4, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->sliceHeight:I

    invoke-static {v2, v4}, Ljava/lang/Math;->max(II)I

    move-result v2

    iput v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->sliceHeight:I

    .line 452
    monitor-exit v3

    .line 453
    return-void

    .line 452
    :catchall_160
    move-exception v2

    monitor-exit v3
    :try_end_162
    .catchall {:try_start_108 .. :try_end_162} :catchall_160

    throw v2

    .line 430
    :catchall_163
    move-exception v3

    :try_start_164
    monitor-exit v2
    :try_end_165
    .catchall {:try_start_164 .. :try_end_165} :catchall_163

    throw v3
.end method

.method private reinitDecode(II)Lorg/webrtc/ali/VideoCodecStatus;
    .registers 5
    .param p1, "newWidth"    # I
    .param p2, "newHeight"    # I

    .line 296
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->decoderThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 297
    invoke-virtual {p0}, Lorg/webrtc/ali/HardwareVideoDecoder;->release()Lorg/webrtc/ali/VideoCodecStatus;

    move-result-object v0

    .line 298
    .local v0, "status":Lorg/webrtc/ali/VideoCodecStatus;
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->OK:Lorg/webrtc/ali/VideoCodecStatus;

    if-eq v0, v1, :cond_e

    .line 299
    return-object v0

    .line 301
    :cond_e
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    invoke-direct {p0, p1, p2, v1}, Lorg/webrtc/ali/HardwareVideoDecoder;->initDecodeInternal(IILorg/webrtc/ali/VideoDecoder$Callback;)Lorg/webrtc/ali/VideoCodecStatus;

    move-result-object v1

    return-object v1
.end method

.method private releaseCodecOnOutputThread()V
    .registers 4

    .line 456
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 457
    const-string v0, "HardwareVideoDecoder"

    const-string v1, "Releasing MediaCodec on output thread"

    invoke-static {v0, v1}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V

    .line 458
    invoke-direct {p0}, Lorg/webrtc/ali/HardwareVideoDecoder;->waitOutputBuffersReleasedOnOutputThread()V

    .line 460
    :try_start_f
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v1}, Landroid/media/MediaCodec;->stop()V
    :try_end_14
    .catch Ljava/lang/Exception; {:try_start_f .. :try_end_14} :catch_15

    .line 463
    goto :goto_1b

    .line 461
    :catch_15
    move-exception v1

    .line 462
    .local v1, "e":Ljava/lang/Exception;
    const-string v2, "Media decoder stop failed"

    invoke-static {v0, v2, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 465
    .end local v1    # "e":Ljava/lang/Exception;
    :goto_1b
    :try_start_1b
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v1}, Landroid/media/MediaCodec;->release()V
    :try_end_20
    .catch Ljava/lang/Exception; {:try_start_1b .. :try_end_20} :catch_21

    .line 470
    goto :goto_29

    .line 466
    :catch_21
    move-exception v1

    .line 467
    .restart local v1    # "e":Ljava/lang/Exception;
    const-string v2, "Media decoder release failed"

    invoke-static {v0, v2, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 469
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->shutdownException:Ljava/lang/Exception;

    .line 471
    .end local v1    # "e":Ljava/lang/Exception;
    :goto_29
    const/4 v1, 0x0

    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    .line 472
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 473
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    .line 474
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v1}, Ljava/util/Deque;->clear()V

    .line 475
    const-string v1, "Release on output thread done"

    invoke-static {v0, v1}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V

    .line 476
    return-void
.end method

.method private stopOnOutputThread(Ljava/lang/Exception;)V
    .registers 3
    .param p1, "e"    # Ljava/lang/Exception;

    .line 494
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 495
    const/4 v0, 0x0

    iput-boolean v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->running:Z

    .line 496
    iput-object p1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->shutdownException:Ljava/lang/Exception;

    .line 497
    return-void
.end method

.method private waitOutputBuffersReleasedOnOutputThread()V
    .registers 5

    .line 479
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 480
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffersLock:Ljava/lang/Object;

    monitor-enter v0

    .line 481
    :goto_8
    :try_start_8
    iget v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffers:I

    if-lez v1, :cond_23

    .line 482
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "Waiting for all frames to be released."

    invoke-static {v1, v2}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V
    :try_end_13
    .catchall {:try_start_8 .. :try_end_13} :catchall_25

    .line 484
    :try_start_13
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->activeOutputBuffersLock:Ljava/lang/Object;

    invoke-virtual {v1}, Ljava/lang/Object;->wait()V
    :try_end_18
    .catch Ljava/lang/InterruptedException; {:try_start_13 .. :try_end_18} :catch_19
    .catchall {:try_start_13 .. :try_end_18} :catchall_25

    .line 488
    goto :goto_8

    .line 485
    :catch_19
    move-exception v1

    .line 486
    .local v1, "e":Ljava/lang/InterruptedException;
    :try_start_1a
    const-string v2, "HardwareVideoDecoder"

    const-string v3, "Interrupted while waiting for output buffers to be released."

    invoke-static {v2, v3, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 487
    monitor-exit v0

    return-void

    .line 490
    .end local v1    # "e":Ljava/lang/InterruptedException;
    :cond_23
    monitor-exit v0

    .line 491
    return-void

    .line 490
    :catchall_25
    move-exception v1

    monitor-exit v0
    :try_end_27
    .catchall {:try_start_1a .. :try_end_27} :catchall_25

    goto :goto_29

    :goto_28
    throw v1

    :goto_29
    goto :goto_28
.end method


# virtual methods
.method public decode(Lorg/webrtc/ali/EncodedImage;Lorg/webrtc/ali/VideoDecoder$DecodeInfo;)Lorg/webrtc/ali/VideoCodecStatus;
    .registers 15
    .param p1, "frame"    # Lorg/webrtc/ali/EncodedImage;
    .param p2, "info"    # Lorg/webrtc/ali/VideoDecoder$DecodeInfo;

    .line 168
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->decoderThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-virtual {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;->checkIsOnValidThread()V

    .line 169
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    if-eqz v0, :cond_101

    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    if-nez v0, :cond_f

    goto/16 :goto_101

    .line 173
    :cond_f
    iget-object v0, p1, Lorg/webrtc/ali/EncodedImage;->buffer:Ljava/nio/ByteBuffer;

    if-nez v0, :cond_1d

    .line 174
    const-string v0, "HardwareVideoDecoder"

    const-string v1, "decode() - no input data"

    invoke-static {v0, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 175
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->ERR_PARAMETER:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v0

    .line 178
    :cond_1d
    iget-object v0, p1, Lorg/webrtc/ali/EncodedImage;->buffer:Ljava/nio/ByteBuffer;

    invoke-virtual {v0}, Ljava/nio/ByteBuffer;->remaining()I

    move-result v0

    .line 179
    .local v0, "size":I
    if-nez v0, :cond_2f

    .line 180
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "decode() - input buffer empty"

    invoke-static {v1, v2}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 181
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERR_PARAMETER:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 186
    :cond_2f
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->dimensionLock:Ljava/lang/Object;

    monitor-enter v1

    .line 187
    :try_start_32
    iget v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->width:I

    move v8, v2

    .line 188
    .local v8, "width":I
    iget v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->height:I

    move v9, v2

    .line 189
    .local v9, "height":I
    monitor-exit v1
    :try_end_39
    .catchall {:try_start_32 .. :try_end_39} :catchall_fe

    .line 192
    iget v1, p1, Lorg/webrtc/ali/EncodedImage;->encodedWidth:I

    iget v2, p1, Lorg/webrtc/ali/EncodedImage;->encodedHeight:I

    mul-int v1, v1, v2

    if-lez v1, :cond_56

    iget v1, p1, Lorg/webrtc/ali/EncodedImage;->encodedWidth:I

    if-ne v1, v8, :cond_49

    iget v1, p1, Lorg/webrtc/ali/EncodedImage;->encodedHeight:I

    if-eq v1, v9, :cond_56

    .line 194
    :cond_49
    iget v1, p1, Lorg/webrtc/ali/EncodedImage;->encodedWidth:I

    iget v2, p1, Lorg/webrtc/ali/EncodedImage;->encodedHeight:I

    invoke-direct {p0, v1, v2}, Lorg/webrtc/ali/HardwareVideoDecoder;->reinitDecode(II)Lorg/webrtc/ali/VideoCodecStatus;

    move-result-object v1

    .line 195
    .local v1, "status":Lorg/webrtc/ali/VideoCodecStatus;
    sget-object v2, Lorg/webrtc/ali/VideoCodecStatus;->OK:Lorg/webrtc/ali/VideoCodecStatus;

    if-eq v1, v2, :cond_56

    .line 196
    return-object v1

    .line 200
    .end local v1    # "status":Lorg/webrtc/ali/VideoCodecStatus;
    :cond_56
    iget-boolean v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->keyFrameRequired:Z

    if-eqz v1, :cond_78

    .line 202
    iget-object v1, p1, Lorg/webrtc/ali/EncodedImage;->frameType:Lorg/webrtc/ali/EncodedImage$FrameType;

    sget-object v2, Lorg/webrtc/ali/EncodedImage$FrameType;->VideoFrameKey:Lorg/webrtc/ali/EncodedImage$FrameType;

    if-eq v1, v2, :cond_6a

    .line 203
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "decode() - key frame required first"

    invoke-static {v1, v2}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 204
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 206
    :cond_6a
    iget-boolean v1, p1, Lorg/webrtc/ali/EncodedImage;->completeFrame:Z

    if-nez v1, :cond_78

    .line 207
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "decode() - complete frame required first"

    invoke-static {v1, v2}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 208
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 215
    :cond_78
    :try_start_78
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    const-wide/32 v2, 0x7a120

    invoke-virtual {v1, v2, v3}, Landroid/media/MediaCodec;->dequeueInputBuffer(J)I

    move-result v1
    :try_end_81
    .catch Ljava/lang/IllegalStateException; {:try_start_78 .. :try_end_81} :catch_f3

    move v10, v1

    .line 219
    .local v10, "index":I
    nop

    .line 220
    if-gez v10, :cond_8f

    .line 223
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "decode() - no HW buffers available; decoder falling behind"

    invoke-static {v1, v2}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 224
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 229
    :cond_8f
    :try_start_8f
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    invoke-virtual {v1}, Landroid/media/MediaCodec;->getInputBuffers()[Ljava/nio/ByteBuffer;

    move-result-object v1

    aget-object v1, v1, v10
    :try_end_97
    .catch Ljava/lang/IllegalStateException; {:try_start_8f .. :try_end_97} :catch_e8

    move-object v11, v1

    .line 233
    .local v11, "buffer":Ljava/nio/ByteBuffer;
    nop

    .line 235
    invoke-virtual {v11}, Ljava/nio/ByteBuffer;->capacity()I

    move-result v1

    if-ge v1, v0, :cond_a9

    .line 236
    const-string v1, "HardwareVideoDecoder"

    const-string v2, "decode() - HW buffer too small"

    invoke-static {v1, v2}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;)V

    .line 237
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 239
    :cond_a9
    iget-object v1, p1, Lorg/webrtc/ali/EncodedImage;->buffer:Ljava/nio/ByteBuffer;

    invoke-virtual {v11, v1}, Ljava/nio/ByteBuffer;->put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;

    .line 241
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    new-instance v2, Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;

    invoke-static {}, Landroid/os/SystemClock;->elapsedRealtime()J

    move-result-wide v3

    iget v5, p1, Lorg/webrtc/ali/EncodedImage;->rotation:I

    invoke-direct {v2, v3, v4, v5}, Lorg/webrtc/ali/HardwareVideoDecoder$FrameInfo;-><init>(JI)V

    invoke-interface {v1, v2}, Ljava/util/Deque;->offer(Ljava/lang/Object;)Z

    .line 243
    :try_start_be
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    const/4 v3, 0x0

    iget-wide v4, p1, Lorg/webrtc/ali/EncodedImage;->captureTimeMs:J

    const-wide/16 v6, 0x3e8

    mul-long v5, v4, v6

    const/4 v7, 0x0

    move v2, v10

    move v4, v0

    invoke-virtual/range {v1 .. v7}, Landroid/media/MediaCodec;->queueInputBuffer(IIIJI)V
    :try_end_cd
    .catch Ljava/lang/IllegalStateException; {:try_start_be .. :try_end_cd} :catch_d8

    .line 249
    nop

    .line 250
    iget-boolean v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->keyFrameRequired:Z

    if-eqz v1, :cond_d5

    .line 251
    const/4 v1, 0x0

    iput-boolean v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->keyFrameRequired:Z

    .line 253
    :cond_d5
    sget-object v1, Lorg/webrtc/ali/VideoCodecStatus;->OK:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v1

    .line 245
    :catch_d8
    move-exception v1

    .line 246
    .local v1, "e":Ljava/lang/IllegalStateException;
    const-string v2, "HardwareVideoDecoder"

    const-string v3, "queueInputBuffer failed"

    invoke-static {v2, v3, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 247
    iget-object v2, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v2}, Ljava/util/Deque;->pollLast()Ljava/lang/Object;

    .line 248
    sget-object v2, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v2

    .line 230
    .end local v1    # "e":Ljava/lang/IllegalStateException;
    .end local v11    # "buffer":Ljava/nio/ByteBuffer;
    :catch_e8
    move-exception v1

    .line 231
    .restart local v1    # "e":Ljava/lang/IllegalStateException;
    const-string v2, "HardwareVideoDecoder"

    const-string v3, "getInputBuffers failed"

    invoke-static {v2, v3, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 232
    sget-object v2, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v2

    .line 216
    .end local v1    # "e":Ljava/lang/IllegalStateException;
    .end local v10    # "index":I
    :catch_f3
    move-exception v1

    .line 217
    .restart local v1    # "e":Ljava/lang/IllegalStateException;
    const-string v2, "HardwareVideoDecoder"

    const-string v3, "dequeueInputBuffer failed"

    invoke-static {v2, v3, v1}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 218
    sget-object v2, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v2

    .line 189
    .end local v1    # "e":Ljava/lang/IllegalStateException;
    .end local v8    # "width":I
    .end local v9    # "height":I
    :catchall_fe
    move-exception v2

    :try_start_ff
    monitor-exit v1
    :try_end_100
    .catchall {:try_start_ff .. :try_end_100} :catchall_fe

    throw v2

    .line 170
    .end local v0    # "size":I
    :cond_101
    :goto_101
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->UNINITIALIZED:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v0
.end method

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

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

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

    const-string v1, "HardwareVideoDecoder: "

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

    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codecName:Ljava/lang/String;

    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 getPrefersLateDecoding()Z
    .registers 2

    .line 258
    const/4 v0, 0x1

    return v0
.end method

.method public initDecode(Lorg/webrtc/ali/VideoDecoder$Settings;Lorg/webrtc/ali/VideoDecoder$Callback;)Lorg/webrtc/ali/VideoCodecStatus;
    .registers 5
    .param p1, "settings"    # Lorg/webrtc/ali/VideoDecoder$Settings;
    .param p2, "callback"    # Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 120
    new-instance v0, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    invoke-direct {v0}, Lorg/webrtc/ali/ThreadUtils$ThreadChecker;-><init>()V

    iput-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->decoderThreadChecker:Lorg/webrtc/ali/ThreadUtils$ThreadChecker;

    .line 121
    iget v0, p1, Lorg/webrtc/ali/VideoDecoder$Settings;->width:I

    iget v1, p1, Lorg/webrtc/ali/VideoDecoder$Settings;->height:I

    invoke-direct {p0, v0, v1, p2}, Lorg/webrtc/ali/HardwareVideoDecoder;->initDecodeInternal(IILorg/webrtc/ali/VideoDecoder$Callback;)Lorg/webrtc/ali/VideoCodecStatus;

    move-result-object v0

    return-object v0
.end method

.method public release()Lorg/webrtc/ali/VideoCodecStatus;
    .registers 6

    .line 273
    const/4 v0, 0x0

    const/4 v1, 0x0

    :try_start_2
    iput-boolean v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->running:Z

    .line 274
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    const-wide/16 v2, 0x1388

    invoke-static {v0, v2, v3}, Lorg/webrtc/ali/ThreadUtils;->joinUninterruptibly(Ljava/lang/Thread;J)Z

    move-result v0
    :try_end_c
    .catchall {:try_start_2 .. :try_end_c} :catchall_57

    const-string v2, "HardwareVideoDecoder"

    if-nez v0, :cond_28

    .line 276
    :try_start_10
    const-string v0, "Media encoder release timeout"

    new-instance v3, Ljava/lang/RuntimeException;

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

    invoke-static {v2, v0, v3}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 277
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->TIMEOUT:Lorg/webrtc/ali/VideoCodecStatus;
    :try_end_1c
    .catchall {:try_start_10 .. :try_end_1c} :catchall_57

    .line 287
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    .line 288
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 289
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    .line 290
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v1}, Ljava/util/Deque;->clear()V

    .line 277
    return-object v0

    .line 279
    :cond_28
    :try_start_28
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->shutdownException:Ljava/lang/Exception;

    if-eqz v0, :cond_48

    .line 282
    const-string v0, "Media encoder release error"

    new-instance v3, Ljava/lang/RuntimeException;

    iget-object v4, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->shutdownException:Ljava/lang/Exception;

    invoke-direct {v3, v4}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V

    invoke-static {v2, v0, v3}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    .line 283
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->shutdownException:Ljava/lang/Exception;

    .line 284
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->ERROR:Lorg/webrtc/ali/VideoCodecStatus;
    :try_end_3c
    .catchall {:try_start_28 .. :try_end_3c} :catchall_57

    .line 287
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    .line 288
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 289
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    .line 290
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v1}, Ljava/util/Deque;->clear()V

    .line 284
    return-object v0

    .line 287
    :cond_48
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    .line 288
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 289
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    .line 290
    iget-object v0, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v0}, Ljava/util/Deque;->clear()V

    .line 291
    nop

    .line 292
    sget-object v0, Lorg/webrtc/ali/VideoCodecStatus;->OK:Lorg/webrtc/ali/VideoCodecStatus;

    return-object v0

    .line 287
    :catchall_57
    move-exception v0

    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->codec:Landroid/media/MediaCodec;

    .line 288
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->callback:Lorg/webrtc/ali/VideoDecoder$Callback;

    .line 289
    iput-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->outputThread:Ljava/lang/Thread;

    .line 290
    iget-object v1, p0, Lorg/webrtc/ali/HardwareVideoDecoder;->frameInfos:Ljava/util/Deque;

    invoke-interface {v1}, Ljava/util/Deque;->clear()V

    .line 291
    throw v0
.end method