From 3a9ba23bac63872dcded5ef2c4113cfe6192c419 Mon Sep 17 00:00:00 2001 From: pedro Date: Fri, 29 Mar 2024 20:43:24 +0100 Subject: [PATCH 1/5] migrate only audio --- .../com/pedro/library/rtmp/RtmpOnlyAudio.java | 76 ------------------- .../com/pedro/library/rtmp/RtmpOnlyAudio.kt | 58 ++++++++++++++ .../com/pedro/library/rtsp/RtspOnlyAudio.java | 76 ------------------- .../com/pedro/library/rtsp/RtspOnlyAudio.kt | 58 ++++++++++++++ .../com/pedro/library/srt/SrtOnlyAudio.java | 76 ------------------- .../com/pedro/library/srt/SrtOnlyAudio.kt | 58 ++++++++++++++ 6 files changed, 174 insertions(+), 228 deletions(-) delete mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java create mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.kt delete mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java create mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.kt delete mode 100644 library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java create mode 100644 library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.kt diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java deleted file mode 100644 index fa8d08bff..000000000 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtmp; - -import android.media.MediaCodec; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.library.base.OnlyAudioBase; -import com.pedro.library.util.streamclient.RtmpStreamClient; -import com.pedro.rtmp.rtmp.RtmpClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.OnlyAudioBase} - * - * Created by pedro on 10/07/18. - */ -public class RtmpOnlyAudio extends OnlyAudioBase { - - private final RtmpClient rtmpClient; - private final RtmpStreamClient streamClient; - - public RtmpOnlyAudio(ConnectChecker connectChecker) { - super(); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, null); - streamClient.setOnlyAudio(true); - } - - @Override - public RtmpStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtmpClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - rtmpClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.kt new file mode 100644 index 000000000..2a3afb57f --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpOnlyAudio.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtmp + +import android.media.MediaCodec +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.library.base.OnlyAudioBase +import com.pedro.library.util.streamclient.RtmpStreamClient +import com.pedro.rtmp.rtmp.RtmpClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.OnlyAudioBase] + * + * Created by pedro on 10/07/18. + */ +class RtmpOnlyAudio(connectChecker: ConnectChecker) : OnlyAudioBase() { + + private val rtmpClient = RtmpClient(connectChecker).apply { setOnlyAudio(true) } + private val streamClient = RtmpStreamClient(rtmpClient, null) + + override fun getStreamClient(): RtmpStreamClient = streamClient + + override fun setAudioCodecImp(codec: AudioCodec) { + rtmpClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtmpClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + rtmpClient.connect(url) + } + + override fun stopStreamRtp() { + rtmpClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendAudio(aacBuffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java deleted file mode 100644 index 1005dfd67..000000000 --- a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtsp; - -import android.media.MediaCodec; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.library.base.OnlyAudioBase; -import com.pedro.library.util.streamclient.RtspStreamClient; -import com.pedro.rtsp.rtsp.RtspClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.OnlyAudioBase} - * - * Created by pedro on 10/07/18. - */ -public class RtspOnlyAudio extends OnlyAudioBase { - - private final RtspClient rtspClient; - private final RtspStreamClient streamClient; - - public RtspOnlyAudio(ConnectChecker connectChecker) { - super(); - rtspClient = new RtspClient(connectChecker); - rtspClient.setOnlyAudio(true); - streamClient = new RtspStreamClient(rtspClient, null); - } - - @Override - public RtspStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtspClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtspClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - rtspClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtspClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtspClient.sendAudio(aacBuffer, info); - } -} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.kt b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.kt new file mode 100644 index 000000000..a6e08d8eb --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtsp/RtspOnlyAudio.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtsp + +import android.media.MediaCodec +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.library.base.OnlyAudioBase +import com.pedro.library.util.streamclient.RtspStreamClient +import com.pedro.rtsp.rtsp.RtspClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.OnlyAudioBase] + * + * Created by pedro on 10/07/18. + */ +class RtspOnlyAudio(connectChecker: ConnectChecker) : OnlyAudioBase() { + + private val rtspClient = RtspClient(connectChecker).apply { setOnlyAudio(true) } + private val streamClient = RtspStreamClient(rtspClient, null) + + override fun getStreamClient(): RtspStreamClient = streamClient + + override fun setAudioCodecImp(codec: AudioCodec) { + rtspClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtspClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + rtspClient.connect(url) + } + + override fun stopStreamRtp() { + rtspClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendAudio(aacBuffer, info) + } +} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java deleted file mode 100644 index 15afa864a..000000000 --- a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.srt; - -import android.media.MediaCodec; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.library.base.OnlyAudioBase; -import com.pedro.library.util.streamclient.SrtStreamClient; -import com.pedro.srt.srt.SrtClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link OnlyAudioBase} - * - * Created by pedro on 8/9/23. - */ -public class SrtOnlyAudio extends OnlyAudioBase { - - private final SrtClient srtClient; - private final SrtStreamClient streamClient; - - public SrtOnlyAudio(ConnectChecker connectChecker) { - super(); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, null); - streamClient.setOnlyAudio(true); - } - - @Override - public SrtStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - srtClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - srtClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - srtClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - srtClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - srtClient.sendAudio(aacBuffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.kt b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.kt new file mode 100644 index 000000000..6e5da518e --- /dev/null +++ b/library/src/main/java/com/pedro/library/srt/SrtOnlyAudio.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.srt + +import android.media.MediaCodec +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.library.base.OnlyAudioBase +import com.pedro.library.util.streamclient.SrtStreamClient +import com.pedro.srt.srt.SrtClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [OnlyAudioBase] + * + * Created by pedro on 8/9/23. + */ +class SrtOnlyAudio(connectChecker: ConnectChecker) : OnlyAudioBase() { + + private val srtClient = SrtClient(connectChecker).apply { setOnlyAudio(true) } + private val streamClient = SrtStreamClient(srtClient, null) + + override fun getStreamClient(): SrtStreamClient = streamClient + + override fun setAudioCodecImp(codec: AudioCodec) { + srtClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + srtClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + srtClient.connect(url) + } + + override fun stopStreamRtp() { + srtClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendAudio(aacBuffer, info) + } +} From a386f5dd40cd5ffc2068d80757d4278763aab582 Mon Sep 17 00:00:00 2001 From: pedro Date: Fri, 12 Apr 2024 18:01:44 +0200 Subject: [PATCH 2/5] move camera1 and camera2 to kotlin --- .../com/pedro/library/rtmp/RtmpCamera1.java | 127 ---------------- .../com/pedro/library/rtmp/RtmpCamera1.kt | 112 ++++++++++++++ .../com/pedro/library/rtmp/RtmpCamera2.java | 138 ------------------ .../com/pedro/library/rtmp/RtmpCamera2.kt | 102 +++++++++++++ .../com/pedro/library/rtsp/RtspCamera1.java | 121 --------------- .../com/pedro/library/rtsp/RtspCamera1.kt | 106 ++++++++++++++ .../com/pedro/library/rtsp/RtspCamera2.java | 132 ----------------- .../com/pedro/library/rtsp/RtspCamera2.kt | 96 ++++++++++++ .../com/pedro/library/srt/SrtCamera1.java | 121 --------------- .../java/com/pedro/library/srt/SrtCamera1.kt | 106 ++++++++++++++ .../com/pedro/library/srt/SrtCamera2.java | 132 ----------------- .../java/com/pedro/library/srt/SrtCamera2.kt | 96 ++++++++++++ 12 files changed, 618 insertions(+), 771 deletions(-) delete mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java create mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.kt delete mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java create mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.kt delete mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java create mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspCamera1.kt delete mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java create mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspCamera2.kt delete mode 100644 library/src/main/java/com/pedro/library/srt/SrtCamera1.java create mode 100644 library/src/main/java/com/pedro/library/srt/SrtCamera1.kt delete mode 100644 library/src/main/java/com/pedro/library/srt/SrtCamera2.java create mode 100644 library/src/main/java/com/pedro/library/srt/SrtCamera2.kt diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java deleted file mode 100644 index b42cdd8ff..000000000 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtmp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; -import android.view.SurfaceView; -import android.view.TextureView; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.Camera1Base; -import com.pedro.library.util.streamclient.RtmpStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.rtmp.rtmp.RtmpClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.Camera1Base} - * - * Created by pedro on 25/01/17. - */ - -public class RtmpCamera1 extends Camera1Base { - - private final RtmpClient rtmpClient; - private final RtmpStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public RtmpCamera1(SurfaceView surfaceView, ConnectChecker connectChecker) { - super(surfaceView); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - public RtmpCamera1(TextureView textureView, ConnectChecker connectChecker) { - super(textureView); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) - public RtmpCamera1(OpenGlView openGlView, ConnectChecker connectChecker) { - super(openGlView); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) - public RtmpCamera1(Context context, ConnectChecker connectChecker) { - super(context); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - @Override - public RtmpStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtmpClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtmpClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { - rtmpClient.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); - } else { - rtmpClient.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); - } - rtmpClient.setFps(videoEncoder.getFps()); - rtmpClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtmpClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtmpClient.sendVideo(h264Buffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.kt new file mode 100644 index 000000000..9b34a54a5 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera1.kt @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtmp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import android.view.SurfaceView +import android.view.TextureView +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.Camera1Base +import com.pedro.library.util.streamclient.RtmpStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.rtmp.rtmp.RtmpClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.Camera1Base] + * + * Created by pedro on 25/01/17. + */ +class RtmpCamera1 : Camera1Base { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var rtmpClient: RtmpClient + private lateinit var streamClient: RtmpStreamClient + + constructor(surfaceView: SurfaceView, connectChecker: ConnectChecker): super(surfaceView) { + init(connectChecker) + } + + constructor(textureView: TextureView, connectChecker: ConnectChecker): super(textureView) { + init(connectChecker) + } + + @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2) + constructor(openGlView: OpenGlView, connectChecker: ConnectChecker): super(openGlView) { + init(connectChecker) + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + constructor(context: Context, connectChecker: ConnectChecker): super(context) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + rtmpClient = RtmpClient(connectChecker) + streamClient = RtmpStreamClient(rtmpClient, streamClientListener) + } + + override fun getStreamClient(): RtmpStreamClient = streamClient + + override fun setVideoCodecImp(codec: VideoCodec) { + rtmpClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtmpClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtmpClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) { + rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width) + } else { + rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height) + } + rtmpClient.setFps(videoEncoder.fps) + rtmpClient.connect(url) + } + + override fun stopStreamRtp() { + rtmpClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtmpClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java deleted file mode 100644 index 99a1b7c2b..000000000 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtmp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; -import android.view.SurfaceView; -import android.view.TextureView; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.Camera2Base; -import com.pedro.library.util.streamclient.RtmpStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.rtmp.rtmp.RtmpClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.Camera2Base} - * - * Created by pedro on 6/07/17. - */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtmpCamera2 extends Camera2Base { - - private final RtmpClient rtmpClient; - private final RtmpStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - /** - * @deprecated This view produce rotations problems and could be unsupported in future versions. - * Use {@link Camera2Base#Camera2Base(OpenGlView)} - * instead. - */ - @Deprecated - public RtmpCamera2(SurfaceView surfaceView, ConnectChecker connectChecker) { - super(surfaceView); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - /** - * @deprecated This view produce rotations problems and could be unsupported in future versions. - * Use {@link Camera2Base#Camera2Base(OpenGlView)} - * instead. - */ - @Deprecated - public RtmpCamera2(TextureView textureView, ConnectChecker connectChecker) { - super(textureView); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - public RtmpCamera2(OpenGlView openGlView, ConnectChecker connectChecker) { - super(openGlView); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - public RtmpCamera2(Context context, boolean useOpengl, ConnectChecker connectChecker) { - super(context, useOpengl); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - @Override - public RtmpStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtmpClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtmpClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { - rtmpClient.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); - } else { - rtmpClient.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); - } - rtmpClient.setFps(videoEncoder.getFps()); - rtmpClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtmpClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtmpClient.sendVideo(h264Buffer, info); - } -} - diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.kt new file mode 100644 index 000000000..b3b280d23 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpCamera2.kt @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtmp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.Camera2Base +import com.pedro.library.util.streamclient.RtmpStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.rtmp.rtmp.RtmpClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.Camera2Base] + * + * Created by pedro on 6/07/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +class RtmpCamera2 : Camera2Base { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var rtmpClient: RtmpClient + private lateinit var streamClient: RtmpStreamClient + + constructor(openGlView: OpenGlView, connectChecker: ConnectChecker): super(openGlView) { + init(connectChecker) + } + + constructor(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): super( + context, useOpengl) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + rtmpClient = RtmpClient(connectChecker) + streamClient = RtmpStreamClient(rtmpClient, streamClientListener) + } + + override fun getStreamClient(): RtmpStreamClient = streamClient + + override fun setVideoCodecImp(codec: VideoCodec) { + rtmpClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtmpClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtmpClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) { + rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width) + } else { + rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height) + } + rtmpClient.setFps(videoEncoder.fps) + rtmpClient.connect(url) + } + + override fun stopStreamRtp() { + rtmpClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtmpClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java deleted file mode 100644 index b0dc76513..000000000 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtsp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; -import android.view.SurfaceView; -import android.view.TextureView; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.Camera1Base; -import com.pedro.library.util.streamclient.RtspStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.rtsp.rtsp.RtspClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.Camera1Base} - * - * Created by pedro on 10/02/17. - */ - -public class RtspCamera1 extends Camera1Base { - - private final RtspClient rtspClient; - private final RtspStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public RtspCamera1(SurfaceView surfaceView, ConnectChecker connectChecker) { - super(surfaceView); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - public RtspCamera1(TextureView textureView, ConnectChecker connectChecker) { - super(textureView); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) - public RtspCamera1(OpenGlView openGlView, ConnectChecker connectChecker) { - super(openGlView); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) - public RtspCamera1(Context context, ConnectChecker connectChecker) { - super(context); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - @Override - public RtspStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtspClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtspClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtspClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - rtspClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtspClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtspClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtspClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtspClient.sendVideo(h264Buffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.kt b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.kt new file mode 100644 index 000000000..f91c400b2 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera1.kt @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtsp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import android.view.SurfaceView +import android.view.TextureView +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.Camera1Base +import com.pedro.library.util.streamclient.RtspStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.rtsp.rtsp.RtspClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.Camera1Base] + * + * Created by pedro on 10/02/17. + */ +class RtspCamera1 : Camera1Base { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var rtspClient: RtspClient + private lateinit var streamClient: RtspStreamClient + + constructor(surfaceView: SurfaceView, connectChecker: ConnectChecker): super(surfaceView) { + init(connectChecker) + } + + constructor(textureView: TextureView, connectChecker: ConnectChecker): super(textureView) { + init(connectChecker) + } + + @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2) + constructor(openGlView: OpenGlView, connectChecker: ConnectChecker): super(openGlView) { + init(connectChecker) + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + constructor(context: Context, connectChecker: ConnectChecker): super(context) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + rtspClient = RtspClient(connectChecker) + streamClient = RtspStreamClient(rtspClient, streamClientListener) + } + + override fun getStreamClient(): RtspStreamClient = streamClient + + override fun setVideoCodecImp(codec: VideoCodec) { + rtspClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtspClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtspClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + rtspClient.connect(url) + } + + override fun stopStreamRtp() { + rtspClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtspClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java deleted file mode 100644 index a72f5a9a0..000000000 --- a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtsp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; -import android.view.SurfaceView; -import android.view.TextureView; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.Camera2Base; -import com.pedro.library.util.streamclient.RtspStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.rtsp.rtsp.RtspClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.Camera2Base} - * - * Created by pedro on 4/06/17. - */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtspCamera2 extends Camera2Base { - - private final RtspClient rtspClient; - private final RtspStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - /** - * @deprecated This view produce rotations problems and could be unsupported in future versions. - * Use {@link Camera2Base#Camera2Base(OpenGlView)} - * instead. - */ - @Deprecated - public RtspCamera2(SurfaceView surfaceView, ConnectChecker connectChecker) { - super(surfaceView); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - /** - * @deprecated This view produce rotations problems and could be unsupported in future versions. - * Use {@link Camera2Base#Camera2Base(OpenGlView)} - * instead. - */ - @Deprecated - public RtspCamera2(TextureView textureView, ConnectChecker connectChecker) { - super(textureView); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - public RtspCamera2(OpenGlView openGlView, ConnectChecker connectChecker) { - super(openGlView); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - public RtspCamera2(Context context, boolean useOpengl, ConnectChecker connectChecker) { - super(context, useOpengl); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - @Override - public RtspStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtspClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtspClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtspClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - rtspClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtspClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtspClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtspClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtspClient.sendVideo(h264Buffer, info); - } -} - diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.kt b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.kt new file mode 100644 index 000000000..6b6982ae0 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtsp/RtspCamera2.kt @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtsp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.Camera2Base +import com.pedro.library.util.streamclient.RtspStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.rtsp.rtsp.RtspClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.Camera2Base] + * + * Created by pedro on 4/06/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +class RtspCamera2 : Camera2Base { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var rtspClient: RtspClient + private lateinit var streamClient: RtspStreamClient + + constructor(openGlView: OpenGlView, connectChecker: ConnectChecker): super(openGlView) { + init(connectChecker) + } + + constructor(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): super( + context, useOpengl) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + rtspClient = RtspClient(connectChecker) + streamClient = RtspStreamClient(rtspClient, streamClientListener) + } + + override fun getStreamClient(): RtspStreamClient = streamClient + + override fun setVideoCodecImp(codec: VideoCodec) { + rtspClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtspClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtspClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + rtspClient.connect(url) + } + + override fun stopStreamRtp() { + rtspClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtspClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java b/library/src/main/java/com/pedro/library/srt/SrtCamera1.java deleted file mode 100644 index 0ff94995f..000000000 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera1.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.srt; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; -import android.view.SurfaceView; -import android.view.TextureView; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.Camera1Base; -import com.pedro.library.util.streamclient.SrtStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.srt.srt.SrtClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link Camera1Base} - * - * Created by pedro on 8/9/23. - */ - -public class SrtCamera1 extends Camera1Base { - - private final SrtClient srtClient; - private final SrtStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public SrtCamera1(SurfaceView surfaceView, ConnectChecker connectChecker) { - super(surfaceView); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - public SrtCamera1(TextureView textureView, ConnectChecker connectChecker) { - super(textureView); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) - public SrtCamera1(OpenGlView openGlView, ConnectChecker connectChecker) { - super(openGlView); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) - public SrtCamera1(Context context, ConnectChecker connectChecker) { - super(context); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - @Override - public SrtStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - srtClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - srtClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - srtClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - srtClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - srtClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - srtClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - srtClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - srtClient.sendVideo(h264Buffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera1.kt b/library/src/main/java/com/pedro/library/srt/SrtCamera1.kt new file mode 100644 index 000000000..31ef40b34 --- /dev/null +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera1.kt @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.srt + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import android.view.SurfaceView +import android.view.TextureView +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.Camera1Base +import com.pedro.library.util.streamclient.SrtStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.srt.srt.SrtClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [Camera1Base] + * + * Created by pedro on 8/9/23. + */ +class SrtCamera1 : Camera1Base { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var srtClient: SrtClient + private lateinit var streamClient: SrtStreamClient + + constructor(surfaceView: SurfaceView, connectChecker: ConnectChecker): super(surfaceView) { + init(connectChecker) + } + + constructor(textureView: TextureView, connectChecker: ConnectChecker): super(textureView) { + init(connectChecker) + } + + @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2) + constructor(openGlView: OpenGlView, connectChecker: ConnectChecker): super(openGlView) { + init(connectChecker) + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + constructor(context: Context, connectChecker: ConnectChecker): super(context) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + srtClient = SrtClient(connectChecker) + streamClient = SrtStreamClient(srtClient, streamClientListener) + } + + override fun getStreamClient(): SrtStreamClient = streamClient + + override fun setVideoCodecImp(codec: VideoCodec) { + srtClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + srtClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + srtClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + srtClient.connect(url) + } + + override fun stopStreamRtp() { + srtClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + srtClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java b/library/src/main/java/com/pedro/library/srt/SrtCamera2.java deleted file mode 100644 index 39d8a5ad8..000000000 --- a/library/src/main/java/com/pedro/library/srt/SrtCamera2.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.srt; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; -import android.view.SurfaceView; -import android.view.TextureView; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.Camera2Base; -import com.pedro.library.util.streamclient.SrtStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.srt.srt.SrtClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link Camera2Base} - * - * Created by pedro on 8/9/23. - */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class SrtCamera2 extends Camera2Base { - - private final SrtClient srtClient; - private final SrtStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - /** - * @deprecated This view produce rotations problems and could be unsupported in future versions. - * Use {@link Camera2Base#Camera2Base(OpenGlView)} - * instead. - */ - @Deprecated - public SrtCamera2(SurfaceView surfaceView, ConnectChecker connectChecker) { - super(surfaceView); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - /** - * @deprecated This view produce rotations problems and could be unsupported in future versions. - * Use {@link Camera2Base#Camera2Base(OpenGlView)} - * instead. - */ - @Deprecated - public SrtCamera2(TextureView textureView, ConnectChecker connectChecker) { - super(textureView); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - public SrtCamera2(OpenGlView openGlView, ConnectChecker connectChecker) { - super(openGlView); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - public SrtCamera2(Context context, boolean useOpengl, ConnectChecker connectChecker) { - super(context, useOpengl); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - @Override - public SrtStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - srtClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - srtClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - srtClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - srtClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - srtClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - srtClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - srtClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - srtClient.sendVideo(h264Buffer, info); - } -} - diff --git a/library/src/main/java/com/pedro/library/srt/SrtCamera2.kt b/library/src/main/java/com/pedro/library/srt/SrtCamera2.kt new file mode 100644 index 000000000..1b877d5bc --- /dev/null +++ b/library/src/main/java/com/pedro/library/srt/SrtCamera2.kt @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.srt + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.Camera2Base +import com.pedro.library.util.streamclient.SrtStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.srt.srt.SrtClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [Camera2Base] + * + * Created by pedro on 8/9/23. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +class SrtCamera2 : Camera2Base { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var srtClient: SrtClient + private lateinit var streamClient: SrtStreamClient + + constructor(openGlView: OpenGlView, connectChecker: ConnectChecker): super(openGlView) { + init(connectChecker) + } + + constructor(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): super( + context, useOpengl) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + srtClient = SrtClient(connectChecker) + streamClient = SrtStreamClient(srtClient, streamClientListener) + } + + override fun getStreamClient(): SrtStreamClient = streamClient + + override fun setVideoCodecImp(codec: VideoCodec) { + srtClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + srtClient.setAudioCodec(codec) + } + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + srtClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + srtClient.connect(url) + } + + override fun stopStreamRtp() { + srtClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + srtClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendVideo(h264Buffer, info) + } +} From d50f3692f9ad6041913e3e671f459161dc2aae45 Mon Sep 17 00:00:00 2001 From: pedro Date: Fri, 12 Apr 2024 18:08:51 +0200 Subject: [PATCH 3/5] display to kotlin --- .../com/pedro/library/rtmp/RtmpDisplay.java | 104 ------------------ .../com/pedro/library/rtmp/RtmpDisplay.kt | 87 +++++++++++++++ .../com/pedro/library/rtsp/RtspDisplay.java | 98 ----------------- .../com/pedro/library/rtsp/RtspDisplay.kt | 81 ++++++++++++++ .../com/pedro/library/srt/SrtDisplay.java | 98 ----------------- .../java/com/pedro/library/srt/SrtDisplay.kt | 81 ++++++++++++++ .../java/com/pedro/library/udp/UdpDisplay.kt | 3 +- 7 files changed, 250 insertions(+), 302 deletions(-) delete mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java create mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.kt delete mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java create mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspDisplay.kt delete mode 100644 library/src/main/java/com/pedro/library/srt/SrtDisplay.java create mode 100644 library/src/main/java/com/pedro/library/srt/SrtDisplay.kt diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java deleted file mode 100644 index 2b0d37f71..000000000 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtmp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.DisplayBase; -import com.pedro.library.util.streamclient.RtmpStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.rtmp.rtmp.RtmpClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.DisplayBase} - * - * Created by pedro on 9/08/17. - */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtmpDisplay extends DisplayBase { - - private final RtmpClient rtmpClient; - private final RtmpStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public RtmpDisplay(Context context, boolean useOpengl, ConnectChecker connectChecker) { - super(context, useOpengl); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - @Override - public RtmpStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtmpClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtmpClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { - rtmpClient.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); - } else { - rtmpClient.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); - } - rtmpClient.setFps(videoEncoder.getFps()); - rtmpClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtmpClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtmpClient.sendVideo(h264Buffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.kt new file mode 100644 index 000000000..29390de9a --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpDisplay.kt @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtmp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.DisplayBase +import com.pedro.library.util.streamclient.RtmpStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.rtmp.rtmp.RtmpClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.DisplayBase] + * + * Created by pedro on 9/08/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +class RtmpDisplay(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): DisplayBase(context, useOpengl) { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private val rtmpClient = RtmpClient(connectChecker) + private val streamClient = RtmpStreamClient(rtmpClient, streamClientListener) + + override fun setVideoCodecImp(codec: VideoCodec) { + rtmpClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtmpClient.setAudioCodec(codec) + } + + override fun getStreamClient(): RtmpStreamClient = streamClient + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtmpClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) { + rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width) + } else { + rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height) + } + rtmpClient.setFps(videoEncoder.fps) + rtmpClient.connect(url) + } + + override fun stopStreamRtp() { + rtmpClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtmpClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java deleted file mode 100644 index 1a1c59828..000000000 --- a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtsp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.DisplayBase; -import com.pedro.library.util.streamclient.RtspStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.rtsp.rtsp.RtspClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.DisplayBase} - * - * Created by pedro on 9/08/17. - */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class RtspDisplay extends DisplayBase { - - private final RtspClient rtspClient; - private final RtspStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public RtspDisplay(Context context, boolean useOpengl, ConnectChecker connectChecker) { - super(context, useOpengl); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - @Override - public RtspStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtspClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtspClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtspClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - rtspClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtspClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtspClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtspClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtspClient.sendVideo(h264Buffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.kt b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.kt new file mode 100644 index 000000000..858168626 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtsp/RtspDisplay.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtsp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.DisplayBase +import com.pedro.library.util.streamclient.RtspStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.rtsp.rtsp.RtspClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.DisplayBase] + * + * Created by pedro on 9/08/17. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +class RtspDisplay(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): DisplayBase(context, useOpengl) { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private val rtspClient = RtspClient(connectChecker) + private val streamClient = RtspStreamClient(rtspClient, streamClientListener) + + override fun setVideoCodecImp(codec: VideoCodec) { + rtspClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtspClient.setAudioCodec(codec) + } + + override fun getStreamClient(): RtspStreamClient = streamClient + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtspClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + rtspClient.connect(url) + } + + override fun stopStreamRtp() { + rtspClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtspClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java b/library/src/main/java/com/pedro/library/srt/SrtDisplay.java deleted file mode 100644 index 37af491ac..000000000 --- a/library/src/main/java/com/pedro/library/srt/SrtDisplay.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.srt; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.library.base.DisplayBase; -import com.pedro.library.util.streamclient.SrtStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.srt.srt.SrtClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link DisplayBase} - * - * Created by pedro on 8/9/23. - */ -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class SrtDisplay extends DisplayBase { - - private final SrtClient srtClient; - private final SrtStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public SrtDisplay(Context context, boolean useOpengl, ConnectChecker connectChecker) { - super(context, useOpengl); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - srtClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - srtClient.setAudioCodec(codec); - } - - @Override - public SrtStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - srtClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - srtClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - srtClient.disconnect(); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - srtClient.sendAudio(aacBuffer, info); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - srtClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - srtClient.sendVideo(h264Buffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/srt/SrtDisplay.kt b/library/src/main/java/com/pedro/library/srt/SrtDisplay.kt new file mode 100644 index 000000000..ab3fa39c3 --- /dev/null +++ b/library/src/main/java/com/pedro/library/srt/SrtDisplay.kt @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.srt + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.library.base.DisplayBase +import com.pedro.library.util.streamclient.SrtStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.srt.srt.SrtClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [DisplayBase] + * + * Created by pedro on 8/9/23. + */ +@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) +class SrtDisplay(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): DisplayBase(context, useOpengl) { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private val srtClient = SrtClient(connectChecker) + private val streamClient = SrtStreamClient(srtClient, streamClientListener) + + override fun setVideoCodecImp(codec: VideoCodec) { + srtClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + srtClient.setAudioCodec(codec) + } + + override fun getStreamClient(): SrtStreamClient = streamClient + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + srtClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + srtClient.connect(url) + } + + override fun stopStreamRtp() { + srtClient.disconnect() + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendAudio(aacBuffer, info) + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + srtClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendVideo(h264Buffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/udp/UdpDisplay.kt b/library/src/main/java/com/pedro/library/udp/UdpDisplay.kt index 50bc56586..2e8cd59b7 100644 --- a/library/src/main/java/com/pedro/library/udp/UdpDisplay.kt +++ b/library/src/main/java/com/pedro/library/udp/UdpDisplay.kt @@ -35,8 +35,7 @@ import java.nio.ByteBuffer * Created by pedro on 6/3/24. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -class UdpDisplay(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): - DisplayBase(context, useOpengl) { +class UdpDisplay(context: Context, useOpengl: Boolean, connectChecker: ConnectChecker): DisplayBase(context, useOpengl) { private val streamClientListener = object: StreamClientListener { override fun onRequestKeyframe() { From 4040af08fff5ef22be2b13de64341ac897e66f80 Mon Sep 17 00:00:00 2001 From: pedro Date: Fri, 12 Apr 2024 18:15:27 +0200 Subject: [PATCH 4/5] move fromfile to kotlin --- .../com/pedro/library/rtmp/RtmpFromFile.java | 122 ------------------ .../com/pedro/library/rtmp/RtmpFromFile.kt | 116 +++++++++++++++++ .../com/pedro/library/rtsp/RtspFromFile.java | 118 ----------------- .../com/pedro/library/rtsp/RtspFromFile.kt | 110 ++++++++++++++++ .../com/pedro/library/srt/SrtFromFile.java | 116 ----------------- .../java/com/pedro/library/srt/SrtFromFile.kt | 110 ++++++++++++++++ 6 files changed, 336 insertions(+), 356 deletions(-) delete mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java create mode 100644 library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.kt delete mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java create mode 100644 library/src/main/java/com/pedro/library/rtsp/RtspFromFile.kt delete mode 100644 library/src/main/java/com/pedro/library/srt/SrtFromFile.java create mode 100644 library/src/main/java/com/pedro/library/srt/SrtFromFile.kt diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java deleted file mode 100644 index 01bd137be..000000000 --- a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtmp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.encoder.input.decoder.AudioDecoderInterface; -import com.pedro.encoder.input.decoder.VideoDecoderInterface; -import com.pedro.library.base.FromFileBase; -import com.pedro.library.util.streamclient.RtmpStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.rtmp.rtmp.RtmpClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.FromFileBase} - * - * Created by pedro on 26/06/17. - */ -@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class RtmpFromFile extends FromFileBase { - - private final RtmpClient rtmpClient; - private final RtmpStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public RtmpFromFile(ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(videoDecoderInterface, audioDecoderInterface); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - public RtmpFromFile(Context context, ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(context, videoDecoderInterface, audioDecoderInterface); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - public RtmpFromFile(OpenGlView openGlView, ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(openGlView, videoDecoderInterface, audioDecoderInterface); - rtmpClient = new RtmpClient(connectChecker); - streamClient = new RtmpStreamClient(rtmpClient, streamClientListener); - } - - @Override - public RtmpStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtmpClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtmpClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtmpClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - if (videoEncoder.getRotation() == 90 || videoEncoder.getRotation() == 270) { - rtmpClient.setVideoResolution(videoEncoder.getHeight(), videoEncoder.getWidth()); - } else { - rtmpClient.setVideoResolution(videoEncoder.getWidth(), videoEncoder.getHeight()); - } - rtmpClient.setFps(videoEncoder.getFps()); - rtmpClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtmpClient.disconnect(); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtmpClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtmpClient.sendVideo(h264Buffer, info); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtmpClient.sendAudio(aacBuffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.kt b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.kt new file mode 100644 index 000000000..658a2f164 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtmp/RtmpFromFile.kt @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtmp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.encoder.input.decoder.AudioDecoderInterface +import com.pedro.encoder.input.decoder.VideoDecoderInterface +import com.pedro.library.base.FromFileBase +import com.pedro.library.util.streamclient.RtmpStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.rtmp.rtmp.RtmpClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.FromFileBase] + * + * Created by pedro on 26/06/17. + */ +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +class RtmpFromFile: FromFileBase { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var rtmpClient: RtmpClient + private lateinit var streamClient: RtmpStreamClient + + constructor( + openGlView: OpenGlView, connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(openGlView, videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + constructor( + context: Context, connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(context, videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + constructor( + connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + rtmpClient = RtmpClient(connectChecker) + streamClient = RtmpStreamClient(rtmpClient, streamClientListener) + } + + override fun setVideoCodecImp(codec: VideoCodec) { + rtmpClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtmpClient.setAudioCodec(codec) + } + + override fun getStreamClient(): RtmpStreamClient = streamClient + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtmpClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + if (videoEncoder.rotation == 90 || videoEncoder.rotation == 270) { + rtmpClient.setVideoResolution(videoEncoder.height, videoEncoder.width) + } else { + rtmpClient.setVideoResolution(videoEncoder.width, videoEncoder.height) + } + rtmpClient.setFps(videoEncoder.fps) + rtmpClient.connect(url) + } + + override fun stopStreamRtp() { + rtmpClient.disconnect() + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtmpClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendVideo(h264Buffer, info) + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtmpClient.sendAudio(aacBuffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java deleted file mode 100644 index 692d63275..000000000 --- a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.rtsp; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.encoder.input.decoder.AudioDecoderInterface; -import com.pedro.encoder.input.decoder.VideoDecoderInterface; -import com.pedro.library.base.FromFileBase; -import com.pedro.library.util.streamclient.RtspStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.rtsp.rtsp.RtspClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link com.pedro.library.base.FromFileBase} - * - * Created by pedro on 4/06/17. - */ -@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class RtspFromFile extends FromFileBase { - - private final RtspClient rtspClient; - private final RtspStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public RtspFromFile(ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(videoDecoderInterface, audioDecoderInterface); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - public RtspFromFile(Context context, ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(context, videoDecoderInterface, audioDecoderInterface); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - public RtspFromFile(OpenGlView openGlView, ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(openGlView, videoDecoderInterface, audioDecoderInterface); - rtspClient = new RtspClient(connectChecker); - streamClient = new RtspStreamClient(rtspClient, streamClientListener); - } - - @Override - public RtspStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - rtspClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - rtspClient.setAudioCodec(codec); - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - rtspClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - rtspClient.setOnlyAudio(!videoEnabled); - rtspClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - rtspClient.disconnect(); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - rtspClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - rtspClient.sendVideo(h264Buffer, info); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - rtspClient.sendAudio(aacBuffer, info); - } -} - diff --git a/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.kt b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.kt new file mode 100644 index 000000000..521666df8 --- /dev/null +++ b/library/src/main/java/com/pedro/library/rtsp/RtspFromFile.kt @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.rtsp + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.encoder.input.decoder.AudioDecoderInterface +import com.pedro.encoder.input.decoder.VideoDecoderInterface +import com.pedro.library.base.FromFileBase +import com.pedro.library.util.streamclient.RtspStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.rtsp.rtsp.RtspClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [com.pedro.library.base.FromFileBase] + * + * Created by pedro on 4/06/17. + */ +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +class RtspFromFile: FromFileBase { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var rtspClient: RtspClient + private lateinit var streamClient: RtspStreamClient + + constructor( + openGlView: OpenGlView, connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(openGlView, videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + constructor( + context: Context, connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(context, videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + constructor( + connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + rtspClient = RtspClient(connectChecker) + streamClient = RtspStreamClient(rtspClient, streamClientListener) + } + + override fun setVideoCodecImp(codec: VideoCodec) { + rtspClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + rtspClient.setAudioCodec(codec) + } + + override fun getStreamClient(): RtspStreamClient = streamClient + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + rtspClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + rtspClient.connect(url) + } + + override fun stopStreamRtp() { + rtspClient.disconnect() + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + rtspClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendVideo(h264Buffer, info) + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + rtspClient.sendAudio(aacBuffer, info) + } +} diff --git a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java b/library/src/main/java/com/pedro/library/srt/SrtFromFile.java deleted file mode 100644 index 41924ebed..000000000 --- a/library/src/main/java/com/pedro/library/srt/SrtFromFile.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.srt; - -import android.content.Context; -import android.media.MediaCodec; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -import com.pedro.common.AudioCodec; -import com.pedro.common.ConnectChecker; -import com.pedro.common.VideoCodec; -import com.pedro.encoder.input.decoder.AudioDecoderInterface; -import com.pedro.encoder.input.decoder.VideoDecoderInterface; -import com.pedro.library.base.FromFileBase; -import com.pedro.library.util.streamclient.SrtStreamClient; -import com.pedro.library.util.streamclient.StreamClientListener; -import com.pedro.library.view.OpenGlView; -import com.pedro.srt.srt.SrtClient; - -import java.nio.ByteBuffer; - -/** - * More documentation see: - * {@link FromFileBase} - * - * Created by pedro on 8/9/23. - */ -@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) -public class SrtFromFile extends FromFileBase { - - private final SrtClient srtClient; - private final SrtStreamClient streamClient; - private final StreamClientListener streamClientListener = this::requestKeyFrame; - - public SrtFromFile(ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(videoDecoderInterface, audioDecoderInterface); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - public SrtFromFile(Context context, ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(context, videoDecoderInterface, audioDecoderInterface); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - public SrtFromFile(OpenGlView openGlView, ConnectChecker connectChecker, - VideoDecoderInterface videoDecoderInterface, AudioDecoderInterface audioDecoderInterface) { - super(openGlView, videoDecoderInterface, audioDecoderInterface); - srtClient = new SrtClient(connectChecker); - streamClient = new SrtStreamClient(srtClient, streamClientListener); - } - - @Override - protected void setVideoCodecImp(VideoCodec codec) { - srtClient.setVideoCodec(codec); - } - - @Override - protected void setAudioCodecImp(AudioCodec codec) { - srtClient.setAudioCodec(codec); - } - - @Override - public SrtStreamClient getStreamClient() { - return streamClient; - } - - @Override - protected void prepareAudioRtp(boolean isStereo, int sampleRate) { - srtClient.setAudioInfo(sampleRate, isStereo); - } - - @Override - protected void startStreamRtp(String url) { - srtClient.connect(url); - } - - @Override - protected void stopStreamRtp() { - srtClient.disconnect(); - } - - @Override - protected void onSpsPpsVpsRtp(ByteBuffer sps, ByteBuffer pps, ByteBuffer vps) { - srtClient.setVideoInfo(sps, pps, vps); - } - - @Override - protected void getH264DataRtp(ByteBuffer h264Buffer, MediaCodec.BufferInfo info) { - srtClient.sendVideo(h264Buffer, info); - } - - @Override - protected void getAacDataRtp(ByteBuffer aacBuffer, MediaCodec.BufferInfo info) { - srtClient.sendAudio(aacBuffer, info); - } -} diff --git a/library/src/main/java/com/pedro/library/srt/SrtFromFile.kt b/library/src/main/java/com/pedro/library/srt/SrtFromFile.kt new file mode 100644 index 000000000..f37ab1ecb --- /dev/null +++ b/library/src/main/java/com/pedro/library/srt/SrtFromFile.kt @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2023 pedroSG94. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.pedro.library.srt + +import android.content.Context +import android.media.MediaCodec +import android.os.Build +import androidx.annotation.RequiresApi +import com.pedro.common.AudioCodec +import com.pedro.common.ConnectChecker +import com.pedro.common.VideoCodec +import com.pedro.encoder.input.decoder.AudioDecoderInterface +import com.pedro.encoder.input.decoder.VideoDecoderInterface +import com.pedro.library.base.FromFileBase +import com.pedro.library.util.streamclient.SrtStreamClient +import com.pedro.library.util.streamclient.StreamClientListener +import com.pedro.library.view.OpenGlView +import com.pedro.srt.srt.SrtClient +import java.nio.ByteBuffer + +/** + * More documentation see: + * [FromFileBase] + * + * Created by pedro on 8/9/23. + */ +@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) +class SrtFromFile: FromFileBase { + + private val streamClientListener = object: StreamClientListener { + override fun onRequestKeyframe() { + requestKeyFrame() + } + } + private lateinit var srtClient: SrtClient + private lateinit var streamClient: SrtStreamClient + + constructor( + openGlView: OpenGlView, connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(openGlView, videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + constructor( + context: Context, connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(context, videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + constructor( + connectChecker: ConnectChecker, + videoDecoderInterface: VideoDecoderInterface, audioDecoderInterface: AudioDecoderInterface + ): super(videoDecoderInterface, audioDecoderInterface) { + init(connectChecker) + } + + private fun init(connectChecker: ConnectChecker) { + srtClient = SrtClient(connectChecker) + streamClient = SrtStreamClient(srtClient, streamClientListener) + } + + override fun setVideoCodecImp(codec: VideoCodec) { + srtClient.setVideoCodec(codec) + } + + override fun setAudioCodecImp(codec: AudioCodec) { + srtClient.setAudioCodec(codec) + } + + override fun getStreamClient(): SrtStreamClient = streamClient + + override fun prepareAudioRtp(isStereo: Boolean, sampleRate: Int) { + srtClient.setAudioInfo(sampleRate, isStereo) + } + + override fun startStreamRtp(url: String) { + srtClient.connect(url) + } + + override fun stopStreamRtp() { + srtClient.disconnect() + } + + override fun onSpsPpsVpsRtp(sps: ByteBuffer, pps: ByteBuffer?, vps: ByteBuffer?) { + srtClient.setVideoInfo(sps, pps, vps) + } + + override fun getH264DataRtp(h264Buffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendVideo(h264Buffer, info) + } + + override fun getAacDataRtp(aacBuffer: ByteBuffer, info: MediaCodec.BufferInfo) { + srtClient.sendAudio(aacBuffer, info) + } +} From fa23abb74bbd4efdfa782b4e0dcc908fc31beac8 Mon Sep 17 00:00:00 2001 From: pedro Date: Fri, 12 Apr 2024 18:19:58 +0200 Subject: [PATCH 5/5] remove old adaptative video bitrate --- .../base/recording/BaseRecordController.java | 1 - .../library/network/AdapterBitrateParser.java | 56 ------- .../library/network/ByteArrayScanner.java | 155 ------------------ .../network/ConnectionClassManager.java | 102 ------------ .../library/network/LineBufferReader.java | 97 ----------- .../pedro/library/network/QTagTxParser.java | 154 ----------------- .../network/UploadBandwidthSampler.java | 142 ---------------- .../library/util/SensorRotationManager.java | 1 + .../pedro/library/view/GlStreamInterface.kt | 1 - 9 files changed, 1 insertion(+), 708 deletions(-) delete mode 100644 library/src/main/java/com/pedro/library/network/AdapterBitrateParser.java delete mode 100644 library/src/main/java/com/pedro/library/network/ByteArrayScanner.java delete mode 100644 library/src/main/java/com/pedro/library/network/ConnectionClassManager.java delete mode 100644 library/src/main/java/com/pedro/library/network/LineBufferReader.java delete mode 100644 library/src/main/java/com/pedro/library/network/QTagTxParser.java delete mode 100644 library/src/main/java/com/pedro/library/network/UploadBandwidthSampler.java diff --git a/library/src/main/java/com/pedro/library/base/recording/BaseRecordController.java b/library/src/main/java/com/pedro/library/base/recording/BaseRecordController.java index 5dcea14f7..53c405f38 100644 --- a/library/src/main/java/com/pedro/library/base/recording/BaseRecordController.java +++ b/library/src/main/java/com/pedro/library/base/recording/BaseRecordController.java @@ -21,7 +21,6 @@ import com.pedro.common.AudioCodec; import com.pedro.common.VideoCodec; -import com.pedro.encoder.utils.CodecUtil; import com.pedro.rtsp.utils.RtpConstants; import java.nio.ByteBuffer; diff --git a/library/src/main/java/com/pedro/library/network/AdapterBitrateParser.java b/library/src/main/java/com/pedro/library/network/AdapterBitrateParser.java deleted file mode 100644 index 689256ca7..000000000 --- a/library/src/main/java/com/pedro/library/network/AdapterBitrateParser.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.network; - -@Deprecated -public class AdapterBitrateParser { - - public static long DELAY = 1000; - public static long DIFFERENCE = 500; - private static long cont = 0; - public static int maxVideoBitrate = 0; - - public interface Callback { - void onNewBitrate(int bitrate); - } - - public static void parseBitrate(int oldBitrate, int bandwidth, Callback callback) { - if (cont == 0) cont = System.currentTimeMillis(); - if (System.currentTimeMillis() - cont > DELAY) { - cont = 0; - if (oldBitrate / 1000 - bandwidth >= DIFFERENCE - || maxVideoBitrate != 0 && oldBitrate / 1000 >= maxVideoBitrate) { - callback.onNewBitrate((int) (oldBitrate - (DIFFERENCE * 1000))); - } else if (oldBitrate / 1000 - bandwidth <= DIFFERENCE) { - callback.onNewBitrate((int) (oldBitrate + (DIFFERENCE * 1000))); - } - } - } - - public static void calculateMaxVideoBitrate(int resolutionValue) { - maxVideoBitrate = (int) (1.65287774651705E-10 * Math.pow(resolutionValue, 2) - + 0.002653652033201 * resolutionValue - + 640.220156152395); - } - - public static void reset() { - DELAY = 1000; - DIFFERENCE = 500; - cont = 0; - maxVideoBitrate = 0; - } -} diff --git a/library/src/main/java/com/pedro/library/network/ByteArrayScanner.java b/library/src/main/java/com/pedro/library/network/ByteArrayScanner.java deleted file mode 100644 index e730d6132..000000000 --- a/library/src/main/java/com/pedro/library/network/ByteArrayScanner.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.network; - -import java.util.NoSuchElementException; - -@Deprecated -class ByteArrayScanner { - private byte[] mData; - private int mCurrentOffset; - private int mTotalLength; - private char mDelimiter; - private boolean mDelimiterSet; - - public ByteArrayScanner reset(byte[] buffer, int length) { - mData = buffer; - mCurrentOffset = 0; - mTotalLength = length; - mDelimiterSet = false; - return this; - } - - public ByteArrayScanner useDelimiter(char delimiter) { - throwIfNotReset(); - mDelimiter = delimiter; - mDelimiterSet = true; - return this; - } - - private void throwIfNotReset() { - if (mData == null) { - throw new IllegalStateException("Must call reset first"); - } - } - - private void throwIfDelimiterNotSet() { - if (!mDelimiterSet) { - throw new IllegalStateException("Must call useDelimiter first"); - } - } - - /** - * @return The next token, parsed as a string. - * @throws NoSuchElementException - */ - public String nextString() throws NoSuchElementException { - throwIfNotReset(); - throwIfDelimiterNotSet(); - int offset = mCurrentOffset; - int length = advance(); - return new String(mData, offset, length); - } - - /** - * Matches the next token with a string. - * - * @param str String to match the next token with. - * @return True if the next token matches, false otherwise. - * @throws NoSuchElementException - */ - public boolean nextStringEquals(String str) throws NoSuchElementException { - int offset = mCurrentOffset; - int length = advance(); - if (str.length() != length) { - return false; - } - for (int i = 0; i < str.length(); i++) { - if (str.charAt(i) != mData[offset]) { - return false; - } - offset++; - } - return true; - } - - /** - * @return The next token, parsed as an integer. - * @throws NoSuchElementException - */ - public int nextInt() throws NoSuchElementException { - throwIfNotReset(); - throwIfDelimiterNotSet(); - int offset = mCurrentOffset; - int length = advance(); - int value = parseInt(mData, offset, offset + length); - return value; - } - - /** - * Move to the next token. - * - * @throws NoSuchElementException - */ - public void skip() throws NoSuchElementException { - throwIfNotReset(); - throwIfDelimiterNotSet(); - advance(); - } - - private int advance() throws NoSuchElementException { - throwIfNotReset(); - throwIfDelimiterNotSet(); - if (mTotalLength <= mCurrentOffset) { - throw new NoSuchElementException( - "Reading past end of input stream at " + mCurrentOffset + "."); - } - int index = indexOf(mData, mCurrentOffset, mTotalLength, mDelimiter); - if (index == -1) { - int length = mTotalLength - mCurrentOffset; - mCurrentOffset = mTotalLength; - return length; - } else { - int length = index - mCurrentOffset; - mCurrentOffset = index + 1; - return length; - } - } - - private static int parseInt(byte[] buffer, int start, int end) throws NumberFormatException { - int radix = 10; - int result = 0; - while (start < end) { - int digit = buffer[start++] - '0'; - if (digit < 0 || digit > 9) { - throw new NumberFormatException("Invalid int in buffer at " + (start - 1) + "."); - } - int next = result * radix + digit; - result = next; - } - return result; - } - - private static int indexOf(byte[] data, int start, int end, char ch) { - for (int i = start; i < end; i++) { - if (data[i] == ch) { - return i; - } - } - return -1; - } -} diff --git a/library/src/main/java/com/pedro/library/network/ConnectionClassManager.java b/library/src/main/java/com/pedro/library/network/ConnectionClassManager.java deleted file mode 100644 index 4bd84ae30..000000000 --- a/library/src/main/java/com/pedro/library/network/ConnectionClassManager.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.network; - -/** - *

- * Class used to calculateViewPort the approximate bandwidth of a user's connection. - *

- *

- * This class notifies all subscribed {@link ConnectionClassStateChangeListener} with the new - * ConnectionClass when the network's ConnectionClass changes. - *

- */ - -@Deprecated -public class ConnectionClassManager { - - private static final int BYTES_TO_BITS = 8; - - /** Current bandwidth of the user's connection depending upon the response. */ - private ConnectionClassStateChangeListener listener; - /** - * The lower bound for measured bandwidth in bits/ms. Readings - * lower than this are treated as effectively zero (therefore ignored). - */ - static final long BANDWIDTH_LOWER_BOUND = 10; - - // Singleton. - private static class ConnectionClassManagerHolder { - public static final ConnectionClassManager instance = new ConnectionClassManager(); - } - - /** - * Retrieval method for the DownloadBandwidthManager singleton. - * - * @return The singleton instance of DownloadBandwidthManager. - */ - public static ConnectionClassManager getInstance() { - return ConnectionClassManagerHolder.instance; - } - - // Force constructor to be private. - private ConnectionClassManager() { - } - - /** - * Adds bandwidth to the current filtered latency counter. Sends a broadcast to all - * {@link ConnectionClassStateChangeListener} if the counter moves from one bucket - * to another (i.e. poor bandwidth -> moderate bandwidth). - */ - public synchronized void addBandwidth(long bytes, long timeInMs) { - - //Ignore garbage values. - if (timeInMs == 0 || (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS < BANDWIDTH_LOWER_BOUND) { - return; - } - double bandwidth = (bytes) * 1.0 / (timeInMs) * BYTES_TO_BITS; - if (listener != null) listener.onBandwidthStateChange(bandwidth); - } - - /** - * Interface for listening to when ConnectionClassManager - * changes state. - */ - public interface ConnectionClassStateChangeListener { - /** - * The method that will be called when ConnectionClassManager - * changes ConnectionClass. - */ - void onBandwidthStateChange(double bandwidth); - } - - /** - * Method for adding new listeners to this class. - * - * @param listener {@link ConnectionClassStateChangeListener} to add as a listener. - */ - public void register(ConnectionClassStateChangeListener listener) { - this.listener = listener; - } - - /** - * Method for removing listeners from this class. - */ - public void remove() { - listener = null; - } -} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/network/LineBufferReader.java b/library/src/main/java/com/pedro/library/network/LineBufferReader.java deleted file mode 100644 index bf68f56d7..000000000 --- a/library/src/main/java/com/pedro/library/network/LineBufferReader.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.network; - -import java.io.FileInputStream; -import java.io.IOException; - -/** - * Class for reading {@code /proc/net/xt_qtaguid/stats} line by line with a small, - * reusable byte buffer. - */ - -@Deprecated -class LineBufferReader { - - private byte[] mFileBuffer; - private FileInputStream mInputStream; - private int mFileBufIndex; - private int mBytesInBuffer; - - public LineBufferReader() { - mFileBuffer = new byte[512]; - } - - /** - * Sets the FileInputStream for reading. - * - * @param is The FileInputStream to set. - */ - public void setFileStream(FileInputStream is) { - mInputStream = is; - mBytesInBuffer = 0; - mFileBufIndex = 0; - } - - /** - * @param lineBuffer The buffer to fill with the current line. - * @return The index in the buffer at which the line terminates. - */ - public int readLine(byte[] lineBuffer) throws IOException { - if (mFileBufIndex >= mBytesInBuffer) { - mBytesInBuffer = mInputStream.read(mFileBuffer); - mFileBufIndex = 0; - } - int i; - for (i = 0; mBytesInBuffer != -1 && i < lineBuffer.length && mFileBuffer[mFileBufIndex] != '\n'; - i++) { - lineBuffer[i] = mFileBuffer[mFileBufIndex]; - mFileBufIndex++; - if (mFileBufIndex >= mBytesInBuffer) { - mBytesInBuffer = mInputStream.read(mFileBuffer); - mFileBufIndex = 0; - } - } - // Move past the newline character. - mFileBufIndex++; - // If there are no more bytes to be read into the buffer, - // we have reached the end of this file. Exit. - if (mBytesInBuffer == -1) { - return -1; - } - return i; - } - - /** - * Skips a line in the current file stream. - */ - public void skipLine() throws IOException { - if (mFileBufIndex >= mBytesInBuffer) { - mBytesInBuffer = mInputStream.read(mFileBuffer); - mFileBufIndex = 0; - } - for (int i = 0; mBytesInBuffer != -1 && mFileBuffer[mFileBufIndex] != '\n'; i++) { - mFileBufIndex++; - if (mFileBufIndex >= mBytesInBuffer) { - mBytesInBuffer = mInputStream.read(mFileBuffer); - mFileBufIndex = 0; - } - } - // Move past the newline character. - mFileBufIndex++; - } -} diff --git a/library/src/main/java/com/pedro/library/network/QTagTxParser.java b/library/src/main/java/com/pedro/library/network/QTagTxParser.java deleted file mode 100644 index 28e15bc6d..000000000 --- a/library/src/main/java/com/pedro/library/network/QTagTxParser.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.network; - -import android.os.StrictMode; -import android.util.Log; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.NoSuchElementException; - -/** - * Class for parsing total number of downloaded bytes - * from {@code /proc/net/xt_qtaguid/stats}. - */ - -@Deprecated -class QTagTxParser { - private static final String TAG = "QTagParser"; - private static final String QTAGUID_UID_STATS = "/proc/net/xt_qtaguid/stats"; - - private static final ThreadLocal sLineBuffer = new ThreadLocal() { - @Override - public byte[] initialValue() { - return new byte[512]; - } - }; - - private static long sPreviousBytes = -1; - private static LineBufferReader sStatsReader = new LineBufferReader(); - private static ByteArrayScanner sScanner = new ByteArrayScanner(); - public static QTagTxParser sInstance; - - public static synchronized QTagTxParser getInstance() { - if (sInstance == null) { - sInstance = new QTagTxParser(QTAGUID_UID_STATS); - } - return sInstance; - } - - private String mPath; - - // @VisibleForTesting - public QTagTxParser(String path) { - mPath = path; - } - - /** - * Reads the qtaguid file and returns a difference from the previous read. - * - * @param uid The target uid to read bytes downloaded for. - * @return The difference between the current number of bytes downloaded and - */ - public long parseDataUsageForUidAndTag(int uid) { - // The format of each line is - // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes - // (There are many more fields but we are not interested in them) - // For us parts: 1, 2, 3 are to see if the line is relevant - // and part 5 is the received bytes - // (part numbers start from 0) - - // Permit disk reads here, as /proc/net/xt_qtaguid/stats isn't really "on - // disk" and should be fast. - StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); - try { - long tagTxBytes = 0; - - FileInputStream fis = new FileInputStream(mPath); - sStatsReader.setFileStream(fis); - byte[] buffer = sLineBuffer.get(); - - try { - int length; - sStatsReader.skipLine(); // skip first line (headers) - - int line = 2; - while ((length = sStatsReader.readLine(buffer)) != -1) { - try { - - // Content is arranged in terms of: - // idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes - // rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets - // tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets - - // The ones we're interested in are: - // idx - ignore - // interface, filter out local interface ("lo") - // tag - ignore - // uid_tag_int, match it with the UID of interest - // cnt_set - ignore - // rx_bytes - - sScanner.reset(buffer, length); - sScanner.useDelimiter(' '); - - sScanner.skip(); - if (sScanner.nextStringEquals("lo")) { - continue; - } - sScanner.skip(); - if (sScanner.nextInt() != uid) { - continue; - } - sScanner.skip(); - sScanner.skip(); - sScanner.skip(); - int txBytes = sScanner.nextInt(); - tagTxBytes += txBytes; - line++; - // If the line is incorrectly formatted, ignore the line. - } catch (NumberFormatException e) { - Log.e(TAG, "Cannot parse byte count at line" + line + "."); - continue; - } catch (NoSuchElementException e) { - Log.e(TAG, "Invalid number of tokens on line " + line + "."); - continue; - } - } - } finally { - fis.close(); - } - - if (sPreviousBytes == -1) { - sPreviousBytes = tagTxBytes; - return -1; - } - long diff = tagTxBytes - sPreviousBytes; - sPreviousBytes = tagTxBytes; - return diff; - } catch (IOException e) { - Log.e(TAG, - "Error reading from /proc/net/xt_qtaguid/stats. Please check if this file exists."); - } finally { - StrictMode.setThreadPolicy(savedPolicy); - } - - // Return -1 upon error. - return -1; - } -} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/network/UploadBandwidthSampler.java b/library/src/main/java/com/pedro/library/network/UploadBandwidthSampler.java deleted file mode 100644 index 33b825b73..000000000 --- a/library/src/main/java/com/pedro/library/network/UploadBandwidthSampler.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2023 pedroSG94. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.pedro.library.network; - -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Looper; -import android.os.Message; -import android.os.Process; -import android.os.SystemClock; - -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Class used to read from the file {@code /proc/net/xt_qtaguid/stats} periodically, in order to - * determine a ConnectionClass. - */ - -@Deprecated -public class UploadBandwidthSampler { - - /** - * Time between polls in ms. - */ - static final long SAMPLE_TIME = 1000; - - /** - * The DownloadBandwidthManager that keeps track of the moving average and ConnectionClass. - */ - private final ConnectionClassManager mConnectionClassManager; - - private AtomicInteger mSamplingCounter; - - private Handler mHandler; - private HandlerThread mThread; - - private long mLastTimeReading; - - // Singleton. - private static class UploadBandwidthSamplerHolder { - public static final UploadBandwidthSampler instance = - new UploadBandwidthSampler(ConnectionClassManager.getInstance()); - } - - /** - * Retrieval method for the DeviceBandwidthSampler singleton. - * - * @return The singleton instance of DeviceBandwidthSampler. - */ - public static UploadBandwidthSampler getInstance() { - return UploadBandwidthSamplerHolder.instance; - } - - private UploadBandwidthSampler(ConnectionClassManager connectionClassManager) { - mConnectionClassManager = connectionClassManager; - mSamplingCounter = new AtomicInteger(); - mThread = new HandlerThread("ParseThread"); - mThread.start(); - mHandler = new SamplingHandler(mThread.getLooper()); - } - - /** - * Method call to start sampling for download bandwidth. - */ - public void startSampling() { - if (mSamplingCounter.getAndIncrement() == 0) { - mHandler.sendEmptyMessage(SamplingHandler.MSG_START); - mLastTimeReading = SystemClock.elapsedRealtime(); - } - } - - /** - * Finish sampling and prevent further changes to the - * ConnectionClass until another timer is started. - */ - public void stopSampling() { - if (mSamplingCounter.decrementAndGet() == 0) { - mHandler.sendEmptyMessage(SamplingHandler.MSG_STOP); - } - } - - private class SamplingHandler extends Handler { - static final int MSG_START = 1; - static final int MSG_STOP = 2; - - public SamplingHandler(Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_START: - addSample(); - sendEmptyMessageDelayed(MSG_START, SAMPLE_TIME); - break; - case MSG_STOP: - addSample(); - removeMessages(MSG_START); - break; - default: - throw new IllegalArgumentException("Unknown what=" + msg.what); - } - } - - /** - * Method for polling for the change in total bytes since last update and - * adding it to the BandwidthManager. - */ - private void addSample() { - long byteDiff = QTagTxParser.getInstance().parseDataUsageForUidAndTag(Process.myUid()); - synchronized (this) { - long curTimeReading = SystemClock.elapsedRealtime(); - if (byteDiff != -1) { - mConnectionClassManager.addBandwidth(byteDiff, curTimeReading - mLastTimeReading); - } - mLastTimeReading = curTimeReading; - } - } - } - - /** - * @return True if there are still threads which are sampling, false otherwise. - */ - public boolean isSampling() { - return (mSamplingCounter.get() != 0); - } -} \ No newline at end of file diff --git a/library/src/main/java/com/pedro/library/util/SensorRotationManager.java b/library/src/main/java/com/pedro/library/util/SensorRotationManager.java index 2922443db..da83e2ec0 100644 --- a/library/src/main/java/com/pedro/library/util/SensorRotationManager.java +++ b/library/src/main/java/com/pedro/library/util/SensorRotationManager.java @@ -19,6 +19,7 @@ import android.content.Context; import android.hardware.SensorManager; import android.view.OrientationEventListener; + import com.pedro.encoder.input.video.CameraHelper; public class SensorRotationManager { diff --git a/library/src/main/java/com/pedro/library/view/GlStreamInterface.kt b/library/src/main/java/com/pedro/library/view/GlStreamInterface.kt index 91ae3673e..3f8fa33cc 100644 --- a/library/src/main/java/com/pedro/library/view/GlStreamInterface.kt +++ b/library/src/main/java/com/pedro/library/view/GlStreamInterface.kt @@ -29,7 +29,6 @@ import com.pedro.encoder.input.gl.SurfaceManager import com.pedro.encoder.input.gl.render.MainRender import com.pedro.encoder.input.gl.render.filters.BaseFilterRender import com.pedro.encoder.input.gl.render.filters.NoFilterRender -import com.pedro.encoder.input.video.CameraHelper import com.pedro.encoder.input.video.FpsLimiter import com.pedro.encoder.utils.gl.AspectRatioMode import com.pedro.encoder.utils.gl.GlUtil