Skip to content

Commit 28dfb3a

Browse files
committed
implements dynamic queue
1 parent dab9ac2 commit 28dfb3a

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

lib/src/main/java/com/otaliastudios/transcoder/sink/DefaultDataSink.java

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,17 @@ public class DefaultDataSink implements DataSink {
3737
*/
3838
private static class QueuedSample {
3939
private final TrackType mType;
40+
private ByteBuffer mByteBuffer;
41+
4042
private final int mSize;
4143
private final long mTimeUs;
4244
private final int mFlags;
4345

4446
private QueuedSample(@NonNull TrackType type,
47+
@NonNull ByteBuffer byteBuffer,
4548
@NonNull MediaCodec.BufferInfo bufferInfo) {
4649
mType = type;
50+
mByteBuffer = byteBuffer;
4751
mSize = bufferInfo.size;
4852
mTimeUs = bufferInfo.presentationTimeUs;
4953
mFlags = bufferInfo.flags;
@@ -52,14 +56,9 @@ private QueuedSample(@NonNull TrackType type,
5256

5357
private final static Logger LOG = new Logger("DefaultDataSink");
5458

55-
// We must be able to handle potentially big buffers (e.g. first keyframe) in the queue.
56-
// Got crashes with 152kb - let's use 256kb. TODO use a dynamic queue instead
57-
private final static int BUFFER_SIZE = 256 * 1024;
58-
5959
private boolean mMuxerStarted = false;
6060
private final MediaMuxer mMuxer;
6161
private final List<QueuedSample> mQueue = new ArrayList<>();
62-
private ByteBuffer mQueueBuffer;
6362
private final MutableTrackMap<TrackStatus> mStatus = mutableTrackMapOf(null);
6463
private final MutableTrackMap<MediaFormat> mLastFormat = mutableTrackMapOf(null);
6564
private final MutableTrackMap<Integer> mMuxerIndex = mutableTrackMapOf(null);
@@ -177,19 +176,14 @@ public void writeTrack(@NonNull TrackType type, @NonNull ByteBuffer byteBuffer,
177176
private void enqueue(@NonNull TrackType type,
178177
@NonNull ByteBuffer buffer,
179178
@NonNull MediaCodec.BufferInfo bufferInfo) {
180-
if (mQueueBuffer == null) {
181-
mQueueBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE).order(ByteOrder.nativeOrder());
182-
}
183179
LOG.v("enqueue(" + type + "): offset=" + bufferInfo.offset
184180
+ "\trealOffset=" + buffer.position()
185181
+ "\tsize=" + bufferInfo.size
186-
+ "\trealSize=" + buffer.remaining()
187-
+ "\tavailable=" + mQueueBuffer.remaining()
188-
+ "\ttotal=" + BUFFER_SIZE);
189-
buffer.limit(bufferInfo.offset + bufferInfo.size);
190-
buffer.position(bufferInfo.offset);
191-
mQueueBuffer.put(buffer);
192-
mQueue.add(new QueuedSample(type, bufferInfo));
182+
+ "\trealSize=" + buffer.remaining());
183+
184+
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bufferInfo.size).order(ByteOrder.nativeOrder());
185+
byteBuffer.put(buffer);
186+
mQueue.add(new QueuedSample(type, byteBuffer, bufferInfo));
193187
}
194188

195189
/**
@@ -198,19 +192,16 @@ private void enqueue(@NonNull TrackType type,
198192
*/
199193
private void drainQueue() {
200194
if (mQueue.isEmpty()) return;
201-
mQueueBuffer.flip();
202195
LOG.i("Output format determined, writing pending data into the muxer. "
203-
+ "samples:" + mQueue.size() + " "
204-
+ "bytes:" + mQueueBuffer.limit());
196+
+ "samples:" + mQueue.size());
205197
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
206-
int offset = 0;
207198
for (QueuedSample sample : mQueue) {
208-
bufferInfo.set(offset, sample.mSize, sample.mTimeUs, sample.mFlags);
209-
writeTrack(sample.mType, mQueueBuffer, bufferInfo);
210-
offset += sample.mSize;
199+
bufferInfo.set(0, sample.mSize, sample.mTimeUs, sample.mFlags);
200+
sample.mByteBuffer.position(0);
201+
writeTrack(sample.mType, sample.mByteBuffer, bufferInfo);
202+
sample.mByteBuffer = null;
211203
}
212204
mQueue.clear();
213-
mQueueBuffer = null;
214205
}
215206

216207
@Override

0 commit comments

Comments
 (0)