1 | // basis_file_headers.h |
2 | // Copyright (C) 2019-2020 Binomial LLC. All Rights Reserved. |
3 | // |
4 | // Licensed under the Apache License, Version 2.0 (the "License"); |
5 | // you may not use this file except in compliance with the License. |
6 | // You may obtain a copy of the License at |
7 | // |
8 | // http://www.apache.org/licenses/LICENSE-2.0 |
9 | // |
10 | // Unless required by applicable law or agreed to in writing, software |
11 | // distributed under the License is distributed on an "AS IS" BASIS, |
12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | // See the License for the specific language governing permissions and |
14 | // limitations under the License. |
15 | #pragma once |
16 | #include "basisu_transcoder_internal.h" |
17 | |
18 | namespace basist |
19 | { |
20 | // Slice desc header flags |
21 | enum basis_slice_desc_flags |
22 | { |
23 | cSliceDescFlagsHasAlpha = 1, |
24 | |
25 | // Video only: Frame doesn't refer to previous frame (no usage of conditional replenishment pred symbols) |
26 | // Currently the first frame is always an I-Frame, all subsequent frames are P-Frames. This will eventually be changed to periodic I-Frames. |
27 | cSliceDescFlagsFrameIsIFrame = 2 |
28 | }; |
29 | |
30 | #pragma pack(push) |
31 | #pragma pack(1) |
32 | struct basis_slice_desc |
33 | { |
34 | basisu::packed_uint<3> m_image_index; // The index of the source image provided to the encoder (will always appear in order from first to last, first image index is 0, no skipping allowed) |
35 | basisu::packed_uint<1> m_level_index; // The mipmap level index (mipmaps will always appear from largest to smallest) |
36 | basisu::packed_uint<1> m_flags; // enum basis_slice_desc_flags |
37 | |
38 | basisu::packed_uint<2> m_orig_width; // The original image width (may not be a multiple of 4 pixels) |
39 | basisu::packed_uint<2> m_orig_height; // The original image height (may not be a multiple of 4 pixels) |
40 | |
41 | basisu::packed_uint<2> m_num_blocks_x; // The slice's block X dimensions. Each block is 4x4 pixels. The slice's pixel resolution may or may not be a power of 2. |
42 | basisu::packed_uint<2> m_num_blocks_y; // The slice's block Y dimensions. |
43 | |
44 | basisu::packed_uint<4> m_file_ofs; // Offset from the start of the file to the start of the slice's data |
45 | basisu::packed_uint<4> m_file_size; // The size of the compressed slice data in bytes |
46 | |
47 | basisu::packed_uint<2> m_slice_data_crc16; // The CRC16 of the compressed slice data, for extra-paranoid use cases |
48 | }; |
49 | |
50 | // File header files |
51 | enum |
52 | { |
53 | // Always set for ETC1S files. Not set for UASTC files. |
54 | = 1, |
55 | |
56 | // Set if the texture had to be Y flipped before encoding. The actual interpretation of this (is Y up or down?) is up to the user. |
57 | = 2, |
58 | |
59 | // Set if any slices contain alpha (for ETC1S, if the odd slices contain alpha data) |
60 | = 4, |
61 | |
62 | // For ETC1S files, this will be true if the file utilizes a codebook from another .basis file. |
63 | = 8, |
64 | |
65 | // Set if the texture data is sRGB, otherwise it's linear. |
66 | // In reality, we have no idea if the texture data is actually linear or sRGB. This is the m_perceptual parameter passed to the compressor. |
67 | = 16, |
68 | }; |
69 | |
70 | // The image type field attempts to describe how to interpret the image data in a Basis file. |
71 | // The encoder library doesn't really do anything special or different with these texture types, this is mostly here for the benefit of the user. |
72 | // We do make sure the various constraints are followed (2DArray/cubemap/videoframes/volume implies that each image has the same resolution and # of mipmap levels, etc., cubemap implies that the # of image slices is a multiple of 6) |
73 | enum basis_texture_type |
74 | { |
75 | cBASISTexType2D = 0, // An arbitrary array of 2D RGB or RGBA images with optional mipmaps, array size = # images, each image may have a different resolution and # of mipmap levels |
76 | cBASISTexType2DArray = 1, // An array of 2D RGB or RGBA images with optional mipmaps, array size = # images, each image has the same resolution and mipmap levels |
77 | cBASISTexTypeCubemapArray = 2, // an array of cubemap levels, total # of images must be divisable by 6, in X+, X-, Y+, Y-, Z+, Z- order, with optional mipmaps |
78 | cBASISTexTypeVideoFrames = 3, // An array of 2D video frames, with optional mipmaps, # frames = # images, each image has the same resolution and # of mipmap levels |
79 | cBASISTexTypeVolume = 4, // A 3D texture with optional mipmaps, Z dimension = # images, each image has the same resolution and # of mipmap levels |
80 | |
81 | cBASISTexTypeTotal |
82 | }; |
83 | |
84 | enum |
85 | { |
86 | cBASISMaxUSPerFrame = 0xFFFFFF |
87 | }; |
88 | |
89 | enum class basis_tex_format |
90 | { |
91 | cETC1S = 0, |
92 | cUASTC4x4 = 1 |
93 | }; |
94 | |
95 | struct |
96 | { |
97 | enum |
98 | { |
99 | = ('B' << 8) | 's', |
100 | = 0x10 |
101 | }; |
102 | |
103 | basisu::packed_uint<2> ; // 2 byte file signature |
104 | basisu::packed_uint<2> ; // Baseline file version |
105 | basisu::packed_uint<2> ; // Header size in bytes, sizeof(basis_file_header) |
106 | basisu::packed_uint<2> ; // CRC16 of the remaining header data |
107 | |
108 | basisu::packed_uint<4> ; // The total size of all data after the header |
109 | basisu::packed_uint<2> ; // The CRC16 of all data after the header |
110 | |
111 | basisu::packed_uint<3> ; // The total # of compressed slices (1 slice per image, or 2 for alpha .basis files) |
112 | |
113 | basisu::packed_uint<3> ; // The total # of images |
114 | |
115 | basisu::packed_uint<1> ; // enum basis_tex_format |
116 | basisu::packed_uint<2> ; // enum basist::header_flags |
117 | basisu::packed_uint<1> ; // enum basist::basis_texture_type |
118 | basisu::packed_uint<3> ; // Framerate of video, in microseconds per frame |
119 | |
120 | basisu::packed_uint<4> ; // For future use |
121 | basisu::packed_uint<4> ; // For client use |
122 | basisu::packed_uint<4> ; // For client use |
123 | |
124 | basisu::packed_uint<2> ; // The number of endpoints in the endpoint codebook |
125 | basisu::packed_uint<4> ; // The compressed endpoint codebook's file offset relative to the start of the file |
126 | basisu::packed_uint<3> ; // The compressed endpoint codebook's size in bytes |
127 | |
128 | basisu::packed_uint<2> ; // The number of selectors in the endpoint codebook |
129 | basisu::packed_uint<4> ; // The compressed selectors codebook's file offset relative to the start of the file |
130 | basisu::packed_uint<3> ; // The compressed selector codebook's size in bytes |
131 | |
132 | basisu::packed_uint<4> ; // The file offset of the compressed Huffman codelength tables, for decompressing slices |
133 | basisu::packed_uint<4> ; // The file size in bytes of the compressed huffman codelength tables |
134 | |
135 | basisu::packed_uint<4> ; // The file offset to the slice description array, usually follows the header |
136 | |
137 | basisu::packed_uint<4> ; // The file offset of the "extended" header and compressed data, for future use |
138 | basisu::packed_uint<4> ; // The file size in bytes of the "extended" header and compressed data, for future use |
139 | }; |
140 | #pragma pack (pop) |
141 | |
142 | } // namespace basist |
143 | |