[ ] seems we cannot just pass the uds created in key frame to delta frames:
session.ts:246 failed to write obj: TypeError: Failed to execute 'getWriter' on 'WritableStream': Cannot create writer when WritableStream is locked
at Object.write (session.ts:227:41)
[ ] maybe pass encoderStream directly? none, we streamer-app need to control close of stream when writing all delta frames to that stream, and control the stream close by objID, all done in streamer-app, session only handles sending:
// moqjs: session.ts
// return a function that can be used to write obj msgs on the subscription, aka: writeObjUniStream()
async subscribeOk(
subscribeId: number,
expires: number,
groupOrder: number,
contentExists: boolean,
finalGroup?: number,
finalObject?: number,
) {
await this.controlStream.send(
new SubscribeOkEncoder({
type: MessageType.SubscribeOk,
subscribeId: subscribeId,
expires: expires,
groupOrder: groupOrder,
contentExists: contentExists,
finalGroup: finalGroup,
finalObject: finalObject,
}),
);
return async (
subscribeId: number,
trackAlias: number,
groupId: number,
objectId: number,
publisherPriority: number,
objectStatus: number,
objectPayload: Uint8Array,
encoderStream: WritableStream<Uint8Array>,
) => {
try {
// const objectStream = await this.conn.createUnidirectionalStream();
// const encoderStream = new WritableStream<Uint8Array>({
// async write(chunk) {
// const writer = objectStream.getWriter();
// await writer.write(chunk);
// writer.releaseLock();
// },
// });
const encoder = new Encoder(encoderStream);
const objStreamEncoder = new ObjectStreamEncoder({
type: MessageType.ObjectStream,
subscribeId: subscribeId,
trackAlias: trackAlias,
groupId: groupId,
objectId: objectId,
publisherPriority: publisherPriority,
objectStatus: objectStatus,
objectPayload: objectPayload,
});
await objStreamEncoder.encode(encoder);
// await objectStream.close();
} catch (err) {
console.log("failed to write obj: ", err);
}
};
}
[x] revamp serializer struct using Uint32 for totalLength, uint8 for chunk type (video or audio, binary value) and key (key or delta, binary value), use float64 for timestamp and duration, since we donot know how big would these two numbers be.
Note: the caching on chrome tab is really sticky, even with hard reload…
[ ] TODO: read video frames from one stream
[ ] streamer has writer issue:
failed to write obj: TypeError: Failed to execute 'getWriter' on 'WritableStream': Cannot create writer when WritableStream is locked
at Encoder.writeVarint (encoder.ts:21:32)
at ObjectStreamEncoder.encode (messages.ts:84:15)
at session.ts:243:32
at sendEncodedChunk (App.tsx:414:15)
at serializeEncodedChunk (App.tsx:359:5)
at worker.onmessage (App.tsx:280:7)