1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Kernel: Fix demux SPS error for NVENC and LARIX. v6.0.22 (#3389)

Co-authored-by: Winlin <winlin@vip.126.com>
Co-authored-by: john <hondaxiao@tencent.com>
This commit is contained in:
chundonglinlin 2023-02-08 20:23:25 +08:00 committed by GitHub
parent 47c2d59b31
commit 2b0e32aace
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 79 deletions

View file

@ -8,6 +8,7 @@ The changelog for SRS.
## SRS 6.0 Changelog ## SRS 6.0 Changelog
* v6.0, 2023-02-08, Merge [#3389](https://github.com/ossrs/srs/pull/3389): Kernel: Fix demux SPS error for NVENC and LARIX. v6.0.22 (#3389)
* v6.0, 2023-01-29, Merge [#3371](https://github.com/ossrs/srs/pull/3371): HLS: support kick-off hls client. v6.0.21 (#3371) * v6.0, 2023-01-29, Merge [#3371](https://github.com/ossrs/srs/pull/3371): HLS: support kick-off hls client. v6.0.21 (#3371)
* v6.0, 2023-01-19, Merge [#3366](https://github.com/ossrs/srs/pull/3366): H265: Support HEVC over SRT. v6.0.20 (#465) (#3366) * v6.0, 2023-01-19, Merge [#3366](https://github.com/ossrs/srs/pull/3366): H265: Support HEVC over SRT. v6.0.20 (#465) (#3366)
* v6.0, 2023-01-19, Merge [#3318](https://github.com/ossrs/srs/pull/3318): RTC: fix rtc publisher pli cid. v6.0.19 (#3318) * v6.0, 2023-01-19, Merge [#3318](https://github.com/ossrs/srs/pull/3318): RTC: fix rtc publisher pli cid. v6.0.19 (#3318)

View file

@ -651,7 +651,7 @@ srs_error_t SrsRtmpFromSrtBridge::check_vps_sps_pps_change(SrsTsMessage* msg)
} }
if ((err = live_source_->on_video(&rtmp)) != srs_success) { if ((err = live_source_->on_video(&rtmp)) != srs_success) {
return srs_error_wrap(err, "srt to rtmp sps/pps"); return srs_error_wrap(err, "srt to rtmp vps/sps/pps");
} }
return err; return err;

View file

@ -9,6 +9,6 @@
#define VERSION_MAJOR 6 #define VERSION_MAJOR 6
#define VERSION_MINOR 0 #define VERSION_MINOR 0
#define VERSION_REVISION 21 #define VERSION_REVISION 22
#endif #endif

View file

@ -893,7 +893,7 @@ srs_error_t SrsFormat::video_avc_demux(SrsBuffer* stream, int64_t timestamp)
if (avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader) { if (avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader) {
// TODO: demux vps/sps/pps for hevc // TODO: demux vps/sps/pps for hevc
if ((err = hevc_demux_hvcc(stream)) != srs_success) { if ((err = hevc_demux_hvcc(stream)) != srs_success) {
return srs_error_wrap(err, "demux hevc SPS/PPS"); return srs_error_wrap(err, "demux hevc VPS/SPS/PPS");
} }
} else if (avc_packet_type == SrsVideoAvcFrameTraitNALU) { } else if (avc_packet_type == SrsVideoAvcFrameTraitNALU) {
// TODO: demux nalu for hevc // TODO: demux nalu for hevc
@ -928,6 +928,42 @@ srs_error_t SrsFormat::video_avc_demux(SrsBuffer* stream, int64_t timestamp)
// LCOV_EXCL_START // LCOV_EXCL_START
#ifdef SRS_H265 #ifdef SRS_H265
// struct ptl
SrsHevcProfileTierLevel::SrsHevcProfileTierLevel()
{
general_profile_space = 0;
general_tier_flag = 0;
general_profile_idc = 0;
memset(general_profile_compatibility_flag, 0, 32);
general_progressive_source_flag = 0;
general_interlaced_source_flag = 0;
general_non_packed_constraint_flag = 0;
general_frame_only_constraint_flag = 0;
general_max_12bit_constraint_flag = 0;
general_max_10bit_constraint_flag = 0;
general_max_8bit_constraint_flag = 0;
general_max_422chroma_constraint_flag = 0;
general_max_420chroma_constraint_flag = 0;
general_max_monochrome_constraint_flag = 0;
general_intra_constraint_flag = 0;
general_one_picture_only_constraint_flag = 0;
general_lower_bit_rate_constraint_flag = 0;
general_max_14bit_constraint_flag = 0;
general_reserved_zero_7bits = 0;
general_reserved_zero_33bits = 0;
general_reserved_zero_34bits = 0;
general_reserved_zero_35bits = 0;
general_reserved_zero_43bits = 0;
general_inbld_flag = 0;
general_reserved_zero_bit = 0;
general_level_idc = 0;
memset(reserved_zero_2bits, 0, 8);
}
SrsHevcProfileTierLevel::~SrsHevcProfileTierLevel()
{
}
// Parse the hevc vps/sps/pps // Parse the hevc vps/sps/pps
srs_error_t SrsFormat::hevc_demux_hvcc(SrsBuffer* stream) srs_error_t SrsFormat::hevc_demux_hvcc(SrsBuffer* stream)
{ {
@ -1047,7 +1083,7 @@ srs_error_t SrsFormat::hevc_demux_hvcc(SrsBuffer* stream)
// demux nalu // demux nalu
if ((err = hevc_demux_vps_sps_pps(&hevc_unit)) != srs_success) { if ((err = hevc_demux_vps_sps_pps(&hevc_unit)) != srs_success) {
return srs_error_wrap(err, "hevc demux vps sps pps failed"); return srs_error_wrap(err, "hevc demux vps/sps/pps failed");
} }
} }
@ -1317,7 +1353,6 @@ srs_error_t SrsFormat::hevc_demux_sps_rbsp(char* rbsp, int nb_rbsp)
// profile tier level... // profile tier level...
SrsHevcProfileTierLevel profile_tier_level; SrsHevcProfileTierLevel profile_tier_level;
memset((void*)&profile_tier_level, 0, sizeof(SrsHevcProfileTierLevel));
// profile_tier_level(1, sps_max_sub_layers_minus1) // profile_tier_level(1, sps_max_sub_layers_minus1)
if ((err = hevc_demux_rbsp_ptl(&bs, &profile_tier_level, 1, sps_max_sub_layers_minus1)) != srs_success) { if ((err = hevc_demux_rbsp_ptl(&bs, &profile_tier_level, 1, sps_max_sub_layers_minus1)) != srs_success) {
return srs_error_wrap(err, "sps rbsp ptl sps_max_sub_layers_minus1=%d", sps_max_sub_layers_minus1); return srs_error_wrap(err, "sps rbsp ptl sps_max_sub_layers_minus1=%d", sps_max_sub_layers_minus1);
@ -1343,7 +1378,7 @@ srs_error_t SrsFormat::hevc_demux_sps_rbsp(char* rbsp, int nb_rbsp)
sps->sps_max_sub_layers_minus1 = sps_max_sub_layers_minus1; sps->sps_max_sub_layers_minus1 = sps_max_sub_layers_minus1;
sps->sps_temporal_id_nesting_flag = sps_temporal_id_nesting_flag; sps->sps_temporal_id_nesting_flag = sps_temporal_id_nesting_flag;
sps->sps_seq_parameter_set_id = sps_seq_parameter_set_id; sps->sps_seq_parameter_set_id = sps_seq_parameter_set_id;
memcpy(&(sps->ptl), &profile_tier_level, sizeof(SrsHevcProfileTierLevel)); sps->ptl = profile_tier_level;
// chroma_format_idc ue(v) // chroma_format_idc ue(v)
if ((err = bs.read_bits_ue(sps->chroma_format_idc)) != srs_success) { if ((err = bs.read_bits_ue(sps->chroma_format_idc)) != srs_success) {
@ -1652,7 +1687,7 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
pps->deblocking_filter_override_enabled_flag = bs.read_bit(); pps->deblocking_filter_override_enabled_flag = bs.read_bit();
// pps_deblocking_filter_disabled_flag u(1) // pps_deblocking_filter_disabled_flag u(1)
pps->pps_deblocking_filter_disabled_flag = bs.read_bit(); pps->pps_deblocking_filter_disabled_flag = bs.read_bit();
if (pps->pps_deblocking_filter_disabled_flag) { if (!pps->pps_deblocking_filter_disabled_flag) {
// pps_beta_offset_div2 se(v) // pps_beta_offset_div2 se(v)
if ((err = bs.read_bits_se(pps->pps_beta_offset_div2)) != srs_success) { if ((err = bs.read_bits_se(pps->pps_beta_offset_div2)) != srs_success) {
return srs_error_wrap(err, "pps_beta_offset_div2"); return srs_error_wrap(err, "pps_beta_offset_div2");
@ -1744,78 +1779,9 @@ srs_error_t SrsFormat::hevc_demux_pps_rbsp(char* rbsp, int nb_rbsp)
pps->pps_extension_4bits = bs.read_bits(4); pps->pps_extension_4bits = bs.read_bits(4);
} }
if (pps->pps_range_extension_flag) { // TODO: FIXME: Implements it, you might parse remain bits for pic_parameter_set_rbsp.
if (pps->transform_skip_enabled_flag) { // @see 7.3.2.3 Picture parameter set RBSP syntax
if ((err = bs.read_bits_ue(pps->pps_range_extension.log2_max_transform_skip_block_size_minus2)) != srs_success) { // @doc ITU-T-H.265-2021.pdf, page 59.
return srs_error_wrap(err, "log2_max_transform_skip_block_size_minus2");
}
}
if (!bs.require_bits(2)) {
return srs_error_new(ERROR_HEVC_DECODE_ERROR, "cross_component_prediction_enabled_flag requires 2 only %d bits", bs.left_bits());
}
// cross_component_prediction_enabled_flag u(1)
pps->pps_range_extension.cross_component_prediction_enabled_flag = bs.read_bit();
// chroma_qp_offset_list_enabled_flag u(1)
pps->pps_range_extension.chroma_qp_offset_list_enabled_flag = bs.read_bit();
if (pps->pps_range_extension.chroma_qp_offset_list_enabled_flag) {
// diff_cu_chroma_qp_offset_depth ue(v)
if ((err = bs.read_bits_ue(pps->pps_range_extension.diff_cu_chroma_qp_offset_depth)) != srs_success) {
return srs_error_wrap(err, "diff_cu_chroma_qp_offset_depth");
}
// chroma_qp_offset_list_len_minus1 ue(v)
if ((err = bs.read_bits_ue(pps->pps_range_extension.chroma_qp_offset_list_len_minus1)) != srs_success) {
return srs_error_wrap(err, "chroma_qp_offset_list_len_minus1");
}
pps->pps_range_extension.cb_qp_offset_list.resize(pps->pps_range_extension.chroma_qp_offset_list_len_minus1);
pps->pps_range_extension.cr_qp_offset_list.resize(pps->pps_range_extension.chroma_qp_offset_list_len_minus1);
for (int i = 0; i < (int)pps->pps_range_extension.chroma_qp_offset_list_len_minus1; i++) {
// cb_qp_offset_list[i] se(v)
if ((err = bs.read_bits_se(pps->pps_range_extension.cb_qp_offset_list[i])) != srs_success) {
return srs_error_wrap(err, "cb_qp_offset_list");
}
// cr_qp_offset_list[i] se(v)
if ((err = bs.read_bits_se(pps->pps_range_extension.cr_qp_offset_list[i])) != srs_success) {
return srs_error_wrap(err, "cr_qp_offset_list");
}
}
}
// log2_sao_offset_scale_luma ue(v)
if ((err = bs.read_bits_ue(pps->pps_range_extension.log2_sao_offset_scale_luma)) != srs_success) {
return srs_error_wrap(err, "log2_sao_offset_scale_luma");
}
// log2_sao_offset_scale_chroma ue(v)
if ((err = bs.read_bits_ue(pps->pps_range_extension.log2_sao_offset_scale_chroma)) != srs_success) {
return srs_error_wrap(err, "log2_sao_offset_scale_chroma");
}
}
if (pps->pps_multilayer_extension_flag){
// pps_multilayer_extension, specified in Annex F
// TODO: FIXME: add support for pps_multilayer_extension()
}
if (pps->pps_3d_extension_flag) {
// pps_3d_extension, specified in Annex I
// TODO: FIXME: add support for pps_3d_extension()
}
if (pps->pps_scc_extension_flag) {
// pps_scc_extension_flag
// TODO: FIXME: add support for pps_scc_extension()
}
if (pps->pps_extension_4bits) {
// more_rbsp_data
// TODO: FIXME: add support for more_rbsp_data()
}
// TODO: FIXME: rbsp_trailing_bits // TODO: FIXME: rbsp_trailing_bits

View file

@ -511,6 +511,7 @@ const int SrsHevcMax_PPS_COUNT = 64;
*/ */
struct SrsHevcProfileTierLevel struct SrsHevcProfileTierLevel
{ {
public:
uint8_t general_profile_space; uint8_t general_profile_space;
uint8_t general_tier_flag; uint8_t general_tier_flag;
uint8_t general_profile_idc; uint8_t general_profile_idc;
@ -565,6 +566,10 @@ struct SrsHevcProfileTierLevel
std::vector<uint8_t> sub_layer_inbld_flag; std::vector<uint8_t> sub_layer_inbld_flag;
std::vector<uint8_t> sub_layer_reserved_zero_bit; std::vector<uint8_t> sub_layer_reserved_zero_bit;
std::vector<uint8_t> sub_layer_level_idc; std::vector<uint8_t> sub_layer_level_idc;
public:
SrsHevcProfileTierLevel();
virtual ~SrsHevcProfileTierLevel();
}; };
/** /**