From 28dfb3a3c6028c728e806ff71bd456c07b400dbb Mon Sep 17 00:00:00 2001 From: kazuya okamoto Date: Thu, 27 Jan 2022 21:25:29 +0900 Subject: [PATCH] implements dynamic queue --- .../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 b17446e7..f006c050 100644 --- a/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java +++ b/lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java @@ -37,13 +37,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; @@ -52,14 +56,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); @@ -177,19 +176,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)); } /** @@ -198,19 +192,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