WavHeaderReader.smali
.class final Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader;
.super Ljava/lang/Object;
.source "WavHeaderReader.java"
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
}
.end annotation
# static fields
.field private static final TAG:Ljava/lang/String; = "WavHeaderReader"
# direct methods
.method static constructor <clinit>()V
.registers 1
return-void
.end method
.method private constructor <init>()V
.registers 1
.line 144
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
.line 146
return-void
.end method
.method public static peek(Lcom/google/android/exoplayer2/extractor/ExtractorInput;)Lcom/google/android/exoplayer2/extractor/wav/WavHeader;
.registers 20
.param p0, "input" # Lcom/google/android/exoplayer2/extractor/ExtractorInput;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;,
Ljava/lang/InterruptedException;
}
.end annotation
.line 44
move-object/from16 v0, p0
invoke-static/range {p0 .. p0}, Lcom/google/android/exoplayer2/util/Assertions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
.line 47
new-instance v1, Lcom/google/android/exoplayer2/util/ParsableByteArray;
const/16 v2, 0x10
invoke-direct {v1, v2}, Lcom/google/android/exoplayer2/util/ParsableByteArray;-><init>(I)V
.line 50
.local v1, "scratch":Lcom/google/android/exoplayer2/util/ParsableByteArray;
invoke-static {v0, v1}, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->peek(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Lcom/google/android/exoplayer2/util/ParsableByteArray;)Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
move-result-object v3
.line 51
.local v3, "chunkHeader":Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
iget v4, v3, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->id:I
sget v5, Lcom/google/android/exoplayer2/audio/WavUtil;->RIFF_FOURCC:I
const/4 v6, 0x0
if-eq v4, v5, :cond_18
.line 52
return-object v6
.line 55
:cond_18
iget-object v4, v1, Lcom/google/android/exoplayer2/util/ParsableByteArray;->data:[B
const/4 v5, 0x4
const/4 v7, 0x0
invoke-interface {v0, v4, v7, v5}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->peekFully([BII)V
.line 56
invoke-virtual {v1, v7}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->setPosition(I)V
.line 57
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readInt()I
move-result v4
.line 58
.local v4, "riffFormat":I
sget v5, Lcom/google/android/exoplayer2/audio/WavUtil;->WAVE_FOURCC:I
const-string v8, "WavHeaderReader"
if-eq v4, v5, :cond_41
.line 59
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
const-string v5, "Unsupported RIFF format: "
invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v8, v2}, Lcom/google/android/exoplayer2/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)V
.line 60
return-object v6
.line 64
:cond_41
invoke-static {v0, v1}, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->peek(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Lcom/google/android/exoplayer2/util/ParsableByteArray;)Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
move-result-object v3
.line 65
:goto_45
iget v5, v3, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->id:I
sget v9, Lcom/google/android/exoplayer2/audio/WavUtil;->FMT_FOURCC:I
if-eq v5, v9, :cond_56
.line 66
iget-wide v9, v3, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->size:J
long-to-int v5, v9
invoke-interface {v0, v5}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->advancePeekPosition(I)V
.line 67
invoke-static {v0, v1}, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->peek(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Lcom/google/android/exoplayer2/util/ParsableByteArray;)Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
move-result-object v3
goto :goto_45
.line 70
:cond_56
iget-wide v9, v3, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->size:J
const-wide/16 v11, 0x10
cmp-long v5, v9, v11
if-ltz v5, :cond_60
const/4 v5, 0x1
goto :goto_61
:cond_60
const/4 v5, 0x0
:goto_61
invoke-static {v5}, Lcom/google/android/exoplayer2/util/Assertions;->checkState(Z)V
.line 71
iget-object v5, v1, Lcom/google/android/exoplayer2/util/ParsableByteArray;->data:[B
invoke-interface {v0, v5, v7, v2}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->peekFully([BII)V
.line 72
invoke-virtual {v1, v7}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->setPosition(I)V
.line 73
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLittleEndianUnsignedShort()I
move-result v5
.line 74
.local v5, "type":I
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLittleEndianUnsignedShort()I
move-result v7
.line 75
.local v7, "numChannels":I
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLittleEndianUnsignedIntToInt()I
move-result v16
.line 76
.local v16, "sampleRateHz":I
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLittleEndianUnsignedIntToInt()I
move-result v17
.line 77
.local v17, "averageBytesPerSecond":I
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLittleEndianUnsignedShort()I
move-result v15
.line 78
.local v15, "blockAlignment":I
invoke-virtual {v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;->readLittleEndianUnsignedShort()I
move-result v14
.line 80
.local v14, "bitsPerSample":I
mul-int v9, v7, v14
div-int/lit8 v13, v9, 0x8
.line 81
.local v13, "expectedBlockAlignment":I
if-ne v15, v13, :cond_c6
.line 86
invoke-static {v5, v14}, Lcom/google/android/exoplayer2/audio/WavUtil;->getEncodingForType(II)I
move-result v18
.line 87
.local v18, "encoding":I
if-nez v18, :cond_ad
.line 88
new-instance v2, Ljava/lang/StringBuilder;
invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
const-string v9, "Unsupported WAV format: "
invoke-virtual {v2, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v2, v14}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string v9, " bit/sample, type "
invoke-virtual {v2, v9}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v2, v5}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v8, v2}, Lcom/google/android/exoplayer2/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)V
.line 89
return-object v6
.line 93
:cond_ad
iget-wide v8, v3, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->size:J
long-to-int v6, v8
sub-int/2addr v6, v2
invoke-interface {v0, v6}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->advancePeekPosition(I)V
.line 95
new-instance v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeader;
move-object v9, v2
move v10, v7
move/from16 v11, v16
move/from16 v12, v17
move v6, v13
.end local v13 # "expectedBlockAlignment":I
.local v6, "expectedBlockAlignment":I
move v13, v15
move v8, v14
.end local v14 # "bitsPerSample":I
.local v8, "bitsPerSample":I
move v0, v15
.end local v15 # "blockAlignment":I
.local v0, "blockAlignment":I
move/from16 v15, v18
invoke-direct/range {v9 .. v15}, Lcom/google/android/exoplayer2/extractor/wav/WavHeader;-><init>(IIIIII)V
return-object v2
.line 82
.end local v0 # "blockAlignment":I
.end local v6 # "expectedBlockAlignment":I
.end local v8 # "bitsPerSample":I
.end local v18 # "encoding":I
.restart local v13 # "expectedBlockAlignment":I
.restart local v14 # "bitsPerSample":I
.restart local v15 # "blockAlignment":I
:cond_c6
move v6, v13
move v0, v15
.end local v13 # "expectedBlockAlignment":I
.end local v15 # "blockAlignment":I
.restart local v0 # "blockAlignment":I
.restart local v6 # "expectedBlockAlignment":I
new-instance v2, Lcom/google/android/exoplayer2/ParserException;
new-instance v9, Ljava/lang/StringBuilder;
invoke-direct {v9}, Ljava/lang/StringBuilder;-><init>()V
const-string v10, "Expected block alignment: "
invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v9, v6}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
const-string v10, "; got: "
invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v9, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
invoke-virtual {v9}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v9
invoke-direct {v2, v9}, Lcom/google/android/exoplayer2/ParserException;-><init>(Ljava/lang/String;)V
goto :goto_e8
:goto_e7
throw v2
:goto_e8
goto :goto_e7
.end method
.method public static skipToData(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Lcom/google/android/exoplayer2/extractor/wav/WavHeader;)V
.registers 10
.param p0, "input" # Lcom/google/android/exoplayer2/extractor/ExtractorInput;
.param p1, "wavHeader" # Lcom/google/android/exoplayer2/extractor/wav/WavHeader;
.annotation system Ldalvik/annotation/Throws;
value = {
Ljava/io/IOException;,
Ljava/lang/InterruptedException;
}
.end annotation
.line 116
invoke-static {p0}, Lcom/google/android/exoplayer2/util/Assertions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
.line 117
invoke-static {p1}, Lcom/google/android/exoplayer2/util/Assertions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
.line 120
invoke-interface {p0}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->resetPeekPosition()V
.line 122
new-instance v0, Lcom/google/android/exoplayer2/util/ParsableByteArray;
const/16 v1, 0x8
invoke-direct {v0, v1}, Lcom/google/android/exoplayer2/util/ParsableByteArray;-><init>(I)V
.line 124
.local v0, "scratch":Lcom/google/android/exoplayer2/util/ParsableByteArray;
invoke-static {p0, v0}, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->peek(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Lcom/google/android/exoplayer2/util/ParsableByteArray;)Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
move-result-object v2
.line 125
.local v2, "chunkHeader":Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
:goto_14
iget v3, v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->id:I
const-string v4, "data"
invoke-static {v4}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v4
if-eq v3, v4, :cond_70
.line 126
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string v4, "Ignoring unknown WAV chunk: "
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget v4, v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->id: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
const-string v4, "WavHeaderReader"
invoke-static {v4, v3}, Lcom/google/android/exoplayer2/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)V
.line 127
const-wide/16 v3, 0x8
iget-wide v5, v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->size:J
add-long/2addr v5, v3
.line 129
.local v5, "bytesToSkip":J
iget v3, v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->id:I
const-string v4, "RIFF"
invoke-static {v4}, Lcom/google/android/exoplayer2/util/Util;->getIntegerCodeForString(Ljava/lang/String;)I
move-result v4
if-ne v3, v4, :cond_47
.line 130
const-wide/16 v5, 0xc
.line 132
:cond_47
const-wide/32 v3, 0x7fffffff
cmp-long v7, v5, v3
if-gtz v7, :cond_57
.line 135
long-to-int v3, v5
invoke-interface {p0, v3}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->skipFully(I)V
.line 136
invoke-static {p0, v0}, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->peek(Lcom/google/android/exoplayer2/extractor/ExtractorInput;Lcom/google/android/exoplayer2/util/ParsableByteArray;)Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;
move-result-object v2
.line 137
.end local v5 # "bytesToSkip":J
goto :goto_14
.line 133
.restart local v5 # "bytesToSkip":J
:cond_57
new-instance v1, Lcom/google/android/exoplayer2/ParserException;
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
const-string v4, "Chunk is too large (~2GB+) to skip; id: "
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
iget v4, v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->id: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 {v1, v3}, Lcom/google/android/exoplayer2/ParserException;-><init>(Ljava/lang/String;)V
throw v1
.line 139
.end local v5 # "bytesToSkip":J
:cond_70
invoke-interface {p0, v1}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->skipFully(I)V
.line 141
invoke-interface {p0}, Lcom/google/android/exoplayer2/extractor/ExtractorInput;->getPosition()J
move-result-wide v3
iget-wide v5, v2, Lcom/google/android/exoplayer2/extractor/wav/WavHeaderReader$ChunkHeader;->size:J
invoke-virtual {p1, v3, v4, v5, v6}, Lcom/google/android/exoplayer2/extractor/wav/WavHeader;->setDataBounds(JJ)V
.line 142
return-void
.end method