FileVideoCapturer$VideoReaderY4M.smali
.class Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;
.super Ljava/lang/Object;
.source "FileVideoCapturer.java"
# interfaces
.implements Lorg/webrtc/ali/FileVideoCapturer$VideoReader;
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lorg/webrtc/ali/FileVideoCapturer;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0xa
name = "VideoReaderY4M"
.end annotation
# static fields
.field private static final TAG:Ljava/lang/String; = "VideoReaderY4M"
.field private static final Y4M_FRAME_DELIMETER:Ljava/lang/String; = "FRAME"
# instance fields
.field private final frameHeight:I
.field private final frameSize:I
.field private final frameWidth:I
.field private final mediaFileStream:Ljava/io/RandomAccessFile;
.field private final videoStart:J
# direct methods
.method static constructor <clinit>()V
.registers 1
return-void
.end method
.method public constructor <init>(Ljava/lang/String;)V
.registers 15
.param p1, "file" # Ljava/lang/String;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;
}
.end annotation
.line 58
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 59
new-instance v0, Ljava/io/RandomAccessFile;
const-string v1, "r"
invoke-direct {v0, p1, v1}, Ljava/io/RandomAccessFile;-><init>(Ljava/lang/String;Ljava/lang/String;)V
iput-object v0, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
.line 60
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
.line 62
.local v0, "builder":Ljava/lang/StringBuilder;
:goto_11
iget-object v1, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
invoke-virtual {v1}, Ljava/io/RandomAccessFile;->read()I
move-result v1
.line 63
.local v1, "c":I
const/4 v2, -0x1
if-eq v1, v2, :cond_df
.line 67
const/16 v2, 0xa
if-ne v1, v2, :cond_d9
.line 69
nop
.line 73
.end local v1 # "c":I
iget-object v1, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
invoke-virtual {v1}, Ljava/io/RandomAccessFile;->getFilePointer()J
move-result-wide v1
iput-wide v1, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->videoStart:J
.line 74
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
.line 75
.local v1, "header":Ljava/lang/String;
const-string v2, "[ ]"
invoke-virtual {v1, v2}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;
move-result-object v2
.line 76
.local v2, "headerTokens":[Ljava/lang/String;
const/4 v3, 0x0
.line 77
.local v3, "w":I
const/4 v4, 0x0
.line 78
.local v4, "h":I
const-string v5, ""
.line 79
.local v5, "colorSpace":Ljava/lang/String;
array-length v6, v2
const/4 v7, 0x0
const/4 v8, 0x0
:goto_38
const/4 v9, 0x1
if-ge v8, v6, :cond_67
aget-object v10, v2, v8
.line 80
.local v10, "tok":Ljava/lang/String;
invoke-virtual {v10, v7}, Ljava/lang/String;->charAt(I)C
move-result v11
.line 81
.local v11, "c":C
const/16 v12, 0x43
if-eq v11, v12, :cond_60
const/16 v12, 0x48
if-eq v11, v12, :cond_57
const/16 v12, 0x57
if-eq v11, v12, :cond_4e
goto :goto_64
.line 83
:cond_4e
invoke-virtual {v10, v9}, Ljava/lang/String;->substring(I)Ljava/lang/String;
move-result-object v9
invoke-static {v9}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I
move-result v3
.line 84
goto :goto_64
.line 86
:cond_57
invoke-virtual {v10, v9}, Ljava/lang/String;->substring(I)Ljava/lang/String;
move-result-object v9
invoke-static {v9}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I
move-result v4
.line 87
goto :goto_64
.line 89
:cond_60
invoke-virtual {v10, v9}, Ljava/lang/String;->substring(I)Ljava/lang/String;
move-result-object v5
.line 79
.end local v10 # "tok":Ljava/lang/String;
.end local v11 # "c":C
:goto_64
add-int/lit8 v8, v8, 0x1
goto :goto_38
.line 93
:cond_67
new-instance v6, Ljava/lang/StringBuilder;
invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V
const-string v7, "Color space: "
invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v6, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v6
const-string v7, "VideoReaderY4M"
invoke-static {v7, v6}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V
.line 94
const-string v6, "420"
invoke-virtual {v5, v6}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v6
if-nez v6, :cond_96
const-string v6, "420mpeg2"
invoke-virtual {v5, v6}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v6
if-eqz v6, :cond_8e
goto :goto_96
.line 95
:cond_8e
new-instance v6, Ljava/lang/IllegalArgumentException;
const-string v7, "Does not support any other color space than I420 or I420mpeg2"
invoke-direct {v6, v7}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v6
.line 98
:cond_96
:goto_96
rem-int/lit8 v6, v3, 0x2
if-eq v6, v9, :cond_d1
rem-int/lit8 v6, v4, 0x2
if-eq v6, v9, :cond_d1
.line 101
iput v3, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameWidth:I
.line 102
iput v4, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameHeight:I
.line 103
mul-int v6, v3, v4
mul-int/lit8 v6, v6, 0x3
div-int/lit8 v6, v6, 0x2
iput v6, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameSize:I
.line 104
new-instance v6, Ljava/lang/StringBuilder;
invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V
const-string v8, "frame dim: ("
invoke-virtual {v6, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v6, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string v8, ", "
invoke-virtual {v6, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v6, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string v8, ") frameSize: "
invoke-virtual {v6, v8}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget v8, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameSize:I
invoke-virtual {v6, v8}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v6
invoke-static {v7, v6}, Lorg/webrtc/ali/Logging;->d(Ljava/lang/String;Ljava/lang/String;)V
.line 105
return-void
.line 99
:cond_d1
new-instance v6, Ljava/lang/IllegalArgumentException;
const-string v7, "Does not support odd width or height"
invoke-direct {v6, v7}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V
throw v6
.line 71
.end local v2 # "headerTokens":[Ljava/lang/String;
.end local v3 # "w":I
.end local v4 # "h":I
.end local v5 # "colorSpace":Ljava/lang/String;
.local v1, "c":I
:cond_d9
int-to-char v2, v1
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;
.line 72
.end local v1 # "c":I
goto/16 :goto_11
.line 65
.restart local v1 # "c":I
:cond_df
new-instance v2, Ljava/lang/RuntimeException;
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string v4, "Found end of file before end of header for file: "
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v3, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v3
invoke-direct {v2, v3}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
goto :goto_f7
:goto_f6
throw v2
:goto_f7
goto :goto_f6
.end method
# virtual methods
.method public close()V
.registers 4
.line 135
:try_start_0
iget-object v0, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
invoke-virtual {v0}, Ljava/io/RandomAccessFile;->close()V
:try_end_5
.catch Ljava/io/IOException; {:try_start_0 .. :try_end_5} :catch_6
.line 138
goto :goto_e
.line 136
:catch_6
move-exception v0
.line 137
.local v0, "e":Ljava/io/IOException;
const-string v1, "VideoReaderY4M"
const-string v2, "Problem closing file"
invoke-static {v1, v2, v0}, Lorg/webrtc/ali/Logging;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V
.line 139
.end local v0 # "e":Ljava/io/IOException;
:goto_e
return-void
.end method
.method public getFrameHeight()I
.registers 2
.line 55
iget v0, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameHeight:I
return v0
.end method
.method public getFrameWidth()I
.registers 2
.line 51
iget v0, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameWidth:I
return v0
.end method
.method public getNextFrame()[B
.registers 7
.line 108
iget v0, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameSize:I
new-array v0, v0, [B
.line 110
.local v0, "frame":[B
:try_start_4
const-string v1, "FRAME"
invoke-virtual {v1}, Ljava/lang/String;->length()I
move-result v1
add-int/lit8 v1, v1, 0x1
new-array v1, v1, [B
.line 111
.local v1, "frameDelim":[B
iget-object v2, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
invoke-virtual {v2, v1}, Ljava/io/RandomAccessFile;->read([B)I
move-result v2
array-length v3, v1
if-ge v2, v3, :cond_30
.line 113
iget-object v2, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
iget-wide v3, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->videoStart:J
invoke-virtual {v2, v3, v4}, Ljava/io/RandomAccessFile;->seek(J)V
.line 114
iget-object v2, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
invoke-virtual {v2, v1}, Ljava/io/RandomAccessFile;->read([B)I
move-result v2
array-length v3, v1
if-lt v2, v3, :cond_28
goto :goto_30
.line 115
:cond_28
new-instance v2, Ljava/lang/RuntimeException;
const-string v3, "Error looping video"
invoke-direct {v2, v3}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V
.end local v0 # "frame":[B
throw v2
.line 118
.restart local v0 # "frame":[B
:cond_30
:goto_30
new-instance v2, Ljava/lang/String;
invoke-direct {v2, v1}, Ljava/lang/String;-><init>([B)V
.line 119
.local v2, "frameDelimStr":Ljava/lang/String;
const-string v3, "FRAME\n"
invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
if-eqz v3, :cond_4e
.line 124
iget-object v3, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->mediaFileStream:Ljava/io/RandomAccessFile;
invoke-virtual {v3, v0}, Ljava/io/RandomAccessFile;->readFully([B)V
.line 125
iget v3, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameSize:I
new-array v3, v3, [B
.line 126
.local v3, "nv21Frame":[B
iget v4, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameWidth:I
iget v5, p0, Lorg/webrtc/ali/FileVideoCapturer$VideoReaderY4M;->frameHeight:I
invoke-static {v0, v4, v5, v3}, Lorg/webrtc/ali/FileVideoCapturer;->nativeI420ToNV21([BII[B)V
.line 127
return-object v3
.line 120
.end local v3 # "nv21Frame":[B
:cond_4e
new-instance v3, Ljava/lang/RuntimeException;
new-instance v4, Ljava/lang/StringBuilder;
invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V
const-string v5, "Frames should be delimited by FRAME plus newline, found delimter was: \'"
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v4, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v5, "\'"
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)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
.end local v0 # "frame":[B
throw v3
:try_end_6a
.catch Ljava/io/IOException; {:try_start_4 .. :try_end_6a} :catch_6a
.line 128
.end local v1 # "frameDelim":[B
.end local v2 # "frameDelimStr":Ljava/lang/String;
.restart local v0 # "frame":[B
:catch_6a
move-exception v1
.line 129
.local v1, "e":Ljava/io/IOException;
new-instance v2, Ljava/lang/RuntimeException;
invoke-direct {v2, v1}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V
throw v2
.end method