diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EditingMetricsCollector.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EditingMetricsCollector.java index d003997cd1..5cecefcfcc 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EditingMetricsCollector.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EditingMetricsCollector.java @@ -25,6 +25,7 @@ import android.media.metrics.MediaMetricsManager; import android.util.SparseIntArray; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import androidx.media3.common.C; import androidx.media3.common.util.SystemClock; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -131,25 +132,43 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; editingSession.close(); } - /** Called when export completes with an error. */ - public void onExportError(ExportException exportException) { + /** + * Called when export completes with an error. + * + * @param progressPercentage The progress of the export operation in percent. Value is {@link + * C#PERCENTAGE_UNSET} if unknown or between 0 and 100 inclusive. + * @param exportException The {@link ExportException} describing the exception. + */ + public void onExportError(int progressPercentage, ExportException exportException) { if (editingSession == null) { return; } - editingSession.reportEditingEndedEvent( + EditingEndedEvent.Builder editingEndedEventBuilder = createEditingEndedEventBuilder(EditingEndedEvent.FINAL_STATE_ERROR) - .setErrorCode(getEditingEndedEventErrorCode(exportException.errorCode)) - .build()); + .setErrorCode(getEditingEndedEventErrorCode(exportException.errorCode)); + if (progressPercentage != C.PERCENTAGE_UNSET) { + editingEndedEventBuilder.setFinalProgressPercent(progressPercentage); + } + editingSession.reportEditingEndedEvent(editingEndedEventBuilder.build()); editingSession.close(); } - /** Called when export is cancelled. */ - public void onExportCancelled() { + /** + * Called when export is cancelled. + * + * @param progressPercentage The progress of the export operation in percent. Value is {@link + * C#PERCENTAGE_UNSET} if unknown or between 0 and 100 inclusive. + */ + public void onExportCancelled(int progressPercentage) { if (editingSession == null) { return; } - editingSession.reportEditingEndedEvent( - createEditingEndedEventBuilder(EditingEndedEvent.FINAL_STATE_CANCELED).build()); + EditingEndedEvent.Builder editingEndedEventBuilder = + createEditingEndedEventBuilder(EditingEndedEvent.FINAL_STATE_CANCELED); + if (progressPercentage != C.PERCENTAGE_UNSET) { + editingEndedEventBuilder.setFinalProgressPercent(progressPercentage); + } + editingSession.reportEditingEndedEvent(editingEndedEventBuilder.build()); editingSession.close(); } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index 096d4342ce..0599b8eef4 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -1168,10 +1168,17 @@ public final class Transformer { try { transformerInternal.cancel(); } finally { + ProgressHolder progressHolder = new ProgressHolder(); + int progressState = getProgress(progressHolder); transformerInternal = null; - } - if (canCollectEditingMetrics()) { - checkNotNull(editingMetricsCollector).onExportCancelled(); + + if (canCollectEditingMetrics()) { + int progressPercentage = + (progressState == PROGRESS_STATE_AVAILABLE) + ? progressHolder.progress + : C.PERCENTAGE_UNSET; + checkNotNull(editingMetricsCollector).onExportCancelled(progressPercentage); + } } if (getResumeMetadataFuture != null && !getResumeMetadataFuture.isDone()) { @@ -1616,7 +1623,13 @@ public final class Transformer { listener.onError(checkNotNull(composition), exportResultBuilder.build(), exception)); listeners.flushEvents(); if (canCollectEditingMetrics()) { - checkNotNull(editingMetricsCollector).onExportError(exception); + ProgressHolder progressHolder = new ProgressHolder(); + int progressState = getProgress(progressHolder); + int progressPercentage = + (progressState == PROGRESS_STATE_AVAILABLE) + ? progressHolder.progress + : C.PERCENTAGE_UNSET; + checkNotNull(editingMetricsCollector).onExportError(progressPercentage, exception); } transformerState = TRANSFORMER_STATE_PROCESS_FULL_INPUT; } @@ -1691,8 +1704,8 @@ public final class Transformer { } exportResultBuilder.setExportException(exportException); - transformerInternal = null; onExportCompletedWithError(exportException); + transformerInternal = null; } // MuxerWrapper.Listener implementation