Skip to content

Commit 38dda7d

Browse files
committed
avoid reuse bufferinfo class in each frame
1 parent e141e0b commit 38dda7d

File tree

7 files changed

+17
-39
lines changed

7 files changed

+17
-39
lines changed

encoder/src/main/java/com/pedro/encoder/BaseEncoder.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ public abstract class BaseEncoder implements EncoderCallback {
4949
private final MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
5050
private HandlerThread handlerThread;
5151
private ExecutorService executorService;
52-
protected BlockingQueue<Frame> queue = new PriorityBlockingQueue<>(80, (frame, frame2) -> {
53-
return ExtensionsKt.compare(frame.getTimeStamp(), frame2.getTimeStamp());
54-
});
52+
protected BlockingQueue<Frame> queue = new ArrayBlockingQueue<>(80);
5553
protected MediaCodec codec;
5654
protected long presentTimeUs;
5755
protected volatile boolean running = false;

encoder/src/main/java/com/pedro/encoder/input/audio/MicrophoneManager.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ public class MicrophoneManager {
6363
private float microphoneVolume = 1f;
6464
private float internalVolume = 1f;
6565
private final AudioUtils audioUtils = new AudioUtils();
66-
private volatile long lastTimestamp = 0;
6766

6867
enum Mode {
6968
MICROPHONE, INTERNAL, MIX
@@ -196,8 +195,7 @@ public synchronized void start() {
196195
handler.post(() -> {
197196
while (running) {
198197
Frame frame = read();
199-
if (frame != null && lastTimestamp >= frame.getTimeStamp()) {
200-
lastTimestamp = frame.getTimeStamp();
198+
if (frame != null) {
201199
getMicrophoneData.inputPCMData(frame);
202200
}
203201
}
@@ -324,7 +322,6 @@ public synchronized void stop() {
324322
audioPostProcessEffect.release();
325323
}
326324
Log.i(TAG, "Microphone stopped");
327-
lastTimestamp = 0;
328325
}
329326

330327
/**

library/src/main/java/com/pedro/library/base/recording/BaseRecordController.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.pedro.library.base.recording;
1818

1919
import android.media.MediaCodec;
20-
import android.util.Log;
2120

2221
import com.pedro.common.AudioCodec;
2322
import com.pedro.common.BitrateManager;
@@ -34,13 +33,11 @@ public abstract class BaseRecordController implements RecordController {
3433
protected Status status = Status.STOPPED;
3534
protected VideoCodec videoCodec = VideoCodec.H264;
3635
protected AudioCodec audioCodec = AudioCodec.AAC;
37-
protected volatile long pauseMoment = 0;
38-
protected volatile long pauseTime = 0;
36+
protected long pauseMoment = 0;
37+
protected long pauseTime = 0;
3938
protected Listener listener;
4039
protected int videoTrack = -1;
4140
protected int audioTrack = -1;
42-
protected volatile MediaCodec.BufferInfo videoInfo = new MediaCodec.BufferInfo();
43-
protected volatile MediaCodec.BufferInfo audioInfo = new MediaCodec.BufferInfo();
4441
protected BitrateManager bitrateManager;
4542
protected volatile long startTs = 0;
4643
protected RecordTracks tracks = RecordTracks.ALL;
@@ -101,18 +98,11 @@ protected boolean isKeyFrame(ByteBuffer videoBuffer) {
10198
}
10299

103100
//We can't reuse info because could produce stream issues
104-
protected boolean updateFormat(MediaCodec.BufferInfo newInfo, MediaCodec.BufferInfo oldInfo) {
101+
protected MediaCodec.BufferInfo updateFormat(MediaCodec.BufferInfo oldInfo) {
102+
MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
105103
if (startTs <= 0) startTs = oldInfo.presentationTimeUs;
106-
newInfo.flags = oldInfo.flags;
107-
newInfo.offset = oldInfo.offset;
108-
newInfo.size = oldInfo.size;
109104
long ts = Math.max(0, oldInfo.presentationTimeUs - startTs - pauseTime);
110-
if (newInfo.presentationTimeUs >= oldInfo.presentationTimeUs) {
111-
Log.e(TAG, "out of order frame discarded");
112-
return false; //should discard frame
113-
} else {
114-
newInfo.presentationTimeUs = ts;
115-
return true;
116-
}
105+
info.set(oldInfo.offset, oldInfo.size, ts, oldInfo.flags);
106+
return info;
117107
}
118108
}

library/src/main/java/com/pedro/library/util/AacMuxerRecordController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ public void stopRecord() {
9595
} catch (Exception ignored) { } finally {
9696
outputStream = null;
9797
}
98-
audioInfo = new MediaCodec.BufferInfo();
9998
if (listener != null) listener.onStatusChange(status);
10099
}
101100

@@ -110,7 +109,7 @@ public void recordVideo(ByteBuffer videoBuffer, MediaCodec.BufferInfo videoInfo)
110109
public void recordAudio(ByteBuffer audioBuffer, MediaCodec.BufferInfo audioInfo) {
111110
if (status == Status.RECORDING) {
112111
//we need duplicate buffer to avoid problems with the buffer
113-
if (updateFormat(this.audioInfo, audioInfo)) write(audioBuffer.duplicate(), this.audioInfo);
112+
write(audioBuffer.duplicate(), updateFormat(audioInfo));
114113
}
115114
}
116115

library/src/main/java/com/pedro/library/util/AndroidMuxerRecordController.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@ public void stopRecord() {
9999
pauseMoment = 0;
100100
pauseTime = 0;
101101
startTs = 0;
102-
audioInfo = new MediaCodec.BufferInfo();
103-
videoInfo = new MediaCodec.BufferInfo();
104102
if (listener != null) listener.onStatusChange(status);
105103
}
106104

@@ -117,14 +115,14 @@ public void recordVideo(ByteBuffer videoBuffer, MediaCodec.BufferInfo videoInfo)
117115
if (listener != null) listener.onStatusChange(status);
118116
}
119117
if (status == Status.RECORDING && tracks != RecordTracks.AUDIO) {
120-
if (updateFormat(this.videoInfo, videoInfo)) write(videoTrack, videoBuffer, this.videoInfo);
118+
write(videoTrack, videoBuffer, videoInfo);
121119
}
122120
}
123121

124122
@Override
125123
public void recordAudio(ByteBuffer audioBuffer, MediaCodec.BufferInfo audioInfo) {
126124
if (status == Status.RECORDING && tracks != RecordTracks.VIDEO) {
127-
if (updateFormat(this.audioInfo, audioInfo)) write(audioTrack, audioBuffer, this.audioInfo);
125+
write(audioTrack, audioBuffer, audioInfo);
128126
}
129127
}
130128

@@ -158,11 +156,11 @@ private void write(int track, ByteBuffer byteBuffer, MediaCodec.BufferInfo info)
158156
if (track == -1) return;
159157
String trackString = track == audioTrack ? "Audio" : "Video";
160158
try {
161-
mediaMuxer.writeSampleData(track, byteBuffer, info);
162-
Log.i(TAG, trackString + ", ts: " + info.presentationTimeUs + ", flag: " + info.flags);
163-
if (bitrateManager != null) bitrateManager.calculateBitrate(info.size * 8L, ExtensionsKt.getSuspendContext());
159+
MediaCodec.BufferInfo i = updateFormat(info);
160+
Log.i(TAG, trackString + ", ts: " + i.presentationTimeUs + ", flag: " + i.flags);
161+
mediaMuxer.writeSampleData(track, byteBuffer, i);
162+
if (bitrateManager != null) bitrateManager.calculateBitrate(i.size * 8L, ExtensionsKt.getSuspendContext());
164163
} catch (Exception e) {
165-
Log.e(TAG, trackString + ", ts: " + info.presentationTimeUs + ", flag: " + info.flags, e);
166164
if (listener != null) listener.onError(e);
167165
}
168166
}

library/src/main/java/com/pedro/library/util/AndroidMuxerWebmRecordController.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,6 @@ public void stopRecord() {
104104
pauseMoment = 0;
105105
pauseTime = 0;
106106
startTs = 0;
107-
audioInfo = new MediaCodec.BufferInfo();
108-
videoInfo = new MediaCodec.BufferInfo();
109107
if (listener != null) listener.onStatusChange(status);
110108
}
111109

@@ -116,7 +114,7 @@ public void recordVideo(ByteBuffer videoBuffer, MediaCodec.BufferInfo videoInfo)
116114
@Override
117115
public void recordAudio(ByteBuffer audioBuffer, MediaCodec.BufferInfo audioInfo) {
118116
if (status == Status.RECORDING) {
119-
if (updateFormat(this.audioInfo, audioInfo)) write(audioTrack, audioBuffer, this.audioInfo);
117+
write(audioTrack, audioBuffer, audioInfo);
120118
}
121119
}
122120

@@ -147,7 +145,7 @@ private void init() {
147145
private void write(int track, ByteBuffer byteBuffer, MediaCodec.BufferInfo info) {
148146
if (track == -1) return;
149147
try {
150-
mediaMuxer.writeSampleData(track, byteBuffer, info);
148+
mediaMuxer.writeSampleData(track, byteBuffer, updateFormat(info));
151149
if (bitrateManager != null) bitrateManager.calculateBitrate(info.size * 8L, ExtensionsKt.getSuspendContext());
152150
} catch (Exception e) {
153151
if (listener != null) listener.onError(e);

library/src/main/java/com/pedro/library/util/FlvMuxerRecordController.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,6 @@ class FlvMuxerRecordController: BaseRecordController() {
126126
} catch (_: Exception) { } finally {
127127
outputStream = null
128128
}
129-
audioInfo = MediaCodec.BufferInfo()
130-
videoInfo = MediaCodec.BufferInfo()
131129
if (listener != null) listener.onStatusChange(status)
132130
}
133131

0 commit comments

Comments
 (0)