From d7910847be9655591eae84b78dd757e978a4025d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Pinsonneau?= Date: Sun, 5 Nov 2023 10:05:36 +0100 Subject: [PATCH 1/5] wip --- .../images/BasicMpdElements.png | Bin 0 -> 33274 bytes .../images/PeriodsMakeTheMpd.png | Bin 0 -> 2253 bytes .../images/adback-seq-diag.drawio.svg | 4 + .../images/adback-trackings.drawio.svg | 4 + .../images/adslate-cut.drawio.svg | 4 + .../images/adslates.drawio.svg | 4 + .../images/archi-adback.drawio.svg | 4 + .../images/archi-vod2live.drawio.svg | 4 + .../streaming-fast-ssai/images/dvr.drawio.svg | 4 + .../pub/streaming-fast-ssai/images/hero.jpg | Bin 0 -> 121353 bytes .../images/vod2live-dvr.drawio.svg | 4 + .../images/vod2live-seq-diag.drawio.svg | 4 + .../2023/pub/streaming-fast-ssai/index.md | 298 ++++++++++++++++++ 13 files changed, 334 insertions(+) create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/BasicMpdElements.png create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/PeriodsMakeTheMpd.png create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/adback-seq-diag.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/adback-trackings.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/adslate-cut.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/adslates.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/archi-adback.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/archi-vod2live.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/dvr.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/hero.jpg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/vod2live-dvr.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/images/vod2live-seq-diag.drawio.svg create mode 100644 content/post/2023/pub/streaming-fast-ssai/index.md diff --git a/content/post/2023/pub/streaming-fast-ssai/images/BasicMpdElements.png b/content/post/2023/pub/streaming-fast-ssai/images/BasicMpdElements.png new file mode 100644 index 0000000000000000000000000000000000000000..523c9c1a00708ae47e6b837fae9b1ee3737de216 GIT binary patch literal 33274 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 X7vZ_W%S)dT|0;J^SvpVB==uKv7c3p$ literal 0 HcmV?d00001 diff --git a/content/post/2023/pub/streaming-fast-ssai/images/PeriodsMakeTheMpd.png b/content/post/2023/pub/streaming-fast-ssai/images/PeriodsMakeTheMpd.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdadd60441269a7a0005b5e2404d1c3ae7fcdcc GIT binary patch literal 2253 zcmcguX;cyl7Diw1QCUw@Po`)lLgZ*NX^KnkXqvf&;Wlb7Q{0G*QE^F1F_E%z>$&7c znwcW!sbDTqQzB|EnV15aX=DVRx$5-0|2l$&jo4cO$ZV{QovsvR=+KC6gL@%HVylq zeEee6|Hq~tF1pIwdyZ^$<&yJr=yg|l(lrIrF}cfoM{M`D98$K2c4#Pp)ec4uN9xNI zf>-L}GD=ns3Ho#u+r?o9|V3k}s2C zCp62fghFYspjc|id!(g?O&Xwi+uZD07C-oA4s`ruAdY#lk6y`lAYC@K;|$|OmI@yJ z?4>B?Y)35T?e|4q6I2`*F0AFQ8{{dShV!h|1KM!B-Z^}YgnWB@K$KCXg^m&VKZ7G1 z&i{s6ecI={{exhT@qVuLt(N{o0}sp`ZGTC@xLT$vu7+bbZf-S|+A#267E zYGEjv=kf%>q0lxW#uXHNK1+qIu{kYOBR zYzay3vx_;WQQC;Pm8F0wwbdj9%DI6l7B!N5o3& zPNDovQpV3bXG>OT%_yI>*7;HpP%MF;6gpKTc?rL{e$ zmHPtPzicc;jT2`n5j8Q?BUAhKb9@xvr>*XCa6h=VDEI_>a< z6JhwLM{;mza6)om8O87T4JaAFiGo)uf%+j9C*-8VGl zD8+w4S%&u%0C8>7_&^-Bps(t(Gs_E{JsEY!y{k$44+q>5?cjxBf0bXjF;-#bbQ?a>-$aPdw%*0u_4@}2xaxGUT~4F10izeMn94ZOUvAh z6#N>d;ezBaj$_P zx)J9f{xR>E+daD4{MKAVC(C=s4?1{`oI^o7fmxOhZBIL4x~S3)m2OwdjN{P*`=Hvi zrf2Y!dN%=SLpig&;6(_e*yAMQWcAyzJLtCl_L)>4S)%g88ezAYy+Ed69RC^Kxu}B3 znE?h}hhJsyXcgXPCUeznMk=vX1KmR~L&T^;{?ItaRpO}XaK>&j8Fa>3I97)ylC%${vz4_kyP+dqrAOej(h=8~)elXJ|m)6D7%q=*TQnvJpcgtNQ zP!elXlJ6#g{^KTU5|SO|#^EfabEp6Lf|}?s<6T1I8<60`2;wK@TR{cSU)Bv3CN3ZR zL;xS+PYwBIdC8B)N`{tLjzGgUCTC==MGbKsnq#KgmO}*|`24V_^E8|AVjnm(Kd5S|b3J n$tth-S2L&l+Zf<^N;ol>rlu5_mgc$}QvfcG?#O!kOR0YbJU?3& literal 0 HcmV?d00001 diff --git a/content/post/2023/pub/streaming-fast-ssai/images/adback-seq-diag.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/adback-seq-diag.drawio.svg new file mode 100644 index 0000000..8eed2e1 --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/adback-seq-diag.drawio.svg @@ -0,0 +1,4 @@ + + + +
player
player
adback
adback
vod2live
vod2live
request DASH/HLS
request DASH/HLS
get main content
get main content
wizads
freewheel
wizads...
DASH / HLS
DASH / HLS
Generate DASH/HLS
Generate D...
C3PO
video wf
C3PO...
get ads
get ads
get ads DASH/HLS
get ads DASH/HLS
kown ads
DASH/HLS
kown ads...
VAST 
VAST 
Freewheel call
Freewheel...
asynchronously
encode unknown ads
asynchronously...
return HLS/DASH
return HLS/DASH
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/adback-trackings.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/adback-trackings.drawio.svg new file mode 100644 index 0000000..f8ef8ad --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/adback-trackings.drawio.svg @@ -0,0 +1,4 @@ + + + +
player
player
adback
adback
wizads
freewheel
wizads...
request segment
request segment
tracking
tracking
CDN
USP
CDN...
302 redirect
302 redirect
GET
GET
segment (ts / m4s)
segment (ts / m4s)
ok
ok
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/adslate-cut.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/adslate-cut.drawio.svg new file mode 100644 index 0000000..79e40dc --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/adslate-cut.drawio.svg @@ -0,0 +1,4 @@ + + + +
vod2 part1
vod2 part1
vod2 part2
vod2 part2
vod2live origin
vod2live o...
adback origin
adback ori...
SCTE35
SCTE35
vod2 part1
vod2 part1
s1
s1
s2
s2
s3
s3
ad slate
ad slate
s4
s4
s5
s5
s6
s6
s7
s7
ad1
ad1
ad2
ad2
s7
s7
s6
s6
ad slate
ad slate
delta
delta
vod2 part2
vod2 part2
start = t
start = t
start = t + delta
start = t + del...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/adslates.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/adslates.drawio.svg new file mode 100644 index 0000000..2e76071 --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/adslates.drawio.svg @@ -0,0 +1,4 @@ + + + +
vod1
vod1
ad slate
ad slate
vod2 part1
vod2 part1
live start
live start
ad slate
ad slate
vod2 part2
vod2 part2
vod3
vod3
vod2live origin
vod2live o...
vod1
vod1
ad1
ad1
vod2 part1
vod2 part1
live start
live start
ad1
ad1
vod2 part2
vod2 part2
vod3
vod3
adback origin
adback ori...
ad2
ad2
ad3
ad3
remaining
ad slate
remaining...
SCTE35
SCTE35
SCTE35
SCTE35
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/archi-adback.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/archi-adback.drawio.svg new file mode 100644 index 0000000..b520c9b --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/archi-adback.drawio.svg @@ -0,0 +1,4 @@ + + + +
USP
USP
AdBack
AdBack
Dash manifest
HLS playlist
Dash manifest...
REDIS Cache
REDIS Cache
Dash manifest
HLS playlist
Dash manifest...
Player
Player
Internal delivery
Internal deli...
HD/SD DASH/HLS delivery urls
HD/SD DASH/HLS delivery urls
Mediainfo
Mediainfo
Dash manifest
HLS playlist
Dash manifest...
delivery
URL
delivery...
delivery
URL
delivery...
VOD2LIVE
VOD2LIVE
Wizads
Wizads
C3PO
C3PO
Freewheel
Ad server
Freewheel...
S3
S3
video wf
video wf
ads referential
ads referential
request ads encoding
request ads encoding
ads storage
ads storage
Ads
Ads
Content
Content
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/archi-vod2live.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/archi-vod2live.drawio.svg new file mode 100644 index 0000000..09349d1 --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/archi-vod2live.drawio.svg @@ -0,0 +1,4 @@ + + + +

mytf1.backend.queueing.catalog.video.v1
mytf1.back...

mytf1.backend.queueing.catalog.channel.v1
mytf1.back...
Goka
Store
Goka...
Enhancer
Enhancer

mytf1.backend.queueing.catalog.enhanced_channel.v1
mytf1.back...
USP
USP
RealDuration
RealDuration
WatID (lookup)
WatID (lookup)
VOD2LIVE
VOD2LIVE
Dash manifest
HLS playlist
Dash manifest...
REDIS Cache
REDIS Cache
Dash manifest
HLS playlist
Dash manifest...
Channels
Channels
Channels with sources (watID + RealDuration)
Channels with sources (watID + RealDuration)
Goka
View
Goka...
Player
Player
Internal delivery
Internal deli...
HD/SD DASH/HLS delivery urls
HD/SD DASH/HLS delivery urls
Mediainfo
Mediainfo
Dash manifest
HLS playlist
Dash manifest...
delivery
URL
delivery...
delivery
URL
delivery...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/dvr.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/dvr.drawio.svg new file mode 100644 index 0000000..e67fc42 --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/dvr.drawio.svg @@ -0,0 +1,4 @@ + + + +
sN
sN
sN+1
sN+1
sN+2
sN+2
now
now
timeshift buffer depth
timeshift buffer depth
live delay
live delay
effective DVR
effective DVR
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/hero.jpg b/content/post/2023/pub/streaming-fast-ssai/images/hero.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81d3e5bc706556a250bcb0c5225c5041aebb307f GIT binary patch literal 121353 zcmb5VcRbba|37}r4#zllL^(Ldv1M<^$R5X*6;7FjkWpFZ*n97cV{b`_A|oSZN2w4( z64H|RU8mRU{r-HuzrViU)9vXzyUsNp*JIot<9R(#7fzQUaD5#;9S8{t1VRG-K~CR5 za1b(5QfeqQ^#AVjw;we%_=3?=Lut=Ish}ieOrd`QX2DJaj7K&hy~?+$PX2^lFlIXNjM#hEkI zWMs4?5YT~vf)OD}$)sU+hUbc(R3tMmI=!qFigD?mV&S{!zp}S)9uSq0*)~nZ%BE>y zc{A(&jI`@hEp1$R`@mVGOyDZNtXstgFg+)6w*O;wGI9th1qtODDEL*K0YXYjLjIQk zGIHn{Kp_b!83Q?3n~6fhjOPlolwTQTWcn0u>mCbQ6T^DZJfpmSdWBCqDmt@b_4GA_ zh72sgK*j)3gRJYK+3Ho#MWEpg)({*5?F`2W8j`~CRG_6y0s%!!-v0Z)ZZVuNb6-1x zdVLQxmPtU-ECkRGcd;A{u#AG^ulmAq+~2iCVdLeW@}MtGdth?|5nw_nm`5F4e(u_@ z@MtPM4K$7%K@A6^h^^!ZsHIXQRDUEXVX!X?Nm;>z>&vR*mI9=6E4hs?fk+GtYq_|khg9;P| zp5nul&2FC0kj}hIDOG{G$s>g-dd-WHs>JG8N*GmUz;Ui>++dBq|3x4IsslD=+JZw+ z4{7|fAHYW8Ww5lpANa)@44`i01Y2yV0Zqid5jcb)3poOoCjuz5<3=E<9~qp_=+#3P z8kZ2iHef(JaTa!P9OGX$I68#ZIb3{2UWil(u0Vyj*@og_{HPH@bgPR}Q4S6j#frl{ zaM_B2<6%UJ^n4_>+XmoY zL_ZWAsquFYFdU$-(jN&$<0JpOslU1b`hnm6s)~l3_N%zR0ss?1MZpj7|HT+20a*jM zUS|XJgNq!9@u_JRQKl@=FgMCt8W%Gc)>Vc9ICJ}0VO%IjS}_{s#?g%lfr_q4q%mX* zQtVnd%b!ErvG{9n^P()%u}f)aHUiIhO_YBH&o@ytBOJ$1v-gkS|0ReQjsYwKn!*bt zK;aSrh*`!V93*%E1#2ikw6vuJ8eT4ffTB0SP2H3;8r~HJXqNzVmXVi1EyeyvsVt(! z{O$g#l|7h9Lc<*m*G0TQGtRnq;*e!G$(eD8faNR%H5ZW?*ngP9OrBMbKyM|Y?bsxI zQ*Z>K=sZU7HzH1-F|7*vi+E3LLHKgx5Y(iA!#JWA0F|(UmS_RR*aTP9Bu?-j#zvWf zJ6$wO0+G8^Lb|4#V7W@7IR3+C!16l9L4+vvGon<8tuS>oXto2arf3VrwF{2Lp{*>i_TrI(`eR9Tc)Tr1?UmZw1m!e+HlPvoe4M~e z#%eTl_1mPH+ys+q#&X9U*UXU;g9u?BDKQ~Vm64v2>;Q*zes9Ye8+shyS_=flk0jL& z7V^|GGhlZuR`+lEoq^*74F5+)(7}HdhsbU~UMsk|{-r!%>r-yL2hyRqe-(~5WWAK4 zr!OR&%;}6nXy$=Yz+C>SoV`9Ak0$ctUqMB|aVWQ4FvnIOn3JLmssUIF9c0BJ$U6yO z2Uu8ysuKzBt zA@~>D{;Tu(N&iP$ zW9JqV%F2>Ai!Fv_jwjhIF`FH8P(H@o2N+&+4e$j+t%tVj@CWuP7~lb1%)e41?tKtk zYvAHi$02OEaR^wcFM`V5bQ4$tdIZfl*-3+jnPAJ_u2$gQ65LlTu(0u@8wL18f161_;w= z>or+3s<~APJR>l26dbHO4QM9;7g1m~5x^{gQv4rK^{*0egW15(|42$Zt&HMdC)H01 z&ze)uJBP-w^v8ogFnqdOJJ0`+@bSMH1uQGN9 zsN%M9#uO*U*$04KOcd6~R>KF}EsBzpL{KMUcGDB)Mw7Tydt$eT&RNpv7`*50v4JkZ zN>yBu&{?na&yE(tJcrUPKk~OeNaHmhho6o8C{{0=Xq|9*#jsl%>+y_+2CHN7Gnup9 ziJLOUU)*27zZquvV{MlbhA}Y5iBoq|4*QEsRqyt6KQ?AC#fcK!;?eMKAh-XbT0A3Q zjQ{dKjPYXzjvWUi0yrm}ON5L6vIET$M+F4>7uwE%UiLfynebYRtopzkQ32l>Kx8%? zCluWU#&d$P7Qn#~+36dRlZLm71G~4bBhF1!0?<)V1Ax_ktX3UJ9e8zunDaK!3}3|h z^bC2mwW%teuadhd$50Z-3#_r5j<)}* zX$b(mSW44kbS%dRFnmR*0lM`pLWr8c2(UWaJIb2S%+_V?fA&z4B;Lx=ma1(a$t7d> zh)mrrlQl$0Dynhw?P;@M)Xt(_g&iZDC7_7!QM-d zK_sb;ILDmKltajvdGOPki0@UuJj2QyJF){8wCzwhU545(Rc$wN!uVOr{cGaK9sOsM z;uRR?@*vA2DOA-IlKWK-9IAU^x<4FkL+yHvYDxVN2sLqWVq1UnQH1ZV`nRZ;sqrhN9?ILlEY z*NFo}A_3dM4URmEko^=W&vP!I-R2;~Mt{%(VmJ422FgEEibEJx`}RZ8^_NIsZ+OOh zuF%7Aw$|h$?K~rGkK(UVX(NLzIgMR;vB5o|`_^YTwLz5Q+%%=DhtA`l>=ui{N%;T| zYEuL75j~oWETd*P0ISR6fGmiBt@sYm5DOOlSDZw9#@!@^<9LdJe&L4}SplgC5S{pf z&cLu8v~7UWia?3JY=~Y2NS-DFhpcCV15amTlK$oLy^x7P<;{?UMdpy6@bt%3?e}kgs5eO<-v>Pi^AO8~LQ@F)oPGxI?IjO1V zx%5d_^T_(yss{pMwtmB{N=&AcMe#MF1TKw43dOlkHaTZA(?0vMGBr>k>I@kwk$h@r zp>6y6W9j4QC7H7f_OqYPm4|JP&kt7ZT_?Aek>02^#!GLeXUCCMrn$Lz@f2+E7c(X} zAM?2|Ve77mif1rUt8-~^%?UDV9dulsn)At{wMa z@G_Y$nqdqGd=_vGz`?<%Ie#EYkj|-_M!}>0<2)U-04oQ%bhpp(%sh6 z-4wKz-x6=IhD>BZ+L`&LcF}x`?}oj5j2Dqw0q7r6`_OCTeAT86`2)}6*_i;m!-4Ty zfd&7H8{jo&6;K1HZy?59Q9$MJzRv%FZZr#r(gF~9zZ3$BUb#ZtHh`iQfactVJfphS zh97LnfnVywHN=gS_4m|_<*cukk$}0mh#`WTBi5K_yi0L74Ts|Lg5b7U;$x6dbxWo8 zLvmX|a;$y-&87O`2VvN4R`rr7oC7(JkedW+Gy1TUnY2?QpgaS=RPeKr zY2#vz6m2l^pX7^+$(#L|OzV=ykzGh9HA#?>Ojm~6$6%H(+ug(0kGNuZ;)R8hhlLWo zFbB3ZH5{AH^(QM@q39 zqAf|=ZnIfq&rn=v9We5%W}}9AcN9A_@+FP}rqg;#ExK8j&5JplpT>7u_9f`+`|VfJ zxIc>MHmt+wV~!Y=1p&jj0VETMRu=(SNrlGf^Mr6Cgph$!L|hPdi^VltcW7si2!Uvd z$Syekb8Z4K7hyQOw@u_x)Oo;V;z;N}0R2}~KuUjOA_9V%%@B^?H2o9;6KCqsGfixT z8rwny;o50)yg5B%Wy5VeBM7mPHhL{hR>z29V5WGc zIu;$ssF?l^X^u=Rpw=)3tw;4kQr4y>F$ochJ{ZmD!{HFi4tt^ilt|!6f;c*lmmR1` z0Aq%AgO%a3o1;LVo+${R{-!xN5D1zI;{KN>BB}t;=@!sNM1q?T5MY*qO~KG0+Y@t( z2HG_G99Y3XX#~92bA<{5Ac0N?E2R!1=|P*S<|k>%|pm=x~as( zC0=#pRk8t<*V$uuY0(u&34t<~%f4fAj|6O(o>F{bcVpd?xzC&4wuMa4B;EgPaQ%ub zpX9jX**{EWp=NSzg;2cIa%ER-`Jl~n@=|n0vE-PQv5U`&Bzt5w*06;?#Bpa`T8l97)&BP)ZT3q><9fOx@yXo3;Fut8yX z0D0Em5KI_=5)o~I`T&3e7EA;cr3f$|Fy}ILaQUMB$A_Sz2qia2gNCfS31!vvTez} zG+RDq2k$nLPWxOhjJbR;UMDV6S4&)^M6y|`sfu>c12#Rko+U(Fe~FY4R8d5!pr(0T z8hVZ_RFS#jY|V~>#2AN2^#89O5lgIUD1xjR1t?D=7y%xR@#|0 zz%-C`IRmUcj*BGZwcFpC93y%xM@bN(q7G6}T{H`9kZ}hmXb;D4JB6Juq1)kgE^8$DM0PQZ2 zmy@@1W);K1$m^2Um!4mZ;dIF$)$%ruxX(91{gTwLQO|gIR_W{^j~W@%{%~Gyh7Zi?mgZfA-Y#3_*&&T($86R=EZiZK9z{)Znf#i`Sfgx=LT=2Z8~pGV|eD+ z*I)9rPatpI8zna@R9XCx9C1G_KRB~%Fwe+nhp{Akvs$hz6ZofInBv5nE+EPOF({&3 z$;+UY++d5(e5r)=Q2X)#rn`uM0=nS)iP6GV5kMisqCReB1fvu`31Fr_KRJ>-i+3m! z*rUxdQI~KCjYz&;krl!1>h<9Bv8FjvYjuND#vI0VY8}H zsR&lbcCjkUilv&7;<4WK(vE;@D5>f;UY_&D$?#qh`N=F&rZf$bxbMicAt~jm1KbS4meoWdp53zTru!JnE$3b03xdPK%$=_ z{FCaNlk*{6iXL0HR%$YY(e~u&vn5>XB72N z`3^*gi}aX8G?AV;oGT0D5-x`(whMpzFH2ZURTy~D+uojY^7x(7| z&fY7BEks5FjQ zjF_$aM&LiEW1+#gb`&eTmrB<(PX#uZSXpC8iqU6-vg&~ZjA+c2Iy)e$MpLzk=E;t_+%H>ccX_Vy5h1(x6dU z4ezK3$Cyh0Q^=DaREC}#XlHUE7v^Oubzrt-B#D!A;u$$Y+2*LVxXAc^#tgfj?hXx_ zgG?!yka%d^kGF=!BU$3qZ2nGUH#}1;V!LFp-no}*M`oxt$7;RlItgV^QO>^hnlb&$ zm;?3%}{0kQNA&z_+ePyiv72BN|$EUBE^Ux`ighA7*6Lzo2YofB5m;&~N zp&rw$Jv2{wXWO^$C{s!AnAeu8WH4PVVnmux38NHcs0xHb1^8~!@W~yTXr)$AxT8HL zE3c^<$!oxIp4!UiTEVHG(t|5_gSgZ4SNv|msrw+#8_#YKtM+khCM7K$dfd7l8gXDab zz<>PHNQ_~k;5lgxphvfcAkgg#v_=T(ts;LXbq+ zyOV!QBMl&@qU>Mx43*DVP1f`F(0L(^UKhViTEwHzQ2CJ7IfmP~jr?b_3a5~sVaHUN zZm$nd(ZY0>u9*L?v-@ePNs$Jd4I$7q?vM+kH_iz^PUtz}xqqanno^y9oH;m_YkDNO zk?d3uFj}c?E#b(Mx*1<>F8mBrbvGgYBk2~(NRiz0cB`%I<;@4&LmWJ+GEQb3-IDx# zRdzDt+y(u5y>Vp zF2}?dPUTgrwAk)*v{{kVf$g92xT(TNG>*zM*c8jD_8MBi&J@uvwh&T0TIeYAqoeDxqOKtfUM!88x~~Ytq8M zz#JpPD|?Y-BWq76?H-QLNGq0%>9fA8d0Bjjt{IrC!0RZv>>z@g zNGF)h2<^DMeC$Q0G_r81?EAoSw5X&tojf6#uF0jQdLoOPPiwG&ub zHdI&nW5gDdUuIt6FK>$8uu8@r%caZ1f+LLjZj}y(S-$-Tpk#3bIerIVTo4p!{}yLm zK%@nW0@)zYVGtpL+_Q|FSdzj49{k5VDATesh*r=Lhk&9H;O1{xzmphrI`3)&Gl?ZM zTgMOb$4?eE+nJ@)=okuXt|(9DQBAIiM7w_zLJBd8bdZEHU_aSatQDuOJNnN=)@sBd z(-vI(8Vwk#KSYYB7ZZF3KiE~t(rZ;c&CaB6(K5vF#?!>>r|>1^y?Y+FE*|1(?yO#I z>wm@4&Fn(CUy`|PZ1vp;eEJgxy3zUJV(%amX!d2nI^MU`y5%Mv@nUaiKL{T*t6P08 z)fkwQVjH%?f6jVe#%RFB)hkc_Y~*I{mTEETIb{;H&%MY$X0VVy z)}YfSi)$Cl_9BJn;OPcI(Y9>94FOxK8SAucfQ|uBx2{X-W{d!3emC=|i(4-^_P)|H z&rTa$D!J76tm{Qhepk_ro7v3}+IGn8qYI<*u0aE_CoUDIkibjW8(-~AzS^8ZklA%j za@Lu;&o39sw)V#)x2&8(@@h^YZ%u}el}>hV{L}wt^{ew+v8zK=1*X?7dv{*@6Zz!x zw%QM~7XxZLw5O08W~Y$uF76?HwQLrHwe5?KXigz5a({X+ogAcIIQUQRT*+tb=f7QF|k!YQ~oX!`!OKmp!ZW zBGZ^YQyIAgXjLFSaa2l4=jae*5|X2DklAOIk!CGSx@sEMmFTn~L5&X7%$B$x2=Ju2 zs>jpREVvlH79hx)3FK@~+43Mdt41A1FeEztw-I#yo?D00_ys;B!9lZp@}DOZP!SN~ zlYg?nzH*t&>GibJ;1*3X5$9lv5b5erVHPbjj89O$Vi3o7;QngzP}ICMnZE#5+djpI z<<-+V5M=4)q~YT0Q6H$7Q0GWH_Osw;eA0z8tr(VrRmW(95Z7cXYLKd5Z&uA8n^P8@W9sIK8`H?G zJFI@gVeVr8HtIy`u|DUCL*_=p{GpZP%%Wh&_6>H+GzX)w^A!h}H>~kKB*9zo610z| zoQA%!n`xoxcwza~FbkV+TbL5O$2ctA zqPe6pxfBb=wE0n5gbj&WE&l21MZ<|>^V(aErVDzT zdD3+$*kf(m_~0w3(b>oGYC4DZ@6HTb=8YvwqYkG-1+%5c#=JjN-ex~4z@Ala7mw7w z!x36}HVW3O^>zhbp3GFdmn|jqoSTHGUbRZ+ zU-Fm29k8S*OJ)hAm9fIdnC7*!_;oNd;E}jlxvCDlL=UN1;VyK${p_59^sR&N!kO?w z?O!Zejs9~C$M15FUyF}4G~T@BaIYmv>BNmqb*sKQ(K;WqwH!{4G0Rt8&O_QNM?T}d zy;@vd^j3h!p4Za3P3Hq{{j1!P7|W2Q+6&YjPXV=4$b<0*dxOjJ7c7V5a|*t`2zx1a zQjtdCI+&0%Qp8wmdL{nn9;T7iqsqF&ViUF4NwQON3Ms5^`y@YBMIqU!f1>BRS>yvA zdWSL(3%DfH;Pt&&IE2JfNxy%ZTTiod&U0W-$F6Q)lMoGMi*p#I(ip8aPIJsdnv+w# zE7M=+!IY20Cy^VS=VRIObnminnVE4HwB|0XwwnZR1)d3|&kPl_1q zoF+{_3(((7b45OFI)~MJ%^S`0x~h)}KG@)rGH;;35vX-f-{NPvsRzp}&7{bdBms{Z z+HCaTF}$d9ZZ zbBvsIeCb8+5;PO2^K|d1!=#NQYnRy?ldXeaHI%ln!n$r|k8`#MWb z5gyDZNYJi9a@-Rw-Pxzg&g1v#vZCyszj*!$J6HLredABlJheS1yVB6t;b{#8qtP2> zb~&@_td#xb{S}izmTjw?lN1DxCxh=sP7qEAZCm_fR_Q0t{eKlrXar8|$USI$Vri`z z_i@7ci|7OHNdJdY^Rg22OkF=mdLP*fNW`5H>R%z~uKF)HJ^1qkIf`M?9l4}A0@%Y_a4-s>!sE`@m}wm$Cc2`1MON zrm0qbR-xy~s2#4pZX5K``EZEfV!^kIzw|tgs&=W)c+lS%@>LYDKdU%G*go{&AeqGpGu7 z9P;y@s|u;)w+`4CzLH?VC!Wr@ydv9q+&HlBwIGz;NiM@3+wRmG^`TwaBO_Q9bC%S1 z`MblXvwJti3wZN_wp$jOsTI}Y30{lhu0CgygB8a2CiCucvUWF9cZ}WN^pMNCHGGZk zY=*C7_f&znKluu>zPFe&t>a!#q_|^GyY81QzmMBJj)S8$%cn|1{MvuTiAW z76+#1oI)&WpQL+%Q!OtcTLo%Wxw|*^ZMWZ(duW^#+~|5T6xiTGSiI7zm>KYKRq|w8 z_@_w2uGitS?~?a}xeT7DR=g2bTRr)1x_!)F;jVVsRBh_o$}L-OwL*g0 z6OXjMKgi^g!_9_&PiX#zIEBP(7Cz+=|E+C(ly(ZrKpz{-_!}I%6E7x}7~d^9(cikw zU49A?H9M(L`(XJ^m45PDP3dT*VOLNbXwLG!@JHJ)h|l`onA5vYdRHO?9?Yi3Y;a94I#WhbMUJV?d$6`%P_VrY0Oiv+zHH+xtv*llZ8Ik!Zi?5%&UjXE4GOK+b zd->h8G*}W0@oqSUVCnaai?j$yrnQ|VYzH8++)-6#A9(ra&OgM;za*FV+Wswk`_k{F z!mFt2X_sysmRTGHMi!q8YYvISYByI>JVUT|J)~Gi`rg9qmo>=WuW)b5!7_82K7A1R zK}bA>u-`lKZ#uiicM%h&ptKWyEGqu1-6`X_wT#Dy8(%$5zPbaoC~Tm<|DDQ?8=f!p zgCA2J${y-nt?yoA;oXH2;2*QVS|bvbrJ9ATf8L>`{i>(+Og_W@gQ)g+@`ILK!C&-Y zn{B1F4D+^udl<7Hibxf@v$|qsH=JTT@1>m-IlT|ZbSNvaGK;82y}9hvTy%1iWia3B zUMdG~9pN72o$nn{&4FOU?z3DM?vEbtHevs8ZdS4-EpVlL+6bi+<#n+dr`*@qv7zFW z-8Rh>I%n^s{e}H*;!9_-lxbHiOP#yoD+A?^uPSuxiagF+xxw-N`_g$4xsF8h zxK-xB)#-=Asc(FuJ36{O<1=0yPVF^XK`&3K!^KN`EcW~kJHjr>GKyi7I2+|A)i8Ft z^S?uzxZ*Ha0qw!~bq5v@Fs{FxvrFdk&!iaDv)Z}}327t2fdvGtQ!x_MSEt;e>S*jJLv_?u>93}QTcod< zM+)+zWRTeB(@l_j5uSyZt%ds=6Z*?~)h-2nd69L7mn*BMD(yrhj_#nRrl!AHbUNF4 z>TDg@GTlxkNT03lV={@?!^gw;yyh6Ss0Zk)x-8QkTHeqQ%}CK{5Eipro{fKCcG-eD zbAtN5;a!HlxK&60cB2WiET_9UmNxeo+-_vq7mMz8alAPv&g;&r)wwnLYR=5}5tjRj zcvkU^s>da7L?53y$0_!4@v~yP&kf6KRjzdgWXwM)gSvmTavY+LGD;;QD-5HBFNJH< ztd?#t?AT9z^7?Y)OL@B4C6}GIx}#g~fN}*}Og2{ll_ppd`|tJSYMc32@c zOK)mUgc$Cdigz8Sn@f_vxf~_?xK~wo-M&z;zT?HKg~-y)JJj{J;D&S>*~70oIc#=R z=4%(c?1$eA-r3!t9Xh%&!Q;)46qsKhAh%6#n%vF3XR+M#Or=d8mP~Jz7MA+1xzhcS z@e4NAb2f#9ndx6C4iU%ZtM@Dv#(BAzF4%1(KWmk>=&Yu>r1Ea++V=JL?O!ZXM zfyZyNlNe&6bA!Ho+KHHk72P8R*}yF|ArSmSK?Q*OKM6tf_4qZxdkgcU8>Kh776 zR6vqPMd=$&XDNc(vtbk00C+H6IWv;I;#j6xuBWeSV1)t`$b+OnlvoFb<#XFoEzjm4 zvMH-IG^k2tEa;Sb9VtGc=~gLnORN2>FO!m$kP)QLmZZoa(r`b4IXorEj%3BmR7w@A zE@1p;&m`&aCX9Z6AlgzZF&MkSWy)u+xsiJG`4kc?_B)}y=oIoZBfMvQ@SNV>Da7_k zo|D!qQzzAXKBtf`%rKb?>R4l+c>HKxp*BaRrKa018{MaKFJ5Xpa4~sY>F%l|7*44- zy1KO8=Pzg`bxj!E4%*HdVa_YF$S(U}x??8{T`HyEmx$Q8VyPX?=NNAhl)a06JK)G; zEgAMgW!7-yMXvY5q*j(o-R*>7Xh+q%Pcr#pY^7NIzT4JMHHLS6*%c-68L1aFeu-&N z*q#%;Mz^o(B%D&x%TjSmIXdtd-uZ06`TFMJ;mOc=t1`4Dz42M#;Uh;*rG{Mgy%t|_ zGK&{g7mQ6QSV~Mv>Udh))IBFZbULKGL3N;8UZ*+KTxY0pFdu-P)HxmN5VQ6M(OI$P zmD{%x{`r6Wd5EnO@50JtgCoKqa7xnCtKsV=>AAE)FNw}Vsbtnm%-h|pN_3yt;xLV( z(g)8!8{MFk3d$yRY5ufwXdwfen|z7%--+a_yma%2iM-%}=;ryr?-nXs8EeO%&2;U! znB8Gh#UX*KE>eoC!ipCOWjDEBvlR16?ISFzC_LVi9A@VVcC&pHr25;U7WWVJ6*=NlGNz{1-hqjtyCR0m)@T&3ah-AuaAQtj%U6!k{8sVs;_P+H023lf6=?ajB}u;z<<>@&6dVX zpv~RB>3e_dPNCjYfSr*@tW(BL{MPo^dm#~~dq1IHy81)5gK}iHf+~K+gjp)7iM?Ru znshOAA-b$nSa?+~#wbs*D&nfoeLaZWO`WwCkDzu^|HP8M#hcx?HN`FK`sFi4<7C^q z*Yqtqd)7V#QWZAMt(u&X>Pl^_BDvp+|7IrV!7-_qU+S%X{>pBs82>@O`}O);>r`~c zg3i?+{HZW#I4K*6L@2gjIo<84V$4#WuSu8G9`3iu$QL7lHAB+Qd31l0g6utn9M=BK zk}QVGq-Nc(q6<8|^A&us=_rnN!1ar9-}5l+D{;ZNGQ^89m4~F5YRwxOVcI^9*4z8W z@75XjC)C{_@Z)O4c;_lGOZLK{sG@Pm)>uo$5a-(j%f6XLE=`(XJ5PsPzJboXZ=H51 zIw6(aHu0LtOX~49n87Zm zJk^!^s;mko)r9Z5#XMD;b9HYfW?JF#Sb(zjxenh~b4EACWVnO)wwj&XU`!?zI<)LI z_f=M+en$i>aY24%dk3?0MH43Sn^-&EjfX@mm-8zL+w#SJQYg%zoBy116lC>ebfx?y zdy&qS->S9Ut5b692?gGbzr?V|?Y6vy@TH|(C#M_Quj+mMe@A$W)OyKV*vLOzoM)T; z?U}T|A{9+B#Hsvp^3%gzJ8FA-WyqVt^N%vZ_~=;2E?$L%zBdVUh<~xLwD9DULrq7Y z*gEslg#FaI$1O7-wJ4YJ1{;Q;PI|dr+XDOB?Fa8`1PqE({r=Rwv)5N*v=`I8uo{i} zGoYho?-f7blNIvWUwtV#CzG;qL#A>9@xn{*{7HSWpO1WYZWZE-hp2)*-Q@t^-Y<6( zzTo|?J%~)@>%o#4rGDo_+Na&F^4X{!4MUDXCu>=Z*~#L&Zmr#aKmKcJVc}91XWy6Z zst=7!m9erN3tItm=7FyQ5nt1juY>>kOMq2j##7xMO_zg zUZhTAjU1s~vCN;A(~!rlYk#B9>Uo$9=edO7nSwNR z*%1KAkW$TtrkHRXcg_lMde&ofO(xw6*(n@VV5-PGmhw{ zt?(Hr(#z>9Rur932@bY*EGT{8EkSd4{>)nP8bh(06FfNRRhUl7@hembjO8%UhdW1# z-u1@a#Msr&D_(KDrl#NE4y7LK^Vhqd;XWVLKG{Eavb}LV)pAZ5nYz6JQqZ@yx-MQx zIr60z4+ey-hM&-%u}pl1eUcSmfl9j0EvEm{1>P8l<(OFA+q5cHDO0(mBgX&}if3sU zJZk9RncJ$lmNw5~Y^WQ6(tMp4a`~I?*ZU~XTV`4LPgAiSs6m!hD+@O(@69Z5lEy*X zjY=p;Pt-v$I4#$05ml+tChRS9RL3N-%kr4rYBDhF(gd84OMZdGNtvM%{#!HraLryq!K|YF#AN%9g7$^4c1~a2pYYrd>{nd!?I_5Ch3`!{o(#Eu zl6?5XzC>$z@BOxe?pmL)fMtU6H?w5dNB4T6T`f6gOZ<0>-mSR3w=%JKQ)2Cx!4bc2 z^}}pfWUf%SkAY(p_R-a6=S%-3`GuWu3d?}l2XtorcZQxFOz!l`cUmASRaqo#rA9ue zCca<4r)}w$W@)ErA1=c3$*-;MRiou=^s8SXW0rJ^*K56t30AtyFLIwQ+5e0SqpPS! zD@JdIq24nE2T8D78k5-~c&upi#bQ41T&R7}-fCgN5@PimzfYMn${C@MspHD)Zvuo~_`0jh)V9n6U3e*PU}~@JpLf?Z9jN z%V2qmF$AiI)eV_gYj}LRBeVaI(1cM}LZPptIJy69Y^!dVxj3qcxd z2=yRN)1qYez9cN>O17-KzBz9jbjj+>8>uG)T;&s3JA10`JEKY;vLhD;@28X;RZ_T& z`7pbZw!`1LlzV2f3o*zTxU2h1FF$*OICoC?`h^7BV&@-}$uEwAepR(Na^7AesR+%U zX>sK8rfHE=(Oaq;qjntn@nF{^k@e=8?7>iaqbL2L@*6HjOI(#rI;E)ElIv(s!1_u< zy>;wcad@YFX4t2?7G!LfL99x1?mS1n>`cl1|(bmxoJC{ByVW*$x`R*&6Wa?u} zV8uki(o@;)`MqI;uv_{tljy_?^ZLNwyv=PZ%y*?!2=ZyWIeec#?R3Xd{ahrY^sao# zdztIz`6qmZX_YN=POV}qT!E^?p`KG5?_WQK0c)ekLe=t2&n1q z*#mHfq*O!CgKAu?^irJTBC7*p6})C8&rwF1!8ETsQYIyrADo-bs`1W2N{Z>1b&h$+ zl`LCjoD6Rb7MvkYQ%8RvUy8rQLyrha4;?OZYcte0jn|Dyt;;ph&Ax9IIb=(l7Aj0_ zV==PHf=7}*zmHLIAomQFaW&Fmu3FjlX6~@foIMxl;jh75|GuLB>WsKHx1NeddBQmiaT(UzPczFu;s0237@40g zyJZ>Nq$HrlsI=mmz~jwfpAl03&NJf$W7Z)`cR9rJ7xk3AfXR?)<^8Dl?+>if_Y`

=(fVf}XrTHvQg~!e@iuX{ecq`$7FsC~4id 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 Rpr0FNnlXNk+T(7MNe zUa2_Ab&gFK>9SzFJK;vf%aThR_XAIc!}zIK?+#N8&U+ge54WDybB|GO>fas3nFC)b zEo))~HMh6II(z>0%Pag%WlJJ++nl-iasWxx66e_Iaiy)IUOH=>+XXtJy^N2EloYIy zt!7X_*_w;{_FVdDa)V}@F7L$^H1b0jh9=#i&2f7`kh? z&I{sss3$VUNOo5?$4g&Ly^5{k?jV+D`JQ<}_iSOuCb@~bcDYh|4BX_O7!<}&pnNL9 zgszOU;l171l7D*oD~K@C&@SN6!X7R(b%m^b7tVYi;>I0C3=F1?^Uuo$R=K5&Y@Vj) zGe<+|>bF$hGqSRlUTMox*M_n%55VTT&8I=21$eD~lG`l&yk#1iY&6O*9V;Tq360Si zF5vLX4aUaXuaz-o7~gQ?YyS1C<2nbi?K!Ri=t&k?Y*IYdUeD9CYMPQvPT1mDETfB@ z(p$I+G%dCIC$J#s+HKS*GgKRutiLfUC-C$UW{}H!ix!d4eWF&|=uzYjgo!V^K=U+r zD>uThG4~Dxx%(b~H+%f{TWTyJjD_-t1_5EcvtRfutz6rl)GIgjGcCmKYZ%98JDY)~ zUvA}YyeRQd!otYdEYdQ#n>y~^{{XpjO3Gn4ZnglE`2H(PfN=Hl@7X+e+Ba<8^Y$H;9R$t&3PMK zXuX%DN)xHJx!}yyu5fveVqyMb;O9BT&aluE(N|Gb3xeC|Za=|XagPKVX0g{KJ)z#f z?6cT+Pi5<b--x0_ZL{+D)BJXzCj*lMVyv2 zoq_ea-DmK(2gfTNYg;vr#m)Ft8#E`-l&xAQLgzek#?=0v3rT82b?Q^H;@Md1d`{4M z6V*~xRt~B>wc0HO6jOFjYNj{7iBWNDSl36$Yu@W+c-#@#dhDrcu>*T64i$l=qGu2s z*Pkihef~&RE(I)>OB`AXh~a{%(Fhp)#g00-`Zxopr_E@%M-h@(xwSGhv8LL(#e=q8 z&&g`>DQOu^{NTLvh{)HQjJAD?2TLwJgwn+4yO`n|dx6sZ?64sPeNt^>4D1iFJPyOG z1w#mQS0Fn5KsVEMYsDC!I(}0~EMRMa2Eg-LEw5d+Uomj+i}KJyY3W^=xs9Ct_4Mwp zI4_DG%ga+Ez;TZ#I_TWP%eIG4xGYUaq{&(Nk)atSgXsD3NT}l`XR)qp9V1v=Joeh( zn)v${rc}CHBg-X zMYT3=XzZA`j%{r-Dd`KNc{$$jI&GKmD-l7*FU@mf{i-ZJ9>`cFwc{;qkG=X0wO$?& zk}^qQu(qSuK(s2ARY|0|FI?H6s^T`c>p;AO9R}?H=xm|Z@#EyYZ!VKdv~B<+TMu=d z#^Q8jToHCZezsbl4yfdDFO8tMfI%$|BYyfL-!!17(k&^;CS!3LHvw|THK$RS5pnZS z;KeKhS5@P@DqcgKD0SLzcWa>p8-5Gt*F_*V2H_7)Z<#h@-6x#n+EnolKyqkoHBD9V zTdEq|;9Y{(0@`}4{S`nr%%?+7oeI|brtDrxRo&||oe4Kop?&4=0+PH_JK0k9KOOmav|b1-dZA2qvQ z_aQ@B9VIeQLEqMV-(5=jLo@`mo7j*#Ur%G*WHAc6T;D^g>b@*sMjDx#<_276Xa_cj zug!7%Rt*ob_L>R#Dpq`%t~g9p515TCPxlG=X@}a_k^R4Nm4#Hcz@6+Yo}PA)Y%i^a z(JXj*GI`HrY9@x8HMbpA*D%EsvosdWa%wdmquT0s3E=E=hIYBY?QI5|-1J*MFW}Y~ znEQ~}&6yJg$#^HseJyLBWtncJXK2KqMnj1Ms#+T2K>?9KUArO{yH9TF^BLhb!7Vo| zIq-;>=a6nozSX@JN-DzQZgma|tl(IQnwunXv6D5A$miUHeJ^v+d_$r_%*8AO{{VQ8 zO~kE{?uoEkCptFd+>Y;ep-%Bm5m6w?6IjY;45Xa^aXM?$MNPw88BiS?<(kjXI7S7C zxv?j$`!1p4%~VvBZ3Vy?B#zfMaU*kX-m5;zILSsl<&2yVF!Ns=goZXol3F~cmt(2y zt9(u3@25CgHnFTG#A@eg0J-)Xdaj*YJQZx^M`)yTTH`1lr#5c+mpzAsWT!8lcyq$m zy54QveiB>q(^cp+@==oA!9{}*`5zu)*APnxC#|ivs#gi(ZiKQ%IOYd2E#Cc<405|M zaUDx$>Dta7keKrg9^eJHR+uGL zUSk^2E^>p~*W2A_**rzRfD<0!&J&e^^0WrJHkTax0d2rL=(3zyi8@y|GlQ~?>^EJD z#BLav#SD;>{{X|6O=o4hTcG#TqTuq2k?e=*_W5&`8V@LwLyfv1_JRvuEatmW_jgwO zH!DU`e_S0s4gTdu>@3>pG*BOeINY0Q**9WKk!dqYRA+*z?iY-giCFEfEpS4ei17@v zW)sOIqov)o^*<}A6m+vx7P4upmW#-qt+K?nlGYOV0t z ziQJB(TZ6LZ99fRTJd(|jYEDto_r1qpwOF+jGe<1!1+Tbch3)|ZR{_&8CjHksn+grE z^|}t4wB@@jgZK-bmF{h|(_Y`jN2zfiXrGx6g)<*p90W;SUFyp4SFM@Xs-9!tFQO!r?RGCx%rJ&nMIX*F2Vp+}8jc zGiU)e8tisnQtD}TavB^L{6pjYMNA?Gv5kq>4lUi?uk5)`65=7wZeD|@eH5&2ozUJH zSm@+siEFfQ1YBwBbw^Jq%-25ob-slAXcpBPO5qgJ=dcsCwkMkYppo-ZC1G!t8=GS0zQi<(W&>Zec2!YeZIBm>TKzUhjoIWQMt=pGUxlRQBoYbG z+hp}!5fTRt4^_M2?hL+C2(c%smBl;{BzKUohJo9ELENM)*2O)z0@E|NJ`l;ooWXL& zmowGDJ3+z>cPw4y(hc`)XS2U+uv#7+;U{H+q_`FnmF#HSHh{ab+|P$o)62+!7gRVk z_G!$~*U#DAf?msj2ZOZHuh#9S&UDH$W95ml1c2Dn+zZ|fe}hO3gtP$m}|JFrga zrM^3e%PA@|L;=*^=j54nU7AKws<+|H4bpisolfblH{jVIbbeA9C&Es;x8nPdcSm;I zoNy{|`WMhOjXUC0)9(HBC$kDi1Qnb(qN_vT`pF%-uEX(7LA7H z>#2;R?Ee50_=S^(+81+2#P>KB>M!MJ)M?RhtYZ%IIdx1^QtyBMg^R~&e8=VaEShxj zstai4+?>x4hSvVDRh4C2<3nHcl{I46sUa2F3a$God=*;8OxM3JlsiWZz>+(6`;=ON zqJSBd!`)uxm_N|6I{bW9kWT?%Z=<#YkORM>n+6R&+;FcSTIW{rD%SW7cbEE(KlAxDr!k=_WL{cFQ7Qf zf@xuk4R9WL;F3v3pq7qbF5_En<)>z*G~+9=oE+!Fh?r^sk<9?K{6gURbr(A?q4*Pn z84K)K9V1*`+}~$&Z5PZOK?g0(EH<_8>)CI7HsYyU%Zf7W&vlwZt(MLgHnG0`ixbpz z)4G>rA9)yuXHfA21fEA3q%8o<+>8R*Y}=i0uD0m6{4)zou{3~lF_+rH_6JW@!YjC< zS4wlp=UQzuYi}XH-(b2n6+J=o=L{vGt>x}68>#QNrL{xR(Va3`_BCmIohOQTuAY^^ zJ>jDJdTnr@lZhdyv>zYpCS1y>a^Z#Gm*R)7h3;3hoG!u6M-{Yg|Zkb7<48 zx3#tP)4JZpG;a|I?`~NRyKV5;gSox#eU@{?TwK${OGnmbcn-a-mo4rst@C#lT++{M zlLsjA!Nq(-;dfKGvOq+Dkl;mzosIm!{Ff}m@Pgx@)ppER8TwpB(x0qjoYr-?9=com z_E@QSapVaDZqh}*_3u@`;iC%j_rqY?2;S)(aV$@1cyIJlWy~0VTKimBbyyB1;xi)& z5jpv!u{HxP+8(8Lc{o^AQ^5tTn7cktIc<)b-Il(+58$ylt`7|~uY&E4&n$b`3%&p> zOK;aP(*5;bdKM_!=J{q(#xY2)Z)Hn8CabHS7w37H6)krJIj2(4y%v{J_aG^Z_i=m~Uztt$UcJyU%Z36_X|)uG_}`1w#aJIk6Tw(nfCQXBIcj z&{%_O4!88zFXBG{HifJ*0v{vf5sTk5V{=+v>3qQ3Uv-loRD|TBlm3G+n?$H_UStB@ z*gyQHs`;^rV{}G4=;sheOC87e-9_N+K*Svzn{Zl57wN6PHLKwqEV@Ru%`OC;Hy<@i z>`+^=?Ee7Q?lU&pNa~&%aA2*1Stjjd3n> zgFyUuNyl4RJus|u-q~GyhL9VkngBHWm$I)(n6I$xr_uE%0&yJ$ComT@yf)FCq1L(A zQ?~yAn!{o)sFq1w&!dLsBpAzF9d6ln`;8$2rCBjowze+U5rO^!P_Zy6%`h zAlgWuD}~w|0UK{`bhVtPpP%egeqTmwALELM2^ouR*;BiVC9iv9dyCFc2A0r^m8Rla zPo@zpLhUUF@B6zfHams7H?#uw9*1k_Z{F)dF-dSOb2HpgLr)vUIc$w{TyAffr?%g{ zX?Oz`rlfZ^&oVSIt+Dcvp7tR1Cc^8TV%1hY#H$PfAtTt=YS$KAZM14A8aB~;+~Y2gM?1HREDom?&f(%&_`WlVreJkqt?&m&_8Gjg!o%VKPI?5j9Whhvfn zBXexWN-WXvx5zdf7enGd3)xRfS|oHvJg;a2a07p9?O)~Vb%hzE`ZuE-MBzMnRS;=( zt#g5MOF*}Nw_KLL8$8J0VPVh#ro9&1#!AB8OhvjA<$d?Fn|&>%uivWYRq^N#U_TO8 z;#?+WTvo})mM3ppzA+RTm8t{sN%?{KVI91Za~X*h{l66eO=2*()wHOTjp?HcE<2N5J$T9vjb~b@aBt= zV0}^H!oh1-CQMT3!QG^lK|QYJvB9uDd%0P%*}oO9-_&+l{w?5|iaA`#ve(H-29&!C+`L3nI z_+WUp*SF-7)nZm>;1!E>j7AZMkaF0rqrsRHekVIGVQ#6Z@D@f3t*Y#@a6}k=G<8)n zM;Upr4;H!WW9GfCIt{|}y3I>*+K}A{)o>ONV7Hr?*OD^BA z;y`S6Cim9%0^L6JuMharDyK3AUAbS)E+hP$R}IUj#eMIkwl`5cR>j0n&eH1{OJiua zaxQ<-(@wYDczG#K)m&Cv$>?kRhd9N&O>At$qm&j@431!BgKYM?*4WrvYcHO$$wp%| zay^eRw>TCJxpl2??{#~`oH;XJQ0G5a<+*v^FK@kIc)D&=Kxfth=H0`}E(V})duYC! z>AsyB6aN62<3G!<^D^)4jJqD0!OfCKI1~1@uapog1aW?KY2$F3|t)|E3rInIG?5=Bt zvHMHbUl@oLU1$EdMgd#`hb7RWjb<1Ezm+#S1W3=Nr$)ioJ{lbfeR6bcl zM&{%03|h+G8*qj1aQH|U`IMv=jV1G+^G9PQQ*fRh;_z*74g2i7ZasqMrev?P3#7)qc$wMiDVo-j=9uGY9bOM!mbcI3u{G9tElc2G z95$@)>_0Ul0>#IgH*aMRi)o~%kxV?jv!%_t)4ie~TZiXZ{#XTcM5hc;@)~7N7e4j=|%vj}5CLI%irf zZrfOn!26HMa*lBg54V)KG@gS00N_??qxwVskMCVehOl8%M<^2gV`qpu9GmF-dGmT7 zvX2ckG_|P1qb9CNqpup$@rSlDf=-fSrdE0H9WA`sOZw`&Z*=|S0e&l~*>YP8p%r?q0->t9v)(*Dc zulaxEQoqcNe+6N@*rny1rTKJm?fLwdWZ~FHBsAC)YkKUnd?COAt&O+KXAN@vR|C|3 z^>M_Q!D}x|5T2!tC9$~Wwu1I`j^opy?!ITNS#5l@ZC0?GI4|iZhqP3O2VKsF<(9E% z8FIM)09#!;W$ShGhA6|WzH6e=aip?VO*MOuHslzcu2SE#`!=|-7xvLqMNJg*%Gc`I z4aJ*nHL%}XcVA2NeVcpRRZ2pbLd+gHinX@yvhQ`46 zJo*b*4^p%>*rQ~Isj?UM!uK)RQv{_ zN|4}Xb8@oYUc2wI$+oPm+4lu5(NR0v$Lr?u-%j~L)Npl0K+7b0w)XRDrS`GYWk*wo z4q-d%m*=WwbtHi zZEt1Ee1F5|A4Qs?USN_utrjCGX%b(y#1Bg=oJfB=cRBgBA5;EEWxnwijkWkw{@>BR zq5l9>XYJW}>ZRh;Mfb?(vGbP>;?E6x&F!JTa2>OKEu!ny`0w(KJXG)i$32eDIu`t#hMs)q^R0!-3OKMUP7z@21AB zrO(}C`T)txc$Wb&9GA@SOJ3Zz%a*`(*8c#4rlP~#>)33&^ZYS*r+sX%=G460gXS8O zt@iEFR%4tWc-k`BaP4d?56paC+9s;?7QTe@f+K}uGz1)kSc?)5W3tiG@WizIi6vnI zK{b91O;(QzHo$nrZE{(-iaXd3T-g<1m)bbeCjJ2|MLLSXL{=k^#6T{4S zjnca;!R_*2%GPV!M&9xrV?H8kwYDeWvD+@A^IccO zE(?xNtBtIVN{B%&4f{=KIl6Cq8*lPl+YjOL*Roe=4qN(pg6tej@aS6dKkC@r*Z4ti zZnv`X+NrfT;JjBS#~8d8acR`G#kcQm6ZlRZ(_`22P4OI-o<{!w^Bwt>yv49a#|0#< z-SL+@?-uLRU%%0N3CmT3NlSa5$OQc<^N*U9rm#{YRrJ=-?y4kW(Bmia zUhwq`U%FxzsHWI>%Y!u?F)Hs2!<}$4oqZO%gNB$K($@FA%CxJF(ns(6f(@FD%NQ!G zG=37*I+@LTa+eonvxUaJ!ukoAE32GidxIM6fR+nC;pkV*IAr-;PhvFtmtyeqjA|V_ zZ7y3heUNW_tHkTFr=0X?#hlCZknq3guVdI{l-L<%kl#y|fI5x3u4#e2f}VGmGdm1f z8t;ksCpKL*wT1o1b@i{0yfY<5E2F20(oHinxHqd=E3QrU%lO~Xd_rjpxnygV$MMVm z01EVel{sBg%jo6(nkYDzGuxH64ggs1ZpWhf55pQ*}+JLP-L$&>dhHsK-|;hab$=DEWt z7R#31Zf|?`8z;HgvP->?;p*&%lm7r#{-27^o`x4VxptfV8Ad_>0HlhF zX(nqjv9h~1Oukl(#DLbF8U^&QR@fJaQ#tX27@>Cp6il(Te@!v;}4;|k`@UX+mgevxF5u*yjO$1l*k&RC zUK|h0@JZ2HoOb&bM)$`502G^vzM1g{F|k0_NY{_I`#-YLU<#!0lK^z}Eo&K=0xmjP zWU7Xra+`tU^3ym;1co=*jKkGv#U)CS=CN~$zp~;mHs#JcyE#8`R;(Uo`@8aL%KRi$l%89| zU(~xT_?si0AcU7NJmn->;_8wJjkeip@ID_hI?Z8oe$g7`zSr%06*Cv%GXWWeueRQw m#Xmqe80OMlr2eTNjn|Fb`xS9s0BHbjLZ@!$*rvu}fB)IX!}7KO literal 0 HcmV?d00001 diff --git a/content/post/2023/pub/streaming-fast-ssai/images/vod2live-dvr.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/vod2live-dvr.drawio.svg new file mode 100644 index 0000000..c22883f --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/vod2live-dvr.drawio.svg @@ -0,0 +1,4 @@ + + + +
s1
s1
s2
s2
s3
s3
timeshift buffer depth
timeshift buffer depth
live start
live start
s1
s1
s2
s2
s3
s3
end
end
VOD 1
VOD 1
VOD 2
VOD 2
start
start
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/images/vod2live-seq-diag.drawio.svg b/content/post/2023/pub/streaming-fast-ssai/images/vod2live-seq-diag.drawio.svg new file mode 100644 index 0000000..2afea31 --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/images/vod2live-seq-diag.drawio.svg @@ -0,0 +1,4 @@ + + + +
player
player
vod2live
vod2live
enhancer
enhancer
request DASH/HLS
request DASH/HLS
get channel def
get channel def
USP
USP
get sources DASH/HLS
get sources DAS...
return HLS/DASH
return HLS/DASH
sources, duration
sources, duration
compute
DVR
compute...
Generate live DASH/HLS
Generate l...
return HLS/DASH
return HLS/DASH
1
1
get channel schedule
get channel sch...
2
2
compute DVR
sources
compute DVR...
3
3
load sources DASH/HLS
load sources DA...
4
4
compute DVR
segments
compute DVR...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/content/post/2023/pub/streaming-fast-ssai/index.md b/content/post/2023/pub/streaming-fast-ssai/index.md new file mode 100644 index 0000000..3b33c0a --- /dev/null +++ b/content/post/2023/pub/streaming-fast-ssai/index.md @@ -0,0 +1,298 @@ +--- +title: Chaînes FAST & SSAI +date: 2023-11-06T09:00:00 +hero: /post/2023/pub/streaming-fast-ssai/images/hero.jpg +excerpt: "Découvrez comment nous avons mis en place nos chaînes FAST et notre solution SSAI pour y insérer la pub." +authors: + - rpinsonneau +description: "Découvrez comment nous avons mis en place nos chaînes FAST et notre solution SSAI pour y insérer la pub." +--- + +## Chaînes FAST + +FAST est l'acronyme pour Free ad-supported streaming television. Il s'agit de chaînes en streaming gratuites avec de la publicité. Le principe est de reprendre des contenus du catalogue TF1, typiquement en AVOD (Advertising Video on Demand) et de l'assembler pour constituer une grille de programmation qui alimentera une chaîne live. C'est le principe de Stream sur [MYTF1](https://www.tf1.fr/ris-police-scientifique-42165804/direct). On parle alors de relinéarisation des contenus. + +### Mise en oeuvre des flux origin + +eTF1 assure le delivery des contenus VOD en [HLS](https://developer.apple.com/streaming/) (HTTP Live Streaming) et [DASH](https://dashif.org/) (Dynamic Adaptive Streaming over HTTP). Si vous ne l'avez pas déjà lu, nous avons écrit [un article sur la vidéo](https://tech.tf1.fr/post/2020/architecture/video/). + +Afin de déployer nos chaînes FAST nous avons développé une brique maison "vod2live" qui permet de générer des flux live à partir de contenus VOD. + +DASH et HLS sont deux formats de streaming vidéo qui permettent à un player de connaître les segments vidéo/audio (chunk) à télécharger pour lire un contenu. Le découpage en segment permet la lecture en streaming, le fait qu'il existe différents variants (bitrate / résolution) permet au player de faire de l'adaptative bitrate (adaptation de la qualité à la bande passante réseau disponible). + +Dans un contexte VOD, l'ensemble des segments est connu dès l'initialisation du player. Dans un contexte live, le player recharge régulièrement la playlist HLS ou le manifest DASH pour avoir connaissance des segments à venir : il s'agit d'une fenêtre glissante, les segments trop anciens disparaissent et les nouveaux segments sont ajoutés. + +La fenêtre DVR (Digital Video Recorder) est l'intervalle de temps dans lequel le player pourra positionner sa tête de lecture pour jouer le live, soit au plus proche du direct, soit avec un décalage (en timeshifting). Un délais est toujours présent pour garantir un buffer minimal. + +![DVR](images/dvr.drawio.svg#darkmode "time window") + +Le rôle de la brique vod2live est donc à partir d'une grille de programme de déterminer en fonction de l'heure courante la liste des segments à présenter au player. + +Une grille de programme peut être générée de plusieurs façons : +* manuellement, chaque programme est positionné sur une grille +* automatiquement, une liste de programme est déterminée et boucle à l'infini à partir du démarrage de la chaîne + +Cette seconde option est la plus simple à gérer car elle demande moins d'effort sur la programmation des chaînes. A partir d'une liste de vidéos ordonnées, de leur durée et de la date de démarrage de la boucle on peut déterminer à chaque instant (à l'aide de modulo) : +* l'index de la boucle courante +* l'index du programme courant +* l'index du segment correspondant + +![vod2live DVR](images/vod2live-dvr.drawio.svg#darkmode "vod2live loops") + +Dans l'exemple ci-dessus, on est sur la première boucle de la chaîne, le premier segment de la fenêtre tombe sur le deuxième segment de la première vidéo, la fin de la fenêtre tombe sur le premier segment de la deuxième vidéo. + +### Architecture de la brique VOD2LIVE + +![architecture](images/archi-vod2live.drawio.svg#darkmode "schema") + +Afin de générer les flux DASH / HLS de nos chaînes FAST, vod2live est interfacé à plusieurs systèmes : +* l'enhancer est une brique interne qui permet de construire une vue consolidée des chaînes, sa date de démarrage, la liste ordonnée des vidéos qui la compose et leurs durées, ce qui permet de calculer la grille à tout instant +* l'[USP](https://www.unified-streaming.com/products/unified-packager) est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des VOD sources +* les briques delivery et media info permettent au player de récupérer une URL sécurisée de chaque flux + +![sequence diagram](images/vod2live-seq-diag.drawio.svg#darkmode "schema") + +Pour générer un manifest dash ou une playlist HLS, la brique vod2live effectue les tâches suivantes : + +1. récupération de la définition de la chaîne et calcul de la grille +2. calcul du ou des programmes inclus dans la fenêtre DVR actuelle +3. chargement des manifests DASH / playlist HLS des vidéos concernées +4. calcul des segments à inclure dans la fenêtre DVR et génération d'un manifest DASH ou playlist HLS + +### Manipulation des manifests DASH + +La génération d'un flux live DASH à partir de manifest provenant de VOD est relativement facile si l'on s'appuie sur le concept de [periods](https://dashif-documents.azurewebsites.net/DASH-IF-IOP/master/DASH-IF-IOP.html#periods). + +En effet, un manifest DASH ou fichier MPD (Media Presentation Description) est constitué d'une ou plusieurs périodes. + +![PeriodsMakeTheMpd](images/PeriodsMakeTheMpd.png#darkmode "MPD periods") + +Dans un MPD, chaque période de la [timeline](https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html#mpd-general-timeline), correspond à une source (encodage) et contient elle même les éléments qui encapsulent les segments vidéo et audio pour les différents variants. On peut donc lire séquenciellement plusieurs VOD dans un manifest. + +![BasicMpdElements](images/BasicMpdElements.png#darkmode "MPD elements") + +Ci-dessous, un exemple très allégé de MPD live constitué de deux périodes : + +```xml + + + ... + + + ... + + +``` + +Le flux live commence à la date indiquée par l'attribut "availabilityStartTime". Les différentes périodes qui le composent sont positionnées de façon relative par rapport à cette date absolue grâce à leur attribut "start". La première période commence donc à cette date (start="PT0S" par défaut), la deuxième période commence 300s après la première période, qui à donc une durée de 300s. La deuxième période à également une durée de 300s. + +La valeur de l'attribut "timeShiftBufferDepth" indique une fenêtre de DVR de 400s. +Si la date courante est "2017-12-02T09:45:00Z" soit 600s (la durée des deux périodes) de plus que availabilityStartTime alors notre fenêtre DVR commence à 200s de la première période. + +Vous l'avez compris, pour générer le flux live, il faut recopier dans un nouveau MPD les périodes des VOD correspondantes à la DVR courante en adaptant la timeline DASH. + +Il est également nécessaire d'adapter les SegmentTimeline dans le cas d'[adressage explicite](https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html#addressing-explicit). + +```xml + + + + + + + + + + + + + + +``` + +* timescale > nombre d'unité de temps pour une seconde +* S.t > offset du segment exprimé en unité de timescale (soit 0,9s) +* S.d > durée du segment exprimé en unité de timescale +* S.r > nombre de segment similaire consécutifs + +L'url des segments est déduite par le player à partir du template "video/$Time$.m4s", ici $Time$ est remplacé par l'offset S.t du segment correspondant. + +Afin d'inclure les bon segments dans notre fenêtre DVR, il faut adapter les S.t, S.r du SegmentTimeLine. + + +### Manipulation des playlist HLS + +La génération d'un flux HLS est beaucoup plus simple qu'en DASH. En HLS, il existe une playlist pour chaque variant audio/vidéo. Une playlist est un fichier [m3u8](https://fr.wikipedia.org/wiki/M3U) qui contient la liste des segments de la DVR. + +```shell +#EXTM3U +#EXT-X-VERSION:6 +#EXT-X-MEDIA-SEQUENCE:206756 +#EXT-X-TARGETDURATION:8 +#EXT-X-DISCONTINUITY-SEQUENCE:1737 +#EXTINF:8.000, no desc +../videoA-126.ts +#EXTINF:8.000, no desc +../videoA-127.ts +#EXT-X-DISCONTINUITY +#EXTINF:8.000, no desc +../videoB-1.ts +#EXTINF:8.000, no desc +../videoB-2.ts +``` + +L'attribut "EXTINF" indique la durée des segments (ici 8s). Pour enchaîner deux VOD distincte, l'attribut "EXT-X-DISCONTINUITY" permet d'indiquer au player une discontinuité dans l'encodage de deux segments successifs. + +Il suffit alors de lister explicitement les segments des VOD en plaçant les tag #EXT-X-DISCONTINUITY entre les VOD. + +Il est également nécessaire de tenir à jour les valeurs des attributs #EXT-X-MEDIA-SEQUENCE et #EXT-X-DISCONTINUITY-SEQUENCE. +* #EXT-X-MEDIA-SEQUENCE doit être incrémenté à chaque fois qu'un segment disparait de la playlist +* #EXT-X-DISCONTINUITY-SEQUENCE doit être incrémenté à chaque fois qu'un segment en discontinuité disparait de la playlist + +Il y a cependant un prérequis fort sur HLS, les contenus doivent tous avoir exactement le même nombre de variants (une seule master playlist pour le flux). Sans cela, la jonction entre les VOD n'est pas possible si un variant n'existe plus sur le contenu suivant, le player plante et s'arrête. + +## Insertion des publicités + +Pour l'insertion des publicités dans le flux vidéo des chaînes FAST il est nécessaire d'ajouter des emplacements prévus à cet effet. La publicité n'étant pas la même pour chaque utilisateur (ciblage, état de l'inventaire disponible sur l'ad server), la durée des tunnels de publicité (ad break) peut être très variable. Cela n'est pas gênant en VOD, mais sur une chaîne live, cela peut induire un décalage trop important par rapport à la grille de programmation. Afin d'éviter ce décalage, des emplacements sont ajoutés dans la grille de programme. Ces emplacements correspondent à des vidéos (ad slate) qui seront remplacées par la publicité. + +![adslates](images/adslates.drawio.svg#darkmode "ad slates") + +Dans l'exemple ci-dessus, le premier ad slate est remplacé par trois spots publicitaire, la durée totale des spots est égale à celui de l'ad slate. + +Le deuxième ad slate lui n'est remplacé que par un seul spot (manque d'inventaire sur l'ad server). Dans ce cas, pour éviter de créer un décalage dans le flux, une partie de l'ad slate vient compléter le spot pour que la durée totale soit équivalente à celle de l'ad slate initial. + +Dans le flux vidéo d'origine, des marqueurs [SCTE35](https://www.scte.org/standards/library/catalog/scte-35-digital-program-insertion-cueing-message/) sont ajoutés pour indiquer les emplacements où des opportunités publicitaire sont possibles ainsi que leur durée. + +A noter également, pour insérer de la publicité au milieu d'un contenu, il est nécessaire de le couper en deux parties. Cela est possible en DASH ou HLS à condition que le point de jonction corresponde au début d'un segment. Afin que le packager puisse créer un segment à une frame précise, il est nécessaire de forcer un GOP (group of picture) au niveau de l'encoder afin de tomber sur une frame I. En général, ce comportement est assuré par la présence de marqueur SCTE35 dans la source VOD. À défaut d'avoir correctement préparer les contenus, la publicité ne pourra être insérée qu'à la jonction des deux segments les plus proches de la frame désirée. + +### Architecture de la brique adback + +Pour insérer les publicités dans nos flux FAST, nous avons développé une solution SSAI (Server Side Ad Insertion) maison "adback". + +![architecture](images/archi-adback.drawio.svg#darkmode "schema") + +Adback est interfacé à plusieurs systèmes : +* vod2live qui permet de récupérer le flux préparé avec des adslates et marqueur SCTE35 +* wizads est une brique interne qui proxifie les appels avec notre ad server : freewheel +* C3PO est un référentiel des publicités connues de notre delivery vidéo +* video wf est notre workflow d'encodage & packaging, il est sollicité par C3PO pour mettre à disposition les spots publicitaires +* l'[USP](https://www.unified-streaming.com/products/unified-packager) est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des spots publicitaires (c'est la même brique qui est utilisé par vod2live) + +![sequence diagram](images/adback-seq-diag.drawio.svg#darkmode "schema") + +Pour insérer les spots publicitaire, la brique adback effectue les tâches suivantes : +1. Adback: récupération du manifest DASH ou playlist HLS du contenu, préparé avec les adslates & marqueur SCTE35 par vod2live +2. Wizads: sur présence de marqueur SCTE35, appel à l'ad server Freewheel pour récupérer la liste de publicités du tunnel (format VAST, cf. ci-dessous), la durée du tunnel est extraite du marqueur SCTE35 et indiqué à l'ad server +3. C3PO: les publicités qui ne sont pas déjà connues font l'objet d'une demande d'encodage asynchrone à notre workflow vidéo, les publicités déjà encodées sont conservées dans le VAST retourné par wizads +4. Adback: les manifest DASH ou playlist HLS du contenu et des pubs permettent après remanipulation de générer le flux live, le tunnel est persisté en session pour chaque utilisateur + +### Template VAST + +Ci-dessous, un exemple de template VAST avec un spot publicitaire : + +[VAST](https://www.iab.com/guidelines/vast/) est le format utilisé pour récupérer de l'ad server la liste des spots publicitaires pour un tunnel. + +```xml + + + + iabtechlab + + + a532d16d-4d7f-4440-bd29-2ec05553fc80 + Inline Simple Ad + + IAB Sample Company + AD CONTENT description category + + + + + + + + + + 00:00:16 + + + + + + + + + + + + 8465 + + + + + +``` + +On retrouve les différents trackings à exécuter : +* le tracking d'impression, si affichage de la PUB +* le tracking d'erreur, si la PUB n'a pu être insérée +* "firstQuartile", "midpoint", "thirdQuartile", "complete" : selon l'avancement de lecture du spot + +On trouve aussi l'url du spot de PUB dans la balise "MediaFile" au format mp4 dans le retour freewheel, réécrit ensuite en dash et hls suite à la réécriture de wizads / c3po. + +### Manipulation des manifests DASH + +Pour réaliser l'insertion des spots en DASH, il est nécessaire de tronquer la période d'ad slate qui sert de filler si la durée de la publicité est inférieure à la durée de l'ad slate initial. + +Pour ce faire, il faut modifier la valeur du champ "presentationTimeOffset" du SegmentTemplate comme expliqué [ici](https://dashif-documents.azurewebsites.net/DASH-IF-IOP/master/DASH-IF-IOP.html#addressing-explicit-startpoint). + +La durée de l'ad slate tronqué doit être égale à : "durée ad slate initiale" - "durée tunnel de PUB". La durée du tunnel de publicité est inférieure à l'ad slate, l'ad server reçoit un paramètre pour garantir ce comportement. Autrement, les spots en trop sont ignorés. + +Il y a cependant une contrainte forte, le redimensionnement consiste à supprimer un certain nombre de segments de l'ad slate, mais on ne pourra pas toujours avoir la durée voulue exacte. On ne peut que prendre la jonction de deux segments la plus proche. + +![adslates-cut](images/adslate-cut.drawio.svg#darkmode "ad slates cut") + +Cette contrainte amène une deuxième contrainte, si le remplacement de l'adslate initial par la PUB + l'ad slate tronqué ne fait pas la même durée, cela va décaler les "start" de toutes les périodes suivantes. Il est donc nécessaire de garder une session pour chaque utilisateur pour tenir compte de ce décalage. + +Une troisième contrainte vient s'ajouter, si dans une session de lecture, un grand nombre de tunnel de publicité induit un décalage trop important, la tête de lecture du player peut être amenée à sortir de la fenêtre DVR. Pour pallier cette dernière contrainte, il est important d'avoir une fenêtre DVR suffisamment grande, et de limiter les décalages au minimum en ayant des segments plus petits sur l'ad slate. + +### Manipulation des playlist HLS + +Il n'y a pas de complexité particulière sur HLS, il suffit de remplacer les segments de l'ad slate par ceux des spots de PUB en respectant bien la déclaration des discontinuités. Les mêmes contraintes qu'en DASH s'appliquent sur le découpage au niveau des segment et la fenêtre DVR. + +### Tracking des publicités + +![trackings](images/adback-trackings.drawio.svg#darkmode "trackings") + +Le tracking des publicités se fait en server side, lors de la génération du flux live, les URL des segments de spot publicitaire sont remplacées par une URL qui pointera sur la brique adback. + +Dans cette URL sont inclus : +* l'id de session de l'utilisateur +* l'id du tunnel publicitaire (identifié à l'aide du marqueur SCTE35) +* l'id du spot concerné +* l'index du segment + +L'index du segment permet à la brique adback de déterminer la progression dans le spot et de déterminer les quartiles à déclencher ("firstQuartile", "midpoint", "thirdQuartile", "complete"). + +Adback pourra alors envoyer le ou les trackings adéquats en asynchrone et renvoyer une redirection (status code 302) vers le contenu du segment au player qui pourra télécharger celui-ci. + +Ce mode de tracking crée une imprécision sur les quartiles car les trackings sont exécutés au téléchargement des segments et non à la lecture réelle du player. Selon la taille du buffer du player un écart plus ou moins important peut exister. + +Il donne également moins de possibilités de mesures pour les annonceurs qui souhaiteraient contrôler plus finement leur campagne (cf. [Open Measurement SDK](https://iabtechlab.com/standards/open-measurement-sdk/)). + +L'avantage d'un tracking server side est qu'il ne necéssite pas de développement dans le player pour être mis en place et facilite la mise à disposition des flux FAST à des partenaires pour lesquels le player n'est pas maîtrisé. + +## Conclusion + +Il existe une multitude de solutions SSAI sur le marché. Plusieurs acteurs permettent également de gérer des chaînes FAST. eTF1 opère sa propre plateforme vidéo, dans notre contexte, il était pertinent de gérer nous même la delivery de ces chaînes et leur planification. + +Les manipulations de manifest DASH ou playlist HLS nécessaires à la mise en place des chaînes FAST ne sont pas si complexes. + +L'insertion publicitaire est plus complexe, elle exige de maintenir une session pour chaque utilisateur : +* pour gérer le décalage des périodes DASH +* pour conserver les publicités d'un utilisateur pour chaque tunnel (le manifest est rechargé régulièrement par le player en live) +* pour gérer les trackings sur les segments des spot publicitaire + +Nous opérons actuellement une soixantaine de flux FAST. Notre solution "maison" permet en quelque clics dans notre [CMS](https://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_contenu) la publication d'une nouvelle chaîne avec la possibilité de gérer la pression publicitaire (durée et fréquence des ad slates). \ No newline at end of file From 195dacfacd4424c5e1ff9dfb4d8e10a4fc78c74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20PINSONNEAU?= Date: Fri, 10 Nov 2023 14:47:38 +0100 Subject: [PATCH 2/5] vcomposieux feedbacks --- content/post/2023/pub/streaming-fast-ssai/index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/post/2023/pub/streaming-fast-ssai/index.md b/content/post/2023/pub/streaming-fast-ssai/index.md index 3b33c0a..5507cd6 100644 --- a/content/post/2023/pub/streaming-fast-ssai/index.md +++ b/content/post/2023/pub/streaming-fast-ssai/index.md @@ -1,5 +1,5 @@ --- -title: Chaînes FAST & SSAI +title: Gestion du Server-Side Ad Insertion (SSAI) sur nos chaînes FAST date: 2023-11-06T09:00:00 hero: /post/2023/pub/streaming-fast-ssai/images/hero.jpg excerpt: "Découvrez comment nous avons mis en place nos chaînes FAST et notre solution SSAI pour y insérer la pub." @@ -10,15 +10,15 @@ description: "Découvrez comment nous avons mis en place nos chaînes FAST et no ## Chaînes FAST -FAST est l'acronyme pour Free ad-supported streaming television. Il s'agit de chaînes en streaming gratuites avec de la publicité. Le principe est de reprendre des contenus du catalogue TF1, typiquement en AVOD (Advertising Video on Demand) et de l'assembler pour constituer une grille de programmation qui alimentera une chaîne live. C'est le principe de Stream sur [MYTF1](https://www.tf1.fr/ris-police-scientifique-42165804/direct). On parle alors de relinéarisation des contenus. +FAST est l'acronyme pour `Free Ad-supported Streaming Television`. Il s'agit de chaînes en streaming gratuites avec de la publicité. Le principe est de reprendre des contenus du catalogue TF1, typiquement en AVOD (Advertising Video on Demand) et de l'assembler pour constituer une grille de programmation qui alimentera une chaîne live. C'est le principe de Stream sur [MYTF1](https://www.tf1.fr/tf1/direct). On parle alors de re-linéarisation des contenus. ### Mise en oeuvre des flux origin -eTF1 assure le delivery des contenus VOD en [HLS](https://developer.apple.com/streaming/) (HTTP Live Streaming) et [DASH](https://dashif.org/) (Dynamic Adaptive Streaming over HTTP). Si vous ne l'avez pas déjà lu, nous avons écrit [un article sur la vidéo](https://tech.tf1.fr/post/2020/architecture/video/). +eTF1 assure le delivery des contenus VOD en [HLS](https://developer.apple.com/streaming/) (HTTP Live Streaming) et [DASH](https://dashif.org/) (Dynamic Adaptive Streaming over HTTP). Si vous ne l'avez pas déjà lu, nous avons écrit [un article sur notre architecture vidéo](https://tech.tf1.fr/post/2020/architecture/video/). Afin de déployer nos chaînes FAST nous avons développé une brique maison "vod2live" qui permet de générer des flux live à partir de contenus VOD. -DASH et HLS sont deux formats de streaming vidéo qui permettent à un player de connaître les segments vidéo/audio (chunk) à télécharger pour lire un contenu. Le découpage en segment permet la lecture en streaming, le fait qu'il existe différents variants (bitrate / résolution) permet au player de faire de l'adaptative bitrate (adaptation de la qualité à la bande passante réseau disponible). +DASH et HLS sont deux formats de streaming vidéo qui permettent à un player de connaître les segments vidéo/audio (chunks) à télécharger pour lire un contenu. Le découpage en segment permet la lecture en streaming, le fait qu'il existe différents variants (bitrate / résolution) permet au player de faire de l'adaptation de la qualité à la bande passante réseau disponible (adaptative bitrate). Dans un contexte VOD, l'ensemble des segments est connu dès l'initialisation du player. Dans un contexte live, le player recharge régulièrement la playlist HLS ou le manifest DASH pour avoir connaissance des segments à venir : il s'agit d'une fenêtre glissante, les segments trop anciens disparaissent et les nouveaux segments sont ajoutés. @@ -240,7 +240,7 @@ On retrouve les différents trackings à exécuter : * le tracking d'erreur, si la PUB n'a pu être insérée * "firstQuartile", "midpoint", "thirdQuartile", "complete" : selon l'avancement de lecture du spot -On trouve aussi l'url du spot de PUB dans la balise "MediaFile" au format mp4 dans le retour freewheel, réécrit ensuite en dash et hls suite à la réécriture de wizads / c3po. +On trouve aussi l'url du spot de PUB dans la balise "MediaFile" au format MP4 dans le retour Freewheel, réécrit ensuite en DASH et HLS suite à la réécriture de Wizads / C3PO. ### Manipulation des manifests DASH @@ -266,7 +266,7 @@ Il n'y a pas de complexité particulière sur HLS, il suffit de remplacer les se ![trackings](images/adback-trackings.drawio.svg#darkmode "trackings") -Le tracking des publicités se fait en server side, lors de la génération du flux live, les URL des segments de spot publicitaire sont remplacées par une URL qui pointera sur la brique adback. +Le tracking des publicités se fait en server side, lors de la génération du flux live, les URLs des segments de spot publicitaire sont remplacées par une URL qui pointera sur la brique Adback. Dans cette URL sont inclus : * l'id de session de l'utilisateur @@ -293,6 +293,6 @@ Les manipulations de manifest DASH ou playlist HLS nécessaires à la mise en pl L'insertion publicitaire est plus complexe, elle exige de maintenir une session pour chaque utilisateur : * pour gérer le décalage des périodes DASH * pour conserver les publicités d'un utilisateur pour chaque tunnel (le manifest est rechargé régulièrement par le player en live) -* pour gérer les trackings sur les segments des spot publicitaire +* pour gérer les trackings sur les segments des spots publicitaires Nous opérons actuellement une soixantaine de flux FAST. Notre solution "maison" permet en quelque clics dans notre [CMS](https://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_de_contenu) la publication d'une nouvelle chaîne avec la possibilité de gérer la pression publicitaire (durée et fréquence des ad slates). \ No newline at end of file From 59ed0c5b9fa2085bad632f2c56eb6738882f623a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20PINSONNEAU?= Date: Fri, 10 Nov 2023 15:02:28 +0100 Subject: [PATCH 3/5] vcomposieux feedbacks --- .../2023/pub/streaming-fast-ssai/index.md | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/content/post/2023/pub/streaming-fast-ssai/index.md b/content/post/2023/pub/streaming-fast-ssai/index.md index 5507cd6..c838492 100644 --- a/content/post/2023/pub/streaming-fast-ssai/index.md +++ b/content/post/2023/pub/streaming-fast-ssai/index.md @@ -29,30 +29,30 @@ La fenêtre DVR (Digital Video Recorder) est l'intervalle de temps dans lequel l Le rôle de la brique vod2live est donc à partir d'une grille de programme de déterminer en fonction de l'heure courante la liste des segments à présenter au player. Une grille de programme peut être générée de plusieurs façons : -* manuellement, chaque programme est positionné sur une grille -* automatiquement, une liste de programme est déterminée et boucle à l'infini à partir du démarrage de la chaîne +* manuellement : chaque programme est positionné sur une grille +* automatiquement : une liste de programme est déterminée et boucle à l'infini à partir du démarrage de la chaîne -Cette seconde option est la plus simple à gérer car elle demande moins d'effort sur la programmation des chaînes. A partir d'une liste de vidéos ordonnées, de leur durée et de la date de démarrage de la boucle on peut déterminer à chaque instant (à l'aide de modulo) : +Cette seconde option est la plus simple à gérer car elle demande moins d'effort sur la programmation des chaînes. À partir d'une liste de vidéos ordonnées, de leur durée et de la date de démarrage de la boucle on peut déterminer à chaque instant (à l'aide de modulo) : * l'index de la boucle courante * l'index du programme courant * l'index du segment correspondant ![vod2live DVR](images/vod2live-dvr.drawio.svg#darkmode "vod2live loops") -Dans l'exemple ci-dessus, on est sur la première boucle de la chaîne, le premier segment de la fenêtre tombe sur le deuxième segment de la première vidéo, la fin de la fenêtre tombe sur le premier segment de la deuxième vidéo. +Dans l'exemple ci-dessus, on est sur la première boucle de la chaîne. Le premier segment de la fenêtre tombe sur le deuxième segment de la première vidéo et la fin de la fenêtre tombe sur le premier segment de la deuxième vidéo. ### Architecture de la brique VOD2LIVE ![architecture](images/archi-vod2live.drawio.svg#darkmode "schema") Afin de générer les flux DASH / HLS de nos chaînes FAST, vod2live est interfacé à plusieurs systèmes : -* l'enhancer est une brique interne qui permet de construire une vue consolidée des chaînes, sa date de démarrage, la liste ordonnée des vidéos qui la compose et leurs durées, ce qui permet de calculer la grille à tout instant -* l'[USP](https://www.unified-streaming.com/products/unified-packager) est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des VOD sources -* les briques delivery et media info permettent au player de récupérer une URL sécurisée de chaque flux +* l'`enhancer` est une brique interne qui permet de construire une vue consolidée des chaînes, sa date de démarrage, la liste ordonnée des vidéos qui la compose et leurs durées, ce qui permet de calculer la grille à tout instant +* l'`[USP](https://www.unified-streaming.com/products/unified-packager)`` est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des VOD sources +* les briques `delivery` et `mediainfo` permettent au player de récupérer une URL sécurisée de chaque flux ![sequence diagram](images/vod2live-seq-diag.drawio.svg#darkmode "schema") -Pour générer un manifest dash ou une playlist HLS, la brique vod2live effectue les tâches suivantes : +Pour générer un manifest DASH ou une playlist HLS, la brique vod2live effectue les tâches suivantes : 1. récupération de la définition de la chaîne et calcul de la grille 2. calcul du ou des programmes inclus dans la fenêtre DVR actuelle @@ -67,7 +67,7 @@ En effet, un manifest DASH ou fichier MPD (Media Presentation Description) est c ![PeriodsMakeTheMpd](images/PeriodsMakeTheMpd.png#darkmode "MPD periods") -Dans un MPD, chaque période de la [timeline](https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html#mpd-general-timeline), correspond à une source (encodage) et contient elle même les éléments qui encapsulent les segments vidéo et audio pour les différents variants. On peut donc lire séquenciellement plusieurs VOD dans un manifest. +Dans un MPD, chaque période de la [timeline](https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html#mpd-general-timeline) correspond à une source (encodage) et contient elle même les éléments qui encapsulent les segments vidéo et audio pour les différents variants. On peut donc lire séquentiellement plusieurs VOD dans un manifest. ![BasicMpdElements](images/BasicMpdElements.png#darkmode "MPD elements") @@ -85,10 +85,10 @@ Ci-dessous, un exemple très allégé de MPD live constitué de deux périodes : ``` -Le flux live commence à la date indiquée par l'attribut "availabilityStartTime". Les différentes périodes qui le composent sont positionnées de façon relative par rapport à cette date absolue grâce à leur attribut "start". La première période commence donc à cette date (start="PT0S" par défaut), la deuxième période commence 300s après la première période, qui à donc une durée de 300s. La deuxième période à également une durée de 300s. +Le flux live commence à la date indiquée par l'attribut "availabilityStartTime". Les différentes périodes qui le composent sont positionnées de façon relative par rapport à cette date absolue grâce à leur attribut "start". La première période commence donc à cette date (start="PT0S" par défaut), la deuxième période commence 300s après la première période, qui à donc une durée de 300s. La deuxième période a également une durée de 300s. La valeur de l'attribut "timeShiftBufferDepth" indique une fenêtre de DVR de 400s. -Si la date courante est "2017-12-02T09:45:00Z" soit 600s (la durée des deux périodes) de plus que availabilityStartTime alors notre fenêtre DVR commence à 200s de la première période. +Si la date courante est "2017-12-02T09:45:00Z" soit 600s (la durée des deux périodes) de plus que "availabilityStartTime" alors notre fenêtre DVR commence à 200s de la première période. Vous l'avez compris, pour générer le flux live, il faut recopier dans un nouveau MPD les périodes des VOD correspondantes à la DVR courante en adaptant la timeline DASH. @@ -113,13 +113,13 @@ Il est également nécessaire d'adapter les SegmentTimeline dans le cas d'[adres ``` * timescale > nombre d'unité de temps pour une seconde -* S.t > offset du segment exprimé en unité de timescale (soit 0,9s) -* S.d > durée du segment exprimé en unité de timescale -* S.r > nombre de segment similaire consécutifs +* `S.t` : offset du segment exprimé en unité de timescale (soit 0,9s) +* `S.d` : durée du segment exprimé en unité de timescale +* `S.r` : nombre de segment similaire consécutifs -L'url des segments est déduite par le player à partir du template "video/$Time$.m4s", ici $Time$ est remplacé par l'offset S.t du segment correspondant. +L'url des segments est déduite par le player à partir du template "video/$Time$.m4s", ici "$Time$" est remplacé par l'offset "S.t" du segment correspondant. -Afin d'inclure les bon segments dans notre fenêtre DVR, il faut adapter les S.t, S.r du SegmentTimeLine. +Afin d'inclure les bon segments dans notre fenêtre DVR, il faut adapter les "S.t", "S.r" du "SegmentTimeLine". ### Manipulation des playlist HLS @@ -143,13 +143,13 @@ La génération d'un flux HLS est beaucoup plus simple qu'en DASH. En HLS, il ex ../videoB-2.ts ``` -L'attribut "EXTINF" indique la durée des segments (ici 8s). Pour enchaîner deux VOD distincte, l'attribut "EXT-X-DISCONTINUITY" permet d'indiquer au player une discontinuité dans l'encodage de deux segments successifs. +L'attribut "EXTINF" indique la durée des segments (ici 8s). Pour enchaîner deux VOD distinctes, l'attribut "EXT-X-DISCONTINUITY" permet d'indiquer au player une discontinuité dans l'encodage de deux segments successifs. -Il suffit alors de lister explicitement les segments des VOD en plaçant les tag #EXT-X-DISCONTINUITY entre les VOD. +Il suffit alors de lister explicitement les segments des VOD en plaçant les tags #EXT-X-DISCONTINUITY entre les VOD. Il est également nécessaire de tenir à jour les valeurs des attributs #EXT-X-MEDIA-SEQUENCE et #EXT-X-DISCONTINUITY-SEQUENCE. -* #EXT-X-MEDIA-SEQUENCE doit être incrémenté à chaque fois qu'un segment disparait de la playlist -* #EXT-X-DISCONTINUITY-SEQUENCE doit être incrémenté à chaque fois qu'un segment en discontinuité disparait de la playlist +* `#EXT-X-MEDIA-SEQUENCE` : doit être incrémenté à chaque fois qu'un segment disparait de la playlist +* `#EXT-X-DISCONTINUITY-SEQUENCE` : doit être incrémenté à chaque fois qu'un segment en discontinuité disparait de la playlist Il y a cependant un prérequis fort sur HLS, les contenus doivent tous avoir exactement le même nombre de variants (une seule master playlist pour le flux). Sans cela, la jonction entre les VOD n'est pas possible si un variant n'existe plus sur le contenu suivant, le player plante et s'arrête. @@ -165,28 +165,28 @@ Le deuxième ad slate lui n'est remplacé que par un seul spot (manque d'inventa Dans le flux vidéo d'origine, des marqueurs [SCTE35](https://www.scte.org/standards/library/catalog/scte-35-digital-program-insertion-cueing-message/) sont ajoutés pour indiquer les emplacements où des opportunités publicitaire sont possibles ainsi que leur durée. -A noter également, pour insérer de la publicité au milieu d'un contenu, il est nécessaire de le couper en deux parties. Cela est possible en DASH ou HLS à condition que le point de jonction corresponde au début d'un segment. Afin que le packager puisse créer un segment à une frame précise, il est nécessaire de forcer un GOP (group of picture) au niveau de l'encoder afin de tomber sur une frame I. En général, ce comportement est assuré par la présence de marqueur SCTE35 dans la source VOD. À défaut d'avoir correctement préparer les contenus, la publicité ne pourra être insérée qu'à la jonction des deux segments les plus proches de la frame désirée. +À noter également, pour insérer de la publicité au milieu d'un contenu, il est nécessaire de le couper en deux parties. Cela est possible en DASH ou HLS à condition que le point de jonction corresponde au début d'un segment. Afin que le packager puisse créer un segment à une frame précise, il est nécessaire de forcer un GOP (Group Of Picture) au niveau de l'encoder afin de tomber sur une frame I. En général, ce comportement est assuré par la présence de marqueur SCTE35 dans la source VOD. À default d'avoir correctement préparer les contenus, la publicité ne pourra être insérée qu'à la jonction des deux segments les plus proches de la frame désirée. ### Architecture de la brique adback -Pour insérer les publicités dans nos flux FAST, nous avons développé une solution SSAI (Server Side Ad Insertion) maison "adback". +Pour insérer les publicités dans nos flux FAST, nous avons développé une solution SSAI (Server Side Ad Insertion) maison, nommée "adback". ![architecture](images/archi-adback.drawio.svg#darkmode "schema") Adback est interfacé à plusieurs systèmes : -* vod2live qui permet de récupérer le flux préparé avec des adslates et marqueur SCTE35 -* wizads est une brique interne qui proxifie les appels avec notre ad server : freewheel -* C3PO est un référentiel des publicités connues de notre delivery vidéo -* video wf est notre workflow d'encodage & packaging, il est sollicité par C3PO pour mettre à disposition les spots publicitaires -* l'[USP](https://www.unified-streaming.com/products/unified-packager) est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des spots publicitaires (c'est la même brique qui est utilisé par vod2live) +* `vod2live` : qui permet de récupérer le flux préparé avec des ad slates et marqueur SCTE35 +* `wizads` : une brique interne qui proxifie les appels avec notre ad server (Freewheel) +* `C3PO` : un référentiel de publicités connues de notre delivery vidéo +* `video wf` : notre workflow d'encodage & packaging, il est sollicité par C3PO pour mettre à disposition les spots publicitaires +* l'`[USP](https://www.unified-streaming.com/products/unified-packager)` : la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des spots publicitaires (c'est la même brique qui est utilisée par vod2live) ![sequence diagram](images/adback-seq-diag.drawio.svg#darkmode "schema") Pour insérer les spots publicitaire, la brique adback effectue les tâches suivantes : -1. Adback: récupération du manifest DASH ou playlist HLS du contenu, préparé avec les adslates & marqueur SCTE35 par vod2live -2. Wizads: sur présence de marqueur SCTE35, appel à l'ad server Freewheel pour récupérer la liste de publicités du tunnel (format VAST, cf. ci-dessous), la durée du tunnel est extraite du marqueur SCTE35 et indiqué à l'ad server -3. C3PO: les publicités qui ne sont pas déjà connues font l'objet d'une demande d'encodage asynchrone à notre workflow vidéo, les publicités déjà encodées sont conservées dans le VAST retourné par wizads -4. Adback: les manifest DASH ou playlist HLS du contenu et des pubs permettent après remanipulation de générer le flux live, le tunnel est persisté en session pour chaque utilisateur +1. `Adback` : récupération du manifest DASH ou playlist HLS du contenu, préparé avec les ad slates & marqueur SCTE35 par vod2live +2. `Wizads` : sur présence de marqueur SCTE35, appel à l'ad server Freewheel pour récupérer la liste de publicités du tunnel (format VAST, cf. ci-dessous), la durée du tunnel est extraite du marqueur SCTE35 et indiqué à l'ad server +3. `C3PO` : les publicités qui ne sont pas déjà connues font l'objet d'une demande d'encodage asynchrone à notre workflow vidéo, les publicités déjà encodées sont conservées dans le VAST retourné par Wizads +4. `Adback` : les manifests DASH ou playlist HLS du contenu et des pubs permettent après re-manipulation de générer le flux live, le tunnel est persisté en session pour chaque utilisateur ### Template VAST From 242ea9867d5ec472046477ff34c539ff7d3fd3f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20PINSONNEAU?= Date: Fri, 10 Nov 2023 15:05:33 +0100 Subject: [PATCH 4/5] vcomposieux feedbacks --- content/post/2023/pub/streaming-fast-ssai/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/post/2023/pub/streaming-fast-ssai/index.md b/content/post/2023/pub/streaming-fast-ssai/index.md index c838492..9d8ce63 100644 --- a/content/post/2023/pub/streaming-fast-ssai/index.md +++ b/content/post/2023/pub/streaming-fast-ssai/index.md @@ -266,7 +266,7 @@ Il n'y a pas de complexité particulière sur HLS, il suffit de remplacer les se ![trackings](images/adback-trackings.drawio.svg#darkmode "trackings") -Le tracking des publicités se fait en server side, lors de la génération du flux live, les URLs des segments de spot publicitaire sont remplacées par une URL qui pointera sur la brique Adback. +Le tracking des publicités se fait en server side, lors de la génération du flux live. Les URLs des segments de spot publicitaire sont remplacées par une URL qui pointera sur la brique Adback. Dans cette URL sont inclus : * l'id de session de l'utilisateur From 98a679d940ec0187ea8e2935721dea2bc67de4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20PINSONNEAU?= Date: Mon, 13 Nov 2023 16:55:02 +0100 Subject: [PATCH 5/5] slaroque feedbacks --- content/post/2023/pub/streaming-fast-ssai/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/post/2023/pub/streaming-fast-ssai/index.md b/content/post/2023/pub/streaming-fast-ssai/index.md index 9d8ce63..7bc7405 100644 --- a/content/post/2023/pub/streaming-fast-ssai/index.md +++ b/content/post/2023/pub/streaming-fast-ssai/index.md @@ -18,7 +18,7 @@ eTF1 assure le delivery des contenus VOD en [HLS](https://developer.apple.com/st Afin de déployer nos chaînes FAST nous avons développé une brique maison "vod2live" qui permet de générer des flux live à partir de contenus VOD. -DASH et HLS sont deux formats de streaming vidéo qui permettent à un player de connaître les segments vidéo/audio (chunks) à télécharger pour lire un contenu. Le découpage en segment permet la lecture en streaming, le fait qu'il existe différents variants (bitrate / résolution) permet au player de faire de l'adaptation de la qualité à la bande passante réseau disponible (adaptative bitrate). +DASH et HLS sont deux formats de streaming vidéo qui permettent à un player de connaître les segments vidéo/audio (chunks) à télécharger pour lire un contenu. Le découpage en segment permet la lecture en streaming, le fait qu'il existe différents variants (bitrate / résolution) permet au player de faire de l'adaptation de la qualité à la bande passante réseau disponible (adaptative bitrate) ou de choisir le variant le plus adapté selon le CPU disponible ainsi que la taille de l'écran du device. Dans un contexte VOD, l'ensemble des segments est connu dès l'initialisation du player. Dans un contexte live, le player recharge régulièrement la playlist HLS ou le manifest DASH pour avoir connaissance des segments à venir : il s'agit d'une fenêtre glissante, les segments trop anciens disparaissent et les nouveaux segments sont ajoutés. @@ -47,7 +47,7 @@ Dans l'exemple ci-dessus, on est sur la première boucle de la chaîne. Le premi Afin de générer les flux DASH / HLS de nos chaînes FAST, vod2live est interfacé à plusieurs systèmes : * l'`enhancer` est une brique interne qui permet de construire une vue consolidée des chaînes, sa date de démarrage, la liste ordonnée des vidéos qui la compose et leurs durées, ce qui permet de calculer la grille à tout instant -* l'`[USP](https://www.unified-streaming.com/products/unified-packager)`` est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des VOD sources +* l'[`USP (Unified Streaming Packager)`](https://www.unified-streaming.com/products/unified-packager) est la solution de packaging vidéo que nous utilisons et permet de générer à la volée les manifests DASH et playlist HLS des VOD sources * les briques `delivery` et `mediainfo` permettent au player de récupérer une URL sécurisée de chaque flux ![sequence diagram](images/vod2live-seq-diag.drawio.svg#darkmode "schema")