Shaka Packager SDK
Loading...
Searching...
No Matches
vp_codec_configuration_record.h
1// Copyright 2015 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#ifndef PACKAGER_MEDIA_CODECS_VP_CODEC_CONFIGURATION_RECORD_H_
8#define PACKAGER_MEDIA_CODECS_VP_CODEC_CONFIGURATION_RECORD_H_
9
10#include <cstdint>
11#include <optional>
12#include <string>
13#include <vector>
14
15#include <packager/media/base/stream_info.h>
16
17namespace shaka {
18namespace media {
19
22enum AVColorPrimaries {
23 AVCOL_PRI_RESERVED0 = 0,
25 AVCOL_PRI_BT709 = 1,
26 AVCOL_PRI_UNSPECIFIED = 2,
27 AVCOL_PRI_RESERVED = 3,
29 AVCOL_PRI_BT470M = 4,
31 AVCOL_PRI_BT470BG = 5,
33 AVCOL_PRI_SMPTE170M = 6,
35 AVCOL_PRI_SMPTE240M = 7,
37 AVCOL_PRI_FILM = 8,
39 AVCOL_PRI_BT2020 = 9,
41 AVCOL_PRI_SMPTE428 = 10,
42 AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428,
44 AVCOL_PRI_SMPTE431 = 11,
46 AVCOL_PRI_SMPTE432 = 12,
48 AVCOL_PRI_NB
49};
50
52enum AVColorTransferCharacteristic {
53 AVCOL_TRC_RESERVED0 = 0,
55 AVCOL_TRC_BT709 = 1,
56 AVCOL_TRC_UNSPECIFIED = 2,
57 AVCOL_TRC_RESERVED = 3,
59 AVCOL_TRC_GAMMA22 = 4,
61 AVCOL_TRC_GAMMA28 = 5,
64 AVCOL_TRC_SMPTE170M = 6,
65 AVCOL_TRC_SMPTE240M = 7,
67 AVCOL_TRC_LINEAR = 8,
69 AVCOL_TRC_LOG = 9,
71 AVCOL_TRC_LOG_SQRT = 10,
73 AVCOL_TRC_IEC61966_2_4 = 11,
75 AVCOL_TRC_BT1361_ECG = 12,
77 AVCOL_TRC_IEC61966_2_1 = 13,
79 AVCOL_TRC_BT2020_10 = 14,
81 AVCOL_TRC_BT2020_12 = 15,
83 AVCOL_TRC_SMPTE2084 = 16,
84 AVCOL_TRC_SMPTEST2084 = AVCOL_TRC_SMPTE2084,
86 AVCOL_TRC_SMPTE428 = 17,
87 AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428,
89 AVCOL_TRC_ARIB_STD_B67 = 18,
91 AVCOL_TRC_NB
92};
93
95enum AVColorSpace {
97 AVCOL_SPC_RGB = 0,
99 AVCOL_SPC_BT709 = 1,
100 AVCOL_SPC_UNSPECIFIED = 2,
101 AVCOL_SPC_RESERVED = 3,
103 AVCOL_SPC_FCC = 4,
106 AVCOL_SPC_BT470BG = 5,
108 AVCOL_SPC_SMPTE170M = 6,
110 AVCOL_SPC_SMPTE240M = 7,
112 AVCOL_SPC_YCOCG = 8,
114 AVCOL_SPC_BT2020_NCL = 9,
116 AVCOL_SPC_BT2020_CL = 10,
118 AVCOL_SPC_SMPTE2085 = 11,
120 AVCOL_SPC_NB
121};
122
136enum AVChromaLocation {
137 AVCHROMA_LOC_UNSPECIFIED = 0,
139 AVCHROMA_LOC_LEFT = 1,
141 AVCHROMA_LOC_CENTER = 2,
143 AVCHROMA_LOC_TOPLEFT = 3,
144 AVCHROMA_LOC_TOP = 4,
145 AVCHROMA_LOC_BOTTOMLEFT = 5,
146 AVCHROMA_LOC_BOTTOM = 6,
148 AVCHROMA_LOC_NB
149};
150
153 public:
154 enum ChromaSubsampling {
155 CHROMA_420_VERTICAL = 0,
156 CHROMA_420_COLLOCATED_WITH_LUMA = 1,
157 CHROMA_422 = 2,
158 CHROMA_444 = 3,
159 CHROMA_440 = 4,
160 };
161 enum ChromaSitingValues {
162 kUnspecified = 0,
163 kLeftCollocated = 1,
164 kTopCollocated = kLeftCollocated,
165 kHalf = 2,
166 };
167
170 uint8_t profile,
171 uint8_t level,
172 uint8_t bit_depth,
173 uint8_t chroma_subsampling,
174 bool video_full_range_flag,
175 uint8_t color_primaries,
176 uint8_t transfer_characteristics,
177 uint8_t matrix_coefficients,
178 const std::vector<uint8_t>& codec_initialization_data);
180
183 bool ParseMP4(const std::vector<uint8_t>& data);
184
187 bool ParseWebM(const std::vector<uint8_t>& data);
188
190 void SetVP9Level(uint16_t width,
191 uint16_t height,
192 double sample_duration_seconds);
193
196 void WriteMP4(std::vector<uint8_t>* data) const;
197
200 void WriteWebM(std::vector<uint8_t>* data) const;
201
203 std::string GetCodecString(Codec codec) const;
204
207 void MergeFrom(const VPCodecConfigurationRecord& other);
208
209 void SetChromaSubsampling(uint8_t subsampling_x, uint8_t subsampling_y);
210 void SetChromaSubsampling(ChromaSubsampling chroma_subsampling);
211 void SetChromaLocation(uint8_t chroma_siting_x, uint8_t chroma_siting_y);
212
213 void set_profile(uint8_t profile) { profile_ = profile; }
214 void set_level(uint8_t level) { level_ = level; }
215 void set_bit_depth(uint8_t bit_depth) { bit_depth_ = bit_depth; }
216 void set_video_full_range_flag(bool video_full_range_flag) {
217 video_full_range_flag_ = video_full_range_flag;
218 }
219 void set_color_primaries(uint8_t color_primaries) {
220 color_primaries_ = color_primaries;
221 }
222 void set_transfer_characteristics(uint8_t transfer_characteristics) {
223 transfer_characteristics_ = transfer_characteristics;
224 }
225 void set_matrix_coefficients(uint8_t matrix_coefficients) {
226 matrix_coefficients_ = matrix_coefficients;
227 }
228
229 bool is_profile_set() const { return static_cast<bool>(profile_); }
230 bool is_level_set() const { return static_cast<bool>(level_); }
231 bool is_bit_depth_set() const { return static_cast<bool>(bit_depth_); }
232 bool is_chroma_subsampling_set() const {
233 return static_cast<bool>(chroma_subsampling_);
234 }
235 bool is_video_full_range_flag_set() const {
236 return static_cast<bool>(video_full_range_flag_);
237 }
238 bool is_color_primaries_set() const {
239 return static_cast<bool>(color_primaries_);
240 }
241 bool is_transfer_characteristics_set() const {
242 return static_cast<bool>(transfer_characteristics_);
243 }
244 bool is_matrix_coefficients_set() const {
245 return static_cast<bool>(matrix_coefficients_);
246 }
247 bool is_chroma_location_set() const {
248 return static_cast<bool>(chroma_location_);
249 }
250
251 uint8_t profile() const { return profile_.value_or(0); }
252 uint8_t level() const { return level_.value_or(10); }
253 uint8_t bit_depth() const { return bit_depth_.value_or(8); }
254 uint8_t chroma_subsampling() const {
255 return chroma_subsampling_.value_or(CHROMA_420_COLLOCATED_WITH_LUMA);
256 }
257 bool video_full_range_flag() const {
258 return video_full_range_flag_.value_or(false);
259 }
260 uint8_t color_primaries() const {
261 return color_primaries_.value_or(AVCOL_PRI_UNSPECIFIED);
262 }
263 uint8_t transfer_characteristics() const {
264 return transfer_characteristics_.value_or(AVCOL_TRC_UNSPECIFIED);
265 }
266 uint8_t matrix_coefficients() const {
267 return matrix_coefficients_.value_or(AVCOL_SPC_UNSPECIFIED);
268 }
269 uint8_t chroma_location() const {
270 return chroma_location_.value_or(AVCHROMA_LOC_UNSPECIFIED);
271 }
272
273 private:
274 void UpdateChromaSubsamplingIfNeeded();
275
276 std::optional<uint8_t> profile_;
277 std::optional<uint8_t> level_;
278 std::optional<uint8_t> bit_depth_;
279 std::optional<uint8_t> chroma_subsampling_;
280 std::optional<bool> video_full_range_flag_;
281 std::optional<uint8_t> color_primaries_;
282 std::optional<uint8_t> transfer_characteristics_;
283 std::optional<uint8_t> matrix_coefficients_;
284 std::vector<uint8_t> codec_initialization_data_;
285
286 // Not in the decoder config. It is there to help determine chroma subsampling
287 // format.
288 std::optional<uint8_t> chroma_location_;
289 // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
290 // generated copy constructor and assignment operator. Since the internal data
291 // is small, the performance impact is minimal.
292};
293
294} // namespace media
295} // namespace shaka
296
297#endif // PACKAGER_MEDIA_CODECS_VP_CODEC_CONFIGURATION_RECORD_H_
Class for parsing or writing VP codec configuration record.
void WriteMP4(std::vector< uint8_t > *data) const
void SetVP9Level(uint16_t width, uint16_t height, double sample_duration_seconds)
Compute and set VP9 Level based on the input attributes.
void MergeFrom(const VPCodecConfigurationRecord &other)
bool ParseWebM(const std::vector< uint8_t > &data)
void WriteWebM(std::vector< uint8_t > *data) const
bool ParseMP4(const std::vector< uint8_t > &data)
All the methods that are virtual are virtual for mocking.