From 8a455a1fcea164f2c5b5f079ed3cbf910523a1a5 Mon Sep 17 00:00:00 2001 From: pedroSG94 Date: Sat, 18 Jul 2026 14:04:50 +0200 Subject: [PATCH 1/3] add setCustomMetadata method to rtmp --- .../com/pedro/library/util/streamclient/RtmpStreamClient.kt | 4 ++++ rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManager.kt | 1 + rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf0.kt | 3 +++ rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt | 4 ++++ 4 files changed, 12 insertions(+) diff --git a/library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt b/library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt index 9a6e4314b3..77f72f432a 100644 --- a/library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt +++ b/library/src/main/java/com/pedro/library/util/streamclient/RtmpStreamClient.kt @@ -213,6 +213,10 @@ class RtmpStreamClient( rtmpClient.setCustomAmfObject(amfObject) } + fun setCustomMetadata(metadata: Map) { + rtmpClient.setCustomMetadata(metadata) + } + /** * Should notify onConnectionFailed if read packet from the server failed */ diff --git a/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManager.kt b/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManager.kt index e6dd2f9007..07ea708a74 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManager.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManager.kt @@ -62,6 +62,7 @@ abstract class CommandsManager { var audioDisabled = false var videoDisabled = false var customAmfObject: Map = emptyMap() + var customMetadata: Map = emptyMap() private var bytesRead = 0 private var lastAcknowledgementSequence = 0 diff --git a/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf0.kt b/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf0.kt index 74d1916b57..ab44079b02 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf0.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf0.kt @@ -131,6 +131,9 @@ class CommandsManagerAmf0: CommandsManager() { amfEcmaArray.setProperty("stereo", isStereo) } amfEcmaArray.setProperty("filesize", 0.0) + customMetadata.forEach { (key, value) -> + amfEcmaArray.setProperty(key, value) + } metadata.addData(amfEcmaArray) metadata.writeHeader(socket) diff --git a/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt b/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt index 0a292df6d8..50263c4c99 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/rtmp/RtmpClient.kt @@ -196,6 +196,10 @@ class RtmpClient(private val connectChecker: ConnectChecker) { commandsManager.customAmfObject = amfObject } + fun setCustomMetadata(metadata: Map) { + commandsManager.customMetadata = metadata + } + fun setAuthorization(user: String?, password: String?) { commandsManager.setAuth(user, password) } From e56894c60186116d4e1ec99454e9f352acb2f16c Mon Sep 17 00:00:00 2001 From: pedroSG94 Date: Sat, 18 Jul 2026 14:22:06 +0200 Subject: [PATCH 2/3] add custommetadata to amf3 --- .../java/com/pedro/rtmp/amf/v0/AmfObject.kt | 2 +- .../java/com/pedro/rtmp/amf/v3/Amf3Integer.kt | 2 +- .../java/com/pedro/rtmp/amf/v3/Amf3Object.kt | 57 +++++++++---------- .../pedro/rtmp/rtmp/CommandsManagerAmf3.kt | 3 + 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/rtmp/src/main/java/com/pedro/rtmp/amf/v0/AmfObject.kt b/rtmp/src/main/java/com/pedro/rtmp/amf/v0/AmfObject.kt index a6d0a93380..931cd54a7e 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/amf/v0/AmfObject.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/amf/v0/AmfObject.kt @@ -60,7 +60,7 @@ open class AmfObject(private val properties: LinkedHashMap = open fun setProperty(name: String, data: AmfData) = putProperty(name, data) open fun setProperty(name: String, data: Any) { - val newValue= when (data) { + val newValue = when (data) { is String -> AmfString(data) is Int -> AmfNumber(data.toDouble()) is Long -> AmfNumber(data.toDouble()) diff --git a/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt b/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt index 92500d1539..74875839df 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt @@ -22,7 +22,7 @@ import java.io.OutputStream /** * Created by pedro on 29/04/21. */ -class Amf3Integer: Amf3Data() { +class Amf3Integer(value: Int): Amf3Data() { override fun readBody(input: InputStream) { TODO("Not yet implemented") diff --git a/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Object.kt b/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Object.kt index 6f6b8ad99e..d7109b76b0 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Object.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Object.kt @@ -16,6 +16,7 @@ package com.pedro.rtmp.amf.v3 +import com.pedro.rtmp.amf.v0.AmfNull import java.io.InputStream import java.io.OutputStream @@ -35,43 +36,37 @@ open class Amf3Object(private val properties: HashMap = Li return null } - open fun setProperty(name: String, data: String) { - val key = Amf3String(name) - val value = Amf3String(data) - properties[key] = value - bodySize += key.getSize() - bodySize += value.getSize() + 1 - } + open fun setProperty(name: String, data: String) = putProperty(name, Amf3String(data)) - open fun setProperty(name: String, data: Boolean) { - val key = Amf3String(name) - val value = if (data) Amf3True() else Amf3False() - properties[key] = value - bodySize += key.getSize() - bodySize += value.getSize() + 1 - } + open fun setProperty(name: String, data: Boolean) = putProperty(name, if (data) Amf3True() else Amf3False()) - open fun setProperty(name: String, data: Amf3Data) { - val key = Amf3String(name) - properties[key] = data - bodySize += key.getSize() - bodySize += data.getSize() + 1 - } + open fun setProperty(name: String, data: Amf3Data) = putProperty(name, data) - open fun setProperty(name: String) { - val key = Amf3String(name) - val value = Amf3Null() - properties[key] = value - bodySize += key.getSize() - bodySize += value.getSize() + 1 + open fun setProperty(name: String) = putProperty(name, Amf3Null()) + + open fun setProperty(name: String, data: Double) = putProperty(name, Amf3Double(data)) + + open fun setProperty(name: String, data: Any) { + val newValue = when (data) { + is String -> Amf3String(data) + is Int -> Amf3Integer(data) + is Double -> Amf3Double(data) + is Float -> Amf3Double(data.toDouble()) + is Boolean -> if (data) Amf3True() else Amf3False() + is Amf3Data -> data + else -> throw IllegalArgumentException("Unsupported value type: ${data::class.java.name}") + } + putProperty(name, newValue) } - open fun setProperty(name: String, data: Double) { + private fun putProperty(name: String, value: Amf3Data) { val key = Amf3String(name) - val value = Amf3Double(data) - properties[key] = value - bodySize += key.getSize() - bodySize += value.getSize() + 1 + val previous = properties.put(key, value) + bodySize += if (previous != null) { + value.getSize() - previous.getSize() + } else { + key.getSize() + value.getSize() + 1 + } } diff --git a/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf3.kt b/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf3.kt index 0597affa57..6c6fa5b934 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf3.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/rtmp/CommandsManagerAmf3.kt @@ -118,6 +118,9 @@ class CommandsManagerAmf3: CommandsManager() { amfEcmaArray.setProperty("stereo", isStereo) } amfEcmaArray.setProperty("filesize", 0.0) + customMetadata.forEach { (key, value) -> + amfEcmaArray.setProperty(key, value) + } metadata.addData(amfEcmaArray) metadata.writeHeader(socket) From 1fb855d89e21cb48eb21b2f4ac1b7736bcc80b56 Mon Sep 17 00:00:00 2001 From: pedroSG94 Date: Sat, 18 Jul 2026 14:25:16 +0200 Subject: [PATCH 3/3] fix compilation --- rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt b/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt index 74875839df..fe908fef16 100644 --- a/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt +++ b/rtmp/src/main/java/com/pedro/rtmp/amf/v3/Amf3Integer.kt @@ -22,7 +22,7 @@ import java.io.OutputStream /** * Created by pedro on 29/04/21. */ -class Amf3Integer(value: Int): Amf3Data() { +class Amf3Integer(private val value: Int = 0): Amf3Data() { override fun readBody(input: InputStream) { TODO("Not yet implemented")