From a7463f60c11c2b0ec77e0bd120336e15381693ed Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Tue, 1 May 2018 10:47:06 -0700 Subject: [PATCH] Enable segment auto removal for live packaging The number of preserved segments outside live window can be configured using flag --preserved_segments_outside_live_window, which is default to 50, i.e. 5 minutes for 6s segment. Note that the segment removal will be disabled if it is set to 0. Only HLS live playlist and DASH dynamic MPD are affected by this flag. - Also add end to end tests. Fixes #223. Change-Id: I8a566efebe2f1552c7d9509ab017bade5a4a1c98 --- docs/source/options/dash_options.rst | 10 ++++ docs/source/options/hls_options.rst | 10 ++++ docs/source/tutorials/live.rst | 5 +- packager/app/manifest_flags.cc | 9 ++++ packager/app/manifest_flags.h | 1 + packager/app/packager_main.cc | 4 ++ packager/app/test/packager_test.py | 47 ++++++++++++++++-- .../bear-640x360-audio-3.m4s | Bin 0 -> 8088 bytes .../bear-640x360-audio-4.m4s | Bin 0 -> 8462 bytes .../bear-640x360-audio-5.m4s | Bin 0 -> 8086 bytes .../bear-640x360-audio-6.m4s | Bin 0 -> 2851 bytes .../bear-640x360-audio-init.mp4 | Bin 0 -> 754 bytes .../output.mpd | 18 +++++++ .../bear-640x360-audio-3.m4s | Bin 0 -> 8088 bytes .../bear-640x360-audio-4.m4s | Bin 0 -> 8462 bytes .../bear-640x360-audio-5.m4s | Bin 0 -> 8086 bytes .../bear-640x360-audio-6.m4s | Bin 0 -> 2851 bytes .../bear-640x360-audio-init.mp4 | Bin 0 -> 754 bytes .../bear-640x360-audio.m3u8 | 12 +++++ .../output.m3u8 | 4 ++ packager/hls/public/hls_params.h | 12 ++--- packager/mpd/public/mpd_params.h | 12 ++--- 22 files changed, 125 insertions(+), 19 deletions(-) create mode 100644 packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-3.m4s create mode 100644 packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-4.m4s create mode 100644 packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-5.m4s create mode 100644 packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-6.m4s create mode 100644 packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-init.mp4 create mode 100644 packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/output.mpd create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-3.m4s create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-4.m4s create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-5.m4s create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-6.m4s create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-init.mp4 create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio.m3u8 create mode 100644 packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/output.m3u8 diff --git a/docs/source/options/dash_options.rst b/docs/source/options/dash_options.rst index ee48eaad43..16cfa3f083 100644 --- a/docs/source/options/dash_options.rst +++ b/docs/source/options/dash_options.rst @@ -38,6 +38,16 @@ DASH options Guaranteed duration of the time shifting buffer for dynamic media presentations, in seconds. +--preserved_segments_outside_live_window + + Segments outside the live window (defined by `time_shift_buffer_depth` + above) are automatically removed except for the most recent X segments + defined by this parameter. This is needed to accommodate latencies in + various stages of content serving pipeline, so that the segments stay + accessible as they may still be accessed by the player. + + The segments are not removed if the value is zero. + --utc_timing {scheme_id_uri}={value}[,{scheme_id_uri}={value}]... Comma separated UTCTiming schemeIdUri and value pairs for the MPD. diff --git a/docs/source/options/hls_options.rst b/docs/source/options/hls_options.rst index 87a8ee6950..39293558b4 100644 --- a/docs/source/options/hls_options.rst +++ b/docs/source/options/hls_options.rst @@ -27,6 +27,16 @@ HLS options Guaranteed duration of the time shifting buffer for LIVE playlists, in seconds. +--preserved_segments_outside_live_window + + Segments outside the live window (defined by `time_shift_buffer_depth` + above) are automatically removed except for the most recent X segments + defined by this parameter. This is needed to accommodate latencies in + various stages of content serving pipeline, so that the segments stay + accessible as they may still be accessed by the player. + + The segments are not removed if the value is zero. + --default_language The first audio/text rendition in a group tagged with this language will diff --git a/docs/source/tutorials/live.rst b/docs/source/tutorials/live.rst index 98312197e4..f14f4ff100 100644 --- a/docs/source/tutorials/live.rst +++ b/docs/source/tutorials/live.rst @@ -37,8 +37,9 @@ Here are some examples. .. note:: - Packager does not support removing old segments internally. The user is - resposible for setting up a cron job to do so. + Packager supports removing old segments automatically. See + `preserved_segments_outside_live_window` option in + :doc:`/options/dash_options` or :doc:`/options/hls_options` for details. .. include:: /options/udp_file_options.rst diff --git a/packager/app/manifest_flags.cc b/packager/app/manifest_flags.cc index 393a9a45a6..4f7d8e582f 100644 --- a/packager/app/manifest_flags.cc +++ b/packager/app/manifest_flags.cc @@ -10,6 +10,15 @@ DEFINE_double(time_shift_buffer_depth, 1800.0, "Guaranteed duration of the time shifting buffer for HLS LIVE " "playlists and DASH dynamic media presentations, in seconds."); +DEFINE_uint64( + preserved_segments_outside_live_window, + 50, + "Segments outside the live window (defined by '--time_shift_buffer_depth') " + "are automatically removed except for the most recent X segments defined " + "by this parameter. This is needed to accommodate latencies in various " + "stages of content serving pipeline, so that the segments stay accessible " + "as they may still be accessed by the player." + "The segments are not removed if the value is zero."); DEFINE_string(default_language, "", "For DASH, any audio/text tracks tagged with this language will " diff --git a/packager/app/manifest_flags.h b/packager/app/manifest_flags.h index 1b9f50a570..7acecf3da9 100644 --- a/packager/app/manifest_flags.h +++ b/packager/app/manifest_flags.h @@ -12,6 +12,7 @@ #include DECLARE_double(time_shift_buffer_depth); +DECLARE_uint64(preserved_segments_outside_live_window); DECLARE_string(default_language); #endif // PACKAGER_APP_MANIFEST_FLAGS_H_ diff --git a/packager/app/packager_main.cc b/packager/app/packager_main.cc index ce762dfa51..8fb1d62600 100644 --- a/packager/app/packager_main.cc +++ b/packager/app/packager_main.cc @@ -403,6 +403,8 @@ base::Optional GetPackagingParams() { mpd_params.minimum_update_period = FLAGS_minimum_update_period; mpd_params.suggested_presentation_delay = FLAGS_suggested_presentation_delay; mpd_params.time_shift_buffer_depth = FLAGS_time_shift_buffer_depth; + mpd_params.preserved_segments_outside_live_window = + FLAGS_preserved_segments_outside_live_window; if (!FLAGS_utc_timings.empty()) { base::StringPairs pairs; @@ -431,6 +433,8 @@ base::Optional GetPackagingParams() { hls_params.base_url = FLAGS_hls_base_url; hls_params.key_uri = FLAGS_hls_key_uri; hls_params.time_shift_buffer_depth = FLAGS_time_shift_buffer_depth; + hls_params.preserved_segments_outside_live_window = + FLAGS_preserved_segments_outside_live_window; hls_params.default_language = FLAGS_default_language; TestParams& test_params = packaging_params.test_params; diff --git a/packager/app/test/packager_test.py b/packager/app/test/packager_test.py index 7c8aa8cc85..de02ee0539 100755 --- a/packager/app/test/packager_test.py +++ b/packager/app/test/packager_test.py @@ -279,10 +279,12 @@ class PackagerAppTest(unittest.TestCase): output_hls=False, hls_playlist_type=None, time_shift_buffer_depth=0.0, + preserved_segments_outside_live_window=0, utc_timings=None, generate_static_mpd=False, ad_cues=None, default_language=None, + segment_duration=1.0, use_fake_clock=True): flags = [] @@ -342,13 +344,17 @@ class PackagerAppTest(unittest.TestCase): flags += ['--hls_master_playlist_output', self.hls_master_playlist_output] if hls_playlist_type: flags += ['--hls_playlist_type', hls_playlist_type] - if time_shift_buffer_depth != 0.0: - flags += [ - '--time_shift_buffer_depth={0}'.format(time_shift_buffer_depth) - ] else: flags += ['--mpd_output', self.mpd_output] + if time_shift_buffer_depth != 0.0: + flags += ['--time_shift_buffer_depth={0}'.format(time_shift_buffer_depth)] + if preserved_segments_outside_live_window != 0: + flags += [ + '--preserved_segments_outside_live_window={0}'.format( + preserved_segments_outside_live_window) + ] + if utc_timings: flags += ['--utc_timings', utc_timings] @@ -361,7 +367,8 @@ class PackagerAppTest(unittest.TestCase): if default_language: flags += ['--default_language', default_language] - flags.append('--segment_duration=1') + flags.append('--segment_duration={0}'.format(segment_duration)) + # Use fake clock, so output can be compared. if use_fake_clock: flags.append('--use_fake_clock_for_muxer') @@ -740,6 +747,36 @@ class PackagerFunctionalTest(PackagerAppTest): time_shift_buffer_depth=0.5)) self._CheckTestResults('avc-ts-event-playlist') + def testPackageAvcTsLivePlaylistWithSegmentDeletion(self): + self.assertPackageSuccess( + self._GetStreams( + ['audio'], + output_format='mp4', + segmented=True, + hls=True, + test_files=['bear-640x360.ts']), + self._GetFlags( + output_hls=True, + hls_playlist_type='LIVE', + segment_duration=0.5, + time_shift_buffer_depth=0.5, + preserved_segments_outside_live_window=1)) + self._CheckTestResults('avc-ts-live-playlist-with-segment-deletion') + + def testPackageAvcTsDashDynamicWithSegmentDeletion(self): + self.assertPackageSuccess( + self._GetStreams( + ['audio'], + output_format='mp4', + segmented=True, + hls=True, + test_files=['bear-640x360.ts']), + self._GetFlags( + segment_duration=0.5, + time_shift_buffer_depth=0.5, + preserved_segments_outside_live_window=1)) + self._CheckTestResults('avc-ts-dash-dynamic-with-segment-deletion') + def testPackageVp8Webm(self): self.assertPackageSuccess( self._GetStreams(['video'], diff --git a/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-3.m4s b/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-3.m4s new file mode 100644 index 0000000000000000000000000000000000000000..8dcbed305912340fa3cbfa1bb3968a8d1ef2361d GIT binary patch literal 8088 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 literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-4.m4s b/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-4.m4s new file mode 100644 index 0000000000000000000000000000000000000000..e19520d81536e5f755c0b5cc37acf090bfceca07 GIT binary patch literal 8462 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 PVs%oe94m`V^=SVOWcCTb literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-6.m4s b/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-6.m4s new file mode 100644 index 0000000000000000000000000000000000000000..b187049c5477e879080bdd9512252b08cc9b5a15 GIT binary patch literal 2851 zcmZ{kcQ_kb8^9xIl}k~IlzWZXV((S6B~l{@LG10CNzkG#RkKyngqT&8BF43=C|Y}K z?U9PA@rkWkSNqi$z29Ho^L+2~{LVYhd(L^EbKd6w003b$=5|;BIy4wS7rNFA4pUX~ z_CWi41^c4uAvtt_cl7xjT^IliZkYhau>5~qx({HT1poqhGye(TgF{1o=_Y5eufO+y zb1u+zEGEL^JT8bij{^ZRbeq2R92RN1J{L}muQ%qG_0RrhmQyAQ_afDAH1T) ztJU;A*gwdte8>kyjaok5X>(}`34Cp;begZf^-2p`7^hP6=3ym11U}nuZ87BZ!C~pS zOw%+<#7$FPu#SVw(D&Bxs{9XsM^LUs2h{b{k1=@5)4!gXGe|d`X=KHKrN`Q(m+7FP9LzO}Txa-Azrwf_^Rxm4U?T>_?VE>7FQ%+Maz=NcE_FT`W4!<-#jz z+rM7=xU7lSy@nPkGb5&*?3^EoUu`YV%m{OV^e7jzAdsM+F|oQSPr9*IDU?wpy!>*9 z<5;3XIAI{?OJQgNZNH9X%Oxu=kVW2%qPvn@k--<0{_nTaRfLn)Z?PE)Dm-1BF^9j3 zbm}>Dj!dJ{Z{}^HWVxYEq5*Dn38t}ww zVbQ!Zfy8l}cF5OhvxYbsd(fi5#8;F{jsj*ZW4LO*cp98rezoddZ(%{2LJ0v>VrZUn z>j+ja^AFGg1 zcBbzGJDhK^Qv(}^z(D3E$pmf)WzjU0WfDWwh#kylWZs;tIU1ImKUL3&`0~vYvP`~c z&!nP}ZDo94M8JfQ#4}~A??V}PrBpk#`H=0%PUK0da&1W6%;bpgN~+MbI&F2FM7)+T zo~d0hvw9~gCWmh%asb1UoHIpJ)~}x<3{>AR+#nhLHO(0YUEMS@aSB+ zEuZHMBg)F63T|@y(UJJ|X7tX>UB;lm~U$x_Z zFOE((Zq#~=!c=q4oYj7d<>;`sn|Zbw>hGyz2@8467D|4{PId0c*0ys|QPbX%zTIQG z&W7NF$yHQ}dfork;G*M(S}&kQal7}qbAfVF3>2^C);S0BzEMxaI9D3z55Zgge)q&N zw6cP=c~RPn47@V{1Y58|n(&x~fuC^kOb=D7DshY}eO&6F^-Dqzs&^NWWOAO&+(laq zA|&K|_L!LGrHorn+IaK#Tjf@lk`76A5U`n9>l+QISDI>l)c)0|QHUvwsh6EPS!7_m;G{v#A-t)t`$2u7O|a$ecum-+-H{v zmaHma1#5EOOi2q|L*(%%`w{m-yl4>A%Yh#^D5ue%f^{(&x%6SCzjd0Jrg?<`;YC zs+JcCGvT|&x8ZZyI4~IHnom;d1tE1#*mTyji-7pqpuZ3DsH}3!<RM|*xy^kcneO%hseF!1hQ zX*X;83`&CoxhJ2!{UCKCRb94$Q!9OlLDtPcaDQSamT@UyswOE7mvfd8mI7?xH(E}$ zekN_Pf+n`Pm%C=aR_M89b1z_`dPZS03!|q*hsuf#!+YurO8S-5ss9mKd~bTR1hZEmC=< z_w*}z{3hzKy9Y0V6U5?XMXq zZ)z#i{s>WY3IabVlW*QGn?~&MfCuk(I<3xj z+WF|>GSJ||!;DYDF{focyU{t05+#O-vhU2NT_cQ^l<`2kUa}(tIBhIIiDdoAKjn!W zh)h;DFaJGr>x<^oJI}bRa}l+9>x{f7F?mA^FETvdZQhFM-xwoZS4kb*{IC%sV=lKe zVLvJH>Ve(wO^1lpd1L6?jVmhYtQ5GgbaPS6mjV5^|wtm(5$MS;*>Dr6_?~wa3$*BXJmz z!oxtKJ4T0ECtRd9eB%PXNk!#mB!`M9f{FoYFH+nNx<_>rdW5+iN}-jN+|orDMn(u! zIirD3mtkgv6_KtEMoS34KF7LUDSnkPRV`wo0kH>Fa-&iKa%LU8p(AZOU*OJ$QAl%f zYDra{=`ABBb?t6Wzv7Rd%!@v97oaa07n<6o2(y7FE4n1asYrm=_`mI!yU_};*ES*JkFI>W|+rrO4vABgx~li*6@eENS6pFllvpV H|2O^z*)b&_ literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-init.mp4 b/packager/app/test/testdata/avc-ts-dash-dynamic-with-segment-deletion/bear-640x360-audio-init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f6ff48bc011610a467f1fbf1092e83ab3393eace GIT binary patch literal 754 zcmZuvyH3L}6m=gw1|$Na0}?|95Mn41kD)?U)uBREEC>V(2;|0T5+$yq*sTCDFf;K1 z>?{m?1QG)qzrc@huj8~4u<& ziG?z;P + + + + + + + + + + + + + + + + + diff --git a/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-3.m4s b/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-3.m4s new file mode 100644 index 0000000000000000000000000000000000000000..8dcbed305912340fa3cbfa1bb3968a8d1ef2361d GIT binary patch literal 8088 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 literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-4.m4s b/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-4.m4s new file mode 100644 index 0000000000000000000000000000000000000000..e19520d81536e5f755c0b5cc37acf090bfceca07 GIT binary patch literal 8462 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 PVs%oe94m`V^=SVOWcCTb literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-6.m4s b/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-6.m4s new file mode 100644 index 0000000000000000000000000000000000000000..b187049c5477e879080bdd9512252b08cc9b5a15 GIT binary patch literal 2851 zcmZ{kcQ_kb8^9xIl}k~IlzWZXV((S6B~l{@LG10CNzkG#RkKyngqT&8BF43=C|Y}K z?U9PA@rkWkSNqi$z29Ho^L+2~{LVYhd(L^EbKd6w003b$=5|;BIy4wS7rNFA4pUX~ z_CWi41^c4uAvtt_cl7xjT^IliZkYhau>5~qx({HT1poqhGye(TgF{1o=_Y5eufO+y zb1u+zEGEL^JT8bij{^ZRbeq2R92RN1J{L}muQ%qG_0RrhmQyAQ_afDAH1T) ztJU;A*gwdte8>kyjaok5X>(}`34Cp;begZf^-2p`7^hP6=3ym11U}nuZ87BZ!C~pS zOw%+<#7$FPu#SVw(D&Bxs{9XsM^LUs2h{b{k1=@5)4!gXGe|d`X=KHKrN`Q(m+7FP9LzO}Txa-Azrwf_^Rxm4U?T>_?VE>7FQ%+Maz=NcE_FT`W4!<-#jz z+rM7=xU7lSy@nPkGb5&*?3^EoUu`YV%m{OV^e7jzAdsM+F|oQSPr9*IDU?wpy!>*9 z<5;3XIAI{?OJQgNZNH9X%Oxu=kVW2%qPvn@k--<0{_nTaRfLn)Z?PE)Dm-1BF^9j3 zbm}>Dj!dJ{Z{}^HWVxYEq5*Dn38t}ww zVbQ!Zfy8l}cF5OhvxYbsd(fi5#8;F{jsj*ZW4LO*cp98rezoddZ(%{2LJ0v>VrZUn z>j+ja^AFGg1 zcBbzGJDhK^Qv(}^z(D3E$pmf)WzjU0WfDWwh#kylWZs;tIU1ImKUL3&`0~vYvP`~c z&!nP}ZDo94M8JfQ#4}~A??V}PrBpk#`H=0%PUK0da&1W6%;bpgN~+MbI&F2FM7)+T zo~d0hvw9~gCWmh%asb1UoHIpJ)~}x<3{>AR+#nhLHO(0YUEMS@aSB+ zEuZHMBg)F63T|@y(UJJ|X7tX>UB;lm~U$x_Z zFOE((Zq#~=!c=q4oYj7d<>;`sn|Zbw>hGyz2@8467D|4{PId0c*0ys|QPbX%zTIQG z&W7NF$yHQ}dfork;G*M(S}&kQal7}qbAfVF3>2^C);S0BzEMxaI9D3z55Zgge)q&N zw6cP=c~RPn47@V{1Y58|n(&x~fuC^kOb=D7DshY}eO&6F^-Dqzs&^NWWOAO&+(laq zA|&K|_L!LGrHorn+IaK#Tjf@lk`76A5U`n9>l+QISDI>l)c)0|QHUvwsh6EPS!7_m;G{v#A-t)t`$2u7O|a$ecum-+-H{v zmaHma1#5EOOi2q|L*(%%`w{m-yl4>A%Yh#^D5ue%f^{(&x%6SCzjd0Jrg?<`;YC zs+JcCGvT|&x8ZZyI4~IHnom;d1tE1#*mTyji-7pqpuZ3DsH}3!<RM|*xy^kcneO%hseF!1hQ zX*X;83`&CoxhJ2!{UCKCRb94$Q!9OlLDtPcaDQSamT@UyswOE7mvfd8mI7?xH(E}$ zekN_Pf+n`Pm%C=aR_M89b1z_`dPZS03!|q*hsuf#!+YurO8S-5ss9mKd~bTR1hZEmC=< z_w*}z{3hzKy9Y0V6U5?XMXq zZ)z#i{s>WY3IabVlW*QGn?~&MfCuk(I<3xj z+WF|>GSJ||!;DYDF{focyU{t05+#O-vhU2NT_cQ^l<`2kUa}(tIBhIIiDdoAKjn!W zh)h;DFaJGr>x<^oJI}bRa}l+9>x{f7F?mA^FETvdZQhFM-xwoZS4kb*{IC%sV=lKe zVLvJH>Ve(wO^1lpd1L6?jVmhYtQ5GgbaPS6mjV5^|wtm(5$MS;*>Dr6_?~wa3$*BXJmz z!oxtKJ4T0ECtRd9eB%PXNk!#mB!`M9f{FoYFH+nNx<_>rdW5+iN}-jN+|orDMn(u! zIirD3mtkgv6_KtEMoS34KF7LUDSnkPRV`wo0kH>Fa-&iKa%LU8p(AZOU*OJ$QAl%f zYDra{=`ABBb?t6Wzv7Rd%!@v97oaa07n<6o2(y7FE4n1asYrm=_`mI!yU_};*ES*JkFI>W|+rrO4vABgx~li*6@eENS6pFllvpV H|2O^z*)b&_ literal 0 HcmV?d00001 diff --git a/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-init.mp4 b/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/bear-640x360-audio-init.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f6ff48bc011610a467f1fbf1092e83ab3393eace GIT binary patch literal 754 zcmZuvyH3L}6m=gw1|$Na0}?|95Mn41kD)?U)uBREEC>V(2;|0T5+$yq*sTCDFf;K1 z>?{m?1QG)qzrc@huj8~4u<& ziG?z;P-- +#EXT-X-TARGETDURATION:1 +#EXT-X-MEDIA-SEQUENCE:3 +#EXT-X-MAP:URI="bear-640x360-audio-init.mp4" +#EXTINF:0.511, +bear-640x360-audio-4.m4s +#EXTINF:0.487, +bear-640x360-audio-5.m4s +#EXTINF:0.302, +bear-640x360-audio-6.m4s diff --git a/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/output.m3u8 b/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/output.m3u8 new file mode 100644 index 0000000000..070810b3cc --- /dev/null +++ b/packager/app/test/testdata/avc-ts-live-playlist-with-segment-deletion/output.m3u8 @@ -0,0 +1,4 @@ +#EXTM3U +## Generated with https://github.com/google/shaka-packager version -- + +#EXT-X-MEDIA:TYPE=AUDIO,URI="bear-640x360-audio.m3u8",GROUP-ID="default-audio-group",NAME="stream_0",AUTOSELECT=YES,CHANNELS="2" diff --git a/packager/hls/public/hls_params.h b/packager/hls/public/hls_params.h index 6d2cc489e6..5811fa7bfa 100644 --- a/packager/hls/public/hls_params.h +++ b/packager/hls/public/hls_params.h @@ -31,12 +31,12 @@ struct HlsParams { /// Defines the live window, or the guaranteed duration of the time shifting /// buffer for 'live' playlists. double time_shift_buffer_depth = 0; - /// Segments outside live window (defined by 'time_shift_buffer_depth' above) - /// are automatically removed except the latest number of segments defined by - /// this parameter. This is needed to accommodate latencies in various stages - /// of content serving pipeline, so that the segments stay accessible as they - /// may still be accessed by the player. - /// The segments are not removed if the value is zero. + /// Segments outside the live window (defined by 'time_shift_buffer_depth' + /// above) are automatically removed except for the most recent X segments + /// defined by this parameter. This is needed to accommodate latencies in + /// various stages of content serving pipeline, so that the segments stay + /// accessible as they may still be accessed by the player. The segments are + /// not removed if the value is zero. size_t preserved_segments_outside_live_window = 0; /// Defines the key uri for "identity" and "com.apple.streamingkeydelivery" /// key formats. Ignored if the playlist is not encrypted or not using the diff --git a/packager/mpd/public/mpd_params.h b/packager/mpd/public/mpd_params.h index b92d5d447d..0decd3a88c 100644 --- a/packager/mpd/public/mpd_params.h +++ b/packager/mpd/public/mpd_params.h @@ -37,12 +37,12 @@ struct MpdParams { /// Set MPD@timeShiftBufferDepth attribute, which is the guaranteed duration /// of the time shifting buffer for 'dynamic' media presentations, in seconds. double time_shift_buffer_depth = 0; - /// Segments outside live window (defined by 'time_shift_buffer_depth' above) - /// are automatically removed except the latest number of segments defined by - /// this parameter. This is needed to accommodate latencies in various stages - /// of content serving pipeline, so that the segments stay accessible as they - /// may still be accessed by the player. - /// The segments are not removed if the value is zero. + /// Segments outside the live window (defined by 'time_shift_buffer_depth' + /// above) are automatically removed except for the most recent X segments + /// defined by this parameter. This is needed to accommodate latencies in + /// various stages of content serving pipeline, so that the segments stay + /// accessible as they may still be accessed by the player. The segments are + /// not removed if the value is zero. size_t preserved_segments_outside_live_window = 0; /// UTCTimings. For dynamic MPD only. struct UtcTiming {