diff options
author | Mikhail Burakov <mburakov@mailbox.org> | 2023-05-22 10:29:46 +0200 |
---|---|---|
committer | Mikhail Burakov <mburakov@mailbox.org> | 2023-05-22 10:29:46 +0200 |
commit | a39b35d524cb3788b85eb2505a2d41854510f4d2 (patch) | |
tree | fb1d5b7472d4060f2abfbf4e373ea93c4743f823 | |
parent | c18411dc703df9f833f5dfb3117bc653216c715e (diff) |
Tidying up hardcoded bitstream attributes (WIP)
-rw-r--r-- | encode2.c | 42 | ||||
-rw-r--r-- | hevc.c | 100 | ||||
-rw-r--r-- | hevc.h | 15 |
3 files changed, 80 insertions, 77 deletions
@@ -226,7 +226,26 @@ struct EncodeContext* EncodeContextCreate(struct GpuContext* gpu_context, .log2_max_pcm_luma_coding_block_size_minus3 = 0, // ??? // mburakov: ffmpeg hardcodes this to 0. - .vui_parameters_present_flag = 0, + .vui_parameters_present_flag = 1, + .vui_fields.bits = + { + .aspect_ratio_info_present_flag = 0, // defaulted + .neutral_chroma_indication_flag = 0, // defaulted + .field_seq_flag = 0, // defaulted + .vui_timing_info_present_flag = 1, // hardcoded + .bitstream_restriction_flag = 1, // hardcoded + .tiles_fixed_structure_flag = 0, // defaulted + .motion_vectors_over_pic_boundaries_flag = 1, // hardcoded + .restricted_ref_pic_lists_flag = 1, // hardcoded + .log2_max_mv_length_horizontal = 15, // hardcoded + .log2_max_mv_length_vertical = 15, // hardcoded + }, + + .vui_num_units_in_tick = 1, // TODO + .vui_time_scale = 60, // TODO + .min_spatial_segmentation_idc = 0, // defaulted + .max_bytes_per_pic_denom = 0, // hardcoded + .max_bits_per_min_cu_denom = 0, // hardcoded // TODO(mburakov): ffmpeg leaves rest of the structure zero-initialized. }; @@ -594,14 +613,23 @@ bool EncodeContextEncodeFrame(struct EncodeContext* encode_context, int fd) { .size = 0, }; static const struct MoreVideoParameters mvp = { - .max_b_depth = 0, - .time_base_num = 1, - .time_base_den = 60, + .vps_max_dec_pic_buffering_minus1 = 1, // No B-frames + .vps_max_num_reorder_pics = 0, // No B-frames }; PackVideoParameterSetNalUnit(&bitstream, &encode_context->seq, &mvp); const struct MoreSeqParameters msp = { - .crop_width = encode_context->width, - .crop_height = encode_context->height, + .conf_win_left_offset = 0, + .conf_win_right_offset = + (encode_context->seq.pic_width_in_luma_samples - + encode_context->width) / + 2, + .conf_win_top_offset = 0, + .conf_win_bottom_offset = + (encode_context->seq.pic_height_in_luma_samples - + encode_context->height) / + 2, + .sps_max_dec_pic_buffering_minus1 = 1, // No B-frames + .sps_max_num_reorder_pics = 0, // No B-frames .video_signal_type_present_flag = 1, .video_full_range_flag = 0, // TODO .colour_description_present_flag = 1, @@ -609,7 +637,7 @@ bool EncodeContextEncodeFrame(struct EncodeContext* encode_context, int fd) { .transfer_characteristics = 2, // Unspecified .matrix_coeffs = 6, // TODO }; - PackSeqParameterSetNalUnit(&bitstream, &encode_context->seq, &mvp, &msp); + PackSeqParameterSetNalUnit(&bitstream, &encode_context->seq, &msp); PackPicParameterSetNalUnit(&bitstream, &encode_context->pic); if (!UploadPackedBuffer(encode_context, VAEncPackedHeaderSequence, (unsigned int)bitstream.size, bitstream.data, @@ -54,19 +54,10 @@ static const uint32_t sps_max_latency_increase_plus1 = vps_max_latency_increase_plus1; static const uint32_t num_short_term_ref_pic_sets = 0; static const bool long_term_ref_pics_present_flag = 0; -static const bool vui_parameters_present_flag = 1; static const uint8_t video_format = 5; -static const bool vui_timing_info_present_flag = 1; static const bool vui_poc_proportional_to_timing_flag = vps_poc_proportional_to_timing_flag; static const bool vui_hrd_parameters_present_flag = 0; -static const bool bitstream_restriction_flag = 1; -static const bool motion_vectors_over_pic_boundaries_flag = 1; -static const bool restricted_ref_pic_lists_flag = 1; -static const uint32_t max_bytes_per_pic_denom = 0; -static const uint32_t max_bits_per_min_cu_denom = 0; -static const uint32_t log2_max_mv_length_horizontal = 15; -static const uint32_t log2_max_mv_length_vertical = 15; static const uint32_t pps_pic_parameter_set_id = 0; static const uint32_t pps_seq_parameter_set_id = sps_seq_parameter_set_id; static const bool short_term_ref_pic_set_sps_flag = 0; @@ -74,14 +65,9 @@ static const bool short_term_ref_pic_set_sps_flag = 0; // mburakov: Below entries are defaulted by ffmpeg: static const bool general_inbld_flag = 0; static const bool vps_extension_flag = 0; -static const bool aspect_ratio_info_present_flag = 0; static const bool overscan_info_present_flag = 0; -static const bool neutral_chroma_indication_flag = 0; -static const bool field_seq_flag = 0; static const bool frame_field_info_present_flag = 0; static const bool default_display_window_flag = 0; -static const bool tiles_fixed_structure_flag = 0; -static const uint32_t min_spatial_segmentation_idc = 0; static const bool sps_extension_present_flag = 0; static const bool output_flag_present_flag = 0; static const uint8_t num_extra_slice_header_bits = 0; @@ -238,9 +224,8 @@ void PackVideoParameterSetNalUnit(struct Bitstream* bitstream, abort(); } - BitstreamAppendUE( - &vps_rbsp, mvp->max_b_depth + 1); // vps_max_dec_pic_buffering_minus1 - BitstreamAppendUE(&vps_rbsp, mvp->max_b_depth); // vps_max_num_reorder_pics + BitstreamAppendUE(&vps_rbsp, mvp->vps_max_dec_pic_buffering_minus1); + BitstreamAppendUE(&vps_rbsp, mvp->vps_max_num_reorder_pics); BitstreamAppendUE(&vps_rbsp, vps_max_latency_increase_plus1); } @@ -258,8 +243,8 @@ void PackVideoParameterSetNalUnit(struct Bitstream* bitstream, // TODO(mburakov): Is this section required? BitstreamAppend(&vps_rbsp, 32, - mvp->time_base_num); // vps_num_units_in_tick - BitstreamAppend(&vps_rbsp, 32, mvp->time_base_den); // vps_time_scale + seq->vui_num_units_in_tick); // vps_num_units_in_tick + BitstreamAppend(&vps_rbsp, 32, seq->vui_time_scale); // vps_time_scale BitstreamAppend(&vps_rbsp, 1, vps_poc_proportional_to_timing_flag); if (vps_poc_proportional_to_timing_flag) { // TODO(mburakov): Implement this! @@ -285,10 +270,12 @@ void PackVideoParameterSetNalUnit(struct Bitstream* bitstream, // E.2.1 VUI parameters syntax static void PackVuiParameters(struct Bitstream* bitstream, - const struct MoreVideoParameters* mvp, + const VAEncSequenceParameterBufferHEVC* seq, const struct MoreSeqParameters* msp) { - BitstreamAppend(bitstream, 1, aspect_ratio_info_present_flag); - if (aspect_ratio_info_present_flag) { + const typeof(seq->vui_fields.bits)* vui_bits = &seq->vui_fields.bits; + + BitstreamAppend(bitstream, 1, vui_bits->aspect_ratio_info_present_flag); + if (vui_bits->aspect_ratio_info_present_flag) { // TODO(mburakov): Implement this! abort(); } @@ -317,13 +304,13 @@ static void PackVuiParameters(struct Bitstream* bitstream, BitstreamAppendUE(bitstream, msp->chroma_sample_loc_type_bottom_field); } - BitstreamAppend(bitstream, 1, neutral_chroma_indication_flag); - if (neutral_chroma_indication_flag) { + BitstreamAppend(bitstream, 1, vui_bits->neutral_chroma_indication_flag); + if (vui_bits->neutral_chroma_indication_flag) { // TODO(mburakov): Implement this! abort(); } - BitstreamAppend(bitstream, 1, field_seq_flag); + BitstreamAppend(bitstream, 1, vui_bits->field_seq_flag); BitstreamAppend(bitstream, 1, frame_field_info_present_flag); BitstreamAppend(bitstream, 1, default_display_window_flag); if (default_display_window_flag) { @@ -331,11 +318,10 @@ static void PackVuiParameters(struct Bitstream* bitstream, abort(); } - BitstreamAppend(bitstream, 1, vui_timing_info_present_flag); - if (vui_timing_info_present_flag) { - BitstreamAppend(bitstream, 32, - mvp->time_base_num); // vui_num_units_in_tick - BitstreamAppend(bitstream, 32, mvp->time_base_den); // vui_time_scale + BitstreamAppend(bitstream, 1, vui_bits->vui_timing_info_present_flag); + if (vui_bits->vui_timing_info_present_flag) { + BitstreamAppend(bitstream, 32, seq->vui_num_units_in_tick); + BitstreamAppend(bitstream, 32, seq->vui_time_scale); BitstreamAppend(bitstream, 1, vui_poc_proportional_to_timing_flag); if (vui_poc_proportional_to_timing_flag) { // TODO(mburakov): Implement this! @@ -349,22 +335,22 @@ static void PackVuiParameters(struct Bitstream* bitstream, } } - BitstreamAppend(bitstream, 1, bitstream_restriction_flag); - if (bitstream_restriction_flag) { - BitstreamAppend(bitstream, 1, tiles_fixed_structure_flag); - BitstreamAppend(bitstream, 1, motion_vectors_over_pic_boundaries_flag); - BitstreamAppend(bitstream, 1, restricted_ref_pic_lists_flag); - BitstreamAppendUE(bitstream, min_spatial_segmentation_idc); - BitstreamAppendUE(bitstream, max_bytes_per_pic_denom); - BitstreamAppendUE(bitstream, max_bits_per_min_cu_denom); - BitstreamAppendUE(bitstream, log2_max_mv_length_horizontal); - BitstreamAppendUE(bitstream, log2_max_mv_length_vertical); + BitstreamAppend(bitstream, 1, vui_bits->bitstream_restriction_flag); + if (vui_bits->bitstream_restriction_flag) { + BitstreamAppend(bitstream, 1, vui_bits->tiles_fixed_structure_flag); + BitstreamAppend(bitstream, 1, + vui_bits->motion_vectors_over_pic_boundaries_flag); + BitstreamAppend(bitstream, 1, vui_bits->restricted_ref_pic_lists_flag); + BitstreamAppendUE(bitstream, seq->min_spatial_segmentation_idc); + BitstreamAppendUE(bitstream, seq->max_bytes_per_pic_denom); + BitstreamAppendUE(bitstream, seq->max_bits_per_min_cu_denom); + BitstreamAppendUE(bitstream, vui_bits->log2_max_mv_length_horizontal); + BitstreamAppendUE(bitstream, vui_bits->log2_max_mv_length_vertical); } } void PackSeqParameterSetNalUnit(struct Bitstream* bitstream, const VAEncSequenceParameterBufferHEVC* seq, - const struct MoreVideoParameters* mvp, const struct MoreSeqParameters* msp) { const typeof(seq->seq_fields.bits)* seq_bits = &seq->seq_fields.bits; @@ -393,25 +379,14 @@ void PackSeqParameterSetNalUnit(struct Bitstream* bitstream, BitstreamAppendUE(&sps_rbsp, seq->pic_height_in_luma_samples); bool conformance_window_flag = - msp->crop_width != seq->pic_width_in_luma_samples || - msp->crop_height != seq->pic_height_in_luma_samples; + msp->conf_win_left_offset || msp->conf_win_right_offset || + msp->conf_win_top_offset || msp->conf_win_bottom_offset; BitstreamAppend(&sps_rbsp, 1, conformance_window_flag); - if (conformance_window_flag) { - if (seq_bits->chroma_format_idc != 1) { - // TODO(mburakov): Implement this! - abort(); - } - - // mburakov: Offsets are in chroma samples. - uint32_t conf_win_right_offset = - (seq->pic_width_in_luma_samples - msp->crop_width) / 2; - uint32_t conf_win_bottom_offset = - (seq->pic_height_in_luma_samples - msp->crop_height) / 2; - BitstreamAppendUE(&sps_rbsp, 0); // conf_win_left_offset - BitstreamAppendUE(&sps_rbsp, conf_win_right_offset); - BitstreamAppendUE(&sps_rbsp, 0); // conf_win_top_offset - BitstreamAppendUE(&sps_rbsp, conf_win_bottom_offset); + BitstreamAppendUE(&sps_rbsp, msp->conf_win_left_offset); + BitstreamAppendUE(&sps_rbsp, msp->conf_win_right_offset); + BitstreamAppendUE(&sps_rbsp, msp->conf_win_top_offset); + BitstreamAppendUE(&sps_rbsp, msp->conf_win_bottom_offset); } BitstreamAppendUE(&sps_rbsp, seq_bits->bit_depth_luma_minus8); @@ -428,9 +403,8 @@ void PackSeqParameterSetNalUnit(struct Bitstream* bitstream, abort(); } - BitstreamAppendUE( - &sps_rbsp, mvp->max_b_depth + 1); // vps_max_dec_pic_buffering_minus1 - BitstreamAppendUE(&sps_rbsp, mvp->max_b_depth); // vps_max_num_reorder_pics + BitstreamAppendUE(&sps_rbsp, msp->sps_max_dec_pic_buffering_minus1); + BitstreamAppendUE(&sps_rbsp, msp->sps_max_num_reorder_pics); BitstreamAppendUE(&sps_rbsp, sps_max_latency_increase_plus1); } @@ -469,8 +443,8 @@ void PackSeqParameterSetNalUnit(struct Bitstream* bitstream, BitstreamAppend(&sps_rbsp, 1, seq_bits->sps_temporal_mvp_enabled_flag); BitstreamAppend(&sps_rbsp, 1, seq_bits->strong_intra_smoothing_enabled_flag); - BitstreamAppend(&sps_rbsp, 1, vui_parameters_present_flag); - if (vui_parameters_present_flag) PackVuiParameters(&sps_rbsp, mvp, msp); + BitstreamAppend(&sps_rbsp, 1, seq->vui_parameters_present_flag); + if (seq->vui_parameters_present_flag) PackVuiParameters(&sps_rbsp, seq, msp); BitstreamAppend(&sps_rbsp, 1, sps_extension_present_flag); if (sps_extension_present_flag) { // TODO(mburakov): Implement this! @@ -43,15 +43,17 @@ enum SliceType { struct Bitstream; struct MoreVideoParameters { - uint32_t max_b_depth; - uint32_t time_base_num; - uint32_t time_base_den; + uint32_t vps_max_dec_pic_buffering_minus1; + uint32_t vps_max_num_reorder_pics; }; struct MoreSeqParameters { - uint32_t crop_width; - uint32_t crop_height; - // TODO(mburakov): Why ffmpeg ignores vui section in seq? + uint32_t conf_win_left_offset; + uint32_t conf_win_right_offset; + uint32_t conf_win_top_offset; + uint32_t conf_win_bottom_offset; + uint32_t sps_max_dec_pic_buffering_minus1; + uint32_t sps_max_num_reorder_pics; bool video_signal_type_present_flag; bool video_full_range_flag; bool colour_description_present_flag; @@ -83,7 +85,6 @@ void PackVideoParameterSetNalUnit(struct Bitstream* bitstream, const struct MoreVideoParameters* mvp); void PackSeqParameterSetNalUnit(struct Bitstream* bitstream, const VAEncSequenceParameterBufferHEVC* seq, - const struct MoreVideoParameters* mvp, const struct MoreSeqParameters* msp); void PackPicParameterSetNalUnit(struct Bitstream* bitstream, const VAEncPictureParameterBufferHEVC* pic); |