From 09cbd5b3302dd8a18a7d6af388077abc52198731 Mon Sep 17 00:00:00 2001 From: Jacob Su Date: Sun, 13 Oct 2024 00:13:50 +0800 Subject: [PATCH] fix code review problems: 1. fix stts box calculation; 2. filter nalu SEI for h.265 codec. --- trunk/src/app/srs_app_dvr.cpp | 10 ++++++++++ trunk/src/kernel/srs_kernel_codec.hpp | 1 + trunk/src/kernel/srs_kernel_mp4.cpp | 25 ++++++++++++++----------- trunk/src/kernel/srs_kernel_mp4.hpp | 2 -- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/trunk/src/app/srs_app_dvr.cpp b/trunk/src/app/srs_app_dvr.cpp index 50aee24e69..3bebc79af9 100644 --- a/trunk/src/app/srs_app_dvr.cpp +++ b/trunk/src/app/srs_app_dvr.cpp @@ -657,6 +657,16 @@ srs_error_t SrsDvrPlan::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* f return err; } } + } else if (format->vcodec->id == SrsVideoCodecIdHEVC) { +#ifdef SRS_H265 + for (int i = 0; i < format->video->nb_samples; ++i) { + SrsSample* sample = &format->video->samples[i]; + SrsHevcNaluType hevc_nalu_type = SrsHevcNaluTypeParse(sample->bytes[0]); + if (hevc_nalu_type == SrsHevcNaluType_SEI || hevc_nalu_type == SrsHevcNaluType_SEI_SUFFIX) { + return err; + } + } +#endif } // quicktime player compatible: skip the packet without any nalu. diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index a1462d3328..2d92e9a6b7 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -1308,6 +1308,7 @@ class SrsVideoFrame : public SrsFrame bool has_sps_pps; // The first nalu type. SrsAvcNaluType first_nalu_type; + public: SrsVideoFrame(); virtual ~SrsVideoFrame(); diff --git a/trunk/src/kernel/srs_kernel_mp4.cpp b/trunk/src/kernel/srs_kernel_mp4.cpp index 7658f76760..937d8afbc1 100644 --- a/trunk/src/kernel/srs_kernel_mp4.cpp +++ b/trunk/src/kernel/srs_kernel_mp4.cpp @@ -5024,13 +5024,19 @@ srs_error_t SrsMp4SampleManager::write_track(SrsFrameType track, } if (stts && previous) { - if (sample->dts >= previous->dts && previous->nb_subsamples > 0) { - uint32_t delta = (uint32_t)(sample->dts - previous->dts) / previous->nb_subsamples; - stts_entry.sample_count = previous->nb_subsamples; + uint32_t delta = (uint32_t)(sample->dts - previous->dts); + + if (delta > 0 && stts_entry.sample_count == 0) { + stts_entry.sample_count = 1; + stts_entry.sample_delta = delta; + } else if (delta > 0 && stts_entry.sample_delta == delta) { + stts_entry.sample_count++; + } else if (stts_entry.sample_count > 0) { + stts_entries.push_back(stts_entry); + stts_entry.sample_count = delta > 0 ? 1 : 0; // calcaulate delta in the time-scale of the media. // moov->mvhd->timescale which is hardcoded to 1000, sample->tbn also being hardcoded to 1000. - stts_entry.sample_delta = delta * previous->tbn / 1000; - stts_entries.push_back(stts_entry); + stts_entry.sample_delta = delta; } } @@ -5051,10 +5057,9 @@ srs_error_t SrsMp4SampleManager::write_track(SrsFrameType track, previous = sample; } - if (stts && previous && previous->nb_subsamples > 0) { - stts_entry.sample_count = previous->nb_subsamples; - // Can't calculate last sample duration, so set sample_delta to 1. - stts_entry.sample_delta = 1; + if (stts && stts_entry.sample_count) { + // Can't calculate last sample duration, so set the sample_delta to previous entry. + stts_entry.sample_delta = stts_entries.size() > 0 ? stts_entries.back().sample_delta : 1; stts_entries.push_back(stts_entry); } @@ -5781,12 +5786,10 @@ srs_error_t SrsMp4Encoder::write_sample( ps->type = SrsFrameTypeVideo; ps->frame_type = (SrsVideoAvcFrameType)ft; ps->index = nb_videos++; - ps->nb_subsamples = format->video->nb_samples; vduration = dts; } else if (ht == SrsMp4HandlerTypeSOUN) { ps->type = SrsFrameTypeAudio; ps->index = nb_audios++; - ps->nb_subsamples = format->audio->nb_samples; aduration = dts; } else { srs_freep(ps); diff --git a/trunk/src/kernel/srs_kernel_mp4.hpp b/trunk/src/kernel/srs_kernel_mp4.hpp index 2d1f947019..66804d327e 100644 --- a/trunk/src/kernel/srs_kernel_mp4.hpp +++ b/trunk/src/kernel/srs_kernel_mp4.hpp @@ -1885,8 +1885,6 @@ class SrsMp4Sample // The sample data. uint32_t nb_data; uint8_t* data; - // number of nalu|audio-frames in this sample. - uint32_t nb_subsamples; public: SrsMp4Sample();