@@ -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 + "\t realOffset=" + buffer .position ()
189185 + "\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 ));
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