diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java index b5a54d1e45..954884027b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DecoderCounters.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer; import static java.lang.Math.max; import androidx.media3.common.util.UnstableApi; +import androidx.media3.common.util.Util; /** * Maintains decoder event counts, for debugging purposes only. @@ -157,4 +158,34 @@ public final class DecoderCounters { totalVideoFrameProcessingOffsetUs += totalProcessingOffsetUs; videoFrameProcessingOffsetCount += count; } + + @Override + public String toString() { + return Util.formatInvariant( + "DecoderCounters {\n " + + "decoderInits=%s,\n " + + "decoderReleases=%s\n " + + "queuedInputBuffers=%s\n " + + "skippedInputBuffers=%s\n " + + "renderedOutputBuffers=%s\n " + + "skippedOutputBuffers=%s\n " + + "droppedBuffers=%s\n " + + "droppedInputBuffers=%s\n " + + "maxConsecutiveDroppedBuffers=%s\n " + + "droppedToKeyframeEvents=%s\n " + + "totalVideoFrameProcessingOffsetUs=%s\n " + + "videoFrameProcessingOffsetCount=%s\n}", + decoderInitCount, + decoderReleaseCount, + queuedInputBufferCount, + skippedInputBufferCount, + renderedOutputBufferCount, + skippedOutputBufferCount, + droppedBufferCount, + droppedInputBufferCount, + maxConsecutiveDroppedBufferCount, + droppedToKeyframeCount, + totalVideoFrameProcessingOffsetUs, + videoFrameProcessingOffsetCount); + } } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/DecoderCountersUtil.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/DecoderCountersUtil.java index 26a4362187..a7bd04fda3 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/DecoderCountersUtil.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/DecoderCountersUtil.java @@ -45,7 +45,7 @@ public final class DecoderCountersUtil { counters.ensureUpdated(); int actual = counters.skippedOutputBufferCount; assertWithMessage( - "Codec(" + name + ") skipped " + actual + " buffers. Expected " + expected + ".") + "Codec(%s) skipped an unexpected number of buffers. Counters:\n%s", name, counters) .that(actual) .isEqualTo(expected); } @@ -68,32 +68,19 @@ public final class DecoderCountersUtil { public static void assertTotalBufferCount( String name, DecoderCounters counters, int minCount, int maxCount) { int actual = getTotalBufferCount(counters); - assertWithMessage( - "Codec(" - + name - + ") output " - + actual - + " buffers. Expected in range [" - + minCount - + ", " - + maxCount - + "].") - .that(minCount <= actual && actual <= maxCount) - .isTrue(); + assertWithMessage("Codec(%s) output too few buffers. Counters:\n%s", name, counters) + .that(actual) + .isAtLeast(minCount); + assertWithMessage("Codec(%s) output too many buffers. Counters:\n%s", name, counters) + .that(actual) + .isAtMost(maxCount); } public static void assertDroppedBufferLimit(String name, DecoderCounters counters, int limit) { counters.ensureUpdated(); int actual = counters.droppedBufferCount; assertWithMessage( - "Codec(" - + name - + ") was late decoding: " - + actual - + " buffers. " - + "Limit: " - + limit - + ".") + "Codec(%s) was late decoding too many buffers. Counters:\n%s: ", name, counters) .that(actual) .isAtMost(limit); } @@ -103,14 +90,8 @@ public final class DecoderCountersUtil { counters.ensureUpdated(); int actual = counters.maxConsecutiveDroppedBufferCount; assertWithMessage( - "Codec(" - + name - + ") was late decoding: " - + actual - + " buffers consecutively. " - + "Limit: " - + limit - + ".") + "Codec(%s) was late decoding too many buffers consecutively. Counters:\n%s", + name, counters) .that(actual) .isAtMost(limit); } @@ -119,16 +100,14 @@ public final class DecoderCountersUtil { String name, DecoderCounters counters, int minCount, int maxCount) { int actual = counters.videoFrameProcessingOffsetCount; assertWithMessage( - "Codec(" - + name - + ") videoFrameProcessingOffsetSampleCount " - + actual - + ". Expected in range [" - + minCount - + ", " - + maxCount - + "].") - .that(minCount <= actual && actual <= maxCount) - .isTrue(); + "Codec(%s) videoFrameProcessingOffsetSampleCount too low. Counters:\n%s", + name, counters) + .that(actual) + .isAtLeast(minCount); + assertWithMessage( + "Codec(%s) videoFrameProcessingOffsetSampleCount too high. Counters:\n%s", + name, counters) + .that(actual) + .isAtMost(maxCount); } }