Use muxer.BufferInfo class in Muxer.java

This is to remove dependency on `MediaCodec` from `muxer module`.

PiperOrigin-RevId: 755885374
This commit is contained in:
sheenachhabra 2025-05-07 09:25:46 -07:00 committed by Copybara-Service
parent b03b22575f
commit 04b999914a
12 changed files with 47 additions and 59 deletions

View File

@ -15,7 +15,6 @@
*/ */
package androidx.media3.muxer; package androidx.media3.muxer;
import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.Metadata; import androidx.media3.common.Metadata;

View File

@ -16,7 +16,6 @@
package androidx.media3.test.utils; package androidx.media3.test.utils;
import android.content.Context; import android.content.Context;
import android.media.MediaCodec;
import android.os.Looper; import android.os.Looper;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
@ -25,6 +24,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.Clock; import androidx.media3.common.util.Clock;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import androidx.media3.transformer.AssetLoader; import androidx.media3.transformer.AssetLoader;
@ -267,8 +267,7 @@ public final class TestTransformerBuilder {
} }
@Override @Override
public void writeSampleData( public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
throws MuxerException { throws MuxerException {
throw new MuxerException("Failed to write sample data", new RuntimeException()); throw new MuxerException("Failed to write sample data", new RuntimeException());
} }

View File

@ -35,7 +35,6 @@ import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Bitmap.Config; import android.graphics.Bitmap.Config;
import android.media.Image; import android.media.Image;
import android.media.MediaCodec;
import android.media.MediaCodecInfo; import android.media.MediaCodecInfo;
import android.media.metrics.LogSessionId; import android.media.metrics.LogSessionId;
import android.opengl.EGLContext; import android.opengl.EGLContext;
@ -73,6 +72,7 @@ import androidx.media3.exoplayer.video.MediaCodecVideoRenderer;
import androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper; import androidx.media3.exoplayer.video.PlaybackVideoGraphWrapper;
import androidx.media3.exoplayer.video.VideoFrameReleaseControl; import androidx.media3.exoplayer.video.VideoFrameReleaseControl;
import androidx.media3.extractor.ExtractorOutput; import androidx.media3.extractor.ExtractorOutput;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import androidx.media3.test.utils.BitmapPixelTestUtil; import androidx.media3.test.utils.BitmapPixelTestUtil;
@ -1431,7 +1431,7 @@ public final class AndroidTestUtil {
} }
@Override @Override
public void writeSampleData(int trackId, ByteBuffer data, MediaCodec.BufferInfo bufferInfo) public void writeSampleData(int trackId, ByteBuffer data, BufferInfo bufferInfo)
throws MuxerException { throws MuxerException {
if (trackId == videoTrackId if (trackId == videoTrackId
&& bufferInfo.presentationTimeUs >= presentationTimeUsToBlockFrame) { && bufferInfo.presentationTimeUs >= presentationTimeUsToBlockFrame) {

View File

@ -27,7 +27,6 @@ import static org.junit.Assert.assertThrows;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
import android.content.Context; import android.content.Context;
import android.media.MediaCodec;
import android.media.metrics.EditingEndedEvent; import android.media.metrics.EditingEndedEvent;
import android.media.metrics.LogSessionId; import android.media.metrics.LogSessionId;
import android.media.metrics.MediaItemInfo; import android.media.metrics.MediaItemInfo;
@ -38,6 +37,7 @@ import androidx.media3.common.Format;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaLibraryInfo; import androidx.media3.common.MediaLibraryInfo;
import androidx.media3.common.Metadata; import androidx.media3.common.Metadata;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
@ -455,8 +455,7 @@ public class EditingMetricsCollectorTest {
} }
@Override @Override
public void writeSampleData( public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
throws MuxerException { throws MuxerException {
if (firstSampleWritten) { if (firstSampleWritten) {
throw new MuxerException("Failed to write sample data", new RuntimeException()); throw new MuxerException("Failed to write sample data", new RuntimeException());

View File

@ -29,7 +29,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.graphics.Rect; import android.graphics.Rect;
import android.media.MediaCodec;
import android.media.projection.MediaProjection; import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager; import android.media.projection.MediaProjectionManager;
import android.os.Build; import android.os.Build;
@ -42,6 +41,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.ConditionVariable; import androidx.media3.common.util.ConditionVariable;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.effect.Presentation; import androidx.media3.effect.Presentation;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import androidx.test.core.app.ActivityScenario; import androidx.test.core.app.ActivityScenario;
@ -193,8 +193,7 @@ public final class MediaProjectionAssetLoaderTest {
private static final class InterceptingMuxerFactory implements Muxer.Factory { private static final class InterceptingMuxerFactory implements Muxer.Factory {
public interface WriteSampleDataCallback { public interface WriteSampleDataCallback {
void onWriteSampleData( void onWriteSampleData(Format format, ByteBuffer byteBuffer, BufferInfo bufferInfo);
Format format, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo);
} }
private final WriteSampleDataCallback writeSampleDataCallback; private final WriteSampleDataCallback writeSampleDataCallback;
@ -218,8 +217,7 @@ public final class MediaProjectionAssetLoaderTest {
} }
@Override @Override
public void writeSampleData( public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
throws MuxerException { throws MuxerException {
writeSampleDataCallback.onWriteSampleData( writeSampleDataCallback.onWriteSampleData(
formatByTrackId.get(trackId), byteBuffer, bufferInfo); formatByTrackId.get(trackId), byteBuffer, bufferInfo);

View File

@ -15,12 +15,12 @@
*/ */
package androidx.media3.transformer; package androidx.media3.transformer;
import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.Metadata; import androidx.media3.common.Metadata;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;

View File

@ -20,10 +20,11 @@ import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.CodecSpecificDataUtil.getCodecProfileAndLevel; import static androidx.media3.common.util.CodecSpecificDataUtil.getCodecProfileAndLevel;
import static androidx.media3.common.util.Util.castNonNull; import static androidx.media3.common.util.Util.castNonNull;
import static androidx.media3.transformer.TransformerUtil.getMediaCodecFlags;
import static java.lang.Integer.max; import static java.lang.Integer.max;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.media.MediaCodec.BufferInfo; import android.media.MediaCodec;
import android.media.MediaCodecInfo; import android.media.MediaCodecInfo;
import android.media.MediaFormat; import android.media.MediaFormat;
import android.media.MediaMuxer; import android.media.MediaMuxer;
@ -38,6 +39,7 @@ import androidx.media3.common.util.Log;
import androidx.media3.common.util.MediaFormatUtil; import androidx.media3.common.util.MediaFormatUtil;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.container.Mp4LocationData; import androidx.media3.container.Mp4LocationData;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -216,11 +218,13 @@ import java.util.Locale;
+ " sample has the smallest timestamp when using the negative PTS workaround.", + " sample has the smallest timestamp when using the negative PTS workaround.",
presentationTimeUs - presentationTimeOffsetUs, presentationTimeUs - presentationTimeOffsetUs,
-presentationTimeOffsetUs)); -presentationTimeOffsetUs));
bufferInfo.set(bufferInfo.offset, bufferInfo.size, presentationTimeUs, bufferInfo.flags); MediaCodec.BufferInfo mediaCodecBufferinfo = new MediaCodec.BufferInfo();
mediaCodecBufferinfo.set(
data.position(), bufferInfo.size, presentationTimeUs, getMediaCodecFlags(bufferInfo.flags));
try { try {
mediaMuxer.writeSampleData(trackId, data, bufferInfo); mediaMuxer.writeSampleData(trackId, data, mediaCodecBufferinfo);
} catch (RuntimeException e) { } catch (RuntimeException e) {
throw new MuxerException( throw new MuxerException(
"Failed to write sample for presentationTimeUs=" "Failed to write sample for presentationTimeUs="
@ -252,12 +256,11 @@ import java.util.Locale;
} }
if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) { if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) {
BufferInfo bufferInfo = new BufferInfo(); BufferInfo bufferInfo =
bufferInfo.set( new BufferInfo(
/* newOffset= */ 0, /* presentationTimeUs= */ videoDurationUs,
/* newSize= */ 0, /* size= */ 0,
videoDurationUs, C.BUFFER_FLAG_END_OF_STREAM);
TransformerUtil.getMediaCodecFlags(C.BUFFER_FLAG_END_OF_STREAM));
writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo); writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo);
} }

View File

@ -15,9 +15,6 @@
*/ */
package androidx.media3.transformer; package androidx.media3.transformer;
import static androidx.media3.muxer.MuxerUtil.getMuxerBufferInfoFromMediaCodecBufferInfo;
import android.media.MediaCodec;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.MediaLibraryInfo; import androidx.media3.common.MediaLibraryInfo;
@ -26,6 +23,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.Log; import androidx.media3.common.util.Log;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.container.Mp4OrientationData; import androidx.media3.container.Mp4OrientationData;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.FragmentedMp4Muxer; import androidx.media3.muxer.FragmentedMp4Muxer;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
@ -140,7 +138,7 @@ public final class InAppFragmentedMp4Muxer implements Muxer {
} }
@Override @Override
public void writeSampleData(int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
throws MuxerException { throws MuxerException {
if (videoDurationUs != C.TIME_UNSET if (videoDurationUs != C.TIME_UNSET
&& trackId == videoTrackId && trackId == videoTrackId
@ -154,8 +152,7 @@ public final class InAppFragmentedMp4Muxer implements Muxer {
videoDurationUs)); videoDurationUs));
return; return;
} }
muxer.writeSampleData( muxer.writeSampleData(trackId, byteBuffer, bufferInfo);
trackId, byteBuffer, getMuxerBufferInfoFromMediaCodecBufferInfo(bufferInfo));
} }
@Override @Override
@ -168,12 +165,11 @@ public final class InAppFragmentedMp4Muxer implements Muxer {
@Override @Override
public void close() throws MuxerException { public void close() throws MuxerException {
if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) { if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) {
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); BufferInfo bufferInfo =
bufferInfo.set( new BufferInfo(
/* newOffset= */ 0, /* presentationTimeUs= */ videoDurationUs,
/* newSize= */ 0, /* size= */ 0,
videoDurationUs, C.BUFFER_FLAG_END_OF_STREAM);
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo); writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo);
} }
muxer.close(); muxer.close();

View File

@ -15,9 +15,6 @@
*/ */
package androidx.media3.transformer; package androidx.media3.transformer;
import static androidx.media3.muxer.MuxerUtil.getMuxerBufferInfoFromMediaCodecBufferInfo;
import android.media.MediaCodec;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
@ -27,6 +24,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.Log; import androidx.media3.common.util.Log;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.container.Mp4OrientationData; import androidx.media3.container.Mp4OrientationData;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Mp4Muxer; import androidx.media3.muxer.Mp4Muxer;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
@ -159,7 +157,7 @@ public final class InAppMp4Muxer implements Muxer {
} }
@Override @Override
public void writeSampleData(int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo) public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
throws MuxerException { throws MuxerException {
if (videoDurationUs != C.TIME_UNSET if (videoDurationUs != C.TIME_UNSET
&& trackId == videoTrackId && trackId == videoTrackId
@ -173,8 +171,7 @@ public final class InAppMp4Muxer implements Muxer {
videoDurationUs)); videoDurationUs));
return; return;
} }
muxer.writeSampleData( muxer.writeSampleData(trackId, byteBuffer, bufferInfo);
trackId, byteBuffer, getMuxerBufferInfoFromMediaCodecBufferInfo(bufferInfo));
} }
@Override @Override
@ -187,12 +184,11 @@ public final class InAppMp4Muxer implements Muxer {
@Override @Override
public void close() throws MuxerException { public void close() throws MuxerException {
if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) { if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) {
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); BufferInfo bufferInfo =
bufferInfo.set( new BufferInfo(
/* newOffset= */ 0, /* presentationTimeUs= */ videoDurationUs,
/* newSize= */ 0, /* size= */ 0,
videoDurationUs, C.BUFFER_FLAG_END_OF_STREAM);
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo); writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo);
} }
writeMetadata(); writeMetadata();

View File

@ -32,7 +32,6 @@ import static java.lang.Math.max;
import static java.lang.Math.min; import static java.lang.Math.min;
import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.ElementType.TYPE_USE;
import android.media.MediaCodec.BufferInfo;
import android.util.SparseArray; import android.util.SparseArray;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
@ -46,6 +45,7 @@ import androidx.media3.common.util.Log;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.container.NalUnitUtil; import androidx.media3.container.NalUnitUtil;
import androidx.media3.effect.DebugTraceUtil; import androidx.media3.effect.DebugTraceUtil;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -150,7 +150,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private final boolean dropSamplesBeforeFirstVideoSample; private final boolean dropSamplesBeforeFirstVideoSample;
private final SparseArray<TrackInfo> trackTypeToInfo; private final SparseArray<TrackInfo> trackTypeToInfo;
@Nullable private final Format appendVideoFormat; @Nullable private final Format appendVideoFormat;
private final BufferInfo bufferInfo;
private boolean isReady; private boolean isReady;
private boolean isEnded; private boolean isEnded;
@ -205,7 +204,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
previousTrackType = C.TRACK_TYPE_NONE; previousTrackType = C.TRACK_TYPE_NONE;
firstVideoPresentationTimeUs = C.TIME_UNSET; firstVideoPresentationTimeUs = C.TIME_UNSET;
minEndedTrackTimeUs = Long.MAX_VALUE; minEndedTrackTimeUs = Long.MAX_VALUE;
bufferInfo = new BufferInfo();
} }
/** /**
@ -573,11 +571,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
trackInfo.timeUs = max(trackInfo.timeUs, presentationTimeUs); trackInfo.timeUs = max(trackInfo.timeUs, presentationTimeUs);
listener.onSampleWrittenOrDropped(); listener.onSampleWrittenOrDropped();
checkStateNotNull(muxer); checkStateNotNull(muxer);
bufferInfo.set( BufferInfo bufferInfo =
data.position(), new BufferInfo(
data.remaining(), presentationTimeUs,
presentationTimeUs, /* size= */ data.remaining(),
TransformerUtil.getMediaCodecFlags(isKeyFrame ? C.BUFFER_FLAG_KEY_FRAME : 0)); /* flags= */ isKeyFrame ? C.BUFFER_FLAG_KEY_FRAME : 0);
muxer.writeSampleData(trackInfo.trackId, data, bufferInfo); muxer.writeSampleData(trackInfo.trackId, data, bufferInfo);
DebugTraceUtil.logEvent( DebugTraceUtil.logEvent(

View File

@ -16,11 +16,11 @@
package androidx.media3.transformer; package androidx.media3.transformer;
import android.media.MediaCodec;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.Metadata; import androidx.media3.common.Metadata;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@ -68,7 +68,7 @@ import java.nio.ByteBuffer;
} }
@Override @Override
public void writeSampleData(int trackId, ByteBuffer data, MediaCodec.BufferInfo bufferInfo) {} public void writeSampleData(int trackId, ByteBuffer data, BufferInfo bufferInfo) {}
@Override @Override
public void addMetadataEntry(Metadata.Entry metadataEntry) {} public void addMetadataEntry(Metadata.Entry metadataEntry) {}

View File

@ -19,13 +19,13 @@ import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.transformer.TransformerUtil.getProcessedTrackType; import static androidx.media3.transformer.TransformerUtil.getProcessedTrackType;
import android.media.MediaCodec.BufferInfo;
import android.util.SparseArray; import android.util.SparseArray;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.Metadata; import androidx.media3.common.Metadata;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer; import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException; import androidx.media3.muxer.MuxerException;
import androidx.media3.test.utils.DumpableFormat; import androidx.media3.test.utils.DumpableFormat;