From 0346363b98adb8e969ba6c4ff9e9a0f69706f5f3 Mon Sep 17 00:00:00 2001
From: kingdo10 <275526951+kingdo10@users.noreply.github.com>
Date: Mon, 1 Jun 2026 11:22:29 +0100
Subject: [PATCH] Local Mode - MP4 | Audio only mode
---
.../ui/tabs/stream/StreamTabContent.kt | 6 +-
.../common/module/StreamingModule.kt | 4 +
mjpeg/src/main/AndroidManifest.xml | 6 +-
mjpeg/src/main/assets/index.html | 227 ++++++++-
.../screenstream/mjpeg/MjpegKoinModule.kt | 2 +-
.../mjpeg/MjpegStreamingModule.kt | 18 +-
.../screenstream/mjpeg/internal/HttpServer.kt | 157 +++++-
.../mjpeg/internal/HttpServerData.kt | 9 +-
.../mjpeg/internal/MjpegStreamingService.kt | 412 ++++++++++++++-
.../mjpeg/internal/audio/MjpegAudioCapture.kt | 362 +++++++++++++
.../mjpeg/internal/audio/MjpegAudioEncoder.kt | 295 +++++++++++
.../internal/audio/MjpegAudioEncoderUtils.kt | 91 ++++
.../mjpeg/internal/audio/MjpegAudioModels.kt | 27 +
.../mjpeg/internal/audio/MjpegAudioSource.kt | 48 ++
.../mjpeg/internal/audio/MjpegAudioSources.kt | 260 ++++++++++
.../mjpeg/internal/audio/MjpegMasterClock.kt | 31 ++
.../mjpeg/internal/audio/OggOpusMuxer.kt | 97 ++++
.../mjpeg/internal/mp4/Mp4AudioEncoder.kt | 306 +++++++++++
.../internal/mp4/Mp4AudioEncoderUtils.kt | 67 +++
.../mjpeg/internal/mp4/Mp4BoxWriter.kt | 475 ++++++++++++++++++
.../mjpeg/internal/mp4/Mp4Capture.kt | 214 ++++++++
.../mjpeg/internal/mp4/Mp4EglRenderer.kt | 375 ++++++++++++++
.../mjpeg/internal/mp4/Mp4Models.kt | 93 ++++
.../mjpeg/internal/mp4/Mp4VideoEncoder.kt | 354 +++++++++++++
.../internal/mp4/Mp4VideoEncoderUtils.kt | 189 +++++++
.../mjpeg/settings/MjpegSettings.kt | 52 ++
.../mjpeg/settings/MjpegSettingsImpl.kt | 58 +++
.../mjpeg/ui/MjpegMainScreenUI.kt | 21 +
.../mjpeg/ui/main/cards/AudioSettingsCard.kt | 413 +++++++++++++++
.../ui/main/cards/GeneralSettingsCard.kt | 29 ++
.../mjpeg/ui/main/cards/ImageSettingsCard.kt | 222 +++++---
.../ui/main/settings/general/AudioOnly.kt | 25 +
.../ui/main/settings/general/StreamFormat.kt | 54 ++
.../ui/main/settings/image/VideoEncoding.kt | 139 +++++
mjpeg/src/main/res/drawable/mic_24px.xml | 10 +
mjpeg/src/main/res/drawable/mic_off_24px.xml | 10 +
.../main/res/drawable/mobile_speaker_24px.xml | 10 +
.../src/main/res/drawable/volume_off_24px.xml | 10 +
mjpeg/src/main/res/values-af/strings.xml | 35 +-
mjpeg/src/main/res/values-am/strings.xml | 35 +-
mjpeg/src/main/res/values-ar/strings.xml | 35 +-
mjpeg/src/main/res/values-bn/strings.xml | 35 +-
mjpeg/src/main/res/values-de/strings.xml | 35 +-
mjpeg/src/main/res/values-es/strings.xml | 35 +-
mjpeg/src/main/res/values-eu/strings.xml | 35 +-
mjpeg/src/main/res/values-fr/strings.xml | 35 +-
mjpeg/src/main/res/values-hi/strings.xml | 35 +-
mjpeg/src/main/res/values-in/strings.xml | 35 +-
mjpeg/src/main/res/values-it/strings.xml | 35 +-
mjpeg/src/main/res/values-ja/strings.xml | 35 +-
mjpeg/src/main/res/values-jv/strings.xml | 35 +-
mjpeg/src/main/res/values-ka/strings.xml | 35 +-
mjpeg/src/main/res/values-nl/strings.xml | 35 +-
mjpeg/src/main/res/values-pl/strings.xml | 35 +-
mjpeg/src/main/res/values-pt/strings.xml | 35 +-
mjpeg/src/main/res/values-ru/strings.xml | 35 +-
mjpeg/src/main/res/values-tr/strings.xml | 35 +-
mjpeg/src/main/res/values-uk/strings.xml | 35 +-
mjpeg/src/main/res/values-ur/strings.xml | 35 +-
mjpeg/src/main/res/values-uz/strings.xml | 35 +-
mjpeg/src/main/res/values-zh-rTW/strings.xml | 35 +-
mjpeg/src/main/res/values-zh/strings.xml | 35 +-
mjpeg/src/main/res/values/strings.xml | 31 +-
.../screenstream/rtsp/RtspStreamingModule.kt | 1 +
.../rtsp/internal/RtspStreamingService.kt | 461 ++++++++++++-----
.../rtsp/internal/audio/AudioEncoder.kt | 14 +-
.../rtsp/internal/rtsp/RtcpReporter.kt | 6 +-
.../rtsp/internal/rtsp/core/SdpBuilder.kt | 20 +-
.../rtsp/server/RtspServerConnection.kt | 18 +-
.../rtsp/server/RtspServerMessageHandler.kt | 2 +-
.../rtsp/settings/RtspSettings.kt | 3 +
.../rtsp/settings/RtspSettingsImpl.kt | 4 +
.../screenstream/rtsp/ui/RtspMainScreenUI.kt | 6 +
.../rtsp/ui/main/cards/ServerSettingsCard.kt | 10 +
.../rtsp/ui/main/settings/server/AudioOnly.kt | 22 +
rtsp/src/main/res/values-af/strings.xml | 3 +
rtsp/src/main/res/values-am/strings.xml | 3 +
rtsp/src/main/res/values-ar/strings.xml | 3 +
rtsp/src/main/res/values-bn/strings.xml | 3 +
rtsp/src/main/res/values-de/strings.xml | 3 +
rtsp/src/main/res/values-es/strings.xml | 3 +
rtsp/src/main/res/values-eu/strings.xml | 3 +
rtsp/src/main/res/values-fr/strings.xml | 3 +
rtsp/src/main/res/values-hi/strings.xml | 3 +
rtsp/src/main/res/values-in/strings.xml | 3 +
rtsp/src/main/res/values-it/strings.xml | 3 +
rtsp/src/main/res/values-ja/strings.xml | 3 +
rtsp/src/main/res/values-jv/strings.xml | 3 +
rtsp/src/main/res/values-ka/strings.xml | 3 +
rtsp/src/main/res/values-nl/strings.xml | 3 +
rtsp/src/main/res/values-pl/strings.xml | 3 +
rtsp/src/main/res/values-pt/strings.xml | 3 +
rtsp/src/main/res/values-ru/strings.xml | 3 +
rtsp/src/main/res/values-tr/strings.xml | 3 +
rtsp/src/main/res/values-uk/strings.xml | 3 +
rtsp/src/main/res/values-ur/strings.xml | 3 +
rtsp/src/main/res/values-uz/strings.xml | 3 +
rtsp/src/main/res/values-zh-rTW/strings.xml | 3 +
rtsp/src/main/res/values-zh/strings.xml | 3 +
rtsp/src/main/res/values/strings.xml | 2 +
100 files changed, 6395 insertions(+), 295 deletions(-)
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegAudioCapture.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegAudioEncoder.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegAudioEncoderUtils.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegAudioModels.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegAudioSource.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegAudioSources.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/MjpegMasterClock.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/audio/OggOpusMuxer.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4AudioEncoder.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4AudioEncoderUtils.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4BoxWriter.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4Capture.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4EglRenderer.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4Models.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4VideoEncoder.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/internal/mp4/Mp4VideoEncoderUtils.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/ui/main/cards/AudioSettingsCard.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/ui/main/settings/general/AudioOnly.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/ui/main/settings/general/StreamFormat.kt
create mode 100644 mjpeg/src/main/java/info/dvkr/screenstream/mjpeg/ui/main/settings/image/VideoEncoding.kt
create mode 100644 mjpeg/src/main/res/drawable/mic_24px.xml
create mode 100644 mjpeg/src/main/res/drawable/mic_off_24px.xml
create mode 100644 mjpeg/src/main/res/drawable/mobile_speaker_24px.xml
create mode 100644 mjpeg/src/main/res/drawable/volume_off_24px.xml
create mode 100644 rtsp/src/main/java/info/dvkr/screenstream/rtsp/ui/main/settings/server/AudioOnly.kt
diff --git a/app/src/main/java/info/dvkr/screenstream/ui/tabs/stream/StreamTabContent.kt b/app/src/main/java/info/dvkr/screenstream/ui/tabs/stream/StreamTabContent.kt
index 08d06b2d..47a2253c 100644
--- a/app/src/main/java/info/dvkr/screenstream/ui/tabs/stream/StreamTabContent.kt
+++ b/app/src/main/java/info/dvkr/screenstream/ui/tabs/stream/StreamTabContent.kt
@@ -142,6 +142,8 @@ private fun ModuleSelectorRow(
onModuleSelect: (StreamingModule.Id) -> Unit,
modifier: Modifier = Modifier
) {
+ val moduleName = module.name()
+
Row(
modifier = modifier.selectable(
selected = module.id == selectedModuleId,
@@ -155,7 +157,7 @@ private fun ModuleSelectorRow(
RadioButton(selected = module.id == selectedModuleId, onClick = null, modifier = Modifier.padding(start = 8.dp))
Text(
- text = stringResource(id = module.nameResource),
+ text = moduleName,
modifier = Modifier
.padding(start = 16.dp)
.weight(1F),
@@ -180,7 +182,7 @@ private fun ModuleSelectorRow(
},
title = {
Text(
- text = stringResource(id = module.nameResource),
+ text = moduleName,
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center
)
diff --git a/common/src/main/java/info/dvkr/screenstream/common/module/StreamingModule.kt b/common/src/main/java/info/dvkr/screenstream/common/module/StreamingModule.kt
index 551177e2..c1eb598d 100644
--- a/common/src/main/java/info/dvkr/screenstream/common/module/StreamingModule.kt
+++ b/common/src/main/java/info/dvkr/screenstream/common/module/StreamingModule.kt
@@ -8,6 +8,7 @@ import androidx.annotation.StringRes
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import kotlinx.coroutines.flow.Flow
import org.koin.core.scope.Scope
@@ -50,6 +51,9 @@ public interface StreamingModule {
@get:StringRes
public val detailsResource: Int
+ @Composable
+ public fun name(): String = stringResource(nameResource)
+
@Composable
public fun StreamUIContent(windowWidthSizeClass: WindowWidthSizeClass, modifier: Modifier)
diff --git a/mjpeg/src/main/AndroidManifest.xml b/mjpeg/src/main/AndroidManifest.xml
index a1333a13..5ef3799d 100644
--- a/mjpeg/src/main/AndroidManifest.xml
+++ b/mjpeg/src/main/AndroidManifest.xml
@@ -5,6 +5,8 @@