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