diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DebugTraceUtil.java b/libraries/effect/src/main/java/androidx/media3/effect/DebugTraceUtil.java index f41d33cd94..0fc385b2f5 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DebugTraceUtil.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DebugTraceUtil.java @@ -16,6 +16,7 @@ package androidx.media3.effect; +import static androidx.media3.common.util.Assertions.checkNotNull; import static java.lang.annotation.ElementType.TYPE_USE; import androidx.annotation.GuardedBy; @@ -47,53 +48,76 @@ public final class DebugTraceUtil { @Retention(RetentionPolicy.SOURCE) @StringDef({ EVENT_VIDEO_INPUT_FORMAT, - EVENT_DECODER_SIGNAL_EOS, + EVENT_MUXER_INPUT_AUDIO, + EVENT_MUXER_INPUT_VIDEO, EVENT_DECODER_DECODED_FRAME, + EVENT_VFP_RENDERED_TO_INPUT, + EVENT_VFP_FRAME_DEQUEUED, + EVENT_VFP_RENDERED_TO_OUTPUT, EVENT_MUXER_CAN_WRITE_SAMPLE_VIDEO, EVENT_MUXER_CAN_WRITE_SAMPLE_AUDIO, - EVENT_DECODER_RECEIVE_EOS, EVENT_ENCODER_ENCODED_FRAME, - EVENT_ENCODER_RECEIVE_EOS, - EVENT_EXTERNAL_INPUT_MANAGER_SIGNAL_EOS, - EVENT_MUXER_INPUT_VIDEO, - EVENT_MUXER_INPUT_AUDIO, - EVENT_MUXER_TRACK_ENDED_VIDEO, - EVENT_MUXER_TRACK_ENDED_AUDIO, - EVENT_VFP_FRAME_DEQUEUED, + EVENT_DECODER_RECEIVE_EOS, EVENT_VFP_RECEIVE_DECODER_EOS, - EVENT_VFP_RENDERED_TO_INPUT, - EVENT_VFP_RENDERED_TO_OUTPUT, - EVENT_VFP_SIGNAL_EOS, + EVENT_EXTERNAL_INPUT_MANAGER_SIGNAL_EOS, EVENT_BITMAP_TEXTURE_MANAGER_SIGNAL_EOS, - EVENT_TEX_ID_TEXTURE_MANAGER_SIGNAL_EOS + EVENT_TEX_ID_TEXTURE_MANAGER_SIGNAL_EOS, + EVENT_VFP_SIGNAL_EOS, + EVENT_ENCODER_RECEIVE_EOS, + EVENT_DECODER_SIGNAL_EOS, + EVENT_MUXER_TRACK_ENDED_AUDIO, + EVENT_MUXER_TRACK_ENDED_VIDEO }) @Documented @Target(TYPE_USE) public @interface DebugTraceEvent {} public static final String EVENT_VIDEO_INPUT_FORMAT = "VideoInputFormat"; - public static final String EVENT_DECODER_SIGNAL_EOS = "Decoder-SignalEOS"; public static final String EVENT_DECODER_DECODED_FRAME = "Decoder-DecodedFrame"; + public static final String EVENT_VFP_RENDERED_TO_INPUT = "VFP-RenderedToInput"; + public static final String EVENT_VFP_FRAME_DEQUEUED = "VFP-FrameDequeued"; + public static final String EVENT_VFP_RENDERED_TO_OUTPUT = "VFP-RenderedToOutput"; public static final String EVENT_MUXER_CAN_WRITE_SAMPLE_VIDEO = "Muxer-CanWriteSample_Video"; public static final String EVENT_MUXER_CAN_WRITE_SAMPLE_AUDIO = "Muxer-CanWriteSample_Audio"; - public static final String EVENT_DECODER_RECEIVE_EOS = "Decoder-ReceiveEOS"; public static final String EVENT_ENCODER_ENCODED_FRAME = "Encoder-EncodedFrame"; - public static final String EVENT_ENCODER_RECEIVE_EOS = "Encoder-ReceiveEOS"; + public static final String EVENT_MUXER_INPUT_AUDIO = "Muxer-Input_Audio"; + public static final String EVENT_MUXER_INPUT_VIDEO = "Muxer-Input_Video"; + public static final String EVENT_DECODER_RECEIVE_EOS = "Decoder-ReceiveEOS"; + public static final String EVENT_VFP_RECEIVE_DECODER_EOS = "VFP-ReceiveDecoderEOS"; public static final String EVENT_EXTERNAL_INPUT_MANAGER_SIGNAL_EOS = "ExternalInputManager-SignalEOS"; - public static final String EVENT_MUXER_INPUT_VIDEO = "Muxer-Input_Video"; - public static final String EVENT_MUXER_INPUT_AUDIO = "Muxer-Input_Audio"; - public static final String EVENT_MUXER_TRACK_ENDED_VIDEO = "Muxer-TrackEnded_Video"; - public static final String EVENT_MUXER_TRACK_ENDED_AUDIO = "Muxer-TrackEnded_Audio"; - public static final String EVENT_VFP_FRAME_DEQUEUED = "VFP-FrameDequeued"; - public static final String EVENT_VFP_RECEIVE_DECODER_EOS = "VFP-ReceiveDecoderEOS"; - public static final String EVENT_VFP_RENDERED_TO_INPUT = "VFP-RenderedToInput"; - public static final String EVENT_VFP_RENDERED_TO_OUTPUT = "VFP-RenderedToOutput"; - public static final String EVENT_VFP_SIGNAL_EOS = "VFP-SignalEOS"; public static final String EVENT_BITMAP_TEXTURE_MANAGER_SIGNAL_EOS = "BitmapTextureManager-SignalEOS"; public static final String EVENT_TEX_ID_TEXTURE_MANAGER_SIGNAL_EOS = "TexIdTextureManager-SignalEOS"; + public static final String EVENT_VFP_SIGNAL_EOS = "VFP-SignalEOS"; + public static final String EVENT_ENCODER_RECEIVE_EOS = "Encoder-ReceiveEOS"; + public static final String EVENT_DECODER_SIGNAL_EOS = "Decoder-SignalEOS"; + public static final String EVENT_MUXER_TRACK_ENDED_AUDIO = "Muxer-TrackEnded_Audio"; + public static final String EVENT_MUXER_TRACK_ENDED_VIDEO = "Muxer-TrackEnded_Video"; + + private static final ImmutableList EVENT_TYPES = + ImmutableList.of( + EVENT_VIDEO_INPUT_FORMAT, + EVENT_DECODER_DECODED_FRAME, + EVENT_VFP_RENDERED_TO_INPUT, + EVENT_VFP_FRAME_DEQUEUED, + EVENT_VFP_RENDERED_TO_OUTPUT, + EVENT_MUXER_CAN_WRITE_SAMPLE_VIDEO, + EVENT_MUXER_CAN_WRITE_SAMPLE_AUDIO, + EVENT_ENCODER_ENCODED_FRAME, + EVENT_MUXER_INPUT_AUDIO, + EVENT_MUXER_INPUT_VIDEO, + EVENT_DECODER_RECEIVE_EOS, + EVENT_VFP_RECEIVE_DECODER_EOS, + EVENT_EXTERNAL_INPUT_MANAGER_SIGNAL_EOS, + EVENT_BITMAP_TEXTURE_MANAGER_SIGNAL_EOS, + EVENT_TEX_ID_TEXTURE_MANAGER_SIGNAL_EOS, + EVENT_VFP_SIGNAL_EOS, + EVENT_ENCODER_RECEIVE_EOS, + EVENT_DECODER_SIGNAL_EOS, + EVENT_MUXER_TRACK_ENDED_AUDIO, + EVENT_MUXER_TRACK_ENDED_VIDEO); private static final int MAX_FIRST_LAST_LOGS = 10; @@ -143,25 +167,19 @@ public final class DebugTraceUtil { * and the detailed log on the first and last {@link #MAX_FIRST_LAST_LOGS} times. */ public static synchronized String generateTraceSummary() { - StringBuilder stringBuilder = new StringBuilder(); - for (Map.Entry entry : events.entrySet()) { - EventLogger logger = entry.getValue(); - stringBuilder.append( - Util.formatInvariant("%s[%d]: [", entry.getKey(), logger.getTotalCount())); - String separator = ""; - ImmutableList eventLogs = logger.getLogs(); - for (int i = 0; i < eventLogs.size(); i++) { - EventLog eventLog = eventLogs.get(i); - String logTime = - Util.formatInvariant( - "%s@%d", - presentationTimeToString(eventLog.presentationTimeUs), eventLog.eventTimeMs); - String extra = eventLog.extra != null ? Util.formatInvariant("(%s)", eventLog.extra) : ""; - stringBuilder.append(separator).append(logTime).append(extra); - separator = ","; + StringBuilder stringBuilder = new StringBuilder().append('{'); + for (int i = 0; i < EVENT_TYPES.size(); i++) { + String eventType = EVENT_TYPES.get(i); + if (!events.containsKey(eventType)) { + stringBuilder.append(Util.formatInvariant("\"%s\": \"No events logged\",", eventType)); + continue; } - stringBuilder.append("]; "); + stringBuilder + .append(Util.formatInvariant("\"%s\":{", eventType)) + .append(checkNotNull(events.get(eventType))) + .append("},"); } + stringBuilder.append('}'); return stringBuilder.toString(); } @@ -203,6 +221,18 @@ public final class DebugTraceUtil { this.eventTimeMs = eventTimeMs; this.extra = extra; } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append( + Util.formatInvariant( + "\"%s@%d", presentationTimeToString(presentationTimeUs), eventTimeMs)); + if (extra != null) { + stringBuilder.append(Util.formatInvariant("(%s)", extra)); + } + return stringBuilder.append('"').toString(); + } } private static final class EventLogger { @@ -228,12 +258,28 @@ public final class DebugTraceUtil { totalCount++; } - public int getTotalCount() { - return totalCount; - } - public ImmutableList getLogs() { return new ImmutableList.Builder().addAll(firstLogs).addAll(lastLogs).build(); } + + @Override + public String toString() { + StringBuilder stringBuilder = + new StringBuilder().append("\"Count\": ").append(totalCount).append(", \"first\":["); + for (int i = 0; i < firstLogs.size(); i++) { + stringBuilder.append(firstLogs.get(i)).append(","); + } + stringBuilder.append("],"); + if (lastLogs.isEmpty()) { + return stringBuilder.toString(); + } + ImmutableList lastLogsList = ImmutableList.copyOf(lastLogs); + stringBuilder.append("\"last\":["); + for (int i = 0; i < lastLogsList.size(); i++) { + stringBuilder.append(lastLogsList.get(i)).append(","); + } + stringBuilder.append(']'); + return stringBuilder.toString(); + } } }