| @@ -224,6 +224,59 @@ SEI_FUNC(ambient_viewing_environment, · 223 unmodified lines |
| 224 | 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 | 280 | static int FUNC(message)(CodedBitstreamContext *ctx, RWContext *rw, |
| 228 | 281 | SEIRawMessage *current) |
| 229 | 282 | { |