@@ -170,6 +170,7 @@ func _deprecatedJoinRoom(ctx context.Context, cmd *cli.Command) error {
170170
171171 if cmd .StringSlice ("publish" ) != nil {
172172 fps := cmd .Float ("fps" )
173+ h26xStreamingFormat := cmd .String ("h26x-streaming-format" )
173174 for _ , pub := range cmd .StringSlice ("publish" ) {
174175 onPublishComplete := func (pub * lksdk.LocalTrackPublication ) {
175176 if cmd .Bool ("exit-after-publish" ) {
@@ -181,7 +182,7 @@ func _deprecatedJoinRoom(ctx context.Context, cmd *cli.Command) error {
181182 _ = room .LocalParticipant .UnpublishTrack (pub .SID ())
182183 }
183184 }
184- if err = handlePublish (room , pub , fps , onPublishComplete ); err != nil {
185+ if err = handlePublish (room , pub , fps , h26xStreamingFormat , onPublishComplete ); err != nil {
185186 return err
186187 }
187188 }
@@ -194,16 +195,17 @@ func _deprecatedJoinRoom(ctx context.Context, cmd *cli.Command) error {
194195func handlePublish (room * lksdk.Room ,
195196 name string ,
196197 fps float64 ,
198+ h26xStreamingFormat string ,
197199 onPublishComplete func (pub * lksdk.LocalTrackPublication ),
198200) error {
199201 if isSocketFormat (name ) {
200202 mimeType , socketType , address , err := parseSocketFromName (name )
201203 if err != nil {
202204 return err
203205 }
204- return publishSocket (room , mimeType , socketType , address , fps , onPublishComplete )
206+ return publishSocket (room , mimeType , socketType , address , fps , h26xStreamingFormat , onPublishComplete )
205207 }
206- return publishFile (room , name , fps , onPublishComplete )
208+ return publishFile (room , name , fps , h26xStreamingFormat , onPublishComplete )
207209}
208210
209211func publishDemo (room * lksdk.Room ) error {
@@ -235,6 +237,7 @@ func publishDemo(room *lksdk.Room) error {
235237func publishFile (room * lksdk.Room ,
236238 filename string ,
237239 fps float64 ,
240+ h26xStreamingFormat string ,
238241 onPublishComplete func (pub * lksdk.LocalTrackPublication ),
239242) error {
240243 // Configure provider
@@ -260,6 +263,15 @@ func publishFile(room *lksdk.Room,
260263 frameDuration := time .Second / time .Duration (fps )
261264 opts = append (opts , lksdk .ReaderTrackWithFrameDuration (frameDuration ))
262265 }
266+
267+ switch h26xStreamingFormat {
268+ case "annex-b" :
269+ opts = append (opts , lksdk .ReaderTrackWithH26xStreamingFormat (lksdk .H26xStreamingFormatAnnexB ))
270+ case "length-prefixed" :
271+ opts = append (opts , lksdk .ReaderTrackWithH26xStreamingFormat (lksdk .H26xStreamingFormatLengthPrefixed ))
272+ default :
273+ return fmt .Errorf ("unsupported h26x streaming format: %s" , h26xStreamingFormat )
274+ }
263275 }
264276
265277 // Create track and publish
@@ -312,6 +324,7 @@ func publishSocket(room *lksdk.Room,
312324 socketType string ,
313325 address string ,
314326 fps float64 ,
327+ h26xStreamingFormat string ,
315328 onPublishComplete func (pub * lksdk.LocalTrackPublication ),
316329) error {
317330 var mime string
@@ -333,14 +346,15 @@ func publishSocket(room *lksdk.Room,
333346 }
334347
335348 // Publish to room
336- err = publishReader (room , sock , mime , fps , onPublishComplete )
349+ err = publishReader (room , sock , mime , fps , h26xStreamingFormat , onPublishComplete )
337350 return err
338351}
339352
340353func publishReader (room * lksdk.Room ,
341354 in io.ReadCloser ,
342355 mime string ,
343356 fps float64 ,
357+ h26xStreamingFormat string ,
344358 onPublishComplete func (pub * lksdk.LocalTrackPublication ),
345359) error {
346360 // Configure provider
@@ -358,6 +372,15 @@ func publishReader(room *lksdk.Room,
358372 frameDuration := time .Second / time .Duration (fps )
359373 opts = append (opts , lksdk .ReaderTrackWithFrameDuration (frameDuration ))
360374 }
375+
376+ switch h26xStreamingFormat {
377+ case "annex-b" :
378+ opts = append (opts , lksdk .ReaderTrackWithH26xStreamingFormat (lksdk .H26xStreamingFormatAnnexB ))
379+ case "length-prefixed" :
380+ opts = append (opts , lksdk .ReaderTrackWithH26xStreamingFormat (lksdk .H26xStreamingFormatLengthPrefixed ))
381+ default :
382+ return fmt .Errorf ("unsupported h26x streaming format: %s" , h26xStreamingFormat )
383+ }
361384 }
362385
363386 // Create track and publish
@@ -414,7 +437,7 @@ func parseSimulcastURL(url string) (*simulcastURLParts, error) {
414437}
415438
416439// createSimulcastVideoTrack creates a simulcast video track from a TCP or Unix socket H.264 streams
417- func createSimulcastVideoTrack (urlParts * simulcastURLParts , quality livekit.VideoQuality , fps float64 , onComplete func ()) (* lksdk.LocalTrack , error ) {
440+ func createSimulcastVideoTrack (urlParts * simulcastURLParts , quality livekit.VideoQuality , fps float64 , h26xStreamingFormat string , onComplete func ()) (* lksdk.LocalTrack , error ) {
418441 conn , err := net .Dial (urlParts .network , urlParts .address )
419442 if err != nil {
420443 return nil , fmt .Errorf ("failed to connect to %s://%s: %w" , urlParts .network , urlParts .address , err )
@@ -433,6 +456,15 @@ func createSimulcastVideoTrack(urlParts *simulcastURLParts, quality livekit.Vide
433456 opts = append (opts , lksdk .ReaderTrackWithFrameDuration (frameDuration ))
434457 }
435458
459+ switch h26xStreamingFormat {
460+ case "annex-b" :
461+ opts = append (opts , lksdk .ReaderTrackWithH26xStreamingFormat (lksdk .H26xStreamingFormatAnnexB ))
462+ case "length-prefixed" :
463+ opts = append (opts , lksdk .ReaderTrackWithH26xStreamingFormat (lksdk .H26xStreamingFormatLengthPrefixed ))
464+ default :
465+ return nil , fmt .Errorf ("unsupported h26x streaming format: %s" , h26xStreamingFormat )
466+ }
467+
436468 // Configure simulcast layer
437469 opts = append (opts , lksdk .ReaderTrackWithSampleOptions (lksdk .WithSimulcast ("simulcast" , & livekit.VideoLayer {
438470 Quality : quality ,
@@ -452,7 +484,7 @@ type simulcastLayer struct {
452484}
453485
454486// handleSimulcastPublish handles publishing multiple H.264 streams as a simulcast track
455- func handleSimulcastPublish (room * lksdk.Room , urls []string , fps float64 , onPublishComplete func (* lksdk.LocalTrackPublication )) error {
487+ func handleSimulcastPublish (room * lksdk.Room , urls []string , fps float64 , h26xStreamingFormat string , onPublishComplete func (* lksdk.LocalTrackPublication )) error {
456488 // Parse all URLs
457489 var layers []simulcastLayer
458490 for _ , url := range urls {
@@ -515,7 +547,7 @@ func handleSimulcastPublish(room *lksdk.Room, urls []string, fps float64, onPubl
515547 }
516548
517549 for _ , layer := range layers {
518- track , err := createSimulcastVideoTrack (layer .parts , layer .quality , fps , signalCompletion )
550+ track , err := createSimulcastVideoTrack (layer .parts , layer .quality , fps , h26xStreamingFormat , signalCompletion )
519551 if err != nil {
520552 // Clean up any tracks we've already created
521553 for _ , t := range tracks {
0 commit comments