@@ -39,13 +39,17 @@ public class DefaultDataSink implements DataSink {
39
39
*/
40
40
private static class QueuedSample {
41
41
private final TrackType mType ;
42
+ private ByteBuffer mByteBuffer ;
43
+
42
44
private final int mSize ;
43
45
private final long mTimeUs ;
44
46
private final int mFlags ;
45
47
46
48
private QueuedSample (@ NonNull TrackType type ,
49
+ @ NonNull ByteBuffer byteBuffer ,
47
50
@ NonNull MediaCodec .BufferInfo bufferInfo ) {
48
51
mType = type ;
52
+ mByteBuffer = byteBuffer ;
49
53
mSize = bufferInfo .size ;
50
54
mTimeUs = bufferInfo .presentationTimeUs ;
51
55
mFlags = bufferInfo .flags ;
@@ -54,14 +58,9 @@ private QueuedSample(@NonNull TrackType type,
54
58
55
59
private final static Logger LOG = new Logger ("DefaultDataSink" );
56
60
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
-
61
61
private boolean mMuxerStarted = false ;
62
62
private final MediaMuxer mMuxer ;
63
63
private final List <QueuedSample > mQueue = new ArrayList <>();
64
- private ByteBuffer mQueueBuffer ;
65
64
private final MutableTrackMap <TrackStatus > mStatus = mutableTrackMapOf (null );
66
65
private final MutableTrackMap <MediaFormat > mLastFormat = mutableTrackMapOf (null );
67
66
private final MutableTrackMap <Integer > mMuxerIndex = mutableTrackMapOf (null );
@@ -181,19 +180,14 @@ public void writeTrack(@NonNull TrackType type, @NonNull ByteBuffer byteBuffer,
181
180
private void enqueue (@ NonNull TrackType type ,
182
181
@ NonNull ByteBuffer buffer ,
183
182
@ NonNull MediaCodec .BufferInfo bufferInfo ) {
184
- if (mQueueBuffer == null ) {
185
- mQueueBuffer = ByteBuffer .allocateDirect (BUFFER_SIZE ).order (ByteOrder .nativeOrder ());
186
- }
187
183
LOG .v ("enqueue(" + type + "): offset=" + bufferInfo .offset
188
184
+ "\t realOffset=" + buffer .position ()
189
185
+ "\t size=" + bufferInfo .size
190
- + "\t realSize=" + buffer .remaining ()
191
- + "\t available=" + mQueueBuffer .remaining ()
192
- + "\t total=" + 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
+ + "\t realSize=" + 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 ));
197
191
}
198
192
199
193
/**
@@ -202,19 +196,16 @@ private void enqueue(@NonNull TrackType type,
202
196
*/
203
197
private void drainQueue () {
204
198
if (mQueue .isEmpty ()) return ;
205
- mQueueBuffer .flip ();
206
199
LOG .i ("Output format determined, writing pending data into the muxer. "
207
- + "samples:" + mQueue .size () + " "
208
- + "bytes:" + mQueueBuffer .limit ());
200
+ + "samples:" + mQueue .size ());
209
201
MediaCodec .BufferInfo bufferInfo = new MediaCodec .BufferInfo ();
210
- int offset = 0 ;
211
202
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 ;
215
207
}
216
208
mQueue .clear ();
217
- mQueueBuffer = null ;
218
209
}
219
210
220
211
@ Override
0 commit comments