wai-conformance: the probe unit tests on every leg and the feature built alone and for wasm32; a step running tests/format_probe.rs, the fetched LCEVC streams under wai_format_probe and format_probe_verify.py; steps for cmsd_read_verify.py and loc_verify.py; the new extensions in its paths. joule-code-conformance: the LOC corpus and the H.265 vector it reads in its paths. SPEC cites format-probes by its headed section. Co-Authored-By: Claude Opus 5.5 <[email protected]>
7.3 KiB
WAI Extension: Projection Descriptor
Status: Draft. Registers
wai.meta.projection, a companion descriptor to a video rendition (SPEC §5, §7.1), as the HDR dynamic-metadata descriptors are: a 40-byteWPJ1record that says how the rendition's pictures map onto what a viewer sees (rectilinear, equirectangular, half-equirectangular or fisheye) and how its two views are arranged (one view, two views packed side by side or top and bottom, or two views in two layers of a multiview bitstream such aswai.video.mvhevc). The projection kinds follow ISO/IEC 23090-2 (OMAF); the angle unit and ranges follow ITU-T H.274 (V4, 01/2026) §8.15; the packing arrangements are ITU-T H.273 (V4, 07/2024) §8.4's. The reference implementation isformat_probe::projectioninwai-rs(featureformat_probe); its vectors are informat-probe-conformance/, with its second implementation,format_probe_verify.py. Keywords MUST, MUST NOT, SHOULD, MAY are RFC 2119/8174.ISO/IEC 23090-2 is not openly readable and was not read. Its projection kinds are used here as the H.274 SEI messages that carry them in a bitstream state them (the equirectangular projection SEI message, §8.15.2, and the sphere rotation and region-wise packing messages, §8.15.4 and §8.15.5), and no clause of ISO/IEC 23090-2 is cited.
1. Scope
§1.1 A projection descriptor describes the pictures of one video rendition: the geometry a renderer maps them onto and the arrangement of their views. It changes no sample and is applied by the renderer, after decoding. A rendition without one is a rectilinear picture of one view.
§1.2 The descriptor is WAI's own record, so a rendition's projection is stated the same way whatever the codec, and also where the codec's own signalling is absent: an AV1 payload, a JPEG XS payload or an MV-HEVC payload whose bitstream carries no projection SEI message. Where a bitstream carries such a message and the descriptor disagrees with it, the descriptor is what WAI states, and a renderer SHOULD report the disagreement.
2. Terms
§2.1 Angles are in units of 2⁻¹⁶ degrees, as H.274 §8.15 states them: one degree is 65 536. Azimuth increases eastward (to the viewer's left, seen from inside the sphere), elevation northward, as for H.274's equirectangular projection (§8.15.2.2).
§2.2 Projections.
| code | name | the picture is |
|---|---|---|
| 0 | rectilinear |
a flat picture with no sphere projection; its coverage, where stated, is its field of view |
| 1 | equirectangular |
the equirectangular projection of the whole sphere, 360° of azimuth and 180° of elevation, as H.274 §8.15.2 maps it |
| 2 | half-equirectangular |
the equirectangular projection of the front hemisphere: 180° of azimuth and 180° of elevation, centred on the coverage centre |
| 3 | fisheye |
a circular fisheye image whose field of view is its coverage |
§2.3 Stereo arrangements.
| code | name | the two views are |
|---|---|---|
| 0 | mono |
one view |
| 1 | side-by-side |
the left and right halves of each picture, H.273 VideoFramePackingType 3 |
| 2 | top-bottom |
the top and bottom halves of each picture, VideoFramePackingType 4 |
| 3 | layers |
two layers of a multiview bitstream, each a view, named by their nuh_layer_id |
3. The record
§3.1 A wai.meta.projection payload is 40 bytes, multi-byte integers little-endian:
| offset | field | type | meaning |
|---|---|---|---|
| 0 | magic |
4 B | WPJ1 |
| 4 | version |
u8 | 1 |
| 5 | projection |
u8 | §2.2 |
| 6 | stereo |
u8 | §2.3 |
| 7 | first_view |
u8 | 0: the left eye's view is the left half, the top half or left_layer's; 1: the right eye's is |
| 8 | azimuth_range |
u32 | coverage in azimuth, 2⁻¹⁶ degrees |
| 12 | elevation_range |
u32 | coverage in elevation |
| 16 | centre_azimuth |
i32 | the coverage's centre |
| 20 | centre_elevation |
i32 | |
| 24 | centre_tilt |
i32 | rotation about the centre's axis |
| 28 | baseline_um |
u32 | the distance between the two cameras, micrometres; 0 where not stated |
| 32 | left_layer |
u8 | with stereo 3, the left eye's layer; otherwise 0 |
| 33 | right_layer |
u8 | with stereo 3, the right eye's layer; otherwise 0 |
| 34 | reserved | 6 B | zero |
§3.2 Its parameters: projection and stereo (the names of §2), first_view (left or
right), coverage ([azimuth_range, elevation_range]), centre ([azimuth, elevation, tilt]), baseline_um, and layers ([left_layer, right_layer] with stereo 3, else null).
4. Checks
§4.1 A reader refuses, in this order:
- fewer than 4 bytes or a magic other than
WPJ1:no_signature; - a length other than 40:
length_mismatch; - a
versionother than 1, aprojectionorstereoabove 3, afirst_viewabove 1, or a reserved byte that is not zero:reserved_value; - fields that disagree,
descriptor_invalid:- coverage: for
equirectangular, exactly 360° by 180°; forhalf-equirectangular, exactly 180° by 180°; forfisheye, each range above 0 and at most 360°; forrectilinear, both 0 (field of view not stated) or each above 0 and below 180°; - centre: azimuth and tilt from −180° up to but not including 180°, elevation from −90° to 90° (H.274 §8.15's ranges);
- views:
monowith afirst_view,baseline_um,left_layerorright_layerthat is not 0;side-by-sideortop-bottomwith a layer that is not 0;layerswith the two layers equal or either above 62.
- coverage: for
§4.2 The codes are those of format-probes §12.
5. Binding to the rendition
§5.1 A projection descriptor is a WAI2 companion (SPEC §7.1) whose companion_of names a
capability of the video media class, as an HDR descriptor's does. It is never a WAI1
capability or fallback and never a selectable rendition.
§5.2 A descriptor with stereo 3 applies only to a rendition of wai.video.mvhevc whose probe
(format-probes §4) reports both left_layer and right_layer among its layers_present;
otherwise layer_absent, and a sink MUST NOT apply it. A sink that presents a rendition with
such a descriptor presents the view of each layer to the eye the descriptor names.
§5.3 With side-by-side or top-bottom, each view is half the decoded picture's width or height;
a sink that presents one eye only presents the view first_view names as the left eye's when it
needs one view.
6. Mapping
§6.1 Writing a descriptor from a bitstream's own signalling: an H.274 equirectangular
projection SEI message gives equirectangular (or half-equirectangular where a region-wise
packing message packs only the front hemisphere); a sphere rotation message gives the centre; a
frame packing arrangement of type 3 or 4 gives side-by-side or top-bottom; an MV-HEVC
bitstream's two views (format-probes §4, view_ids) give layers. Writing the other way, a
descriptor gives the same messages. Fisheye has no H.274 message; its parameters beyond the
coverage (the image circle's centre and radius) are not in this revision of the record.
7. Conformance
§7.1 format-probe-conformance/ holds descriptors of every
projection and arrangement, descriptors refused with each code of §4, and bindings of descriptors
to an MV-HEVC rendition and an H.265 rendition with their outcomes (format-probes §13).