[FFmpeg-devel] 回复: [PATCH v1 01/19] avcodec/cbs_sei_syntax_template: add sei message film_grain_characteristics
Wu Jianhua
toqsxw at outlook.com
Sat Apr 26 14:37:49 EEST 2025
Andreas Rheinhardt:
> toqsxw at gmail.com:
>> From: Wu Jianhua <toqsxw at outlook.com>
>>
>> Signed-off-by: Wu Jianhua <toqsxw at outlook.com>
>> ---
>> libavcodec/cbs_h2645.c | 6 ++++
>> libavcodec/cbs_sei.h | 21 +++++++++++
>> libavcodec/cbs_sei_syntax_template.c | 53 ++++++++++++++++++++++++++++
>> 3 files changed, 80 insertions(+)
>>
>> +typedef struct SEIRawFilmGrainCharacteristics {
>> + uint8_t fg_characteristics_cancel_flag;
>> + uint8_t fg_model_id;
>> + uint8_t fg_separate_colour_description_present_flag;
>> + uint8_t fg_bit_depth_luma_minus8;
>> + uint8_t fg_bit_depth_chroma_minus8;
>> + uint8_t fg_full_range_flag;
>> + uint8_t fg_colour_primaries;
>> + uint8_t fg_transfer_characteristics;
>> + uint8_t fg_matrix_coeffs;
>> + uint8_t fg_blending_mode_id;
>> + uint8_t fg_log2_scale_factor;
>> + uint8_t fg_comp_model_present_flag[3];
>> + uint8_t fg_num_intensity_intervals_minus1[3];
>> + uint8_t fg_num_model_values_minus1[3];
>> + uint8_t fg_intensity_interval_lower_bound[3][256];
>> + uint8_t fg_intensity_interval_upper_bound[3][256];
>> + int16_t fg_comp_model_value[3][256][6];
>> + uint8_t fg_characteristics_persistence_flag;
>> +} SEIRawFilmGrainCharacteristics;
>> +
>> typedef struct SEIRawMessage {
>> uint32_t payload_type;
>> uint32_t payload_size;
>> diff --git a/libavcodec/cbs_sei_syntax_template.c b/libavcodec/cbs_sei_syntax_template.c
>> index 0205bb47aa..b105299cd9 100644
>> --- a/libavcodec/cbs_sei_syntax_template.c
>> +++ b/libavcodec/cbs_sei_syntax_template.c
>> @@ -224,6 +224,59 @@ SEI_FUNC(ambient_viewing_environment,
>> return 0;
>> }
>>
>> +SEI_FUNC(film_grain_characteristics,
>> + (CodedBitstreamContext *ctx, RWContext *rw,
>> + SEIRawFilmGrainCharacteristics *current,
>> + SEIMessageState *state))
>> +{
>> + int err, c, i, j;
>> +
>> + HEADER("Film Grain Characteristics");
>> +
>> + flag(fg_characteristics_cancel_flag);
>> + if (!current->fg_characteristics_cancel_flag) {
>> + int filmGrainBitDepth[3];
>> +
>> + u(2, fg_model_id, 0, 1);
>> + flag(fg_separate_colour_description_present_flag);
>> + if (current->fg_separate_colour_description_present_flag) {
>> + ub(3, fg_bit_depth_luma_minus8);
>> + ub(3, fg_bit_depth_chroma_minus8);
>> + flag(fg_full_range_flag);
>> + ub(8, fg_colour_primaries);
>> + ub(8, fg_transfer_characteristics);
>> + ub(8, fg_matrix_coeffs);
>> + }
>> +
>> + filmGrainBitDepth[0] = current->fg_bit_depth_luma_minus8 + 8;
>> + filmGrainBitDepth[1] =
>> + filmGrainBitDepth[2] = current->fg_bit_depth_chroma_minus8 + 8;
>> +
>> + u(2, fg_blending_mode_id, 0, 1);
>> + ub(4, fg_log2_scale_factor);
>> + for (c = 0; c < 3; c++)
>> + flags(fg_comp_model_present_flag[c], 1, c);
>> +
>> + for (c = 0; c < 3; c++) {
>> + if (current->fg_comp_model_present_flag[c]) {
>> + ubs(8, fg_num_intensity_intervals_minus1[c], 1, c);
>> + us(3, fg_num_model_values_minus1[c], 0, 5, 1, c);
>> + for (i = 0; i <= current->fg_num_intensity_intervals_minus1[c]; i++) {
>> + ubs(8, fg_intensity_interval_lower_bound[c][i], 2, c, i);
>> + ubs(8, fg_intensity_interval_upper_bound[c][i], 2, c, i);
>> + for (j = 0; j <= current->fg_num_model_values_minus1[c]; j++)
>> + ses(fg_comp_model_value[c][i][j], 0 - current->fg_model_id * (1 << (filmGrainBitDepth[c] - 1)),
>> + ((1 << filmGrainBitDepth[c]) - 1) - current->fg_model_id * (1 << (filmGrainBitDepth[c] - 1)),
>> + 3, c, i, j);
>> + }
>> + }
>> + }
>> + flag(fg_characteristics_persistence_flag);
>> + }
>> +
>> + return 0;
>> +}
>> +
>
> This seems to be exactly the same as the H.265 one (apart from some
> variable names), so it should be shared.
>
> - Andreas
Hi Andreas,
Yeah. They are the same but I have some concerns here.
As you can see, the RawSEI structures have the same name as the standard.
For example, the film grain in h274 spec has fg_ prefix, the SEIRawFramePackingArrangement
has fp_ prefix, the film grain in h265 spec has no prefix. I'm not sure we should follow this convention.
And, the h274 doesn't require the codec context, but the film grain in h265 depends on the sps
and vui. Also, there is one more film grain in h264 cbs. I'm not sure how to leverage a good way
to share them, so just follow the convention of cbs interface.
Thanks,
Jianhua
More information about the ffmpeg-devel
mailing list