streaming

Media streaming and broadcast systems in Go
Log | Files | Refs | README | LICENSE

draft.txt (1168B)


      1 package main
      2 
      3 import (
      4 	"rtp"
      5 	"jxs"
      6 )
      7 
      8 func transmit(session *rtp.Session, payload chan *jxs.Payload) {
      9 	for p := range payload {
     10 		packets, err := jxs.Packets(p)
     11 		if err != nil {
     12 			log.Printf("payload to RTP packets: %v", err)
     13 			continue
     14 		}
     15 		for _, packet := range packets {
     16 			if err := session.Transmit(p); err != nil {
     17 				log.Printf("transmit: %v", err)
     18 			}
     19 		}
     20 	}
     21 }
     22 
     23 func main() {
     24 	session, err := rtp.Dial("udp", "[::1]:5004")
     25 	if err != nil {
     26 		log.Fatal(err)
     27 	}
     28 
     29 	ch := make(chan *jxs.Payload)
     30 	go transmit(session, ch)
     31 
     32 	for i := 0; ; i++ {
     33 		frame, err := jxs.DecodeFrame(os.Stdin)
     34 		if errors.Is(err, io.EOF) {
     35 			close(ch)
     36 			break
     37 		} else if err != nil {
     38 			log.Fatal(err)
     39 		}
     40 		mtu := 1492 // typical network
     41 		pus, err := jxs.Packetize(&frame, mtu)
     42 		if err != nil {
     43 			log.Fatal(err)
     44 		}
     45 		for j, pu := range pus {
     46 			payload := &jxs.Payload{
     47 				Header: &jxs.Header{
     48 					Sequential: true,
     49 					PacketMode: true,
     50 					FrameCount: uint8(i),
     51 					SEPCount: 0, // TODO(otl)
     52 					PacketCount: j, // TODO(otl)
     53 				},
     54 				PacketizationUnit: &jxs.PacketizationUnit{
     55 					frame.VideoBox,
     56 					frame.ColorBox,
     57 				},
     58 			},
     59 			ch <- payload
     60 		}
     61 	}
     62 }
     63 
     64