Add offset to tranport streams (MPEG2-TS, HLS Packed Audio)
Configurable with --transport_stream_offset_ms. This is needed to compensate for possible negative timestamps in inputs, which could happen on ISO-BMFF with EditLists. Issue #112. Change-Id: I0fce8766c9df2911b9bb859c1e54052a8ed2abfb
This commit is contained in:
parent
9a55d4033f
commit
51d39d96a1
|
@ -48,6 +48,8 @@ Synopsis
|
||||||
|
|
||||||
.. include:: /options/mp4_output_options.rst
|
.. include:: /options/mp4_output_options.rst
|
||||||
|
|
||||||
|
.. include:: /options/transport_stream_output_options.rst
|
||||||
|
|
||||||
.. include:: /options/dash_options.rst
|
.. include:: /options/dash_options.rst
|
||||||
|
|
||||||
.. include:: /options/hls_options.rst
|
.. include:: /options/hls_options.rst
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
Transport stream output options
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
--transport_stream_timestamp_offset_ms
|
||||||
|
|
||||||
|
Transport stream only (MPEG2-TS, HLS Packed Audio): A positive value, in
|
||||||
|
milliseconds, by which output timestamps are offset to compensate for
|
||||||
|
possible negative timestamps in the input. For example, timestamps from
|
||||||
|
ISO-BMFF after adjusted by EditList could be negative. In transport streams,
|
||||||
|
timestamps are not allowed to be less than zero. Default: 100ms.
|
|
@ -20,6 +20,8 @@ namespace media {
|
||||||
|
|
||||||
MuxerFactory::MuxerFactory(const PackagingParams& packaging_params)
|
MuxerFactory::MuxerFactory(const PackagingParams& packaging_params)
|
||||||
: mp4_params_(packaging_params.mp4_output_params),
|
: mp4_params_(packaging_params.mp4_output_params),
|
||||||
|
transport_stream_timestamp_offset_ms_(
|
||||||
|
packaging_params.transport_stream_timestamp_offset_ms),
|
||||||
temp_dir_(packaging_params.temp_dir) {}
|
temp_dir_(packaging_params.temp_dir) {}
|
||||||
|
|
||||||
std::shared_ptr<Muxer> MuxerFactory::CreateMuxer(
|
std::shared_ptr<Muxer> MuxerFactory::CreateMuxer(
|
||||||
|
@ -27,6 +29,8 @@ std::shared_ptr<Muxer> MuxerFactory::CreateMuxer(
|
||||||
const StreamDescriptor& stream) {
|
const StreamDescriptor& stream) {
|
||||||
MuxerOptions options;
|
MuxerOptions options;
|
||||||
options.mp4_params = mp4_params_;
|
options.mp4_params = mp4_params_;
|
||||||
|
options.transport_stream_timestamp_offset_ms =
|
||||||
|
transport_stream_timestamp_offset_ms_;
|
||||||
options.temp_dir = temp_dir_;
|
options.temp_dir = temp_dir_;
|
||||||
options.output_file_name = stream.output;
|
options.output_file_name = stream.output;
|
||||||
options.segment_template = stream.segment_template;
|
options.segment_template = stream.segment_template;
|
||||||
|
|
|
@ -46,8 +46,9 @@ class MuxerFactory {
|
||||||
MuxerFactory(const MuxerFactory&) = delete;
|
MuxerFactory(const MuxerFactory&) = delete;
|
||||||
MuxerFactory& operator=(const MuxerFactory&) = delete;
|
MuxerFactory& operator=(const MuxerFactory&) = delete;
|
||||||
|
|
||||||
Mp4OutputParams mp4_params_;
|
const Mp4OutputParams mp4_params_;
|
||||||
std::string temp_dir_;
|
const uint32_t transport_stream_timestamp_offset_ms_ = 0;
|
||||||
|
const std::string temp_dir_;
|
||||||
base::Clock* clock_ = nullptr;
|
base::Clock* clock_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -41,3 +41,10 @@ DEFINE_string(temp_dir,
|
||||||
DEFINE_bool(mp4_include_pssh_in_stream,
|
DEFINE_bool(mp4_include_pssh_in_stream,
|
||||||
true,
|
true,
|
||||||
"MP4 only: include pssh in the encrypted stream.");
|
"MP4 only: include pssh in the encrypted stream.");
|
||||||
|
DEFINE_int32(transport_stream_timestamp_offset_ms,
|
||||||
|
100,
|
||||||
|
"A positive value, in milliseconds, by which output timestamps "
|
||||||
|
"are offset to compensate for possible negative timestamps in the "
|
||||||
|
"input. For example, timestamps from ISO-BMFF after adjusted by "
|
||||||
|
"EditList could be negative. In transport streams, timestamps are "
|
||||||
|
"not allowed to be less than zero.");
|
||||||
|
|
|
@ -19,5 +19,6 @@ DECLARE_bool(fragment_sap_aligned);
|
||||||
DECLARE_bool(generate_sidx_in_media_segments);
|
DECLARE_bool(generate_sidx_in_media_segments);
|
||||||
DECLARE_string(temp_dir);
|
DECLARE_string(temp_dir);
|
||||||
DECLARE_bool(mp4_include_pssh_in_stream);
|
DECLARE_bool(mp4_include_pssh_in_stream);
|
||||||
|
DECLARE_int32(transport_stream_timestamp_offset_ms);
|
||||||
|
|
||||||
#endif // APP_MUXER_FLAGS_H_
|
#endif // APP_MUXER_FLAGS_H_
|
||||||
|
|
|
@ -381,6 +381,9 @@ base::Optional<PackagingParams> GetPackagingParams() {
|
||||||
FLAGS_generate_sidx_in_media_segments;
|
FLAGS_generate_sidx_in_media_segments;
|
||||||
mp4_params.include_pssh_in_stream = FLAGS_mp4_include_pssh_in_stream;
|
mp4_params.include_pssh_in_stream = FLAGS_mp4_include_pssh_in_stream;
|
||||||
|
|
||||||
|
packaging_params.transport_stream_timestamp_offset_ms =
|
||||||
|
FLAGS_transport_stream_timestamp_offset_ms;
|
||||||
|
|
||||||
packaging_params.output_media_info = FLAGS_output_media_info;
|
packaging_params.output_media_info = FLAGS_output_media_info;
|
||||||
|
|
||||||
MpdParams& mpd_params = packaging_params.mpd_params;
|
MpdParams& mpd_params = packaging_params.mpd_params;
|
||||||
|
|
|
@ -1486,7 +1486,8 @@ class PackagerFunctionalTest(PackagerAppTest):
|
||||||
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
||||||
|
|
||||||
def testHlsSegmentedWebVtt(self):
|
def testHlsSegmentedWebVtt(self):
|
||||||
streams = self._GetStreams(['audio', 'video'], segmented=True)
|
streams = self._GetStreams(
|
||||||
|
['audio', 'video'], output_format='ts', segmented=True)
|
||||||
streams += self._GetStreams(
|
streams += self._GetStreams(
|
||||||
['text'], test_files=['bear-subtitle-english.vtt'], segmented=True)
|
['text'], test_files=['bear-subtitle-english.vtt'], segmented=True)
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -6,8 +6,8 @@
|
||||||
<Representation id="0" bandwidth="1023201" codecs="avc1.64001e" mimeType="video/MP2T" sar="1:1" frameRate="90000/0">
|
<Representation id="0" bandwidth="1023201" codecs="avc1.64001e" mimeType="video/MP2T" sar="1:1" frameRate="90000/0">
|
||||||
<SegmentTemplate timescale="90000" media="bear-640x360-video-$Number$.ts" startNumber="1">
|
<SegmentTemplate timescale="90000" media="bear-640x360-video-$Number$.ts" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="6006" d="90090" r="1"/>
|
<S t="15006" d="90090" r="1"/>
|
||||||
<S t="186186" d="66066"/>
|
<S t="195186" d="66066"/>
|
||||||
</SegmentTimeline>
|
</SegmentTimeline>
|
||||||
</SegmentTemplate>
|
</SegmentTemplate>
|
||||||
</Representation>
|
</Representation>
|
||||||
|
@ -17,9 +17,9 @@
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="90000" media="bear-640x360-audio-$Number$.ts" startNumber="1">
|
<SegmentTemplate timescale="90000" media="bear-640x360-audio-$Number$.ts" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="3916" d="87771"/>
|
<S t="12916" d="87771"/>
|
||||||
<S t="91688" d="89860"/>
|
<S t="100688" d="89860"/>
|
||||||
<S t="181549" d="71052"/>
|
<S t="190549" d="71052"/>
|
||||||
</SegmentTimeline>
|
</SegmentTimeline>
|
||||||
</SegmentTemplate>
|
</SegmentTemplate>
|
||||||
</Representation>
|
</Representation>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue