Skip to content

Commit 12f9502

Browse files
committed
keep BaseRecordController without changes for compatibility, change BaseRecordController to RecordController inside all Base classes and reduce duplicated code in async records
1 parent e49da50 commit 12f9502

13 files changed

Lines changed: 307 additions & 220 deletions

library/src/main/java/com/pedro/library/base/Camera1Base.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import com.pedro.encoder.video.FormatVideoEncoder;
5454
import com.pedro.encoder.video.GetVideoData;
5555
import com.pedro.encoder.video.VideoEncoder;
56-
import com.pedro.library.base.recording.BaseRecordController;
5756
import com.pedro.library.base.recording.RecordController;
5857
import com.pedro.library.util.AndroidMuxerRecordController;
5958
import com.pedro.library.util.FpsListener;
@@ -93,7 +92,7 @@ public abstract class Camera1Base {
9392
private boolean streaming = false;
9493
protected boolean audioInitialized = false;
9594
private boolean onPreview = false;
96-
protected BaseRecordController recordController;
95+
protected RecordController recordController;
9796
private int previewWidth, previewHeight;
9897
private final FpsListener fpsListener = new FpsListener();
9998

@@ -951,9 +950,9 @@ public RecordController.Status getRecordStatus() {
951950

952951
protected abstract void getVideoDataImp(ByteBuffer videoBuffer, MediaCodec.BufferInfo info);
953952

954-
public void setRecordController(BaseRecordController recordController) {
953+
public void setRecordController(RecordController recordController) {
955954
if (!isRecording()) {
956-
recordController.updateInfo(this.recordController);
955+
recordController.updateInfo(this.recordController.getVideoCodec(), this.recordController.getAudioCodec());
957956
this.recordController = recordController;
958957
}
959958
}

library/src/main/java/com/pedro/library/base/Camera2Base.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import com.pedro.encoder.video.FormatVideoEncoder;
5454
import com.pedro.encoder.video.GetVideoData;
5555
import com.pedro.encoder.video.VideoEncoder;
56-
import com.pedro.library.base.recording.BaseRecordController;
5756
import com.pedro.library.base.recording.RecordController;
5857
import com.pedro.library.util.AndroidMuxerRecordController;
5958
import com.pedro.library.util.FpsListener;
@@ -95,7 +94,7 @@ public abstract class Camera2Base {
9594
protected boolean audioInitialized = false;
9695
private boolean onPreview = false;
9796
private boolean isBackground = false;
98-
protected BaseRecordController recordController;
97+
protected RecordController recordController;
9998
private int previewWidth, previewHeight;
10099
private final FpsListener fpsListener = new FpsListener();
101100

@@ -1047,9 +1046,9 @@ public boolean isOnPreview() {
10471046

10481047
protected abstract void getVideoDataImp(ByteBuffer videoBuffer, MediaCodec.BufferInfo info);
10491048

1050-
public void setRecordController(BaseRecordController recordController) {
1049+
public void setRecordController(RecordController recordController) {
10511050
if (!isRecording()) {
1052-
recordController.updateInfo(this.recordController);
1051+
recordController.updateInfo(this.recordController.getVideoCodec(), this.recordController.getAudioCodec());
10531052
this.recordController = recordController;
10541053
}
10551054
}

library/src/main/java/com/pedro/library/base/DisplayBase.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import com.pedro.encoder.video.FormatVideoEncoder;
5050
import com.pedro.encoder.video.GetVideoData;
5151
import com.pedro.encoder.video.VideoEncoder;
52-
import com.pedro.library.base.recording.BaseRecordController;
5352
import com.pedro.library.base.recording.RecordController;
5453
import com.pedro.library.util.AndroidMuxerRecordController;
5554
import com.pedro.library.util.FpsListener;
@@ -85,7 +84,7 @@ public abstract class DisplayBase {
8584
private int resultCode = -1;
8685
private Intent data;
8786
private MediaProjection.Callback mediaProjectionCallback = new MediaProjection.Callback() { };
88-
protected BaseRecordController recordController;
87+
protected RecordController recordController;
8988
private final FpsListener fpsListener = new FpsListener();
9089
private boolean videoInitialized = false;
9190
private boolean audioInitialized = false;
@@ -572,9 +571,9 @@ public RecordController.Status getRecordStatus() {
572571

573572
protected abstract void getVideoDataImp(ByteBuffer videoBuffer, MediaCodec.BufferInfo info);
574573

575-
public void setRecordController(BaseRecordController recordController) {
574+
public void setRecordController(RecordController recordController) {
576575
if (!isRecording()) {
577-
recordController.updateInfo(this.recordController);
576+
recordController.updateInfo(this.recordController.getVideoCodec(), this.recordController.getAudioCodec());
578577
this.recordController = recordController;
579578
}
580579
}

library/src/main/java/com/pedro/library/base/FromFileBase.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import com.pedro.encoder.video.FormatVideoEncoder;
4949
import com.pedro.encoder.video.GetVideoData;
5050
import com.pedro.encoder.video.VideoEncoder;
51-
import com.pedro.library.base.recording.BaseRecordController;
5251
import com.pedro.library.base.recording.RecordController;
5352
import com.pedro.library.util.AndroidMuxerRecordController;
5453
import com.pedro.library.util.FpsListener;
@@ -81,7 +80,7 @@ public abstract class FromFileBase {
8180
private AudioEncoder audioEncoder;
8281
private GlInterface glInterface;
8382
private boolean streaming = false;
84-
protected BaseRecordController recordController;
83+
protected RecordController recordController;
8584
private final FpsListener fpsListener = new FpsListener();
8685

8786
private VideoDecoder videoDecoder;
@@ -728,9 +727,9 @@ public void setAudioExtractor(Extractor extractor) {
728727

729728
protected abstract void getAudioDataImp(ByteBuffer audioBuffer, MediaCodec.BufferInfo info);
730729

731-
public void setRecordController(BaseRecordController recordController) {
730+
public void setRecordController(RecordController recordController) {
732731
if (!isRecording()) {
733-
recordController.updateInfo(this.recordController);
732+
recordController.updateInfo(this.recordController.getVideoCodec(), this.recordController.getAudioCodec());
734733
this.recordController = recordController;
735734
}
736735
}

library/src/main/java/com/pedro/library/base/OnlyAudioBase.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import com.pedro.encoder.input.audio.GetMicrophoneData;
3636
import com.pedro.encoder.input.audio.MicrophoneManager;
3737
import com.pedro.encoder.utils.CodecUtil;
38-
import com.pedro.library.base.recording.BaseRecordController;
3938
import com.pedro.library.base.recording.RecordController;
4039
import com.pedro.library.util.AacMuxerRecordController;
4140
import com.pedro.library.util.streamclient.StreamBaseClient;
@@ -51,7 +50,7 @@
5150
*/
5251
public abstract class OnlyAudioBase {
5352

54-
protected BaseRecordController recordController;
53+
protected RecordController recordController;
5554
private final MicrophoneManager microphoneManager;
5655
private AudioEncoder audioEncoder;
5756
private boolean streaming = false;
@@ -283,9 +282,9 @@ public boolean resetAudioEncoder() {
283282

284283
protected abstract void getAudioDataImp(ByteBuffer audioBuffer, MediaCodec.BufferInfo info);
285284

286-
public void setRecordController(BaseRecordController recordController) {
285+
public void setRecordController(RecordController recordController) {
287286
if (!isRecording()) {
288-
recordController.updateInfo(this.recordController);
287+
recordController.updateInfo(this.recordController.getVideoCodec(), this.recordController.getAudioCodec());
289288
this.recordController = recordController;
290289
}
291290
}

library/src/main/java/com/pedro/library/base/StreamBase.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import com.pedro.encoder.utils.CodecUtil
4444
import com.pedro.encoder.video.FormatVideoEncoder
4545
import com.pedro.encoder.video.GetVideoData
4646
import com.pedro.encoder.video.VideoEncoder
47-
import com.pedro.library.base.recording.BaseRecordController
4847
import com.pedro.library.base.recording.RecordController
4948
import com.pedro.library.util.AndroidMuxerRecordController
5049
import com.pedro.library.util.FpsListener
@@ -83,14 +82,14 @@ abstract class StreamBase(
8382
//video render
8483
private val glInterface = GlStreamInterface(context)
8584
//video/audio record
86-
private var recordController: BaseRecordController = AndroidMuxerRecordController()
85+
private var recordController: RecordController = AndroidMuxerRecordController()
8786
private val fpsListener = FpsListener()
8887
var isStreaming = false
8988
private set
9089
var isOnPreview = false
9190
private set
9291
val isRecording: Boolean
93-
get() = recordController.isRunning
92+
get() = recordController.isRunning()
9493
var videoSource: VideoSource = vSource
9594
private set
9695
var audioSource: AudioSource = aSource
@@ -482,9 +481,9 @@ abstract class StreamBase(
482481
* Replace the current BaseRecordController.
483482
* This method allow record in other format or even create your custom implementation and record in a new format.
484483
*/
485-
fun setRecordController(recordController: BaseRecordController) {
484+
fun setRecordController(recordController: RecordController) {
486485
if (!isRecording) {
487-
recordController.updateInfo(this.recordController)
486+
recordController.updateInfo(this.recordController.getVideoCodec(), this.recordController.getAudioCodec())
488487
this.recordController = recordController
489488
}
490489
}

library/src/main/java/com/pedro/library/base/recording/BaseRecordController.kt renamed to library/src/main/java/com/pedro/library/base/recording/AsyncBaseRecordController.kt

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2024 pedroSG94.
2+
* Copyright (C) 2026 pedroSG94.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -37,79 +37,68 @@ import java.nio.ByteBuffer
3737
import kotlin.concurrent.Volatile
3838
import kotlin.math.max
3939

40-
abstract class BaseRecordController : RecordController {
40+
/**
41+
* Record async to avoid block the thread used to send frames to protocol module.
42+
*/
43+
abstract class AsyncBaseRecordController : RecordController {
4144

4245
companion object {
43-
const val TAG: String = "RecordController"
46+
const val TAG: String = "AsyncRecordController"
47+
private const val CAPACITY = 500
4448
}
4549

46-
@JvmField
4750
@Volatile
48-
protected var status: RecordController.Status = RecordController.Status.STOPPED
49-
@JvmField
50-
protected var videoCodec: VideoCodec = VideoCodec.H264
51-
@JvmField
52-
protected var audioCodec: AudioCodec = AudioCodec.AAC
53-
@JvmField
54-
protected var pauseMoment: Long = 0
55-
@JvmField
56-
protected var pauseTime: Long = 0
57-
@JvmField
51+
protected var recordStatus: RecordController.Status = RecordController.Status.STOPPED
5852
protected var listener: RecordController.Listener? = null
59-
@JvmField
60-
protected var videoTrack: Int = -1
61-
@JvmField
62-
protected var audioTrack: Int = -1
63-
@JvmField
6453
protected var bitrateManager: BitrateManager? = null
65-
@JvmField
66-
@Volatile
67-
protected var startTs: Long = 0
68-
@JvmField
6954
protected var tracks: RecordTracks = RecordTracks.ALL
7055
protected var myRequestKeyFrame: RequestKeyFrame? = null
56+
private var videoCodec: VideoCodec = VideoCodec.H264
57+
private var audioCodec: AudioCodec = AudioCodec.AAC
58+
private var pauseMoment: Long = 0
59+
private var pauseTime: Long = 0
60+
@Volatile
61+
private var startTs: Long = 0
7162
private val scope = CoroutineScope(Dispatchers.IO)
7263
private var muxerChannel: Channel<MediaFrame>? = null
7364
private var muxerJob: Job? = null
7465

75-
fun getStatus() = status
76-
77-
fun setRequestKeyFrame(requestKeyFrame: RequestKeyFrame?) {
66+
override fun setRequestKeyFrame(requestKeyFrame: RequestKeyFrame?) {
7867
this.myRequestKeyFrame = requestKeyFrame
7968
}
8069

81-
fun updateInfo(recordController: BaseRecordController) {
82-
videoCodec = recordController.videoCodec
83-
audioCodec = recordController.audioCodec
70+
override fun updateInfo(videoCodec: VideoCodec, audioCodec: AudioCodec) {
71+
this.videoCodec = videoCodec
72+
this.audioCodec = audioCodec
8473
}
8574

86-
fun setVideoCodec(videoCodec: VideoCodec) {
75+
override fun setVideoCodec(videoCodec: VideoCodec) {
8776
this.videoCodec = videoCodec
8877
}
8978

90-
fun setAudioCodec(audioCodec: AudioCodec) {
79+
override fun setAudioCodec(audioCodec: AudioCodec) {
9180
this.audioCodec = audioCodec
9281
}
9382

94-
val isRunning: Boolean
95-
get() = status == RecordController.Status.STARTED || status == RecordController.Status.RECORDING || status == RecordController.Status.RESUMED || status == RecordController.Status.PAUSED
83+
override fun getVideoCodec(): VideoCodec = videoCodec
84+
override fun getAudioCodec(): AudioCodec = audioCodec
85+
override fun isRunning(): Boolean = recordStatus == RecordController.Status.STARTED || recordStatus == RecordController.Status.RECORDING || recordStatus == RecordController.Status.RESUMED || recordStatus == RecordController.Status.PAUSED
86+
override fun isRecording(): Boolean = recordStatus == RecordController.Status.RECORDING
87+
override fun getStatus(): RecordController.Status = recordStatus
9688

97-
val isRecording: Boolean
98-
get() = status == RecordController.Status.RECORDING
99-
100-
fun pauseRecord() {
101-
if (status == RecordController.Status.RECORDING) {
89+
override fun pauseRecord() {
90+
if (recordStatus == RecordController.Status.RECORDING) {
10291
pauseMoment = getCurrentTimeMicro()
103-
status = RecordController.Status.PAUSED
104-
listener?.onStatusChange(status)
92+
recordStatus = RecordController.Status.PAUSED
93+
listener?.onStatusChange(recordStatus)
10594
}
10695
}
10796

108-
fun resumeRecord() {
109-
if (status == RecordController.Status.PAUSED) {
97+
override fun resumeRecord() {
98+
if (recordStatus == RecordController.Status.PAUSED) {
11099
pauseTime += getCurrentTimeMicro() - pauseMoment
111-
status = RecordController.Status.RESUMED
112-
listener?.onStatusChange(status)
100+
recordStatus = RecordController.Status.RESUMED
101+
listener?.onStatusChange(recordStatus)
113102
}
114103
}
115104

@@ -156,34 +145,60 @@ abstract class BaseRecordController : RecordController {
156145
listener: RecordController.Listener?,
157146
tracks: RecordTracks
158147
) {
159-
muxerChannel = Channel(Channel.UNLIMITED)
160-
muxerJob = scope.launch {
161-
val channel = muxerChannel ?: return@launch
162-
for (frame in channel) {
163-
onWriteFrame(frame)
164-
}
148+
start(listener, tracks)
149+
try {
150+
startRecordImp(fd, listener, tracks)
151+
} catch (e: Exception) {
152+
stopRecord()
153+
throw e
165154
}
166-
startRecordImp(fd, listener, tracks)
167155
}
168156

169157
override fun startRecord(
170158
path: String,
171159
listener: RecordController.Listener?,
172160
tracks: RecordTracks
173161
) {
174-
muxerChannel = Channel(Channel.UNLIMITED)
162+
start(listener, tracks)
163+
try {
164+
startRecordImp(path, listener, tracks)
165+
} catch (e: Exception) {
166+
stopRecord()
167+
throw e
168+
}
169+
}
170+
171+
private fun start(
172+
listener: RecordController.Listener?,
173+
tracks: RecordTracks
174+
) {
175+
muxerChannel = Channel(CAPACITY)
175176
muxerJob = scope.launch {
176177
val channel = muxerChannel ?: return@launch
177178
for (frame in channel) onWriteFrame(frame)
178179
}
179-
startRecordImp(path, listener, tracks)
180+
this.tracks = tracks
181+
this.listener = listener
182+
recordStatus = RecordController.Status.STARTED
183+
if (listener != null) {
184+
bitrateManager = BitrateManager(listener)
185+
listener.onStatusChange(recordStatus)
186+
} else {
187+
bitrateManager = null
188+
}
180189
}
181190

182191
override fun stopRecord() {
183192
muxerChannel?.close()
184193
muxerChannel = null
185194
muxerJob?.cancel()
186195
runBlocking { muxerJob?.join() }
196+
recordStatus = RecordController.Status.STOPPED
197+
pauseMoment = 0
198+
pauseTime = 0
199+
startTs = 0
200+
myRequestKeyFrame = null
201+
listener?.onStatusChange(recordStatus)
187202
stopRecordImp()
188203
}
189204

0 commit comments

Comments
 (0)