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 d14c0f3a59..615276e1bb 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -66,6 +66,7 @@ import androidx.media3.extractor.DefaultExtractorsFactory; import androidx.media3.extractor.mp4.Mp4Extractor; import com.google.common.collect.ImmutableList; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.lang.annotation.Documented; @@ -593,6 +594,8 @@ public final class Transformer { @Nullable private MuxerWrapper muxerWrapper; @Nullable private ExoPlayer player; + @Nullable private String outputPath; + @Nullable private ParcelFileDescriptor outputParcelFileDescriptor; private @ProgressState int progressState; private boolean isCancelling; @@ -705,6 +708,8 @@ public final class Transformer { throw new UnsupportedEncodingException( "Clipping is not supported when slow motion flattening is requested"); } + this.outputPath = path; + this.outputParcelFileDescriptor = null; startTransformation(mediaItem, muxerFactory.create(path, containerMimeType)); } @@ -733,6 +738,8 @@ public final class Transformer { @RequiresApi(26) public void startTransformation(MediaItem mediaItem, ParcelFileDescriptor parcelFileDescriptor) throws IOException { + this.outputParcelFileDescriptor = parcelFileDescriptor; + this.outputPath = null; startTransformation(mediaItem, muxerFactory.create(parcelFileDescriptor, containerMimeType)); } @@ -876,6 +883,26 @@ public final class Transformer { } } + /** + * Returns the current size in bytes of the current/latest output file, or {@link C#LENGTH_UNSET} + * if unavailable. + */ + private long getCurrentOutputFileCurrentSizeBytes() { + long fileSize = C.LENGTH_UNSET; + + if (outputPath != null) { + fileSize = new File(outputPath).length(); + } else if (outputParcelFileDescriptor != null) { + fileSize = outputParcelFileDescriptor.getStatSize(); + } + + if (fileSize <= 0) { + fileSize = C.LENGTH_UNSET; + } + + return fileSize; + } + private static final class TransformerRenderersFactory implements RenderersFactory { private final Context context; @@ -1064,6 +1091,7 @@ public final class Transformer { .setAverageAudioBitrate(muxerWrapper.getTrackAverageBitrate(C.TRACK_TYPE_AUDIO)) .setAverageVideoBitrate(muxerWrapper.getTrackAverageBitrate(C.TRACK_TYPE_VIDEO)) .setVideoFrameCount(muxerWrapper.getTrackSampleCount(C.TRACK_TYPE_VIDEO)) + .setFileSizeBytes(getCurrentOutputFileCurrentSizeBytes()) .build(); listeners.queueEvent(