Skip to content

Commit d02c5a3

Browse files
committed
add capture time metadata
1 parent e45a5d1 commit d02c5a3

File tree

3 files changed

+16
-17
lines changed

3 files changed

+16
-17
lines changed

pulsebeam-agent/src/actor.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ impl AgentActor {
307307
Some((mid, frame)) = self.senders.next() => {
308308
if let Some(writer) = self.rtc.writer(mid) {
309309
let pt = writer.payload_params().nth(0).unwrap().pt();
310-
let _ = writer.write(pt, Instant::now().into(), frame.ts, frame.data);
310+
let _ = writer.write(pt, frame.capture_time.into(), frame.ts, frame.data);
311311
}
312312
}
313313
}
@@ -321,10 +321,7 @@ impl AgentActor {
321321
Event::MediaData(data) => {
322322
// Network -> User
323323
if let Some(tx) = self.receivers.get(&data.mid) {
324-
let _ = tx.try_send(MediaFrame {
325-
data: Bytes::from(data.data),
326-
ts: data.time,
327-
});
324+
let _ = tx.try_send(data.into());
328325
}
329326
}
330327

pulsebeam-agent/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
pub use bytes::Bytes;
22
pub use str0m::Candidate;
33
pub use str0m::media::{MediaData, MediaKind, MediaTime};
4+
use tokio::time::Instant;
45

56
pub mod actor;
67
pub mod media;
78
pub mod signaling;
8-
// pub mod rt;
99

1010
pub struct MediaFrame {
1111
pub ts: MediaTime,
1212
pub data: Bytes,
13+
pub capture_time: Instant,
1314
}
1415

1516
impl From<MediaData> for MediaFrame {
1617
fn from(value: MediaData) -> Self {
1718
Self {
1819
ts: value.time,
1920
data: value.data.into(),
21+
capture_time: value.network_time.into(),
2022
}
2123
}
2224
}

pulsebeam-cli/src/main.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use pulsebeam_agent::{
55
signaling::HttpSignalingClient,
66
};
77
use std::time::Duration;
8-
use tokio::time::Instant;
98

109
const RAW_H264: &[u8] = include_bytes!("video.h264");
1110

@@ -33,20 +32,21 @@ async fn main() {
3332
fn handle_sender(sender: TrackSender) {
3433
tokio::spawn(async move {
3534
let mut looper = H264Looper::new(RAW_H264);
36-
let mut interval = tokio::time::interval(Duration::from_nanos(1_000_000_000 / 30));
37-
let start = Instant::now();
38-
loop {
39-
let now = interval.tick().await;
40-
let elapsed = now - start;
41-
42-
// Calculate TS based on actual elapsed time to prevent drift
43-
let ts = (elapsed.as_secs_f64() * 90000.0) as u64;
35+
let frame_duration_90khz = 90000 / 30;
36+
let mut ticker = tokio::time::interval(Duration::from_nanos(1_000_000_000 / 30));
37+
let mut current_ts: u64 = 0;
4438

39+
loop {
40+
let now = ticker.tick().await;
41+
let frame_data = looper.next().unwrap();
4542
let frame = MediaFrame {
46-
ts: MediaTime::from_90khz(ts),
47-
data: looper.next().unwrap(),
43+
ts: MediaTime::from_90khz(current_ts),
44+
data: frame_data,
45+
capture_time: now,
4846
};
47+
4948
sender.try_send(frame);
49+
current_ts += frame_duration_90khz;
5050
}
5151
});
5252
}

0 commit comments

Comments
 (0)