Sniffer.smali
.class final Lcom/google/android/exoplayer2/extractor/mp4/Sniffer;
.super Ljava/lang/Object;
.source "Sniffer.java"
# static fields
.field private static final COMPATIBLE_BRANDS:[I
.field private static final SEARCH_LENGTH:I = 0x1000
# direct methods
.method static constructor <clinit>()V
.registers 3
.line 33
const/16 v0, 0x18
new-array v0, v0, [I
.line 34
const-string v1, "isom"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x0
aput v1, v0, v2
.line 35
const-string v1, "iso2"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x1
aput v1, v0, v2
.line 36
const-string v1, "iso3"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x2
aput v1, v0, v2
.line 37
const-string v1, "iso4"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x3
aput v1, v0, v2
.line 38
const-string v1, "iso5"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x4
aput v1, v0, v2
.line 39
const-string v1, "iso6"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x5
aput v1, v0, v2
.line 40
const-string v1, "avc1"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x6
aput v1, v0, v2
.line 41
const-string v1, "hvc1"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x7
aput v1, v0, v2
.line 42
const-string v1, "hev1"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x8
aput v1, v0, v2
.line 43
const-string v1, "mp41"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x9
aput v1, v0, v2
.line 44
const-string v1, "mp42"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0xa
aput v1, v0, v2
.line 45
const-string v1, "3g2a"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0xb
aput v1, v0, v2
.line 46
const-string v1, "3g2b"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0xc
aput v1, v0, v2
.line 47
const-string v1, "3gr6"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0xd
aput v1, v0, v2
.line 48
const-string v1, "3gs6"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0xe
aput v1, v0, v2
.line 49
const-string v1, "3ge6"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0xf
aput v1, v0, v2
.line 50
const-string v1, "3gg6"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x10
aput v1, v0, v2
.line 51
const-string v1, "M4V "
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x11
aput v1, v0, v2
.line 52
const-string v1, "M4A "
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x12
aput v1, v0, v2
.line 53
const-string v1, "f4v "
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x13
aput v1, v0, v2
.line 54
const-string v1, "kddi"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x14
aput v1, v0, v2
.line 55
const-string v1, "M4VP"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x15
aput v1, v0, v2
.line 56
const-string v1, "qt "
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x16
aput v1, v0, v2
.line 57
const-string v1, "MSNV"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/16 v2, 0x17
aput v1, v0, v2
sput-object v0, Lcom/google/android/exoplayer2/extractor/mp4/Sniffer;->COMPATIBLE_BRANDS:[I
.line 33
return-void
.end method
.method private constructor <init>()V
.registers 1
.line 199
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 201
return-void
.end method
.method private static isCompatibleBrand(I)Z
.registers 7
.param p0, "brand" # I
.line 188
ushr-int/lit8 v0, p0, 0x8
const-string v1, "3gp"
invoke-static {v1}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v1
const/4 v2, 0x1
if-ne v0, v1, :cond_c
.line 189
return v2
.line 191
:cond_c
sget-object v0, Lcom/google/android/exoplayer2/extractor/mp4/Sniffer;->COMPATIBLE_BRANDS:[I
array-length v1, v0
const/4 v3, 0x0
const/4 v4, 0x0
:goto_11
if-ge v4, v1, :cond_1b
aget v5, v0, v4
.line 192
.local v5, "compatibleBrand":I
if-ne v5, p0, :cond_18
.line 193
return v2
.line 191
.end local v5 # "compatibleBrand":I
:cond_18
add-int/lit8 v4, v4, 0x1
goto :goto_11
.line 196
:cond_1b
return v3
.end method
.method public static sniffFragmented(Lcom/google/android/exoplayer2/extractor/ExtractorInput;)Z
.registers 2
.param p0, "input" # Lcom/google/android/exoplayer2/extractor/ExtractorInput;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;,
Ljava/lang/InterruptedException;
}
.end annotation
.line 71
const/4 v0, 0x1
invoke-static {p0, v0}, Lcom/google/android/exoplayer2/extractor/mp4/Sniffer;->sniffInternal(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Z)Z
move-result v0
return v0
.end method
.method private static sniffInternal(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Z)Z
.registers 24
.param p0, "input" # Lcom/google/android/exoplayer2/extractor/ExtractorInput;
.param p1, "fragmented" # Z
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;,
Ljava/lang/InterruptedException;
}
.end annotation
.line 90
move-object/from16 v0, p0
invoke-interface/range {p0 .. p0}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->getLength()J
move-result-wide v1
.line 91
.local v1, "inputLength":J
const-wide/16 v3, 0x1000
const-wide/16 v5, -0x1
cmp-long v7, v1, v5
if-eqz v7, :cond_14
cmp-long v7, v1, v3
if-lez v7, :cond_13
goto :goto_14
:cond_13
move-wide v3, v1
:cond_14
:goto_14
long-to-int v4, v3
.line 94
.local v4, "bytesToSearch":I
new-instance v3, Lcom/google/android/exoplayer2/util/ParsableByteArray;
const/16 v7, 0x40
invoke-direct {v3, v7}, Lcom/google/android/exoplayer2/util/ParsableByteArray;-><init>(I)V
.line 95
.local v3, "buffer":Lcom/google/android/exoplayer2/util/ParsableByteArray;
const/4 v7, 0x0
.line 96
.local v7, "bytesSearched":I
const/4 v8, 0x0
.line 97
.local v8, "foundGoodFileType":Z
const/4 v9, 0x0
.line 98
.local v9, "isFragmented":Z
:cond_1f
:goto_1f
const/4 v11, 0x0
if-ge v7, v4, :cond_e7
.line 100
const/16 v12, 0x8
.line 101
.local v12, "headerSize":I
invoke-virtual {v3, v12}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->reset(I)V
.line 102
iget-object v13, v3, Lcom/google/android/exoplayer2/util/ParsableByteArray;->data:[B
invoke-interface {v0, v13, v11, v12}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->peekFully([BII)V
.line 103
invoke-virtual {v3}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readUnsignedInt()J
move-result-wide v13
.line 104
.local v13, "atomSize":J
invoke-virtual {v3}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readInt()I
move-result v15
.line 105
.local v15, "atomType":I
const-wide/16 v16, 0x1
const/16 v10, 0x8
cmp-long v18, v13, v16
if-nez v18, :cond_4d
.line 107
const/16 v12, 0x10
.line 108
iget-object v11, v3, Lcom/google/android/exoplayer2/util/ParsableByteArray;->data:[B
invoke-interface {v0, v11, v10, v10}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->peekFully([BII)V
.line 109
const/16 v11, 0x10
invoke-virtual {v3, v11}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->setLimit(I)V
.line 110
invoke-virtual {v3}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLong()J
move-result-wide v13
goto :goto_64
.line 111
:cond_4d
const-wide/16 v18, 0x0
cmp-long v11, v13, v18
if-nez v11, :cond_64
.line 113
invoke-interface/range {p0 .. p0}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->getLength()J
move-result-wide v18
.line 114
.local v18, "fileEndPosition":J
cmp-long v11, v18, v5
if-eqz v11, :cond_64
.line 115
invoke-interface/range {p0 .. p0}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->getPeekPosition()J
move-result-wide v20
sub-long v20, v18, v20
int-to-long v10, v12
add-long v13, v20, v10
.line 119
.end local v18 # "fileEndPosition":J
:cond_64
:goto_64
cmp-long v10, v1, v5
if-eqz v10, :cond_70
int-to-long v10, v7
add-long/2addr v10, v13
cmp-long v18, v10, v1
if-lez v18, :cond_70
.line 121
const/4 v10, 0x0
return v10
.line 119
:cond_70
const/4 v10, 0x0
.line 123
int-to-long v5, v12
cmp-long v11, v13, v5
if-gez v11, :cond_77
.line 125
return v10
.line 127
:cond_77
add-int/2addr v7, v12
.line 129
sget v5, Lcom/google/android/exoplayer2/extractor/mp4/Atom;->TYPE_moov:I
if-ne v15, v5, :cond_8b
.line 132
long-to-int v5, v13
add-int/2addr v4, v5
.line 133
const-wide/16 v5, -0x1
cmp-long v10, v1, v5
if-eqz v10, :cond_1f
int-to-long v10, v4
cmp-long v16, v10, v1
if-lez v16, :cond_1f
.line 135
long-to-int v4, v1
goto :goto_1f
.line 141
:cond_8b
const-wide/16 v5, -0x1
sget v10, Lcom/google/android/exoplayer2/extractor/mp4/Atom;->TYPE_moof:I
if-eq v15, v10, :cond_e4
sget v10, Lcom/google/android/exoplayer2/extractor/mp4/Atom;->TYPE_mvex:I
if-ne v15, v10, :cond_97
const/4 v10, 0x0
goto :goto_e5
.line 147
:cond_97
int-to-long v10, v7
add-long/2addr v10, v13
int-to-long v5, v12
sub-long/2addr v10, v5
int-to-long v5, v4
cmp-long v20, v10, v5
if-ltz v20, :cond_a2
.line 149
const/4 v10, 0x0
goto :goto_e8
.line 152
:cond_a2
int-to-long v5, v12
sub-long v5, v13, v5
long-to-int v6, v5
.line 153
.local v6, "atomDataSize":I
add-int/2addr v7, v6
.line 154
sget v5, Lcom/google/android/exoplayer2/extractor/mp4/Atom;->TYPE_ftyp:I
if-ne v15, v5, :cond_db
.line 156
const/16 v5, 0x8
if-ge v6, v5, :cond_b1
.line 157
const/4 v5, 0x0
return v5
.line 159
:cond_b1
const/4 v5, 0x0
invoke-virtual {v3, v6}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->reset(I)V
.line 160
iget-object v10, v3, Lcom/google/android/exoplayer2/util/ParsableByteArray;->data:[B
invoke-interface {v0, v10, v5, v6}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->peekFully([BII)V
.line 161
div-int/lit8 v5, v6, 0x4
.line 162
.local v5, "brandsCount":I
const/4 v10, 0x0
.local v10, "i":I
:goto_bd
if-ge v10, v5, :cond_d6
.line 163
const/4 v11, 0x1
if-ne v10, v11, :cond_c7
.line 165
const/4 v11, 0x4
invoke-virtual {v3, v11}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->skipBytes(I)V
goto :goto_d3
.line 166
:cond_c7
invoke-virtual {v3}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readInt()I
move-result v11
invoke-static {v11}, Lcom/google/android/exoplayer2/extractor/mp4/Sniffer;->isCompatibleBrand(I)Z
move-result v11
if-eqz v11, :cond_d3
.line 167
const/4 v8, 0x1
.line 168
goto :goto_d6
.line 162
:cond_d3
:goto_d3
add-int/lit8 v10, v10, 0x1
goto :goto_bd
.line 171
.end local v10 # "i":I
:cond_d6
:goto_d6
if-nez v8, :cond_da
.line 173
const/4 v10, 0x0
return v10
.line 175
.end local v5 # "brandsCount":I
:cond_da
goto :goto_e0
:cond_db
if-eqz v6, :cond_da
.line 177
invoke-interface {v0, v6}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->advancePeekPosition(I)V
.line 179
.end local v6 # "atomDataSize":I
.end local v12 # "headerSize":I
.end local v13 # "atomSize":J
.end local v15 # "atomType":I
:goto_e0
const-wide/16 v5, -0x1
goto/16 :goto_1f
.line 141
.restart local v12 # "headerSize":I
.restart local v13 # "atomSize":J
.restart local v15 # "atomType":I
:cond_e4
const/4 v10, 0x0
.line 143
:goto_e5
const/4 v9, 0x1
.line 144
goto :goto_e8
.line 98
.end local v12 # "headerSize":I
.end local v13 # "atomSize":J
.end local v15 # "atomType":I
:cond_e7
const/4 v10, 0x0
.line 180
:goto_e8
if-eqz v8, :cond_f0
move/from16 v5, p1
if-ne v5, v9, :cond_f2
const/4 v10, 0x1
goto :goto_f2
:cond_f0
move/from16 v5, p1
:cond_f2
:goto_f2
return v10
.end method
.method public static sniffUnfragmented(Lcom/google/android/exoplayer2/extractor/ExtractorInput;)Z
.registers 2
.param p0, "input" # Lcom/google/android/exoplayer2/extractor/ExtractorInput;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;,
Ljava/lang/InterruptedException;
}
.end annotation
.line 85
const/4 v0, 0x0
invoke-static {p0, v0}, Lcom/google/android/exoplayer2/extractor/mp4/Sniffer;->sniffInternal(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Z)Z
move-result v0
return v0
.end method