Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft-10 #187

Open
wants to merge 118 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
8662ce5
Delete features about Track Stream (#173)
tetter27 Feb 24, 2025
366d5aa
Add message types related to FETCH (#172)
tetter27 Feb 24, 2025
58c756e
Rename SUBSCRIBE_NAMESPACE to SUBSCRIBE_ANNOUNCES (#168)
tetter27 Feb 24, 2025
c63ecce
feat: add FETCH_HEADER type (#175)
tetter27 Feb 24, 2025
3f880f0
create exmples directory
yuki-uchida Feb 25, 2025
ea4e1e8
implement send moqt message
yuki-uchida Feb 25, 2025
fd5eb43
rewrite in typescript
yuki-uchida Feb 25, 2025
3389cbd
modify html
yuki-uchida Feb 25, 2025
028734d
Add WebCodecs definition package
yuki-uchida Feb 25, 2025
c8afd6c
Add type definitions
yuki-uchida Feb 25, 2025
78b71ba
Implement encoder
yuki-uchida Feb 26, 2025
2573c35
Modify test
yuki-uchida Feb 26, 2025
9a5ced9
Modify test
yuki-uchida Feb 26, 2025
ece4a0c
Modify supported versions
yuki-uchida Feb 26, 2025
043b0a3
Modify calling API twice
yuki-uchida Feb 26, 2025
18f04c8
Make wating packet error to info
yuki-uchida Feb 26, 2025
55eedb5
Separate Range class from Subscription class (#177)
tetter27 Feb 26, 2025
a3583f7
Implement Video Decoder
yuki-uchida Feb 26, 2025
7f8c3f8
Remove Subscription Getter Functions and Add Alternative Getter Funct…
tetter27 Feb 27, 2025
377c983
Change Codec to AV1
yuki-uchida Feb 27, 2025
d7937a1
extend multple callbacks
yuki-uchida Feb 28, 2025
5b4c82f
Fix: Downstream objects using the same track alias as upstream (#179)
tetter27 Mar 1, 2025
e43b6f5
Implement Audio sample
yuki-uchida Mar 3, 2025
f036d53
Change GroupId when keyfram is sent
yuki-uchida Mar 3, 2025
fc3046f
Modify variable name
yuki-uchida Mar 3, 2025
cb07755
Merge pull request #180 from nttcom/implement-media-examples
yuki-uchida Mar 3, 2025
2018e4e
Add WebCodecs close
yuki-uchida Mar 3, 2025
9222016
Use HTML value for subscribe message
yuki-uchida Mar 3, 2025
da476df
Fix borrow error for client
yuki-uchida Mar 3, 2025
66191e1
Improve WebCodecs performance
yuki-uchida Mar 3, 2025
8ad6c9d
update WebCodecs type difinitions
yuki-uchida Mar 4, 2025
86fc3b2
Adapt svc and subgroups
yuki-uchida Mar 4, 2025
53630eb
Change ObjectStatus in draft-10
yuki-uchida Mar 4, 2025
2462ffa
Merge pull request #181 from nttcom/modify-ObjectStatus
yuki-uchida Mar 4, 2025
e2bd9e9
Modify timing of frameCounter inclement
yuki-uchida Mar 5, 2025
d2eacb9
implement send EndOfGroup Object
yuki-uchida Mar 5, 2025
0c2d175
feat: explicit finish Receiver/Forwarder
tetter27 Mar 6, 2025
3d3c22a
refactor: add comments
tetter27 Mar 6, 2025
aa0bb04
refactor: change SendStreamDispatcher for Control Message
tetter27 Mar 6, 2025
c0310a8
refactor: remove constant for stream direction
tetter27 Mar 6, 2025
24412d2
feat: get/set stream ids related to groups
tetter27 Mar 6, 2025
e4e0d38
Increase max_concurrent_uni_streams
yuki-uchida Mar 6, 2025
b45c2fd
Merge branch 'draft-08' into impl-send-endofgroup
yuki-uchida Mar 6, 2025
b2b4b76
change transport receive window
yuki-uchida Mar 6, 2025
c2728fc
Merge branch 'draft-08' into impl-send-endofgroup
yuki-uchida Mar 6, 2025
9f388ba
feat: signal dispatcher
tetter27 Mar 6, 2025
18d53b9
feat: spawn stream signal dispatch thread
tetter27 Mar 6, 2025
883c389
feat: terminate other forwarders belong to the same group
tetter27 Mar 9, 2025
ac838ee
feat: terminate other receivers belong to the same group
tetter27 Mar 9, 2025
7b85876
refactor: rename signal dispatch command
tetter27 Mar 9, 2025
ad1d87e
feat: remove all senders for data stream threads
tetter27 Mar 9, 2025
39274cb
refactor: rename setter functions
tetter27 Mar 9, 2025
49e2965
refactor: remove unnecessary _repository from variable names
tetter27 Mar 9, 2025
879dc38
Support LatestObject on Subgroup Object Receiver / Forwarder (#184)
tetter27 Mar 9, 2025
2565f05
Change max streams settings and buffer size
yuki-uchida Mar 10, 2025
0c433e5
Modify hanging reload button
yuki-uchida Mar 10, 2025
6f03f0b
fix: lint error
tetter27 Mar 11, 2025
cbd7258
refactor: simplify function
yuki-uchida Mar 11, 2025
d5daf17
delete unnecessary import
yuki-uchida Mar 11, 2025
bcb91b8
Fix: modify import error
yuki-uchida Mar 11, 2025
e51e6d7
Handling ObjectPayloadLength is zero
yuki-uchida Mar 11, 2025
b67692d
Merge pull request #186 from nttcom/impl-send-endofgroup
yuki-uchida Mar 11, 2025
758fd2e
Merge pull request #182 from nttcom/fix/explicit-finish
yuki-uchida Mar 11, 2025
2a96934
Add Extension headers to Object formats (Target branch: draft-10) (#188)
tetter27 Mar 11, 2025
48b05d2
Delete Role from SETUP
yuki-uchida Mar 11, 2025
1e61a53
Merge pull request #190 from nttcom/delete-role-from-setup
yuki-uchida Mar 11, 2025
75043fe
Delete ObjectEnd from SUBCRIBE
yuki-uchida Mar 11, 2025
938f3ab
Merge pull request #191 from nttcom/delete-objectEnd-from-subscribe
yuki-uchida Mar 11, 2025
de9b21f
refactor: add subgroup relation to group/stream map
tetter27 Mar 12, 2025
5d59619
refactor: sepalate step to send signal
tetter27 Mar 12, 2025
6335814
Merge branch 'draft-10' into fix/dispatch-endofgroup
tetter27 Mar 12, 2025
e5c573d
delete is_subscription_ended
tetter27 Mar 12, 2025
119ee48
Merge pull request #189 from nttcom/fix/dispatch-endofgroup
yuki-uchida Mar 12, 2025
183057f
Delete: Role from SETUP
yuki-uchida Mar 12, 2025
f31f4f5
Fix: stream is ended by EndOfObject
yuki-uchida Mar 12, 2025
4dd9255
Delete role from examples
yuki-uchida Mar 12, 2025
5d05133
Update type of Data Streams for draft-10 (#192)
tetter27 Mar 12, 2025
6fca307
feat: update OBJECT_DATAGRAM format
tetter27 Mar 12, 2025
33342cf
feat: change to use new OBJECT_DATAGRAM format
tetter27 Mar 12, 2025
af743c1
refactor: fix comment
tetter27 Mar 12, 2025
58178a4
export GroupOrder
yuki-uchida Mar 13, 2025
4bc9b78
Merge pull request #193 from nttcom/export-GroupOrder
yuki-uchida Mar 13, 2025
d02ade8
clafity method name
yuki-uchida Mar 13, 2025
ebfcde6
clafiry method name
yuki-uchida Mar 13, 2025
3fe44fd
fix: change first object for first subscriber when Latest Object
tetter27 Mar 13, 2025
23d692b
refactor: add comment and annotation
tetter27 Mar 13, 2025
2513908
feat: add OBJECT_DATAGRAM_STATUS message
tetter27 Mar 13, 2025
269e518
feat: Relay supports OBJECT_DATAGRAM_STATUS message
tetter27 Mar 13, 2025
2df75d6
feat: Clients support OBJECT_DATAGRAM_STATUS message
tetter27 Mar 13, 2025
aa9e195
feat: message app send/recv OBJECT_DATAGRAM_STATUS
tetter27 Mar 13, 2025
dec7554
fix: get subgroup largest object id
tetter27 Mar 13, 2025
b9500de
fix: impl none to getter of largest group/object id
tetter27 Mar 14, 2025
438ac3e
fix: clippy error
tetter27 Mar 14, 2025
44667ea
fix: get next largest object id for first object for subsequent stream
tetter27 Mar 14, 2025
1038c34
feat: get all uni-directionl stream_ids within session
tetter27 Mar 14, 2025
fabd971
feat: add TerminateReason to support SessionClosed signal
tetter27 Mar 14, 2025
060c0e4
feat: support for new signal format
tetter27 Mar 14, 2025
136fe9f
feat: terminate all Receiver/Forwarder for the client when session cl…
tetter27 Mar 14, 2025
7f6cd40
fix: add sort to test code
tetter27 Mar 14, 2025
3c754d0
Merge pull request #194 from nttcom/fix/latest-object-first-object
yuki-uchida Mar 14, 2025
02cf4dd
Merge pull request #195 from nttcom/impl/remove-object-status-from-da…
yuki-uchida Mar 14, 2025
68c493f
Merge pull request #196 from nttcom/impl/object-datagram-status
yuki-uchida Mar 14, 2025
a881f47
Merge branch 'draft-10' into fix/get-largest-id
yuki-uchida Mar 14, 2025
43a3622
Modify return type
yuki-uchida Mar 14, 2025
1650c76
Merge pull request #197 from nttcom/fix/get-largest-id
yuki-uchida Mar 14, 2025
1db65ea
Merge pull request #198 from nttcom/fix/first-object-for-subsequent-s…
yuki-uchida Mar 14, 2025
07c0a23
Merge pull request #199 from nttcom/fix/terminate-receiver-forwarder
yuki-uchida Mar 14, 2025
07f8b74
Change chrome start script
yuki-uchida Mar 14, 2025
4320bf5
Simplify method name
yuki-uchida Mar 14, 2025
09a8ecf
Change supported version to draft-10
yuki-uchida Mar 15, 2025
553f13d
Change start Chrome script
yuki-uchida Mar 15, 2025
17f2621
modify test
yuki-uchida Mar 16, 2025
453a1f2
Change server payload size setting.
yuki-uchida Mar 16, 2025
74b5f15
Change max_payload_size
yuki-uchida Mar 17, 2025
a3c91c7
Increase subscribe parameters
yuki-uchida Mar 17, 2025
a901a54
Modify didn't treat value as VarInt
yuki-uchida Mar 17, 2025
2be253f
Refactor write/read varint
yuki-uchida Mar 17, 2025
c80eaa3
Format
yuki-uchida Mar 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
316 changes: 201 additions & 115 deletions Cargo.lock

Large diffs are not rendered by default.

13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -17,20 +17,23 @@ Supported version: draft-ietf-moq-transport-06
- [x] ANNOUNCE_ERROR
- [ ] ANNOUNCE_CANCEL
- [ ] TRACK_STATUS_REQUEST
- [x] SUBSCRIBE_NAMESPACE
- [ ] UNSUBSCRIBE_NAMESPACE
- [x] SUBSCRIBE_ANNOUNCES
- [ ] UNSUBSCRIBE_ANNOUNCES
- [x] SUBSCRIBE_OK
- [x] SUBSCRIBE_ERROR
- [ ] SUBSCRIBE_DONE
- [ ] MAX_SUBSCRIBE_ID
- [x] ANNOUNCE
- [ ] UNANNOUNCE
- [ ] TRACK_STATUS
- [x] SUBSCRIBE_NAMESPACE_OK
- [x] SUBSCRIBE_NAMESPACE_ERROR
- [x] SUBSCRIBE_ANNOUNCES_OK
- [x] SUBSCRIBE_ANNOUNCES_ERROR
- [ ] FETCH
- [ ] FETCH_OK
- [ ] FETCH_ERROR
- [ ] FETCH_CANCEL
- [x] Data Streams
- [x] Datagram
- [x] Track Stream
- [x] Subgroup Stream
- [ ] Features
- [x] Manage Publisher / Subscriber
8 changes: 4 additions & 4 deletions docs/flow.drawio.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions js/examples/media/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Media Examples</title>
</head>
<body>
<h1>Media Examples</h1>
<div>
<a href="./publisher/index.html">Publisher</a>
<a href="./subscriber/index.html">Subscriber</a>
</div>
</body>
</html>
47 changes: 47 additions & 0 deletions js/examples/media/publisher/audioEncoder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
let audioEncoder: AudioEncoder | undefined
const AUDIO_ENCODER_CONFIG = {
codec: 'opus',
sampleRate: 48000, // Opusの推奨サンプルレート
numberOfChannels: 1, // モノラル
bitrate: 64000 // 64kbpsのビットレート
}

function sendAudioChunkMessage(chunk: EncodedAudioChunk, metadata: EncodedAudioChunkMetadata | undefined) {
self.postMessage({ chunk, metadata })
}

async function initializeAudioEncoder() {
const init: AudioEncoderInit = {
output: sendAudioChunkMessage,
error: (e: any) => {
console.log(e.message)
}
}

const encoder = new AudioEncoder(init)
encoder.configure(AUDIO_ENCODER_CONFIG)
return encoder
}

async function startAudioEncode(audioReadableStream: ReadableStream<AudioData>) {
if (!audioEncoder) {
audioEncoder = await initializeAudioEncoder()
}
const audioReader = audioReadableStream.getReader()
while (true) {
const audioResult = await audioReader.read()
if (audioResult.done) break
const audio = audioResult.value
audioEncoder.encode(audio)
audio.close()
}
}

self.onmessage = async (event) => {
const audioReadableStream: ReadableStream<AudioData> = event.data.audioStream
if (!audioReadableStream) {
console.error('MediaStreamTrack が渡されていません')
return
}
await startAudioEncode(audioReadableStream)
}
2 changes: 2 additions & 0 deletions js/examples/media/publisher/const.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const KEYFRAME_INTERVAL = 300
export const AUTH_INFO = 'secret'
95 changes: 95 additions & 0 deletions js/examples/media/publisher/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MOQT Media Publisher Test</title>
</head>
<body>
<h1>Publisher</h1>
<div id="app">
<form name="form" id="form">
<div>
<h2>Connection</h2>
<label for="url">URL:</label>
<input type="url" name="url" id="url" value="https://localhost:4433" />
<button type="button" id="connectBtn">Connect</button>
<button type="button" id="closeBtn">Close</button>
</div>
<br />
<div>
<h2>Forwarding Preference</h2>
<label
><input type="radio" name="forwarding-preference" id="selectDatagram" value="datagram" />Datagram
</label>
<label
><input type="radio" name="forwarding-preference" id="selectSubgroup" value="subgroup" checked />Subgroup
</label>
<br />
*You must select at first

<h3>CLIENT_SETUP</h3>
Max Subscribe ID: <input type="text" name="max-subscribe-id" id="" value="2" />
<br />
<button type="button" id="sendSetupBtn">Send</button>

<h3>ANNOUNCE</h3>
<label
>Track Namespace: <input type="text" name="announce-track-namespace" id="" value="video_audio" />
</label>
<br />
<button type="button" id="sendAnnounceBtn">Send</button>
<h3>OBJECT</h3>
<div id="headerField" style="display: blocked">
<h4>Header</h4>
</div>
<label>Video Track Alias: <input type="text" name="video-object-track-alias" id="" value="0" /> </label>
<label>Audio Track Alias: <input type="text" name="audio-object-track-alias" id="" value="1" /> </label>
<br />
<label
>Video Publisher Priority: <input type="text" name="video-publisher-priority" id="" value="0" />
</label>
<label
>Audio Publisher Priority: <input type="text" name="audio-publisher-priority" id="" value="0" />
</label>
<br />
<div id="objectField" style="display: blocked">
<h4>Object</h4>
</div>
<div id="datagramObjectContents" style="display: none">
Group ID:
<p id="datagramGroupId">0</p>
<br />
<button type="button" id="descendDatagramGroupIdBtn">&lt;</button>
<button type="button" id="ascendDatagramGroupIdBtn">&gt;</button>
<br />
<br />
</div>
<br />
<div>
<button type="button" id="startGetUserMediaBtn">getUserMedia</button>
</div>
<div id="sendDatagramObject" style="display: none">
<button type="button" id="sendDatagramObjectBtn">Send</button>
</div>
<div id="sendSubgroupObject" style="display: blocked">
<button type="button" id="sendSubgroupObjectBtn">Send</button>
</div>
</div>
<div>
<video id="video" autoplay muted inline></video>
</div>
<br />

<br />
</form>
</div>

<script type="module" src="./main.ts"></script>
</body>
<style>
p {
display: inline;
}
</style>
</html>
Loading