DefaultImageHeaderParser.java
package com.bumptech.glide.load.resource.bitmap;
import android.util.Log;
import com.bumptech.glide.load.ImageHeaderParser;
import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.engine.bitmap_recycle.ArrayPool;
import com.bumptech.glide.util.Preconditions;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import kotlin.UByte;
/* loaded from: classes.dex */
public final class DefaultImageHeaderParser implements ImageHeaderParser {
static final int EXIF_MAGIC_NUMBER = 65496;
static final int EXIF_SEGMENT_TYPE = 225;
private static final int GIF_HEADER = 4671814;
private static final int INTEL_TIFF_MAGIC_NUMBER = 18761;
private static final int MARKER_EOI = 217;
private static final int MOTOROLA_TIFF_MAGIC_NUMBER = 19789;
private static final int ORIENTATION_TAG_TYPE = 274;
private static final int PNG_HEADER = -1991225785;
private static final int RIFF_HEADER = 1380533830;
private static final int SEGMENT_SOS = 218;
static final int SEGMENT_START_ID = 255;
private static final String TAG = "DfltImageHeaderParser";
private static final int VP8_HEADER = 1448097792;
private static final int VP8_HEADER_MASK = -256;
private static final int VP8_HEADER_TYPE_EXTENDED = 88;
private static final int VP8_HEADER_TYPE_LOSSLESS = 76;
private static final int VP8_HEADER_TYPE_MASK = 255;
private static final int WEBP_EXTENDED_ALPHA_FLAG = 16;
private static final int WEBP_HEADER = 1464156752;
private static final int WEBP_LOSSLESS_ALPHA_FLAG = 8;
private static final String JPEG_EXIF_SEGMENT_PREAMBLE = "Exif\u0000\u0000";
static final byte[] JPEG_EXIF_SEGMENT_PREAMBLE_BYTES = JPEG_EXIF_SEGMENT_PREAMBLE.getBytes(Charset.forName(Key.STRING_CHARSET_NAME));
private static final int[] BYTES_PER_FORMAT = {0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8};
private static int calcTagOffset(int i, int i2) {
return i + 2 + (i2 * 12);
}
private static boolean handles(int i) {
return (i & EXIF_MAGIC_NUMBER) == EXIF_MAGIC_NUMBER || i == MOTOROLA_TIFF_MAGIC_NUMBER || i == INTEL_TIFF_MAGIC_NUMBER;
}
@Override // com.bumptech.glide.load.ImageHeaderParser
public ImageHeaderParser.ImageType getType(InputStream inputStream) throws IOException {
return getType(new StreamReader((InputStream) Preconditions.checkNotNull(inputStream)));
}
@Override // com.bumptech.glide.load.ImageHeaderParser
public ImageHeaderParser.ImageType getType(ByteBuffer byteBuffer) throws IOException {
return getType(new ByteBufferReader((ByteBuffer) Preconditions.checkNotNull(byteBuffer)));
}
@Override // com.bumptech.glide.load.ImageHeaderParser
public int getOrientation(InputStream inputStream, ArrayPool arrayPool) throws IOException {
return getOrientation(new StreamReader((InputStream) Preconditions.checkNotNull(inputStream)), (ArrayPool) Preconditions.checkNotNull(arrayPool));
}
@Override // com.bumptech.glide.load.ImageHeaderParser
public int getOrientation(ByteBuffer byteBuffer, ArrayPool arrayPool) throws IOException {
return getOrientation(new ByteBufferReader((ByteBuffer) Preconditions.checkNotNull(byteBuffer)), (ArrayPool) Preconditions.checkNotNull(arrayPool));
}
private ImageHeaderParser.ImageType getType(Reader reader) throws IOException {
try {
int uInt16 = reader.getUInt16();
if (uInt16 == EXIF_MAGIC_NUMBER) {
return ImageHeaderParser.ImageType.JPEG;
}
int uInt8 = (uInt16 << 8) | reader.getUInt8();
if (uInt8 == GIF_HEADER) {
return ImageHeaderParser.ImageType.GIF;
}
int uInt82 = (uInt8 << 8) | reader.getUInt8();
if (uInt82 == PNG_HEADER) {
reader.skip(21L);
try {
return reader.getUInt8() >= 3 ? ImageHeaderParser.ImageType.PNG_A : ImageHeaderParser.ImageType.PNG;
} catch (Reader.EndOfFileException unused) {
return ImageHeaderParser.ImageType.PNG;
}
} else if (uInt82 != RIFF_HEADER) {
return ImageHeaderParser.ImageType.UNKNOWN;
} else {
reader.skip(4L);
if (((reader.getUInt16() << 16) | reader.getUInt16()) != WEBP_HEADER) {
return ImageHeaderParser.ImageType.UNKNOWN;
}
int uInt162 = (reader.getUInt16() << 16) | reader.getUInt16();
if ((uInt162 & (-256)) != VP8_HEADER) {
return ImageHeaderParser.ImageType.UNKNOWN;
}
int i = uInt162 & 255;
if (i == 88) {
reader.skip(4L);
return (reader.getUInt8() & 16) != 0 ? ImageHeaderParser.ImageType.WEBP_A : ImageHeaderParser.ImageType.WEBP;
} else if (i == 76) {
reader.skip(4L);
return (reader.getUInt8() & 8) != 0 ? ImageHeaderParser.ImageType.WEBP_A : ImageHeaderParser.ImageType.WEBP;
} else {
return ImageHeaderParser.ImageType.WEBP;
}
}
} catch (Reader.EndOfFileException unused2) {
return ImageHeaderParser.ImageType.UNKNOWN;
}
}
private int getOrientation(Reader reader, ArrayPool arrayPool) throws IOException {
try {
int uInt16 = reader.getUInt16();
if (!handles(uInt16)) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Parser doesn't handle magic number: " + uInt16);
}
return -1;
}
int moveToExifSegmentAndGetLength = moveToExifSegmentAndGetLength(reader);
if (moveToExifSegmentAndGetLength == -1) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Failed to parse exif segment length, or exif segment not found");
}
return -1;
}
byte[] bArr = (byte[]) arrayPool.get(moveToExifSegmentAndGetLength, byte[].class);
int parseExifSegment = parseExifSegment(reader, bArr, moveToExifSegmentAndGetLength);
arrayPool.put(bArr);
return parseExifSegment;
} catch (Reader.EndOfFileException unused) {
return -1;
}
}
private int parseExifSegment(Reader reader, byte[] bArr, int i) throws IOException {
int read = reader.read(bArr, i);
if (read != i) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Unable to read exif segment data, length: " + i + ", actually read: " + read);
}
return -1;
} else if (hasJpegExifPreamble(bArr, i)) {
return parseExifSegment(new RandomAccessReader(bArr, i));
} else {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Missing jpeg exif preamble");
}
return -1;
}
}
private boolean hasJpegExifPreamble(byte[] bArr, int i) {
boolean z = bArr != null && i > JPEG_EXIF_SEGMENT_PREAMBLE_BYTES.length;
if (z) {
int i2 = 0;
while (true) {
byte[] bArr2 = JPEG_EXIF_SEGMENT_PREAMBLE_BYTES;
if (i2 >= bArr2.length) {
break;
} else if (bArr[i2] != bArr2[i2]) {
return false;
} else {
i2++;
}
}
}
return z;
}
private int moveToExifSegmentAndGetLength(Reader reader) throws IOException {
short uInt8;
short uInt82;
int uInt16;
long j;
long skip;
do {
if (reader.getUInt8() != 255) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Unknown segmentId=" + ((int) uInt8));
}
return -1;
}
uInt82 = reader.getUInt8();
if (uInt82 == SEGMENT_SOS) {
return -1;
}
if (uInt82 == MARKER_EOI) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Found MARKER_EOI in exif segment");
}
return -1;
}
uInt16 = reader.getUInt16() - 2;
if (uInt82 == EXIF_SEGMENT_TYPE) {
return uInt16;
}
j = uInt16;
skip = reader.skip(j);
} while (skip == j);
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Unable to skip enough data, type: " + ((int) uInt82) + ", wanted to skip: " + uInt16 + ", but actually skipped: " + skip);
}
return -1;
}
private static int parseExifSegment(RandomAccessReader randomAccessReader) {
ByteOrder byteOrder;
short int16 = randomAccessReader.getInt16(6);
if (int16 == INTEL_TIFF_MAGIC_NUMBER) {
byteOrder = ByteOrder.LITTLE_ENDIAN;
} else if (int16 == MOTOROLA_TIFF_MAGIC_NUMBER) {
byteOrder = ByteOrder.BIG_ENDIAN;
} else {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Unknown endianness = " + ((int) int16));
}
byteOrder = ByteOrder.BIG_ENDIAN;
}
randomAccessReader.order(byteOrder);
int int32 = randomAccessReader.getInt32(10) + 6;
short int162 = randomAccessReader.getInt16(int32);
for (int i = 0; i < int162; i++) {
int calcTagOffset = calcTagOffset(int32, i);
short int163 = randomAccessReader.getInt16(calcTagOffset);
if (int163 == ORIENTATION_TAG_TYPE) {
short int164 = randomAccessReader.getInt16(calcTagOffset + 2);
if (int164 < 1 || int164 > 12) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Got invalid format code = " + ((int) int164));
}
} else {
int int322 = randomAccessReader.getInt32(calcTagOffset + 4);
if (int322 < 0) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Negative tiff component count");
}
} else {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Got tagIndex=" + i + " tagType=" + ((int) int163) + " formatCode=" + ((int) int164) + " componentCount=" + int322);
}
int i2 = int322 + BYTES_PER_FORMAT[int164];
if (i2 > 4) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Got byte count > 4, not orientation, continuing, formatCode=" + ((int) int164));
}
} else {
int i3 = calcTagOffset + 8;
if (i3 < 0 || i3 > randomAccessReader.length()) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Illegal tagValueOffset=" + i3 + " tagType=" + ((int) int163));
}
} else if (i2 < 0 || i2 + i3 > randomAccessReader.length()) {
if (Log.isLoggable(TAG, 3)) {
Log.d(TAG, "Illegal number of bytes for TI tag data tagType=" + ((int) int163));
}
} else {
return randomAccessReader.getInt16(i3);
}
}
}
}
}
}
return -1;
}
/* JADX INFO: Access modifiers changed from: private */
/* loaded from: classes.dex */
public static final class RandomAccessReader {
private final ByteBuffer data;
RandomAccessReader(byte[] bArr, int i) {
this.data = (ByteBuffer) ByteBuffer.wrap(bArr).order(ByteOrder.BIG_ENDIAN).limit(i);
}
void order(ByteOrder byteOrder) {
this.data.order(byteOrder);
}
int length() {
return this.data.remaining();
}
int getInt32(int i) {
if (isAvailable(i, 4)) {
return this.data.getInt(i);
}
return -1;
}
short getInt16(int i) {
if (isAvailable(i, 2)) {
return this.data.getShort(i);
}
return (short) -1;
}
private boolean isAvailable(int i, int i2) {
return this.data.remaining() - i >= i2;
}
}
/* JADX INFO: Access modifiers changed from: private */
/* loaded from: classes.dex */
public interface Reader {
int getUInt16() throws IOException;
short getUInt8() throws IOException;
int read(byte[] bArr, int i) throws IOException;
long skip(long j) throws IOException;
/* loaded from: classes.dex */
public static final class EndOfFileException extends IOException {
private static final long serialVersionUID = 1;
EndOfFileException() {
super("Unexpectedly reached end of a file");
}
}
}
/* loaded from: classes.dex */
private static final class ByteBufferReader implements Reader {
private final ByteBuffer byteBuffer;
ByteBufferReader(ByteBuffer byteBuffer) {
this.byteBuffer = byteBuffer;
byteBuffer.order(ByteOrder.BIG_ENDIAN);
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public short getUInt8() throws Reader.EndOfFileException {
if (this.byteBuffer.remaining() < 1) {
throw new Reader.EndOfFileException();
}
return (short) (this.byteBuffer.get() & UByte.MAX_VALUE);
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public int getUInt16() throws Reader.EndOfFileException {
return (getUInt8() << 8) | getUInt8();
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public int read(byte[] bArr, int i) {
int min = Math.min(i, this.byteBuffer.remaining());
if (min == 0) {
return -1;
}
this.byteBuffer.get(bArr, 0, min);
return min;
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public long skip(long j) {
int min = (int) Math.min(this.byteBuffer.remaining(), j);
ByteBuffer byteBuffer = this.byteBuffer;
byteBuffer.position(byteBuffer.position() + min);
return min;
}
}
/* loaded from: classes.dex */
private static final class StreamReader implements Reader {
private final InputStream is;
StreamReader(InputStream inputStream) {
this.is = inputStream;
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public short getUInt8() throws IOException {
int read = this.is.read();
if (read != -1) {
return (short) read;
}
throw new Reader.EndOfFileException();
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public int getUInt16() throws IOException {
return (getUInt8() << 8) | getUInt8();
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public int read(byte[] bArr, int i) throws IOException {
int i2 = 0;
int i3 = 0;
while (i2 < i && (i3 = this.is.read(bArr, i2, i - i2)) != -1) {
i2 += i3;
}
if (i2 == 0 && i3 == -1) {
throw new Reader.EndOfFileException();
}
return i2;
}
@Override // com.bumptech.glide.load.resource.bitmap.DefaultImageHeaderParser.Reader
public long skip(long j) throws IOException {
if (j < 0) {
return 0L;
}
long j2 = j;
while (j2 > 0) {
long skip = this.is.skip(j2);
if (skip <= 0) {
if (this.is.read() == -1) {
break;
}
skip = 1;
}
j2 -= skip;
}
return j - j2;
}
}
}