Skip to content

Commit

Permalink
fix code review problems:
Browse files Browse the repository at this point in the history
1. fix stts box calculation;
2. filter nalu SEI for h.265 codec.
  • Loading branch information
suzp1984 committed Oct 13, 2024
1 parent ad6a185 commit 09cbd5b
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 13 deletions.
10 changes: 10 additions & 0 deletions trunk/src/app/srs_app_dvr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions trunk/src/kernel/srs_kernel_codec.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1308,6 +1308,7 @@ class SrsVideoFrame : public SrsFrame
bool has_sps_pps;
// The first nalu type.
SrsAvcNaluType first_nalu_type;

public:
SrsVideoFrame();
virtual ~SrsVideoFrame();
Expand Down
25 changes: 14 additions & 11 deletions trunk/src/kernel/srs_kernel_mp4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand All @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down
2 changes: 0 additions & 2 deletions trunk/src/kernel/srs_kernel_mp4.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit 09cbd5b

Please sign in to comment.