xref: /aosp_15_r20/external/webrtc/docs/native-code/rtp-hdrext/video-layers-allocation00/README.md (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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