/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 2 ĠTh ib ault ĠB . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . github . th ib ault bee . stre amp ack . internal . mux ers . fl v . packet Ċ Ċ import Ġio . github . th ib ault bee . stre amp ack . data . Audio Config Ċ import Ġio . github . th ib ault bee . stre amp ack . data . Config Ċ import Ġio . github . th ib ault bee . stre amp ack . data . Video Config Ċ import Ġio . github . th ib ault bee . stre amp ack . internal . data . Frame Ċ import Ġio . github . th ib ault bee . stre amp ack . internal . utils . put Ċ import Ġio . github . th ib ault bee . stre amp ack . internal . utils . put Int 2 4 Ċ import Ġio . github . th ib ault bee . stre amp ack . internal . utils . sh l Ċ import Ġio . github . th ib ault bee . stre amp ack . internal . utils . is Audio Ċ import Ġio . github . th ib ault bee . stre amp ack . internal . utils . is Video Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ Ċ abstract Ġclass ĠFl v Tag ( ĊĠĠĠ Ġprivate Ġvar Ġts : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġtype : ĠTag Type , ĊĠĠĠ Ġprivate Ġval Ġis Encrypted : ĠBoolean Ġ= Ġfalse Ġ/* ĠNot Ġsupported Ġyet Ġ*/ Ċ ) Ġ{ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġwrite Tag Header ( buffer : ĠByteBuffer ) ĊĠĠĠ Ġprotected Ġabstract Ġval Ġtag Header Size : ĠInt ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġwrite Payload ( buffer : ĠByteBuffer ) ĊĠĠĠ Ġprotected Ġabstract Ġval Ġpayload Size : ĠInt ĊĊĠĠĠ Ġfun Ġwrite (): ĠByteBuffer Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Size Ġ= Ġtag Header Size Ġ+ Ġpayload Size ĊĠĠĠĠĠĠĠ Ġval Ġfl v Tag Size Ġ= ĠFL V _ HEADER _ TAG _ SIZE Ġ+ Ġdata Size ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer . allocate Direct ( fl v Tag Size Ġ+ Ġ 4 ) Ġ// Ġ 4 Ġ- ĠPrevious Tag Size ĊĊĠĠĠĠĠĠĠ Ġ// ĠFL V ĠTag ĊĠĠĠĠĠĠĠ Ġbuffer . put (( is Encrypted Ġshl Ġ 5 ) Ġor Ġ( type . value )) ĊĠĠĠĠĠĠĠ Ġbuffer . put Int 2 4 ( data Size ) ĊĠĠĠĠĠĠĠ Ġval Ġts In Ms Ġ= Ġ( ts Ġ/ Ġ 1 0 0 0 ). toInt () Ġ// Ġto Ġms ĊĠĠĠĠĠĠĠ Ġbuffer . put Int 2 4 ( ts In Ms ) ĊĠĠĠĠĠĠĠ Ġbuffer . put (( ts In Ms Ġshr Ġ 2 4 ). to Byte ()) ĊĠĠĠĠĠĠĠ Ġbuffer . put Int 2 4 ( 0 ) Ġ// ĠStream ĠID ĊĊĠĠĠĠĠĠĠ Ġwrite Tag Header ( buffer ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Encrypted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" Filter / encryption Ġis Ġnot Ġimplemented Ġyet ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEncryption Tag Header ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFilter Params ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite Payload ( buffer ) ĊĊĠĠĠĠĠĠĠ Ġbuffer . put Int ( fl v Tag Size ) ĊĊĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFL V _ HEADER _ TAG _ SIZE Ġ= Ġ 1 1 ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Fl v Tag ( frame : ĠFrame , Ġis Sequence Header : ĠBoolean , Ġconfig : ĠConfig ): ĠFl v Tag Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . mime Type . is Audio () Ġ-> Ġif Ġ( is Sequence Header ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tag ( frame . pts , Ġframe . extra ! ![ 0 ], Ġtrue , Ġconfig Ġas ĠAudio Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Tag ( frame . pts , Ġframe . buffer , Ġfalse , Ġconfig Ġas ĠAudio Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . mime Type . is Video () Ġ-> Ġif Ġ( is Sequence Header ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVideo Tag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . pts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . extra !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . is Key Frame , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġas ĠVideo Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVideo Tag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . pts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . is Key Frame , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġas ĠVideo Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Frame Ġis Ġneither Ġvideo Ġnor Ġaudio : Ġ${ frame . mime Type }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠTag Type ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ ĠA UDIO ( 8 ), ĊĠĠĠ ĠV IDE O ( 9 ), ĊĠĠĠ ĠS CRIPT ( 1 8 ), Ċ } ĊĊ