[MP4] Allow not to generate 'sidx' box for single-segment too

I.e. the flag --generate_sidx_in_media_segments,
--nogenerate_sidx_in_media_segments work for both single-segment
and multi-segment mode with this change.

Related to #862.

Change-Id: Icd27fd00e8e036ba0c4709b48650372429cc0351
This commit is contained in:
KongQun Yang 2020-12-07 00:09:04 -08:00
parent 516430bde1
commit 10daa39901
5 changed files with 29 additions and 13 deletions

View File

@ -12,6 +12,8 @@ MP4 output options
--generate_sidx_in_media_segments
--nogenerate_sidx_in_media_segments
For MP4 with DASH live profile only: Indicates whether to generate 'sidx'
box in media segments. Note that it is reuqired by spec if segment template
contains $Time$ specifier.
Indicates whether to generate 'sidx' box in media segments. Note
that it is required for DASH on-demand profile (not using segment
template).
Default enabled.

View File

@ -36,9 +36,9 @@ DEFINE_bool(fragment_sap_aligned,
"implies segment_sap_aligned.");
DEFINE_bool(generate_sidx_in_media_segments,
true,
"For ISO BMFF with DASH live profile only. Indicates whether to "
"generate 'sidx' box in media segments. Note that it is required "
"by spec if segment template contains $Time$ specifier.");
"Indicates whether to generate 'sidx' box in media segments. Note "
"that it is required for DASH on-demand profile (not using segment "
"template).");
DEFINE_string(temp_dir,
"",
"Specify a directory in which to store temporary (intermediate) "

View File

@ -45,15 +45,19 @@ bool SingleSegmentSegmenter::GetIndexRange(size_t* offset, size_t* size) {
// Index range is right after init range so the offset must be the size of
// ftyp and moov.
*offset = ftyp()->ComputeSize() + moov()->ComputeSize();
*size = vod_sidx_->ComputeSize();
*size = options().mp4_params.generate_sidx_in_media_segments
? vod_sidx_->ComputeSize()
: 0;
return true;
}
std::vector<Range> SingleSegmentSegmenter::GetSegmentRanges() {
std::vector<Range> ranges;
uint64_t next_offset =
ftyp()->ComputeSize() + moov()->ComputeSize() + vod_sidx_->ComputeSize() +
vod_sidx_->first_offset;
uint64_t next_offset = ftyp()->ComputeSize() + moov()->ComputeSize() +
(options().mp4_params.generate_sidx_in_media_segments
? vod_sidx_->ComputeSize()
: 0) +
vod_sidx_->first_offset;
for (const SegmentReference& segment_reference : vod_sidx_->references) {
Range r;
r.start = next_offset;
@ -111,7 +115,10 @@ Status SingleSegmentSegmenter::DoFinalize() {
std::unique_ptr<BufferWriter> buffer(new BufferWriter());
ftyp()->Write(buffer.get());
moov()->Write(buffer.get());
vod_sidx_->Write(buffer.get());
if (options().mp4_params.generate_sidx_in_media_segments)
vod_sidx_->Write(buffer.get());
Status status = buffer->WriteToFile(file.get());
if (!status.ok())
return status;

View File

@ -24,8 +24,7 @@ namespace mp4 {
/// may not match the requested duration exactly, but will be approximated. That
/// is, the Segmenter tries to end subsegment/fragment at the first sample with
/// overall subsegment/fragment duration not smaller than defined duration and
/// yet meet SAP requirements. SingleSegmentSegmenter ignores @b
/// MuxerOptions.mp4_params.generate_sidx_in_media_segments.
/// yet meet SAP requirements.
class SingleSegmentSegmenter : public Segmenter {
public:
SingleSegmentSegmenter(const MuxerOptions& options,

View File

@ -351,6 +351,14 @@ Status ValidateParams(const PackagingParams& packaging_params,
"(not using segment_template).");
}
if (on_demand_dash_profile &&
!packaging_params.mpd_params.mpd_output.empty() &&
!packaging_params.mp4_output_params.generate_sidx_in_media_segments) {
return Status(error::UNIMPLEMENTED,
"--generate_sidx_in_media_segments is required for DASH "
"on-demand profile (not using segment_template).");
}
return Status::OK;
}