Skip to content

Commit c962e8f

Browse files
authored
Add unbounded queue for drifted tracks during initialization (#166)
1 parent e555553 commit c962e8f

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

+14-23
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,17 @@ public class DefaultDataSink implements DataSink {
3939
*/
4040
private static class QueuedSample {
4141
private final TrackType mType;
42+
private ByteBuffer mByteBuffer;
43+
4244
private final int mSize;
4345
private final long mTimeUs;
4446
private final int mFlags;
4547

4648
private QueuedSample(@NonNull TrackType type,
49+
@NonNull ByteBuffer byteBuffer,
4750
@NonNull MediaCodec.BufferInfo bufferInfo) {
4851
mType = type;
52+
mByteBuffer = byteBuffer;
4953
mSize = bufferInfo.size;
5054
mTimeUs = bufferInfo.presentationTimeUs;
5155
mFlags = bufferInfo.flags;
@@ -54,14 +58,9 @@ private QueuedSample(@NonNull TrackType type,
5458

5559
private final static Logger LOG = new Logger("DefaultDataSink");
5660

57-
// We must be able to handle potentially big buffers (e.g. first keyframe) in the queue.
58-
// Got crashes with 152kb - let's use 256kb. TODO use a dynamic queue instead
59-
private final static int BUFFER_SIZE = 256 * 1024;
60-
6161
private boolean mMuxerStarted = false;
6262
private final MediaMuxer mMuxer;
6363
private final List<QueuedSample> mQueue = new ArrayList<>();
64-
private ByteBuffer mQueueBuffer;
6564
private final MutableTrackMap<TrackStatus> mStatus = mutableTrackMapOf(null);
6665
private final MutableTrackMap<MediaFormat> mLastFormat = mutableTrackMapOf(null);
6766
private final MutableTrackMap<Integer> mMuxerIndex = mutableTrackMapOf(null);
@@ -181,19 +180,14 @@ public void writeTrack(@NonNull TrackType type, @NonNull ByteBuffer byteBuffer,
181180
private void enqueue(@NonNull TrackType type,
182181
@NonNull ByteBuffer buffer,
183182
@NonNull MediaCodec.BufferInfo bufferInfo) {
184-
if (mQueueBuffer == null) {
185-
mQueueBuffer = ByteBuffer.allocateDirect(BUFFER_SIZE).order(ByteOrder.nativeOrder());
186-
}
187183
LOG.v("enqueue(" + type + "): offset=" + bufferInfo.offset
188184
+ "\trealOffset=" + buffer.position()
189185
+ "\tsize=" + bufferInfo.size
190-
+ "\trealSize=" + buffer.remaining()
191-
+ "\tavailable=" + mQueueBuffer.remaining()
192-
+ "\ttotal=" + BUFFER_SIZE);
193-
buffer.limit(bufferInfo.offset + bufferInfo.size);
194-
buffer.position(bufferInfo.offset);
195-
mQueueBuffer.put(buffer);
196-
mQueue.add(new QueuedSample(type, bufferInfo));
186+
+ "\trealSize=" + buffer.remaining());
187+
188+
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bufferInfo.size).order(ByteOrder.nativeOrder());
189+
byteBuffer.put(buffer);
190+
mQueue.add(new QueuedSample(type, byteBuffer, bufferInfo));
197191
}
198192

199193
/**
@@ -202,19 +196,16 @@ private void enqueue(@NonNull TrackType type,
202196
*/
203197
private void drainQueue() {
204198
if (mQueue.isEmpty()) return;
205-
mQueueBuffer.flip();
206199
LOG.i("Output format determined, writing pending data into the muxer. "
207-
+ "samples:" + mQueue.size() + " "
208-
+ "bytes:" + mQueueBuffer.limit());
200+
+ "samples:" + mQueue.size());
209201
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
210-
int offset = 0;
211202
for (QueuedSample sample : mQueue) {
212-
bufferInfo.set(offset, sample.mSize, sample.mTimeUs, sample.mFlags);
213-
writeTrack(sample.mType, mQueueBuffer, bufferInfo);
214-
offset += sample.mSize;
203+
bufferInfo.set(0, sample.mSize, sample.mTimeUs, sample.mFlags);
204+
sample.mByteBuffer.position(0);
205+
writeTrack(sample.mType, sample.mByteBuffer, bufferInfo);
206+
sample.mByteBuffer = null;
215207
}
216208
mQueue.clear();
217-
mQueueBuffer = null;
218209
}
219210

220211
@Override

0 commit comments

Comments
 (0)