1*d9f75844SAndroid Build Coastguard Worker# Video Layers Allocation 2*d9f75844SAndroid Build Coastguard Worker 3*d9f75844SAndroid Build Coastguard WorkerThe goal of this extension is for a video sender to provide information about 4*d9f75844SAndroid Build Coastguard Workerthe target bitrate, resolution and frame rate of each scalability layer in order 5*d9f75844SAndroid Build Coastguard Workerto aid a selective forwarding middlebox to decide which layer to relay. 6*d9f75844SAndroid Build Coastguard Worker 7*d9f75844SAndroid Build Coastguard Worker**Name:** "Video layers allocation version 0" 8*d9f75844SAndroid Build Coastguard Worker 9*d9f75844SAndroid Build Coastguard Worker**Formal name:** 10*d9f75844SAndroid Build Coastguard Worker<http://www.webrtc.org/experiments/rtp-hdrext/video-layers-allocation00> 11*d9f75844SAndroid Build Coastguard Worker 12*d9f75844SAndroid Build Coastguard Worker**Status:** This extension is defined here to allow for experimentation. 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard WorkerIn a conference scenario, a video from a single sender may be received by 15*d9f75844SAndroid Build Coastguard Workerseveral recipients with different downlink bandwidth constraints and UI 16*d9f75844SAndroid Build Coastguard Workerrequirements. To allow this, a sender can send video with several scalability 17*d9f75844SAndroid Build Coastguard Workerlayers and a middle box can choose a layer to relay for each receiver. 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard WorkerThis extension support temporal layers, multiple spatial layers sent on a single 20*d9f75844SAndroid Build Coastguard Workerrtp stream (SVC), or independent spatial layers sent on multiple rtp streams 21*d9f75844SAndroid Build Coastguard Worker(simulcast). 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker## RTP header extension format 24*d9f75844SAndroid Build Coastguard Worker 25*d9f75844SAndroid Build Coastguard Worker### Data layout 26*d9f75844SAndroid Build Coastguard Worker 27*d9f75844SAndroid Build Coastguard Worker``` 28*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 29*d9f75844SAndroid Build Coastguard Worker// |RID| NS| sl_bm | 30*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 31*d9f75844SAndroid Build Coastguard Worker// Spatial layer bitmask |sl0_bm |sl1_bm | 32*d9f75844SAndroid Build Coastguard Worker// up to 2 bytes |---------------| 33*d9f75844SAndroid Build Coastguard Worker// when sl_bm == 0 |sl2_bm |sl3_bm | 34*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 35*d9f75844SAndroid Build Coastguard Worker// Number of temporal layers |#tl|#tl|#tl|#tl| 36*d9f75844SAndroid Build Coastguard Worker// per spatial layer | | | | | 37*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 38*d9f75844SAndroid Build Coastguard Worker// Target bitrate in kpbs | | 39*d9f75844SAndroid Build Coastguard Worker// per temporal layer : ... : 40*d9f75844SAndroid Build Coastguard Worker// leb128 encoded | | 41*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 42*d9f75844SAndroid Build Coastguard Worker// Resolution and framerate | | 43*d9f75844SAndroid Build Coastguard Worker// 5 bytes per spatial layer + width-1 for + 44*d9f75844SAndroid Build Coastguard Worker// (optional) | rid=0, sid=0 | 45*d9f75844SAndroid Build Coastguard Worker// +---------------+ 46*d9f75844SAndroid Build Coastguard Worker// | | 47*d9f75844SAndroid Build Coastguard Worker// + height-1 for + 48*d9f75844SAndroid Build Coastguard Worker// | rid=0, sid=0 | 49*d9f75844SAndroid Build Coastguard Worker// +---------------+ 50*d9f75844SAndroid Build Coastguard Worker// | max framerate | 51*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 52*d9f75844SAndroid Build Coastguard Worker// : ... : 53*d9f75844SAndroid Build Coastguard Worker// +-+-+-+-+-+-+-+-+ 54*d9f75844SAndroid Build Coastguard Worker``` 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard WorkerRID: RTP stream index this allocation is sent on, numbered from 0. 2 bits. 57*d9f75844SAndroid Build Coastguard Worker 58*d9f75844SAndroid Build Coastguard WorkerNS: Number of RTP streams minus one. 2 bits, thus allowing up-to 4 RTP streams. 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Workersl_bm: BitMask of the active Spatial Layers when same for all RTP streams or 0 61*d9f75844SAndroid Build Coastguard Workerotherwise. 4 bits, thus allows up to 4 spatial layers per RTP streams. 62*d9f75844SAndroid Build Coastguard Worker 63*d9f75844SAndroid Build Coastguard WorkerslX_bm: BitMask of the active Spatial Layers for RTP stream with index=X. 64*d9f75844SAndroid Build Coastguard WorkerWhen NS < 2, takes one byte, otherwise uses two bytes. Zero-padded to byte 65*d9f75844SAndroid Build Coastguard Workeralignment. 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker\#tl: 2-bit value of number of temporal layers-1, thus allowing up-to 4 temporal 68*d9f75844SAndroid Build Coastguard Workerlayers. Values are stored in ascending order of spatial id. Zero-padded to byte 69*d9f75844SAndroid Build Coastguard Workeralignment. 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard WorkerTarget bitrate in kbps. Values are stored using leb128 encoding [1]. One value per 72*d9f75844SAndroid Build Coastguard Workertemporal layer. Values are stored in (RTP stream id, spatial id, temporal id) 73*d9f75844SAndroid Build Coastguard Workerascending order. All bitrates are total required bitrate to receive the 74*d9f75844SAndroid Build Coastguard Workercorresponding layer, i.e. in simulcast mode they include only corresponding 75*d9f75844SAndroid Build Coastguard Workerspatial layers, in full-svc all lower spatial layers are included. All lower 76*d9f75844SAndroid Build Coastguard Workertemporal layers are also included. 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard WorkerResolution and framerate. Optional. Presence is inferred from the rtp header 79*d9f75844SAndroid Build Coastguard Workerextension size. Encoded (width - 1), 16-bit, (height - 1), 16-bit, max frame 80*d9f75844SAndroid Build Coastguard Workerrate 8-bit per spatial layer per RTP stream. Values are stored in (RTP stream 81*d9f75844SAndroid Build Coastguard Workerid, spatial id) ascending order. 82*d9f75844SAndroid Build Coastguard Worker 83*d9f75844SAndroid Build Coastguard WorkerAn empty layer allocation (i.e nothing sent on ssrc) is encoded as 84*d9f75844SAndroid Build Coastguard Workerspecial case with a single 0 byte. 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker[1] https://aomediacodec.github.io/av1-spec/#leb128 87