DefaultImageFormatChecker.smali
.class public Lcom/facebook/imageformat/DefaultImageFormatChecker;
.super Ljava/lang/Object;
.source "SourceFile"
# interfaces
.implements Lcom/facebook/imageformat/ImageFormat$FormatChecker;
# static fields
.field private static final BMP_HEADER:[B
.field private static final BMP_HEADER_LENGTH:I
.field private static final EXTENDED_WEBP_HEADER_LENGTH:I = 0x15
.field private static final GIF_HEADER_87A:[B
.field private static final GIF_HEADER_89A:[B
.field private static final GIF_HEADER_LENGTH:I = 0x6
.field private static final H264_HEADER:[B
.field private static final H264_HEADER_LENGTH:I
.field private static final HEIF_HEADER_LENGTH:I
.field private static final HEIF_HEADER_PREFIX:Ljava/lang/String; = "ftyp"
.field private static final HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
.field private static final ICO_HEADER:[B
.field private static final ICO_HEADER_LENGTH:I
.field private static final JPEG_HEADER:[B
.field private static final JPEG_HEADER_LENGTH:I
.field private static final PNG_HEADER:[B
.field private static final PNG_HEADER_LENGTH:I
.field private static final SIMPLE_WEBP_HEADER_LENGTH:I = 0x14
# instance fields
.field final MAX_HEADER_LENGTH:I
# direct methods
.method static constructor <clinit>()V
.registers 10
const/4 v0, 0x3
new-array v1, v0, [B
.line 136
fill-array-data v1, :array_74
.line 137
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER:[B
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER_LENGTH:I
const/16 v0, 0x8
new-array v1, v0, [B
.line 159
fill-array-data v1, :array_7a
.line 163
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER:[B
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER_LENGTH:I
const-string v0, "GIF87a"
.line 183
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_87A:[B
const-string v0, "GIF89a"
.line 184
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_89A:[B
const-string v0, "BM"
.line 206
invoke-static {v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v0
.line 207
sput-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER:[B
array-length v0, v0
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER_LENGTH:I
const/4 v0, 0x4
new-array v1, v0, [B
.line 225
fill-array-data v1, :array_82
.line 228
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER:[B
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER_LENGTH:I
const-string v2, "mif1"
const-string v3, "msf1"
const-string v4, "heic"
const-string v5, "heix"
const-string v6, "hevc"
const-string v7, "hevx"
const-string v8, "mif1"
const-string v9, "msf1"
.line 253
filled-new-array/range {v2 .. v9}, [Ljava/lang/String;
move-result-object v1
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
.line 256
new-instance v1, Ljava/lang/StringBuilder;
const-string v2, "ftyp"
invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V
sget-object v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
const/4 v3, 0x0
aget-object v2, v2, v3
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
.line 257
invoke-static {v1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v1
array-length v1, v1
sput v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
new-array v1, v0, [B
.line 303
fill-array-data v1, :array_88
.line 306
sput-object v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->H264_HEADER:[B
sput v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->H264_HEADER_LENGTH:I
return-void
:array_74
.array-data 1
-0x1t
-0x28t
-0x1t
.end array-data
:array_7a
.array-data 1
-0x77t
0x50t
0x4et
0x47t
0xdt
0xat
0x1at
0xat
.end array-data
:array_82
.array-data 1
0x0t
0x0t
0x1t
0x0t
.end array-data
:array_88
.array-data 1
0x0t
0x0t
0x0t
0x1t
.end array-data
.end method
.method public constructor <init>()V
.registers 5
.line 18
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
const/16 v0, 0x9
new-array v0, v0, [I
const/4 v1, 0x0
const/16 v2, 0x15
aput v2, v0, v1
const/4 v1, 0x1
const/16 v2, 0x14
aput v2, v0, v1
.line 27
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER_LENGTH:I
const/4 v2, 0x2
aput v1, v0, v2
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER_LENGTH:I
const/4 v2, 0x3
aput v1, v0, v2
const/4 v1, 0x6
const/4 v2, 0x4
aput v1, v0, v2
sget v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER_LENGTH:I
const/4 v3, 0x5
aput v2, v0, v3
sget v2, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER_LENGTH:I
aput v2, v0, v1
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
const/4 v2, 0x7
aput v1, v0, v2
sget v1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->H264_HEADER_LENGTH:I
const/16 v2, 0x8
aput v1, v0, v2
.line 28
invoke-static {v0}, Lcom/facebook/common/internal/Ints;->max([I)I
move-result v0
iput v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->MAX_HEADER_LENGTH:I
return-void
.end method
.method private static getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
.registers 4
const/4 v0, 0x0
.line 110
invoke-static {p0, v0, p1}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v1
invoke-static {v1}, Lcom/facebook/common/internal/Preconditions;->checkArgument(Z)V
.line 111
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isSimpleWebpHeader([BI)Z
move-result v1
if-eqz v1, :cond_11
.line 112
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_SIMPLE:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 115
:cond_11
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isLosslessWebpHeader([BI)Z
move-result v1
if-eqz v1, :cond_1a
.line 116
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_LOSSLESS:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 119
:cond_1a
invoke-static {p0, v0, p1}, Lcom/facebook/common/webp/WebpSupportStatus;->isExtendedWebpHeader([BII)Z
move-result p1
if-eqz p1, :cond_35
.line 120
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isAnimatedWebpHeader([BI)Z
move-result p1
if-eqz p1, :cond_29
.line 121
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_ANIMATED:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 123
:cond_29
invoke-static {p0, v0}, Lcom/facebook/common/webp/WebpSupportStatus;->isExtendedWebpHeaderWithAlpha([BI)Z
move-result p0
if-eqz p0, :cond_32
.line 124
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_EXTENDED_WITH_ALPHA:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 126
:cond_32
sget-object p0, Lcom/facebook/imageformat/DefaultImageFormats;->WEBP_EXTENDED:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.line 129
:cond_35
sget-object p0, Lcom/facebook/imageformat/ImageFormat;->UNKNOWN:Lcom/facebook/imageformat/ImageFormat;
return-object p0
.end method
.method private static isBmpHeader([BI)Z
.registers 4
.line 218
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->BMP_HEADER:[B
array-length v1, v0
if-ge p1, v1, :cond_7
const/4 p0, 0x0
return p0
.line 221
:cond_7
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
return p0
.end method
.method private static isGifHeader([BI)Z
.registers 4
const/4 v0, 0x0
const/4 v1, 0x6
if-ge p1, v1, :cond_5
return v0
.line 199
:cond_5
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_87A:[B
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p1
if-nez p1, :cond_17
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->GIF_HEADER_89A:[B
.line 200
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_16
goto :goto_17
:cond_16
return v0
:cond_17
:goto_17
const/4 p0, 0x1
return p0
.end method
.method private static isH264Header([BI)Z
.registers 3
.line 309
sget v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->H264_HEADER_LENGTH:I
if-ge p1, v0, :cond_6
const/4 p0, 0x0
return p0
.line 312
:cond_6
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->H264_HEADER:[B
invoke-static {p0, p1}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
return p0
.end method
.method private static isHeifHeader([BI)Z
.registers 8
.line 269
sget v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
const/4 v1, 0x0
if-ge p1, v0, :cond_6
return v1
:cond_6
const/4 p1, 0x3
.line 273
aget-byte p1, p0, p1
const/16 v0, 0x8
if-ge p1, v0, :cond_e
return v1
.line 278
:cond_e
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_SUFFIXES:[Ljava/lang/String;
array-length v0, p1
const/4 v2, 0x0
:goto_12
if-ge v2, v0, :cond_32
aget-object v3, p1, v2
.line 279
array-length v4, p0
invoke-static {v3}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String;
move-result-object v3
const-string v5, "ftyp"
invoke-virtual {v5, v3}, Ljava/lang/String;->concat(Ljava/lang/String;)Ljava/lang/String;
move-result-object v3
.line 283
invoke-static {v3}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->asciiBytes(Ljava/lang/String;)[B
move-result-object v3
sget v5, Lcom/facebook/imageformat/DefaultImageFormatChecker;->HEIF_HEADER_LENGTH:I
.line 280
invoke-static {p0, v4, v3, v5}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->indexOfPattern([BI[BI)I
move-result v3
if-ltz v3, :cond_2f
const/4 p0, 0x1
return p0
:cond_2f
add-int/lit8 v2, v2, 0x1
goto :goto_12
:cond_32
return v1
.end method
.method private static isIcoHeader([BI)Z
.registers 4
.line 240
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->ICO_HEADER:[B
array-length v1, v0
if-ge p1, v1, :cond_7
const/4 p0, 0x0
return p0
.line 243
:cond_7
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
return p0
.end method
.method private static isJpegHeader([BI)Z
.registers 4
.line 151
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->JPEG_HEADER:[B
array-length v1, v0
if-lt p1, v1, :cond_d
.line 152
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_d
const/4 p0, 0x1
return p0
:cond_d
const/4 p0, 0x0
return p0
.end method
.method private static isPngHeader([BI)Z
.registers 4
.line 175
sget-object v0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->PNG_HEADER:[B
array-length v1, v0
if-lt p1, v1, :cond_d
.line 176
invoke-static {p0, v0}, Lcom/facebook/imageformat/ImageFormatCheckerUtils;->startsWithPattern([B[B)Z
move-result p0
if-eqz p0, :cond_d
const/4 p0, 0x1
return p0
:cond_d
const/4 p0, 0x0
return p0
.end method
# virtual methods
.method public final determineFormat([BI)Lcom/facebook/imageformat/ImageFormat;
.registers 4
.line 55
invoke-static {p1}, Lcom/facebook/common/internal/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
const/4 v0, 0x0
.line 57
invoke-static {p1, v0, p2}, Lcom/facebook/common/webp/WebpSupportStatus;->isWebpHeader([BII)Z
move-result v0
if-eqz v0, :cond_f
.line 58
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->getWebpFormat([BI)Lcom/facebook/imageformat/ImageFormat;
move-result-object p1
return-object p1
.line 61
:cond_f
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isJpegHeader([BI)Z
move-result v0
if-eqz v0, :cond_18
.line 62
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->JPEG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 65
:cond_18
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isPngHeader([BI)Z
move-result v0
if-eqz v0, :cond_21
.line 66
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->PNG:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 69
:cond_21
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isGifHeader([BI)Z
move-result v0
if-eqz v0, :cond_2a
.line 70
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->GIF:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 73
:cond_2a
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isBmpHeader([BI)Z
move-result v0
if-eqz v0, :cond_33
.line 74
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->BMP:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 77
:cond_33
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isIcoHeader([BI)Z
move-result v0
if-eqz v0, :cond_3c
.line 78
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->ICO:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 81
:cond_3c
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isHeifHeader([BI)Z
move-result v0
if-eqz v0, :cond_45
.line 82
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->HEIF:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 85
:cond_45
invoke-static {p1, p2}, Lcom/facebook/imageformat/DefaultImageFormatChecker;->isH264Header([BI)Z
move-result p1
if-eqz p1, :cond_4e
.line 86
sget-object p1, Lcom/facebook/imageformat/DefaultImageFormats;->H264:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.line 89
:cond_4e
sget-object p1, Lcom/facebook/imageformat/ImageFormat;->UNKNOWN:Lcom/facebook/imageformat/ImageFormat;
return-object p1
.end method
.method public getHeaderSize()I
.registers 2
.line 41
iget v0, p0, Lcom/facebook/imageformat/DefaultImageFormatChecker;->MAX_HEADER_LENGTH:I
return v0
.end method