| @@ -224,6 +224,59 @@ SEI_FUNC(ambient_viewing_environment, · 223 unmodified lines |
| 224 | return 0; | 224 | return 0; |
| 225 | } | 225 | } |
| 226 | | 226 | |
| | 227 | SEI_FUNC(film_grain_characteristics, |
| | 228 | (CodedBitstreamContext *ctx, RWContext *rw, |
| | 229 | SEIRawFilmGrainCharacteristics *current, |
| | 230 | SEIMessageState *state)) |
| | 231 | { |
| | 232 | int err, c, i, j; |
| | 233 | |
| | 234 | HEADER("Film Grain Characteristics"); |
| | 235 | |
| | 236 | flag(fg_characteristics_cancel_flag); |
| | 237 | if (!current->fg_characteristics_cancel_flag) { |
| | 238 | int filmGrainBitDepth[3]; |
| | 239 | |
| | 240 | u(2, fg_model_id, 0, 1); |
| | 241 | flag(fg_separate_colour_description_present_flag); |
| | 242 | if (current->fg_separate_colour_description_present_flag) { |
| | 243 | ub(3, fg_bit_depth_luma_minus8); |
| | 244 | ub(3, fg_bit_depth_chroma_minus8); |
| | 245 | flag(fg_full_range_flag); |
| | 246 | ub(8, fg_colour_primaries); |
| | 247 | ub(8, fg_transfer_characteristics); |
| | 248 | ub(8, fg_matrix_coeffs); |
| | 249 | } |
| | 250 | |
| | 251 | filmGrainBitDepth[0] = current->fg_bit_depth_luma_minus8 + 8; |
| | 252 | filmGrainBitDepth[1] = |
| | 253 | filmGrainBitDepth[2] = current->fg_bit_depth_chroma_minus8 + 8; |
| | 254 | |
| | 255 | u(2, fg_blending_mode_id, 0, 1); |
| | 256 | ub(4, fg_log2_scale_factor); |
| | 257 | for (c = 0; c < 3; c++) |
| | 258 | flags(fg_comp_model_present_flag[c], 1, c); |
| | 259 | |
| | 260 | for (c = 0; c < 3; c++) { |
| | 261 | if (current->fg_comp_model_present_flag[c]) { |
| | 262 | ubs(8, fg_num_intensity_intervals_minus1[c], 1, c); |
| | 263 | us(3, fg_num_model_values_minus1[c], 0, 5, 1, c); |
| | 264 | for (i = 0; i <= current->fg_num_intensity_intervals_minus1[c]; i++) { |
| | 265 | ubs(8, fg_intensity_interval_lower_bound[c][i], 2, c, i); |
| | 266 | ubs(8, fg_intensity_interval_upper_bound[c][i], 2, c, i); |
| | 267 | for (j = 0; j <= current->fg_num_model_values_minus1[c]; j++) |
| | 268 | ses(fg_comp_model_value[c][i][j], 0 - current->fg_model_id * (1 << (filmGrainBitDepth[c] - 1)), |
| | 269 | ((1 << filmGrainBitDepth[c]) - 1) - current->fg_model_id * (1 << (filmGrainBitDepth[c] - 1)), |
| | 270 | 3, c, i, j); |
| | 271 | } |
| | 272 | } |
| | 273 | } |
| | 274 | flag(fg_characteristics_persistence_flag); |
| | 275 | } |
| | 276 | |
| | 277 | return 0; |
| | 278 | } |
| | 279 | |
| 227 | static int FUNC(message)(CodedBitstreamContext *ctx, RWContext *rw, | 280 | static int FUNC(message)(CodedBitstreamContext *ctx, RWContext *rw, |
| 228 | SEIRawMessage *current) | 281 | SEIRawMessage *current) |
| 229 | { | 282 | { |