From c962e8fbc71af6fe556159e34b4b3685a9b7e4b1 Mon Sep 17 00:00:00 2001 From: okamoto Date: Sun, 8 Sep 2024 02:45:26 +0900 Subject: [PATCH 1/2] Add unbounded queue for drifted tracks during initialization (#166) --- .../transcoder/sink/DefaultDataSink.java | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java b/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java index 93333027..5d8d2ed1 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java @@ -39,13 +39,17 @@ public class DefaultDataSink implements DataSink { */ private static class QueuedSample { private final TrackType mType; + private ByteBuffer mByteBuffer; + private final int mSize; private final long mTimeUs; private final int mFlags; private QueuedSample(@NonNull TrackType type, + @NonNull ByteBuffer byteBuffer, @NonNull MediaCodec.BufferInfo bufferInfo) { mType = type; + mByteBuffer = byteBuffer; mSize = bufferInfo.size; mTimeUs = bufferInfo.presentationTimeUs; mFlags = bufferInfo.flags; @@ -54,14 +58,9 @@ private QueuedSample(@NonNull TrackType type, private final static Logger LOG = new Logger("DefaultDataSink"); - // We must be able to handle potentially big buffers (e.g. first keyframe) in the queue. - // Got crashes with 152kb - let's use 256kb. TODO use a dynamic queue instead - private final static int BUFFER_SIZE = 256 * 1024; - private boolean mMuxerStarted = false; private final MediaMuxer mMuxer; private final List mQueue = new ArrayList<>(); - private ByteBuffer mQueueBuffer; private final MutableTrackMap mStatus = mutableTrackMapOf(null); private final MutableTrackMap mLastFormat = mutableTrackMapOf(null); private final MutableTrackMap mMuxerIndex = mutableTrackMapOf(null); @@ -181,19 +180,14 @@ public void writeTrack(@NonNull TrackType type, @NonNull ByteBuffer byteBuffer, private void enqueue(@NonNull TrackType type, @NonNull ByteBuffer buffer, @NonNull MediaCodec.BufferInfo bufferInfo) { - if (mQueueBuffer == null) { - mQueueBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE).order(ByteOrder.nativeOrder()); - } LOG.v("enqueue(" + type + "): offset=" + bufferInfo.offset + "\trealOffset=" + buffer.position() + "\tsize=" + bufferInfo.size - + "\trealSize=" + buffer.remaining() - + "\tavailable=" + mQueueBuffer.remaining() - + "\ttotal=" + BUFFER_SIZE); - buffer.limit(bufferInfo.offset + bufferInfo.size); - buffer.position(bufferInfo.offset); - mQueueBuffer.put(buffer); - mQueue.add(new QueuedSample(type, bufferInfo)); + + "\trealSize=" + buffer.remaining()); + + ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bufferInfo.size).order(ByteOrder.nativeOrder()); + byteBuffer.put(buffer); + mQueue.add(new QueuedSample(type, byteBuffer, bufferInfo)); } /** @@ -202,19 +196,16 @@ private void enqueue(@NonNull TrackType type, */ private void drainQueue() { if (mQueue.isEmpty()) return; - mQueueBuffer.flip(); LOG.i("Output format determined, writing pending data into the muxer. " - + "samples:" + mQueue.size() + " " - + "bytes:" + mQueueBuffer.limit()); + + "samples:" + mQueue.size()); MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); - int offset = 0; for (QueuedSample sample : mQueue) { - bufferInfo.set(offset, sample.mSize, sample.mTimeUs, sample.mFlags); - writeTrack(sample.mType, mQueueBuffer, bufferInfo); - offset += sample.mSize; + bufferInfo.set(0, sample.mSize, sample.mTimeUs, sample.mFlags); + sample.mByteBuffer.position(0); + writeTrack(sample.mType, sample.mByteBuffer, bufferInfo); + sample.mByteBuffer = null; } mQueue.clear(); - mQueueBuffer = null; } @Override From 0fed4708670e5656328fbc4062aa84f143217366 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Tue, 10 Sep 2024 21:25:26 +0200 Subject: [PATCH 2/2] Tests for #180, Release 0.11.1 (#207) * Add test for issue 180 * Bump version to 0.11.1 --- .idea/gradle.xml | 1 + .idea/runConfigurations/deployLocal.xml | 2 +- README.md | 2 +- docs/changelog.mdx | 6 ++++++ lib-legacy/build.gradle.kts | 2 +- lib/build.gradle.kts | 2 +- lib/src/androidTest/assets/issue_180/party.mp4 | Bin 0 -> 345543 bytes .../transcoder/integration/IssuesTests.kt | 16 ++++++++++++++++ 8 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 lib/src/androidTest/assets/issue_180/party.mp4 diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 96913344..75ba98d7 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -11,6 +11,7 @@ diff --git a/.idea/runConfigurations/deployLocal.xml b/.idea/runConfigurations/deployLocal.xml index f7ebf23b..ca2317c2 100644 --- a/.idea/runConfigurations/deployLocal.xml +++ b/.idea/runConfigurations/deployLocal.xml @@ -10,7 +10,7 @@