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;
import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.Metadata;

View File

@ -16,7 +16,6 @@
package androidx.media3.test.utils;
import android.content.Context;
import android.media.MediaCodec;
import android.os.Looper;
import androidx.media3.common.C;
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.UnstableApi;
import androidx.media3.common.util.Util;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
import androidx.media3.transformer.AssetLoader;
@ -267,8 +267,7 @@ public final class TestTransformerBuilder {
}
@Override
public void writeSampleData(
int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
throws MuxerException {
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.Config;
import android.media.Image;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.metrics.LogSessionId;
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.VideoFrameReleaseControl;
import androidx.media3.extractor.ExtractorOutput;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
import androidx.media3.test.utils.BitmapPixelTestUtil;
@ -1431,7 +1431,7 @@ public final class AndroidTestUtil {
}
@Override
public void writeSampleData(int trackId, ByteBuffer data, MediaCodec.BufferInfo bufferInfo)
public void writeSampleData(int trackId, ByteBuffer data, BufferInfo bufferInfo)
throws MuxerException {
if (trackId == videoTrackId
&& bufferInfo.presentationTimeUs >= presentationTimeUsToBlockFrame) {

View File

@ -27,7 +27,6 @@ import static org.junit.Assert.assertThrows;
import static org.junit.Assume.assumeTrue;
import android.content.Context;
import android.media.MediaCodec;
import android.media.metrics.EditingEndedEvent;
import android.media.metrics.LogSessionId;
import android.media.metrics.MediaItemInfo;
@ -38,6 +37,7 @@ import androidx.media3.common.Format;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaLibraryInfo;
import androidx.media3.common.Metadata;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@ -455,8 +455,7 @@ public class EditingMetricsCollectorTest {
}
@Override
public void writeSampleData(
int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
throws MuxerException {
if (firstSampleWritten) {
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.IntentFilter;
import android.graphics.Rect;
import android.media.MediaCodec;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
@ -42,6 +41,7 @@ import androidx.media3.common.MimeTypes;
import androidx.media3.common.util.ConditionVariable;
import androidx.media3.common.util.Util;
import androidx.media3.effect.Presentation;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
import androidx.test.core.app.ActivityScenario;
@ -193,8 +193,7 @@ public final class MediaProjectionAssetLoaderTest {
private static final class InterceptingMuxerFactory implements Muxer.Factory {
public interface WriteSampleDataCallback {
void onWriteSampleData(
Format format, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo);
void onWriteSampleData(Format format, ByteBuffer byteBuffer, BufferInfo bufferInfo);
}
private final WriteSampleDataCallback writeSampleDataCallback;
@ -218,8 +217,7 @@ public final class MediaProjectionAssetLoaderTest {
}
@Override
public void writeSampleData(
int trackId, ByteBuffer byteBuffer, MediaCodec.BufferInfo bufferInfo)
public void writeSampleData(int trackId, ByteBuffer byteBuffer, BufferInfo bufferInfo)
throws MuxerException {
writeSampleDataCallback.onWriteSampleData(
formatByTrackId.get(trackId), byteBuffer, bufferInfo);

View File

@ -15,12 +15,12 @@
*/
package androidx.media3.transformer;
import android.media.MediaCodec.BufferInfo;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.Metadata;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
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.CodecSpecificDataUtil.getCodecProfileAndLevel;
import static androidx.media3.common.util.Util.castNonNull;
import static androidx.media3.transformer.TransformerUtil.getMediaCodecFlags;
import static java.lang.Integer.max;
import android.annotation.SuppressLint;
import android.media.MediaCodec.BufferInfo;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaFormat;
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.Util;
import androidx.media3.container.Mp4LocationData;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
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.",
presentationTimeUs - 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 {
mediaMuxer.writeSampleData(trackId, data, bufferInfo);
mediaMuxer.writeSampleData(trackId, data, mediaCodecBufferinfo);
} catch (RuntimeException e) {
throw new MuxerException(
"Failed to write sample for presentationTimeUs="
@ -252,12 +256,11 @@ import java.util.Locale;
}
if (videoDurationUs != C.TIME_UNSET && videoTrackId != TRACK_ID_UNSET) {
BufferInfo bufferInfo = new BufferInfo();
bufferInfo.set(
/* newOffset= */ 0,
/* newSize= */ 0,
videoDurationUs,
TransformerUtil.getMediaCodecFlags(C.BUFFER_FLAG_END_OF_STREAM));
BufferInfo bufferInfo =
new BufferInfo(
/* presentationTimeUs= */ videoDurationUs,
/* size= */ 0,
C.BUFFER_FLAG_END_OF_STREAM);
writeSampleData(videoTrackId, ByteBuffer.allocateDirect(0), bufferInfo);
}

View File

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

View File

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

View File

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

View File

@ -16,11 +16,11 @@
package androidx.media3.transformer;
import android.media.MediaCodec;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.Metadata;
import androidx.media3.common.MimeTypes;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import com.google.common.collect.ImmutableList;
import java.nio.ByteBuffer;
@ -68,7 +68,7 @@ import java.nio.ByteBuffer;
}
@Override
public void writeSampleData(int trackId, ByteBuffer data, MediaCodec.BufferInfo bufferInfo) {}
public void writeSampleData(int trackId, ByteBuffer data, BufferInfo bufferInfo) {}
@Override
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.transformer.TransformerUtil.getProcessedTrackType;
import android.media.MediaCodec.BufferInfo;
import android.util.SparseArray;
import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.Metadata;
import androidx.media3.common.util.Util;
import androidx.media3.muxer.BufferInfo;
import androidx.media3.muxer.Muxer;
import androidx.media3.muxer.MuxerException;
import androidx.media3.test.utils.DumpableFormat;