Skip to content

Commit a255e27

Browse files
committed
buncha updates
1 parent 8da8283 commit a255e27

27 files changed

+448
-223
lines changed

app/build.gradle.kts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,12 @@ dependencies {
102102
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
103103
implementation("androidx.activity:activity-compose:1.8.2")
104104

105-
implementation("androidx.camera:camera-core:1.3.3")
106-
implementation("androidx.camera:camera-camera2:1.3.3")
107-
implementation("androidx.camera:camera-lifecycle:1.3.3")
108-
implementation("androidx.camera:camera-video:1.3.3")
109-
implementation("androidx.camera:camera-view:1.3.3")
110-
implementation("androidx.camera:camera-extensions:1.3.3")
105+
implementation("androidx.camera:camera-core:1.4.1")
106+
implementation("androidx.camera:camera-camera2:1.4.1")
107+
implementation("androidx.camera:camera-lifecycle:1.4.1")
108+
implementation("androidx.camera:camera-video:1.4.1")
109+
implementation("androidx.camera:camera-view:1.4.1")
110+
implementation("androidx.camera:camera-extensions:1.4.1")
111111

112112
implementation("androidx.concurrent:concurrent-futures:1.1.0")
113113

app/src/main/go/build_native.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ build_arch() {
8585
# -checklinkname=0 is needed for Go 1.24+ compatibility with anet package
8686
cd cmd/jni
8787
go build -buildmode=c-shared \
88-
-ldflags="-s -w -checklinkname=0 -extldflags '-Wl,-soname,libkinetic.so'" \
88+
-ldflags="-s -w -checklinkname=0 -extldflags '-Wl,-soname,libkinetic.so -Wl,-z,max-page-size=16384'" \
8989
-o "$OUTPUT_DIR/$ARCH/libkinetic.so" \
9090
.
9191
cd ../..

app/src/main/go/build_third_party.sh

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ ANDROID_NDK=/home/kevin/android-ndk-r26d
1414
ANDROID_API=24
1515
ANDROID_PLATFORM=android-$ANDROID_API
1616
CMAKE_C_FLAGS="-fPIC"
17+
CMAKE_SHARED_LINKER_FLAGS="-Wl,-z,max-page-size=16384"
1718
CMAKE_MAKE_PROGRAM=ninja
1819
GOMOBILE_COMMAND=gomobile
1920
CMAKE_COMMAND=cmake
@@ -54,6 +55,7 @@ build_arch() {
5455
-DANDROID_NDK=$ANDROID_NDK \
5556
-DCMAKE_C_FLAGS="$CMAKE_C_FLAGS" \
5657
-DCMAKE_CXX_FLAGS="$CMAKE_C_FLAGS" \
58+
-DCMAKE_SHARED_LINKER_FLAGS="$CMAKE_SHARED_LINKER_FLAGS" \
5759
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
5860
-DCMAKE_MAKE_PROGRAM=$CMAKE_MAKE_PROGRAM \
5961
-GNinja \
@@ -71,7 +73,7 @@ build_arch() {
7173

7274
# Export variables and function for parallel execution
7375
export -f build_arch
74-
export ANDROID_NDK ANDROID_API ANDROID_PLATFORM CMAKE_C_FLAGS CMAKE_MAKE_PROGRAM CMAKE_COMMAND
76+
export ANDROID_NDK ANDROID_API ANDROID_PLATFORM CMAKE_C_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_MAKE_PROGRAM CMAKE_COMMAND
7577
export CC CXX CCACHE_DIR CCACHE_MAXSIZE
7678

7779
# Build all architectures in parallel
@@ -112,10 +114,12 @@ fi
112114
echo "Cleaning up build directories..."
113115
rm -rf third_party/build
114116

115-
# Copy libraries to jniLibs
117+
# Copy libraries to jniLibs (only the main shared libraries, not engine modules)
116118
echo "Copying libraries to jniLibs..."
117119
for abi in arm64-v8a armeabi-v7a x86 x86_64; do
118-
cp -r third_party/output/$abi/lib ../jniLibs/$abi
120+
mkdir -p ../jniLibs/$abi
121+
# Only copy the main .so files, skip subdirectories like engines-3 and ossl-modules
122+
cp third_party/output/$abi/lib/*.so ../jniLibs/$abi/ 2>/dev/null || true
119123
done
120124

121125
echo "Build completed successfully!"

app/src/main/go/whip.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/pion/interceptor"
1616
"github.com/pion/interceptor/pkg/cc"
1717
"github.com/pion/interceptor/pkg/gcc"
18+
"github.com/pion/interceptor/pkg/nack"
1819
"github.com/pion/rtcp"
1920
"github.com/pion/rtp"
2021
"github.com/pion/rtp/codecs"
@@ -48,6 +49,31 @@ type whipTrack struct {
4849
payloadType uint8
4950
}
5051

52+
const (
53+
// Playout delay RTP header extension URI
54+
playoutDelayExtensionURI = "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"
55+
// Extension ID to use (must match what's negotiated in SDP)
56+
playoutDelayExtensionID = 6
57+
// Playout delay values in 10ms units (100 = 1000ms = 1s)
58+
minPlayoutDelay = 100 // 1 second
59+
maxPlayoutDelay = 100 // 1 second
60+
)
61+
62+
// addPlayoutDelayExtension adds the playout delay header extension to an RTP packet
63+
func addPlayoutDelayExtension(pkt *rtp.Packet) {
64+
ext := rtp.PlayoutDelayExtension{
65+
MinDelay: minPlayoutDelay,
66+
MaxDelay: maxPlayoutDelay,
67+
}
68+
payload, err := ext.Marshal()
69+
if err != nil {
70+
return
71+
}
72+
pkt.Header.Extension = true
73+
pkt.Header.ExtensionProfile = 0xBEDE // One-byte header extension
74+
pkt.Header.SetExtension(playoutDelayExtensionID, payload)
75+
}
76+
5177
func NewWHIPSink(url, bearerToken, encodedMediaFormatMimeTypes string) (*WHIPSink, error) {
5278
s := &WHIPSink{
5379
url: url,
@@ -90,8 +116,31 @@ func (s *WHIPSink) connect() error {
90116
return err
91117
}
92118

119+
// Register playout delay header extension for video
120+
if err := m.RegisterHeaderExtension(
121+
webrtc.RTPHeaderExtensionCapability{URI: playoutDelayExtensionURI},
122+
webrtc.RTPCodecTypeVideo,
123+
webrtc.RTPTransceiverDirectionSendonly,
124+
); err != nil {
125+
log.Printf("Warning: failed to register playout delay extension: %v", err)
126+
}
127+
93128
i := &interceptor.Registry{}
94129

130+
// Add NACK generator for packet retransmission (part of FEC strategy)
131+
generatorFactory, err := nack.NewGeneratorInterceptor()
132+
if err != nil {
133+
return err
134+
}
135+
i.Add(generatorFactory)
136+
137+
// Add NACK responder to handle retransmission requests
138+
responderFactory, err := nack.NewResponderInterceptor()
139+
if err != nil {
140+
return err
141+
}
142+
i.Add(responderFactory)
143+
95144
// Create congestion controller with Google Congestion Control
96145
// Initial bitrate: 1 Mbps
97146
congestionController, err := cc.NewInterceptor(func() (cc.BandwidthEstimator, error) {
@@ -402,6 +451,7 @@ func (s *WHIPSink) WriteH264(buf []byte, ptsMicroseconds int64) (int, error) {
402451
packets := videoTrack.packetizer.(rtp.Packetizer).Packetize(videoTrack.sps, 0)
403452
for _, pkt := range packets {
404453
pkt.Header.Timestamp = rtpTimestamp
454+
addPlayoutDelayExtension(pkt)
405455
if err := videoTrack.track.WriteRTP(pkt); err != nil {
406456
return 0, fmt.Errorf("error writing SPS RTP: %v", err)
407457
}
@@ -413,6 +463,7 @@ func (s *WHIPSink) WriteH264(buf []byte, ptsMicroseconds int64) (int, error) {
413463
packets := videoTrack.packetizer.(rtp.Packetizer).Packetize(videoTrack.pps, 0)
414464
for _, pkt := range packets {
415465
pkt.Header.Timestamp = rtpTimestamp
466+
addPlayoutDelayExtension(pkt)
416467
if err := videoTrack.track.WriteRTP(pkt); err != nil {
417468
return 0, fmt.Errorf("error writing PPS RTP: %v", err)
418469
}
@@ -428,6 +479,7 @@ func (s *WHIPSink) WriteH264(buf []byte, ptsMicroseconds int64) (int, error) {
428479
// Override timestamp to use our absolute timestamp
429480
for _, pkt := range packets {
430481
pkt.Header.Timestamp = rtpTimestamp
482+
addPlayoutDelayExtension(pkt)
431483
if err := videoTrack.track.WriteRTP(pkt); err != nil {
432484
return 0, fmt.Errorf("error writing RTP packet: %v", err)
433485
}

app/src/main/java/com/kevmo314/kineticstreamer/AudioVisualizerView.kt

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
package com.kevmo314.kineticstreamer
22

33
import androidx.compose.foundation.Canvas
4-
import androidx.compose.foundation.background
5-
import androidx.compose.foundation.layout.Box
64
import androidx.compose.foundation.layout.size
7-
import androidx.compose.foundation.shape.RoundedCornerShape
8-
import androidx.compose.material3.MaterialTheme
95
import androidx.compose.runtime.Composable
106
import androidx.compose.runtime.LaunchedEffect
117
import androidx.compose.runtime.getValue
128
import androidx.compose.runtime.mutableStateOf
139
import androidx.compose.runtime.remember
1410
import androidx.compose.runtime.setValue
1511
import androidx.compose.ui.Modifier
16-
import androidx.compose.ui.draw.clip
1712
import androidx.compose.ui.geometry.Offset
1813
import androidx.compose.ui.geometry.Size
1914
import androidx.compose.ui.graphics.Color
@@ -26,8 +21,7 @@ fun AudioVisualizerView(
2621
audioLevels: List<Float> = emptyList(),
2722
modifier: Modifier = Modifier,
2823
barCount: Int = 12,
29-
barColor: Color = Color.White,
30-
backgroundColor: Color = Color.Black.copy(alpha = 0.6f)
24+
barColor: Color = Color.White
3125
) {
3226
var displayLevels by remember { mutableStateOf(List(barCount) { 0f }) }
3327

@@ -62,17 +56,10 @@ fun AudioVisualizerView(
6256
}
6357
}
6458

65-
Box(
66-
modifier = modifier
67-
.size(150.dp, 40.dp)
68-
.clip(RoundedCornerShape(8.dp))
69-
.background(backgroundColor)
59+
Canvas(
60+
modifier = modifier.size(150.dp, 40.dp)
7061
) {
71-
Canvas(
72-
modifier = Modifier.size(150.dp, 40.dp)
73-
) {
74-
drawAudioBars(displayLevels, barColor)
75-
}
62+
drawAudioBars(displayLevels, barColor)
7663
}
7764
}
7865

app/src/main/java/com/kevmo314/kineticstreamer/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class MainActivity : ComponentActivity() {
8282
override fun onCreate(savedInstanceState: Bundle?) {
8383
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
8484
enableEdgeToEdge()
85-
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
85+
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
8686

8787
super.onCreate(savedInstanceState)
8888

0 commit comments

Comments
 (0)