TrackSelectionUtil.smali

.class public final Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;
.super Ljava/lang/Object;
.source "TrackSelectionUtil.java"


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil$AdaptiveTrackSelectionFactory;
    }
.end annotation


# direct methods
.method static constructor <clinit>()V
    .registers 1

    return-void
.end method

.method private constructor <init>()V
    .registers 1

    .line 34
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static createTrackSelectionsForDefinitions([Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil$AdaptiveTrackSelectionFactory;)[Lcom/google/android/exoplayer2/trackselection/TrackSelection;
    .registers 10
    .param p0, "definitions"    # [Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;
    .param p1, "adaptiveTrackSelectionFactory"    # Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil$AdaptiveTrackSelectionFactory;

    .line 61
    array-length v0, p0

    new-array v0, v0, [Lcom/google/android/exoplayer2/trackselection/TrackSelection;

    .line 62
    .local v0, "selections":[Lcom/google/android/exoplayer2/trackselection/TrackSelection;
    const/4 v1, 0x0

    .line 63
    .local v1, "createdAdaptiveTrackSelection":Z
    const/4 v2, 0x0

    .local v2, "i":I
    :goto_5
    array-length v3, p0

    if-ge v2, v3, :cond_2e

    .line 64
    aget-object v3, p0, v2

    .line 65
    .local v3, "definition":Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;
    if-nez v3, :cond_d

    .line 66
    goto :goto_2b

    .line 68
    :cond_d
    iget-object v4, v3, Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;->tracks:[I

    array-length v4, v4

    const/4 v5, 0x1

    if-le v4, v5, :cond_1d

    if-nez v1, :cond_1d

    .line 69
    const/4 v1, 0x1

    .line 70
    invoke-interface {p1, v3}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil$AdaptiveTrackSelectionFactory;->createAdaptiveTrackSelection(Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;)Lcom/google/android/exoplayer2/trackselection/TrackSelection;

    move-result-object v4

    aput-object v4, v0, v2

    goto :goto_2b

    .line 72
    :cond_1d
    new-instance v4, Lcom/google/android/exoplayer2/trackselection/FixedTrackSelection;

    iget-object v5, v3, Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;->group:Lcom/google/android/exoplayer2/source/TrackGroup;

    iget-object v6, v3, Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;->tracks:[I

    const/4 v7, 0x0

    aget v6, v6, v7

    invoke-direct {v4, v5, v6}, Lcom/google/android/exoplayer2/trackselection/FixedTrackSelection;-><init>(Lcom/google/android/exoplayer2/source/TrackGroup;I)V

    aput-object v4, v0, v2

    .line 63
    .end local v3    # "definition":Lcom/google/android/exoplayer2/trackselection/TrackSelection$Definition;
    :goto_2b
    add-int/lit8 v2, v2, 0x1

    goto :goto_5

    .line 75
    .end local v2    # "i":I
    :cond_2e
    return-object v0
.end method

.method private static estimateBitrates([I[Lcom/google/android/exoplayer2/Format;[I[F)V
    .registers 9
    .param p0, "bitrates"    # [I
    .param p1, "formats"    # [Lcom/google/android/exoplayer2/Format;
    .param p2, "referenceBitrates"    # [I
    .param p3, "referenceBitrateRatios"    # [F

    .line 286
    const/4 v0, 0x0

    .local v0, "i":I
    :goto_1
    array-length v1, p0

    if-ge v0, v1, :cond_1f

    .line 287
    aget v1, p0, v0

    const/4 v2, -0x1

    if-ne v1, v2, :cond_1c

    .line 288
    aget-object v1, p1, v0

    iget v1, v1, Lcom/google/android/exoplayer2/Format;->bitrate:I

    .line 289
    .local v1, "formatBitrate":I
    if-eq v1, v2, :cond_1c

    .line 290
    nop

    .line 291
    invoke-static {v1, p2}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getClosestBitrateIndex(I[I)I

    move-result v2

    .line 292
    .local v2, "closestReferenceBitrateIndex":I
    aget v3, p3, v2

    int-to-float v4, v1

    mul-float v3, v3, v4

    float-to-int v3, v3

    aput v3, p0, v0

    .line 286
    .end local v1    # "formatBitrate":I
    .end local v2    # "closestReferenceBitrateIndex":I
    :cond_1c
    add-int/lit8 v0, v0, 0x1

    goto :goto_1

    .line 297
    .end local v0    # "i":I
    :cond_1f
    return-void
.end method

.method public static getAverageBitrate(Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;J)I
    .registers 14
    .param p0, "iterator"    # Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;
    .param p1, "maxDurationUs"    # J

    .line 89
    const-wide/16 v0, 0x0

    .line 90
    .local v0, "totalDurationUs":J
    const-wide/16 v2, 0x0

    .line 91
    .local v2, "totalLength":J
    :goto_4
    invoke-interface {p0}, Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;->next()Z

    move-result v4

    if-eqz v4, :cond_31

    .line 92
    invoke-interface {p0}, Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;->getDataSpec()Lcom/google/android/exoplayer2/upstream/DataSpec;

    move-result-object v4

    iget-wide v4, v4, Lcom/google/android/exoplayer2/upstream/DataSpec;->length:J

    .line 93
    .local v4, "chunkLength":J
    const-wide/16 v6, -0x1

    cmp-long v8, v4, v6

    if-nez v8, :cond_17

    .line 94
    goto :goto_31

    .line 96
    :cond_17
    invoke-interface {p0}, Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;->getChunkEndTimeUs()J

    move-result-wide v6

    invoke-interface {p0}, Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;->getChunkStartTimeUs()J

    move-result-wide v8

    sub-long/2addr v6, v8

    .line 97
    .local v6, "chunkDurationUs":J
    add-long v8, v0, v6

    cmp-long v10, v8, p1

    if-ltz v10, :cond_2e

    .line 98
    sub-long v8, p1, v0

    mul-long v8, v8, v4

    div-long/2addr v8, v6

    add-long/2addr v2, v8

    .line 99
    move-wide v0, p1

    .line 100
    goto :goto_31

    .line 102
    :cond_2e
    add-long/2addr v0, v6

    .line 103
    add-long/2addr v2, v4

    .line 104
    .end local v4    # "chunkLength":J
    .end local v6    # "chunkDurationUs":J
    goto :goto_4

    .line 105
    :cond_31
    :goto_31
    const-wide/16 v4, 0x0

    cmp-long v6, v0, v4

    if-nez v6, :cond_39

    const/4 v4, -0x1

    goto :goto_44

    :cond_39
    const-wide/16 v4, 0x8

    mul-long v4, v4, v2

    const-wide/32 v6, 0xf4240

    mul-long v4, v4, v6

    div-long/2addr v4, v0

    long-to-int v4, v4

    :goto_44
    return v4
.end method

.method private static getAverageQueueBitrate(Ljava/util/List;J)I
    .registers 6
    .param p1, "maxDurationUs"    # J
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Ljava/util/List<",
            "+",
            "Lcom/google/android/exoplayer2/source/chunk/MediaChunk;",
            ">;J)I"
        }
    .end annotation

    .line 300
    .local p0, "queue":Ljava/util/List;, "Ljava/util/List<+Lcom/google/android/exoplayer2/source/chunk/MediaChunk;>;"
    invoke-interface {p0}, Ljava/util/List;->isEmpty()Z

    move-result v0

    if-eqz v0, :cond_8

    .line 301
    const/4 v0, -0x1

    return v0

    .line 303
    :cond_8
    new-instance v0, Lcom/google/android/exoplayer2/source/chunk/MediaChunkListIterator;

    .line 304
    invoke-static {p0}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getSingleFormatSubQueue(Ljava/util/List;)Ljava/util/List;

    move-result-object v1

    const/4 v2, 0x1

    invoke-direct {v0, v1, v2}, Lcom/google/android/exoplayer2/source/chunk/MediaChunkListIterator;-><init>(Ljava/util/List;Z)V

    .line 305
    .local v0, "iterator":Lcom/google/android/exoplayer2/source/chunk/MediaChunkListIterator;
    invoke-static {v0, p1, p2}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getAverageBitrate(Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;J)I

    move-result v1

    return v1
.end method

.method static getBitratesUsingFutureInfo([Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;[Lcom/google/android/exoplayer2/Format;J[I)[I
    .registers 16
    .param p0, "iterators"    # [Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;
    .param p1, "formats"    # [Lcom/google/android/exoplayer2/Format;
    .param p2, "maxDurationUs"    # J
    .param p4, "bitrates"    # [I

    .line 133
    array-length v0, p0

    .line 134
    .local v0, "trackCount":I
    array-length v1, p1

    const/4 v2, 0x0

    if-ne v0, v1, :cond_7

    const/4 v1, 0x1

    goto :goto_8

    :cond_7
    const/4 v1, 0x0

    :goto_8
    invoke-static {v1}, Lcom/google/android/exoplayer2/util/Assertions;->checkArgument(Z)V

    .line 135
    if-nez v0, :cond_10

    .line 136
    new-array v1, v2, [I

    return-object v1

    .line 138
    :cond_10
    if-nez p4, :cond_14

    .line 139
    new-array p4, v0, [I

    .line 141
    :cond_14
    const-wide/16 v1, 0x0

    const/4 v3, -0x1

    cmp-long v4, p2, v1

    if-nez v4, :cond_1f

    .line 142
    invoke-static {p4, v3}, Ljava/util/Arrays;->fill([II)V

    .line 143
    return-object p4

    .line 146
    :cond_1f
    new-array v1, v0, [I

    .line 147
    .local v1, "formatBitrates":[I
    new-array v2, v0, [F

    .line 148
    .local v2, "bitrateRatios":[F
    const/4 v4, 0x0

    .line 149
    .local v4, "needEstimateBitrate":Z
    const/4 v5, 0x0

    .line 150
    .local v5, "canEstimateBitrate":Z
    const/4 v6, 0x0

    .local v6, "i":I
    :goto_26
    if-ge v6, v0, :cond_47

    .line 151
    aget-object v7, p0, v6

    invoke-static {v7, p2, p3}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getAverageBitrate(Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;J)I

    move-result v7

    .line 152
    .local v7, "bitrate":I
    if-eq v7, v3, :cond_3f

    .line 153
    aget-object v8, p1, v6

    iget v8, v8, Lcom/google/android/exoplayer2/Format;->bitrate:I

    .line 154
    .local v8, "formatBitrate":I
    aput v8, v1, v6

    .line 155
    if-eq v8, v3, :cond_3e

    .line 156
    int-to-float v9, v7

    int-to-float v10, v8

    div-float/2addr v9, v10

    aput v9, v2, v6

    .line 157
    const/4 v5, 0x1

    .line 159
    .end local v8    # "formatBitrate":I
    :cond_3e
    goto :goto_42

    .line 160
    :cond_3f
    const/4 v4, 0x1

    .line 161
    aput v3, v1, v6

    .line 163
    :goto_42
    aput v7, p4, v6

    .line 150
    .end local v7    # "bitrate":I
    add-int/lit8 v6, v6, 0x1

    goto :goto_26

    .line 166
    .end local v6    # "i":I
    :cond_47
    if-eqz v4, :cond_4e

    if-eqz v5, :cond_4e

    .line 167
    invoke-static {p4, p1, v1, v2}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->estimateBitrates([I[Lcom/google/android/exoplayer2/Format;[I[F)V

    .line 169
    :cond_4e
    return-object p4
.end method

.method public static getBitratesUsingPastAndFutureInfo([Lcom/google/android/exoplayer2/Format;Ljava/util/List;J[Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;JZ[I)[I
    .registers 13
    .param p0, "formats"    # [Lcom/google/android/exoplayer2/Format;
    .param p2, "maxPastDurationUs"    # J
    .param p4, "iterators"    # [Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;
    .param p5, "maxFutureDurationUs"    # J
    .param p7, "useFormatBitrateAsLowerBound"    # Z
    .param p8, "bitrates"    # [I
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "([",
            "Lcom/google/android/exoplayer2/Format;",
            "Ljava/util/List<",
            "+",
            "Lcom/google/android/exoplayer2/source/chunk/MediaChunk;",
            ">;J[",
            "Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;",
            "JZ[I)[I"
        }
    .end annotation

    .line 240
    .local p1, "queue":Ljava/util/List;, "Ljava/util/List<+Lcom/google/android/exoplayer2/source/chunk/MediaChunk;>;"
    invoke-static {p4, p0, p5, p6, p8}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getBitratesUsingFutureInfo([Lcom/google/android/exoplayer2/source/chunk/MediaChunkIterator;[Lcom/google/android/exoplayer2/Format;J[I)[I

    move-result-object p8

    .line 241
    invoke-static {p1, p0, p2, p3, p8}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getBitratesUsingPastInfo(Ljava/util/List;[Lcom/google/android/exoplayer2/Format;J[I)[I

    .line 242
    const/4 v0, 0x0

    .local v0, "i":I
    :goto_8
    array-length v1, p8

    if-ge v0, v1, :cond_27

    .line 243
    aget v1, p8, v0

    .line 244
    .local v1, "bitrate":I
    const/4 v2, -0x1

    if-eq v1, v2, :cond_1e

    if-eqz p7, :cond_24

    aget-object v3, p0, v0

    iget v3, v3, Lcom/google/android/exoplayer2/Format;->bitrate:I

    if-eq v3, v2, :cond_24

    aget-object v2, p0, v0

    iget v2, v2, Lcom/google/android/exoplayer2/Format;->bitrate:I

    if-ge v1, v2, :cond_24

    .line 248
    :cond_1e
    aget-object v2, p0, v0

    iget v2, v2, Lcom/google/android/exoplayer2/Format;->bitrate:I

    aput v2, p8, v0

    .line 242
    .end local v1    # "bitrate":I
    :cond_24
    add-int/lit8 v0, v0, 0x1

    goto :goto_8

    .line 251
    .end local v0    # "i":I
    :cond_27
    return-object p8
.end method

.method static getBitratesUsingPastInfo(Ljava/util/List;[Lcom/google/android/exoplayer2/Format;J[I)[I
    .registers 11
    .param p1, "formats"    # [Lcom/google/android/exoplayer2/Format;
    .param p2, "maxDurationUs"    # J
    .param p4, "bitrates"    # [I
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Ljava/util/List<",
            "+",
            "Lcom/google/android/exoplayer2/source/chunk/MediaChunk;",
            ">;[",
            "Lcom/google/android/exoplayer2/Format;",
            "J[I)[I"
        }
    .end annotation

    .line 192
    .local p0, "queue":Ljava/util/List;, "Ljava/util/List<+Lcom/google/android/exoplayer2/source/chunk/MediaChunk;>;"
    const/4 v0, -0x1

    if-nez p4, :cond_9

    .line 193
    array-length v1, p1

    new-array p4, v1, [I

    .line 194
    invoke-static {p4, v0}, Ljava/util/Arrays;->fill([II)V

    .line 196
    :cond_9
    const-wide/16 v1, 0x0

    cmp-long v3, p2, v1

    if-nez v3, :cond_10

    .line 197
    return-object p4

    .line 199
    :cond_10
    invoke-static {p0, p2, p3}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->getAverageQueueBitrate(Ljava/util/List;J)I

    move-result v1

    .line 200
    .local v1, "queueAverageBitrate":I
    if-ne v1, v0, :cond_17

    .line 201
    return-object p4

    .line 203
    :cond_17
    invoke-interface {p0}, Ljava/util/List;->size()I

    move-result v2

    const/4 v3, 0x1

    sub-int/2addr v2, v3

    invoke-interface {p0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v2

    check-cast v2, Lcom/google/android/exoplayer2/source/chunk/MediaChunk;

    iget-object v2, v2, Lcom/google/android/exoplayer2/source/chunk/MediaChunk;->trackFormat:Lcom/google/android/exoplayer2/Format;

    iget v2, v2, Lcom/google/android/exoplayer2/Format;->bitrate:I

    .line 204
    .local v2, "queueFormatBitrate":I
    if-eq v2, v0, :cond_38

    .line 205
    int-to-float v0, v1

    int-to-float v4, v2

    div-float/2addr v0, v4

    .line 206
    .local v0, "queueBitrateRatio":F
    new-array v4, v3, [I

    const/4 v5, 0x0

    aput v2, v4, v5

    new-array v3, v3, [F

    aput v0, v3, v5

    invoke-static {p4, p1, v4, v3}, Lcom/google/android/exoplayer2/trackselection/TrackSelectionUtil;->estimateBitrates([I[Lcom/google/android/exoplayer2/Format;[I[F)V

    .line 209
    .end local v0    # "queueBitrateRatio":F
    :cond_38
    return-object p4
.end method

.method private static getClosestBitrateIndex(I[I)I
    .registers 7
    .param p0, "formatBitrate"    # I
    .param p1, "formatBitrates"    # [I

    .line 321
    const v0, 0x7fffffff

    .line 322
    .local v0, "closestDistance":I
    const/4 v1, -0x1

    .line 323
    .local v1, "closestFormat":I
    const/4 v2, 0x0

    .local v2, "j":I
    :goto_5
    array-length v3, p1

    if-ge v2, v3, :cond_1b

    .line 324
    aget v3, p1, v2

    const/4 v4, -0x1

    if-eq v3, v4, :cond_18

    .line 325
    aget v3, p1, v2

    sub-int/2addr v3, p0

    invoke-static {v3}, Ljava/lang/Math;->abs(I)I

    move-result v3

    .line 326
    .local v3, "distance":I
    if-ge v3, v0, :cond_18

    .line 327
    move v0, v3

    .line 328
    move v1, v2

    .line 323
    .end local v3    # "distance":I
    :cond_18
    add-int/lit8 v2, v2, 0x1

    goto :goto_5

    .line 332
    .end local v2    # "j":I
    :cond_1b
    return v1
.end method

.method public static getFormatBitrates([Lcom/google/android/exoplayer2/Format;[I)[I
    .registers 5
    .param p0, "formats"    # [Lcom/google/android/exoplayer2/Format;
    .param p1, "bitrates"    # [I

    .line 262
    array-length v0, p0

    .line 263
    .local v0, "trackCount":I
    if-nez p1, :cond_5

    .line 264
    new-array p1, v0, [I

    .line 266
    :cond_5
    const/4 v1, 0x0

    .local v1, "i":I
    :goto_6
    if-ge v1, v0, :cond_11

    .line 267
    aget-object v2, p0, v1

    iget v2, v2, Lcom/google/android/exoplayer2/Format;->bitrate:I

    aput v2, p1, v1

    .line 266
    add-int/lit8 v1, v1, 0x1

    goto :goto_6

    .line 269
    .end local v1    # "i":I
    :cond_11
    return-object p1
.end method

.method private static getSingleFormatSubQueue(Ljava/util/List;)Ljava/util/List;
    .registers 5
    .annotation system Ldalvik/annotation/Signature;
        value = {
            "(",
            "Ljava/util/List<",
            "+",
            "Lcom/google/android/exoplayer2/source/chunk/MediaChunk;",
            ">;)",
            "Ljava/util/List<",
            "+",
            "Lcom/google/android/exoplayer2/source/chunk/MediaChunk;",
            ">;"
        }
    .end annotation

    .line 310
    .local p0, "queue":Ljava/util/List;, "Ljava/util/List<+Lcom/google/android/exoplayer2/source/chunk/MediaChunk;>;"
    invoke-interface {p0}, Ljava/util/List;->size()I

    move-result v0

    add-int/lit8 v0, v0, -0x1

    invoke-interface {p0, v0}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Lcom/google/android/exoplayer2/source/chunk/MediaChunk;

    iget-object v0, v0, Lcom/google/android/exoplayer2/source/chunk/MediaChunk;->trackFormat:Lcom/google/android/exoplayer2/Format;

    .line 311
    .local v0, "queueFormat":Lcom/google/android/exoplayer2/Format;
    invoke-interface {p0}, Ljava/util/List;->size()I

    move-result v1

    .line 312
    .local v1, "queueSize":I
    add-int/lit8 v2, v1, -0x2

    .local v2, "i":I
    :goto_14
    if-ltz v2, :cond_2e

    .line 313
    invoke-interface {p0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object;

    move-result-object v3

    check-cast v3, Lcom/google/android/exoplayer2/source/chunk/MediaChunk;

    iget-object v3, v3, Lcom/google/android/exoplayer2/source/chunk/MediaChunk;->trackFormat:Lcom/google/android/exoplayer2/Format;

    invoke-virtual {v3, v0}, Lcom/google/android/exoplayer2/Format;->equals(Ljava/lang/Object;)Z

    move-result v3

    if-nez v3, :cond_2b

    .line 314
    add-int/lit8 v3, v2, 0x1

    invoke-interface {p0, v3, v1}, Ljava/util/List;->subList(II)Ljava/util/List;

    move-result-object v3

    return-object v3

    .line 312
    :cond_2b
    add-int/lit8 v2, v2, -0x1

    goto :goto_14

    .line 317
    .end local v2    # "i":I
    :cond_2e
    return-object p0
.end method