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