// ĠSPDX - File Copyright Text : Ġ 2 0 2 1 ĠS ver i ges ĠTele vision ĠAB Ċ // Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġse . sv t . oss . android . streaming . container . ts Ċ Ċ import Ġandroid . util . Log Ċ import Ġio . ktor . utils . io .* Ċ import Ġkotlinx . coroutines . channels . Closed Receive Channel Exception Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġse . sv t . oss . android . streaming . Result Ċ Ċ sealed Ġclass ĠError Ġ{ ĊĠĠĠ Ġobject ĠMissing Sync Byte Ġ: ĠError () Ċ } Ċ Ċ // ĠTODO : Ġequals , ĠhashCode Ġcon und rum Ċ data Ġclass ĠPacket ( ĊĠĠĠ Ġval Ġdata : ĠByteArray , ĊĠĠĠ Ġval Ġpid : ĠP id , ĊĠĠĠ Ġval Ġpayload Unit Start Indicator : ĠBoolean , ĊĠĠĠ Ġval Ġdis continu ity Flag : ĠBoolean Ċ ) Ċ Ċ private Ġconst Ġval ĠPACK ET _ SIZE Ġ= Ġ 1 8 8 Ċ private Ġconst Ġval ĠHEADER _ SIZE Ġ= Ġ 4 Ċ private Ġconst Ġval ĠSY NC _ BYTE Ġ= Ġ 0 x 4 7 Ċ Ċ private Ġobject ĠAdapt ion Field Flags Ġ{ ĊĠĠĠ Ġconst Ġval ĠP AY LOAD Ġ= Ġ 0 x 1 0 ĊĠĠĠ Ġconst Ġval ĠAD AP TION Ġ= Ġ 0 x 2 0 Ċ } Ċ Ċ fun Ġts Flow ( channel : ĠByte Read Channel ) Ġ= ĊĠĠĠ Ġmutable Map Of < Pid , ĠInt >(). let Ġ{ Ġprevious Continu ity Counters Ġ-> ĊĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġchannel . readInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// en . wikipedia . org / wiki / M PEG _ transport _ stream # Packet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Error Ġ= Ġ( header Ġand Ġ 0 x 8 0 0 0 0 0 ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Unit Start Indicator Ġ= Ġ( header Ġand Ġ 0 x 4 0 0 0 0 0 ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhas Adapt ion Field Ġ= Ġ( header Ġand ĠAdapt ion Field Flags . ADAP TION ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontinu ity Counter Ġ= Ġheader Ġand Ġ 0 xF ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapt ation Field Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Adapt ion Field ) Ġchannel . read Byte (). to U Byte (). toInt () Ġelse Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . discard Exact ( adapt ation Field Length . to Long ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpacket Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPACK ET _ SIZE Ġ- ĠHEADER _ SIZE Ġ- Ġadapt ation Field Length Ġ- Ġ( if Ġ( has Adapt ion Field ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= ĠByteArray ( packet Size ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . read Fully ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpid Ġ= ĠP id (( 0 x 1 fff 0 0 Ġand Ġheader ) Ġshr Ġ 8 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Continu ity Counter Ġ= Ġprevious Continu ity Counters [ pid ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepeated Continu ity Counter Ġ= Ġcontinu ity Counter Ġ== Ġprevious Continu ity Counter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Continu ity Counters [ pid ] Ġ= Ġcontinu ity Counter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis continu ity Flag Ġ= Ġcontinu ity Counter Ġ!= Ġ(( previous Continu ity Counter Ġ?: Ġ( continu ity Counter Ġ- Ġ 1 )) Ġ+ Ġ 1 ) Ġand Ġ 0 xF ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! repeated Continu ity Counter Ġ&& Ġ! transport Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠResult < Packet , ĠError > Ġ= Ġif Ġ( header Ġshr Ġ 2 4 Ġ!= ĠSY NC _ BYTE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Error ( Error . Missing Sync Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Unit Start Indicator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis continu ity Flag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TS ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Skipping Ġpacket Ġdue Ġto Ġrepeated Continu ity Counter Ġ= Ġ$ repeated Continu ity Counter Ġtransport Error Ġ= Ġ$ transport Error " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClosed Receive Channel Exception ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ