§
    #EÇjMi  ã                   óT  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ ddlmZmZmZmZmZ ej        dk    rC	 ej                             d¬¦  «         ej                             d¬¦  «         n# e$ r Y nw xY w ee¦  «                             ¦   «         j        j        Zedz  Z  e!e ¦  «        ej"        vr$ej"         #                    d e!e ¦  «        ¦  «         dd	l$m%Z%m&Z&m'Z'  G d
„ dej(        ¦  «        Z)e*dk    r ej+        ¦   «          dS dS )u2  
=============================================================================
KIEU STORY â€” EMPIRICAL ADVERSARIAL TEST SUITE: M3 AUDIO CONTINUITY ENGINE
=============================================================================
Agent: teamwork_preview_challenger (M3 Challenger 1)
Target: 05_Production_Pipeline/audio_continuity_engine.py

Empirical Stress-Testing Criteria:
1. Two-Pass EBU R128 loudness normalization produces output compliant with:
   - Integrated Loudness: -14.0 LUFS Â± 0.5 LUFS
   - True Peak: <= -1.0 dBTP
2. Silent audio (-inf) does not crash FFmpeg in measure or normalization passes.
3. Video without audio stream (-an) concatenated with standard audio video:
   - Does not crash FFmpeg
   - Produces 48kHz stereo AAC stream
4. Mixed channel counts (mono + stereo) preserve stereo layout without downmixing.
5. Micro-fade Mode A (boundary_smoothing) blends boundaries with zero timeline shrinkage.
6. Extreme sample rates & active gain staging headroom protection.
=============================================================================
é    N)ÚPath)ÚDictÚAnyÚListÚOptionalÚTupleÚwin32úutf-8©ÚencodingÚ05_Production_Pipeline)ÚAudioContinuityEngineÚ
get_ffmpegÚget_ffprobec                   óæ   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         Z	 	 	 	 	 	 dd
ededede	e         de
de
dedefd„Zdedeeef         fd„Zdedeeeef         fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestAdversarialM3AudioEnginezG
    Adversarial empirical stress tests for AudioContinuityEngine.
    c                 óª   — t          ¦   «         | _        t          ¦   «         | _        t	          ¦   «         | _        i | _        t          dz  dz  | _        d S )NÚtestsz(adversarial_m3_audio_engine_results.json)	r   Úffmpegr   Úffprober   ÚengineÚtelemetry_resultsÚBASE_DIRÚresults_json_path)Úclss    ú?C:\Projects\KieuStory\tests\test_adversarial_m3_audio_engine.pyÚ
setUpClassz'TestAdversarialM3AudioEngine.setUpClass8   sF   € å‘\”\ˆŒ
Ý!‘m”mˆŒÝ*Ñ,Ô,ˆŒ
Ø "ˆÔÝ (¨7Ñ 2Ð5_Ñ _ˆÔÐÐó    c                 ó"  — 	 t          | j        dd¬¦  «        5 }t          j        | j        |dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   t          d| j        › �¦  «         d S # t          $ r}t          d|› �¦  «         Y d }~d S d }~ww xY w)	NÚwr
   r   é   F)ÚindentÚensure_asciiu%   
[âœ“] Saved empirical telemetry to: z'[!] Warning: failed to save telemetry: )Úopenr   ÚjsonÚdumpr   ÚprintÚ	Exception)r   ÚfÚes      r   ÚtearDownClassz*TestAdversarialM3AudioEngine.tearDownClass@   s
  € ð	AÝ�cÔ+¨S¸7ÐCÑCÔCð RÀqÝ”	˜#Ô/°¸1È5ÐQÑQÔQÐQðRð Rð Rñ Rô Rð Rð Rð Rð Rð Rð Røøøð Rð Rð Rð RåÐR¸3Ô;PÐRÐRÑSÔSÐSÐSÐSøÝð 	Að 	Að 	AÝÐ?¸AÐ?Ð?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøs9   ‚A' ™A·A' ÁAÁA' Á
AÁA' Á'
BÁ1B	Â	Bç      @ÚblackNé€»  r!   TÚoutput_pathÚdurationÚcolorÚaudio_filterÚsample_rateÚchannelsÚ	has_audioÚreturnc                 ó  — | j         ddddd|› d|› �g}|r}|r|                     d|dd	dd
g¦  «         n#|                     dddd|› d|› �dd	ddg¦  «         |                     dddddddddt          |¦  «        dt          |¦  «        g¦  «         n|                     g d¢¦  «         |                     dt          |¦  «        |g¦  «         t          j        |dd¬¦  «        }	|	j        dk    rt          d|	j        › �¦  «        ‚|S )zAHelper to create deterministic test video with exact audio specs.ú-yú-fÚlavfiú-izcolor=c=z:s=320x240:d=z-filter_complexz-mapz0:vz[a_out]zsine=frequency=440:sample_rate=z
:duration=z1:aú-c:vÚlibx264ú-pix_fmtÚyuv420pú-c:aÚaacz-b:aÚ192kú-arú-ac)z-anr<   r=   r>   r?   z-tT©Úcapture_outputÚtextr   zFFmpeg creation failed: )r   ÚextendÚstrÚ
subprocessÚrunÚ
returncodeÚRuntimeErrorÚstderr)
Úselfr/   r0   r1   r2   r3   r4   r5   ÚcmdÚress
             r   Ú_create_test_videoz/TestAdversarialM3AudioEngine._create_test_videoM   sj  € ð ŒK˜Ø�'˜4Ð!J¨EÐ!JÐ!JÀÐ!JÐ!Jð
ˆð ð 	JØð Ø—
’
Ð-¨|¸VÀUÈFÐT]Ð^Ñ_Ô_Ð_Ð_à—
’
Ø˜'ØÐ]¸KÐ]Ð]ÐS[Ð]Ð]Ø˜E 6¨5ðñ ô ð ð
 �JŠJØ˜	 :¨yØ˜˜v v¨uµc¸+Ñ6FÔ6FÈÍsÐS[É}Ì}ðñ ô ð ð ð
 �JŠJÐHÐHÐHÑIÔIÐIà�
Š
�D�#˜h™-œ-¨Ð5Ñ6Ô6Ð6ÝŒn˜S°¸DÐAÑAÔAˆØŒ>˜QÒÐÝÐF¸#¼*ÐFÐFÑGÔGÐGØÐr   Ú
media_pathc                 óº  — | j         dddddd|g}t          j        |dd¬¦  «        }|                      |j        d	d
|j        › �¦  «         t          j        |j        ¦  «        }| 	                    dg ¦  «        }| 	                    di ¦  «        }t          d„ |D ¦   «         d¦  «        }t          d„ |D ¦   «         d¦  «        }t          | 	                    dd¦  «        ¦  «        |r7t          | 	                    d| 	                    dd¦  «        ¦  «        ¦  «        nd|du|r| 	                    d¦  «        nd|r#t          | 	                    dd	¦  «        ¦  «        nd	|r#t          | 	                    dd	¦  «        ¦  «        nd	|r| 	                    dd¦  «        nd|r7t          | 	                    d| 	                    dd¦  «        ¦  «        ¦  «        nddœS )z3Probes audio and video stream metadata via ffprobe.z-vÚerrorz-show_entrieszYstream=codec_type,codec_name,sample_rate,channels,channel_layout,duration:format=durationz-ofr%   TrE   r   zffprobe failed: ÚstreamsÚformatc              3   óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS )Ú
codec_typeÚvideoN©Úget©Ú.0Úss     r   ú	<genexpr>z<TestAdversarialM3AudioEngine._probe_media.<locals>.<genexpr>   ó8   è è € ÐRÐR 1°1·5²5¸Ñ3FÔ3FÈ'Ò3QÐ3Q˜QÐ3QÐ3QÐ3QÐ3QÐRÐRr   Nc              3   óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS )rY   ÚaudioNr[   r]   s     r   r`   z<TestAdversarialM3AudioEngine._probe_media.<locals>.<genexpr>€   ra   r   r0   ç        Ú
codec_namer3   r4   Úchannel_layoutÚ )Úformat_durationÚvideo_durationr5   Úaudio_codecr3   r4   rf   Úaudio_duration)r   rJ   rK   ÚassertEqualrL   rN   r%   ÚloadsÚstdoutr\   ÚnextÚfloatÚint)	rO   rS   rP   rQ   ÚdatarV   ÚfmtÚvideo_streamÚaudio_streams	            r   Ú_probe_mediaz)TestAdversarialM3AudioEngine._probe_mediar   sõ  € ð ŒL˜$ ØÐxØ�6˜:ð
ˆõ
 Œn˜S°¸DÐAÑAÔAˆØ×Ò˜œ¨Ð,K¸s¼zÐ,KÐ,KÑLÔLÐLÝŒz˜#œ*Ñ%Ô%ˆØ—(’(˜9 bÑ)Ô)ˆØ�hŠh�x Ñ$Ô$ˆåÐRÐR¨ÐRÑRÔRÐTXÑYÔYˆÝÐRÐR¨ÐRÑRÔRÐTXÑYÔYˆõ  % S§W¢W¨Z¸Ñ%=Ô%=Ñ>Ô>Ø_kÐt�e L×$4Ò$4°ZÀÇÂÈÐUXÑAYÔAYÑ$ZÔ$ZÑ[Ô[Ð[ÐqtØ%¨TÐ1Ø=IÐS˜<×+Ò+¨LÑ9Ô9Ð9ÈtØFRÐY�3˜|×/Ò/°¸qÑAÔAÑBÔBÐBÐXYØ@LÐS�˜L×,Ò,¨Z¸Ñ;Ô;Ñ<Ô<Ð<ÐRSØHTÐ\˜l×.Ò.Ð/?ÀÑDÔDÐDÐZ\Ø_kÐt�e L×$4Ò$4°ZÀÇÂÈÐUXÑAYÔAYÑ$ZÔ$ZÑ[Ô[Ð[Ðqtð	
ð 	
ð 		
r   c           
      ó6  — | j         ddd|dddddg
}t          j        |d	d	¬
¦  «        }|                      |j        dd|j        › �¦  «         ddl}|                     d|j        ¦  «        }|                      t          |¦  «        dk    d¦  «         t          j        |d         ¦  «        }t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }	|||	fS )z]Measures Integrated Loudness (LUFS), True Peak (dBTP), and LRA (LU) via FFmpeg loudnorm JSON.z-hide_bannerr8   r;   z-afz.loudnorm=I=-14:TP=-1.0:LRA=9:print_format=jsonr9   Únullú-TrE   r   zLoudnorm pass failed: Nz\{[\s\S]*?\}z0Failed to parse loudnorm JSON from FFmpeg outputéÿÿÿÿÚinput_ig     ÀXÀÚinput_tpÚ	input_lrard   )r   rJ   rK   rl   rL   rN   ÚreÚfindallÚ
assertTrueÚlenr%   rm   rp   r\   )
rO   rS   rP   rQ   r~   Úmatchesrr   Úi_lufsÚtp_dbtpÚlra_lus
             r   Ú_measure_integrated_lufs_tpz8TestAdversarialM3AudioEngine._measure_integrated_lufs_tp�   s  € ð ŒK˜¨Ø�*ØÐCØ�&˜#ð	
ˆõ Œn˜S°¸DÐAÑAÔAˆØ×Ò˜œ¨Ð,QÀSÄZÐ,QÐ,QÑRÔRÐRØˆ	ˆ	ˆ	Ø—*’*˜_¨c¬jÑ9Ô9ˆØ�Š�˜G™œ qÒ(Ð*\Ñ]Ô]Ð]ÝŒz˜' "œ+Ñ&Ô&ˆÝ�t—x’x 	¨5Ñ1Ô1Ñ2Ô2ˆÝ˜Ÿš ¨UÑ3Ô3Ñ4Ô4ˆÝ�t—x’x ¨SÑ1Ô1Ñ2Ô2ˆØ�w Ð&Ð&r   c                 ó  — t          j        ¦   «         5 }ddddœddddœdd	d
dœg}g }|D �]Ÿ}t          j                             |d|d         › d�¦  «        }t          j                             |d|d         › d�¦  «        }|                      |d|d         ¬¦  «         |                      |¦  «        \  }}}	| j                             ||dddd¬¦  «        }
|  	                    |
d|d         › �¦  «         |  	                    t          j         
                    |¦  «        ¦  «         |                      |¦  «        \  }}}|                      |ddd|d›d|d         › �¬¦  «         |                      |dd|d›d|d         › �¬ ¦  «         |                     |d         |||||t          |dz
  ¦  «        dk    |dk    d!œ¦  «         �Œ¡t          j                             |d"¦  «        }t          j                             |d#¦  «        }t          j                             |d$¦  «        }t          j                             |d%¦  «        }t          j                             |d&¦  «        }|                      |d¬'¦  «         t          j        | j        d(d)d*d+d,d-d.|g	dd¬/¦  «         t          j        | j        d(d)d*d+d0d-d.|g	dd¬/¦  «         t          j        | j        d(d)d*d+d1d-d.|g	dd¬/¦  «         | j                             |||||ddd¬2¦  «        }|  	                    |d3¦  «         |  	                    t          j         
                    |¦  «        ¦  «         |                      |¦  «        \  }}}|                      |ddd4|› d5�¬¦  «         |                      |dd6|› d7�¬ ¦  «         |                     d8|||t          |dz
  ¦  «        dk    |dk    d9œ¦  «         || j        j        d:<   d;d;d;¦  «         d;S # 1 swxY w Y   d;S )<uþ   
        Adversarial Test 1: Verify Two-Pass EBU R128 loudness normalization produces:
        - Integrated Loudness: -14.0 LUFS Â± 0.5 LUFS
        - True Peak: <= -1.0 dBTP
        across quiet, loud, complex dynamic, and 4-stem mixed signals.
        Úquiet_speech_simz*sine=f=300:r=48000:d=6,volume=-32dB[a_out]g     €FÀ)ÚnameÚfilterÚexpected_pre_lufsÚloud_music_simz)sine=f=440:r=48000:d=6,volume=-2dB[a_out]g      2ÀÚcomplex_harmonic_ambientz�anoisesrc=d=8:c=pink:r=48000:a=0.15[n];sine=f=220:r=48000:d=8[s1];sine=f=660:r=48000:d=8[s2];[s1][s2]amix=inputs=2[s];[s][n]amix=inputs=2,volume=-14dB[a_out]g      8ÀÚin_r‰   ú.mp4Úout_g      @rŠ   ©r0   r2   ç      ,Àç      ð¿g      "@T)Útarget_lufsÚ	target_tpÚ
target_lraÚtwo_passznormalize_loudness failed for ç      à?zIntegrated Loudness z.2fu%    LUFS out of spec (-14.0 Â± 0.5) for )ÚdeltaÚmsgg®Gáz®ï¿z
True Peak z' dBTP exceeds ceiling of -1.0 dBTP for )rš   )ÚcaseÚpre_lufsÚpre_tpÚ	post_lufsÚpost_tpÚpost_lraÚcompliant_lufsÚcompliant_tpzstem_video.mp4zstem_bgm.wavzstem_amb.wavzstem_diag.wavzmaster_4stems.mp4)r0   r8   r9   r:   r;   zsine=f=180:r=48000:d=4r@   Ú	pcm_s16le©rF   Úcheckz"anoisesrc=d=4:c=pink:r=48000:a=0.1zsine=f=440:r=48000:d=3)Ú
video_pathr/   Ú	stem1_bgmÚstem2_ambienceÚstem4_dialoguer”   r•   r—   zmix_four_stems failedz4-Stem mix LUFS u    not within -14.0 Â± 0.5z4-Stem mix TP z exceeds -1.0 dBTPÚ4_stem_mix_master)r›   rž   rŸ   r    r¡   r¢   Útest_01_two_pass_complianceN)ÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinrR   r†   r   Únormalize_loudnessr€   ÚexistsÚassertAlmostEqualÚassertLessEqualÚappendÚabsrJ   rK   r   Úmix_four_stemsÚ	__class__r   )rO   ÚtdÚcasesÚtelemetry_casesr›   Úin_pathÚout_pathÚpre_ir�   Úpre_lraÚokÚpost_irŸ   r    Úv_baseÚbgm_wavÚamb_wavÚdiag_wavÚ
out_masterÚmix_okÚstem_iÚstem_tpÚstem_lras                          r   Ú6test_adv_01_two_pass_loudness_normalization_compliancezSTestAdversarialM3AudioEngine.test_adv_01_two_pass_loudness_normalization_compliance£   s‚  € õ Ô(Ñ*Ô*ð f	^¨bð /ØJØ).ðð ð -ØIØ).ðð ð 7ð ~Ø).ðð ðˆEð$ !ˆOàð )ñ )�Ýœ'Ÿ,š, rÐ+C°°f´Ð+CÐ+CÐ+CÑDÔD�Ýœ7Ÿ<š<¨Ð,E°4¸´<Ð,EÐ,EÐ,EÑFÔF�ð ×'Ò'¨¸#ÈDÐQYÌNÐ'Ñ[Ô[Ð[ð *.×)IÒ)IÈ'Ñ)RÔ)RÑ&��v˜wð ”[×3Ò3Ø˜XØ %°À#Ø!ð 4ñ ô �ð
 —’ Ð$SÀTÈ&Ä\Ð$SÐ$SÑTÔTÐTØ—’¥¤§¢¨xÑ 8Ô 8Ñ9Ô9Ð9ð -1×,LÒ,LÈXÑ,VÔ,VÑ)�˜ ð ×&Ò&Ø˜E¨Øn¨vÐnÐnÐnÐ`dÐekÔ`lÐnÐnð 'ñ ô ð ð ×$Ò$Ø˜UØg WÐgÐgÐgÐY]Ð^dÔYeÐgÐgð %ñ ô ð ð
  ×&Ò&Ø  œLØ %Ø$Ø!'Ø&Ø (Ý&)¨&°EÑ*:Ñ&;Ô&;¸sÒ&BØ$+¨uÒ$4ð	(ð 	(ñ 	ô 	ð 	ñ 	õ ”W—\’\ "Ð&6Ñ7Ô7ˆFÝ”g—l’l 2 ~Ñ6Ô6ˆGÝ”g—l’l 2 ~Ñ6Ô6ˆGÝ”w—|’| B¨Ñ8Ô8ˆHÝœŸš bÐ*=Ñ>Ô>ˆJà×#Ò# F°SÐ#Ñ9Ô9Ð9ÝŒN˜DœK¨¨t°W¸dÐD\Ð^dÐfqÐszÐ{ð  MQð  Y]ð  ^ñ  ^ô  ^ð  ^ÝŒN˜DœK¨¨t°W¸dÐDhÐjpÐr}ð  @Gð  Hð  Y]ð  eið  jñ  jô  jð  jÝŒN˜DœK¨¨t°W¸dÐD\Ð^dÐfqÐs{Ð|ð  NRð  Z^ð  _ñ  _ô  _ð  _à”[×/Ò/Ø!Ø&Ø!Ø&Ø'Ø!ØØð 0ñ 	ô 	ˆFð �OŠO˜FÐ$;Ñ<Ô<Ð<Ø�OŠO�BœGŸNšN¨:Ñ6Ô6Ñ7Ô7Ð7à(,×(HÒ(HÈÑ(TÔ(TÑ%ˆF�G˜XØ×"Ò" 6¨5¸ÐAtÐTZÐAtÐAtÐAtÐ"ÑuÔuÐuØ× Ò  ¨%Ð5aÀgÐ5aÐ5aÐ5aÐ ÑbÔbÐbà×"Ò"Ø+Ø#Ø"Ø$Ý"% f°Ñ&6Ñ"7Ô"7¸3Ò">Ø '¨5Ò 0ð$ð $ñ ô ð ð O^ˆDŒNÔ,Ð-JÑKðMf	^ð f	^ð f	^ñ f	^ô f	^ð f	^ð f	^ð f	^ð f	^ð f	^ð f	^ð f	^øøøð f	^ð f	^ð f	^ð f	^ð f	^ð f	^s   ”OO=Ï=PÐPc                 ó  — t          j        ¦   «         5 }t          j                             |d¦  «        }t          j                             |d¦  «        }t          j        | j        dddddddddd	d
dddddd|gdd¬¦  «         | j         	                    |¦  «        }|  
                    |d¦  «         |                      |                     d¦  «        du d|                     d¦  «        › �¦  «         |                      d|                     d¦  «        |                     d¦  «        |                     d¦  «        g¦  «         | j                             ||ddd¬¦  «        }|                      |d¦  «         |                      t          j                             |¦  «        d¦  «         |                      |¦  «        }|                      |d         d ¦  «         |                      |d!         d"¦  «         |                      |d#         d$¦  «         |                     d¦  «        |                     d¦  «        |                     d¦  «        ||d#         |d!         d%œ| j        j        d&<   d'd'd'¦  «         d'S # 1 swxY w Y   d'S )(z¯
        Adversarial Test 2: Verify that purely silent audio (-inf) does NOT crash
        FFmpeg, parses correctly, and successfully executes normalization fallback.
        zsilent_input.mp4zsilent_normalized.mp4r8   r9   r:   r;   zcolor=c=black:s=320x240:d=4zaevalsrc=0:d=4:s=48000:c=stereor<   r=   r@   rA   rC   Ú48000rD   Ú2Tr¤   z/measure_loudness returned None for silent audioÚ	is_silentz Expected is_silent == True, got z-infr{   r|   Úinput_threshr’   r“   )r”   r•   r—   z<normalize_loudness must succeed on silent audio via fallbackz"Normalized silent video must existr5   zOutput must retain audio trackr3   r.   r4   r!   )Úmeasured_input_iÚmeasured_input_tpÚis_silent_flagÚnormalization_successÚoutput_channelsÚoutput_sample_rateÚtest_02_silent_resilienceN)r¬   r­   r®   r¯   r°   rJ   rK   r   r   Úmeasure_loudnessÚassertIsNotNoner€   r\   ÚassertInr±   r²   rv   rl   r¸   r   )rO   r¹   Ú
silent_mp4Únorm_silent_mp4ÚmeasrÀ   Úprobes          r   Ú'test_adv_02_silent_audio_inf_resiliencezDTestAdversarialM3AudioEngine.test_adv_02_silent_audio_inf_resilience  sÊ  € õ
 Ô(Ñ*Ô*ð +	¨bÝœŸš bÐ*<Ñ=Ô=ˆJÝ œgŸlšl¨2Ð/FÑGÔGˆOõ ŒNØ”˜TØ�g˜tÐ%BØ�g˜tÐ%FØ˜	 6¨5°%¸À%ÈØðð #¨$ð0ñ 0ô 0ð 0ð ”;×/Ò/°
Ñ;Ô;ˆDØ× Ò  Ð'XÑYÔYÐYØ�OŠOØ—’˜Ñ%Ô%¨Ð-ØJ°4·8²8¸KÑ3HÔ3HÐJÐJñô ð ð
 �MŠM˜& 4§8¢8¨IÑ#6Ô#6¸¿ºÀÑ8LÔ8LÈdÏhÊhÐWeÑNfÔNfÐ"gÑhÔhÐhð ”×/Ò/Ø˜OØ!¨T¸Dð 0ñ ô ˆBð �OŠO˜BÐ ^Ñ_Ô_Ð_Ø�OŠO�BœGŸNšN¨?Ñ;Ô;Ð=aÑbÔbÐbà×%Ò% oÑ6Ô6ˆEØ�OŠO˜E +Ô.Ð0PÑQÔQÐQØ×Ò˜U =Ô1°5Ñ9Ô9Ð9Ø×Ò˜U :Ô.°Ñ2Ô2Ð2ð %)§H¢H¨YÑ$7Ô$7Ø%)§X¢X¨jÑ%9Ô%9Ø"&§(¢(¨;Ñ"7Ô"7Ø)+Ø#(¨Ô#4Ø&+¨MÔ&:ðMð MˆDŒNÔ,Ð-HÑIðI+	ð +	ð +	ñ +	ô +	ð +	ð +	ð +	ð +	ð +	ð +	ð +	øøøð +	ð +	ð +	ð +	ð +	ð +	s   ”IJ Ê JÊJc                 óD  — t          j        ¦   «         5 }t          j                             |d¦  «        }t          j                             |d¦  «        }t          j                             |d¦  «        }|                      |ddd¬¦  «         |                      |ddd	¬¦  «         |                      |d
dd	¬¦  «         d||gdœd||gdœd|||gdœd||gdœg}g }|D �]˜}dD �]‘}t          j                             |d|d         › d|› d�¦  «        }	| j                             |d         |	d|¬¦  «        }
|                      |
d|d         › d|› �¦  «         |                      t          j         	                    |	¦  «        ¦  «         |  
                    |	¦  «        }|                      |d         d|d         › d|› d�¦  «         |                      |d         d ¦  «         |                      |d!         d"d#|d         › d|› d�¦  «         |                      |d$         d%d&|d         › d|› d�¦  «         |                     |d         ||
|d         |d!         |d$         |d'         d(œ¦  «         �Œ“�Œš|| j        j        d)<   d*d*d*¦  «         d*S # 1 swxY w Y   d*S )+z¹
        Adversarial Test 3: Concatenating video without audio stream (-an) with standard
        audio video in various orderings does not crash and produces 48kHz stereo AAC.
        zclip_audio.mp4zclip_mute.mp4zclip_mute2.mp4r,   ÚblueT)r0   r1   r5   ÚredFç       @ÚgreenÚaudio_then_mute©r‰   ÚclipsÚmute_then_audioÚaudio_mute_audioÚpure_mute_sequence)Úboundary_smoothingÚ
acrossfader�   r‰   Ú_r�   rç   r˜   ©Úcrossfade_durÚmodez'stitch_with_audio_crossfade failed for z	 in mode r5   zOutput must have audio for z (ú)rj   rA   r3   r.   zSample rate must be 48000 for r4   r!   z Channels must be 2 (stereo) for rh   )Úsequencerð   ÚsuccessÚcodecr3   r4   rh   Útest_03_missing_audio_streamN)r¬   r­   r®   r¯   r°   rR   r   Ústitch_with_audio_crossfader€   r²   rv   rl   rµ   r¸   r   )rO   r¹   Úv_audioÚv_muteÚv_mute2Ú	sequencesÚtelemetry_orderingsÚseqrð   r½   rÀ   rÞ   s               r   Ú5test_adv_03_missing_audio_stream_an_concat_resiliencezRTestAdversarialM3AudioEngine.test_adv_03_missing_audio_stream_an_concat_resilienceJ  s  € õ
 Ô(Ñ*Ô*ð -	c¨bÝ”g—l’l 2Ð'7Ñ8Ô8ˆGÝ”W—\’\ " oÑ6Ô6ˆFÝ”g—l’l 2Ð'7Ñ8Ô8ˆGà×#Ò# G°cÀÐSWÐ#ÑXÔXÐXØ×#Ò# F°SÀÐQVÐ#ÑWÔWÐWØ×#Ò# G°cÀÐTYÐ#ÑZÔZÐZð +°g¸vÐ5FÐGÐGØ*°f¸gÐ5FÐGÐGØ+°wÀÈÐ6PÐQÐQØ-¸ÀÐ8IÐJÐJð	ˆIð #%Ðà ð ñ �Ø@ð ñ �DÝ!œwŸ|š|¨BÐ0O°s¸6´{Ð0OÐ0OÀTÐ0OÐ0OÐ0OÑPÔP�HØœ×@Ò@Ø˜Gœ hØ&)Ø!ð Añ ô �Bð
 —O’O BÐ(nÐRUÐV\ÔR]Ð(nÐ(nÐhlÐ(nÐ(nÑoÔoÐoØ—O’O¥B¤G§N¢N°8Ñ$<Ô$<Ñ=Ô=Ð=à ×-Ò-¨hÑ7Ô7�EØ—O’O E¨+Ô$6Ð8lÐVYÐZ`ÔVaÐ8lÐ8lÐeiÐ8lÐ8lÐ8lÑmÔmÐmØ×$Ò$ U¨=Ô%9¸5ÑAÔAÐAØ×$Ò$ U¨=Ô%9¸5ÐByÐcfÐgmÔcnÐByÐByÐrvÐByÐByÐByÑzÔzÐzØ×$Ò$ U¨:Ô%6¸Ð;tÐ^aÐbhÔ^iÐ;tÐ;tÐmqÐ;tÐ;tÐ;tÑuÔuÐuà'×.Ò.Ø$'¨¤KØ $Ø#%Ø!& }Ô!5Ø',¨]Ô';Ø$)¨*Ô$5Ø+0Ð1BÔ+Cð0ð 0ñ ô ð ñ ñ!ð4 PcˆDŒNÔ,Ð-KÑLð[-	cð -	cð -	cñ -	cô -	cð -	cð -	cð -	cð -	cð -	cð -	cð -	cøøøð -	cð -	cð -	cð -	cð -	cð -	cs   ”I4JÊJÊJc                 ó  — t          j        ¦   «         5 }t          j                             |d¦  «        }t          j                             |d¦  «        }t          j                             |d¦  «        }|                      |ddd¬¦  «         |                      |ddd	¬¦  «         |                      |d
dd¬¦  «         |                      |¦  «        }|                      |¦  «        }|                      |d         d¦  «         |                      |d         d¦  «         d||gdœd||gdœd|||gdœg}g }|D �]}	t          j                             |d|	d         › d�¦  «        }
t          j                             |d|	d         › d�¦  «        }| j         	                    |	d         |
d¬¦  «        }|  
                    |¦  «         |                      |
¦  «        }|                      |d         dd|d         › d|	d         › �¦  «         |                      d|d                              ¦   «         ¦  «         |                      |d         d¦  «         | j         	                    |	d         |dd¬ ¦  «        }|  
                    |¦  «         |                      |¦  «        }|                      |d         dd!|d         › d|	d         › �¦  «         |                      d|d                              ¦   «         ¦  «         |                      |d         d¦  «         |                     |	d         |d         |d         |d         |d         d"œ¦  «         �Œ|| j        j        d#<   d$d$d$¦  «         d$S # 1 swxY w Y   d$S )%zŒ
        Adversarial Test 4: Verify mixed channel inputs (mono + stereo) preserve
        stereo layout without downmixing to mono.
        zclip_mono.mp4zclip_stereo.mp4zclip_mono2.mp4r,   é   Úcyan)r0   r4   r1   r!   Úmagentag      @Úyellowr4   Úmono_then_stereoræ   Ústereo_then_monoÚmono_stereo_monor�   r‰   z_mode_a.mp4z_mode_b.mp4rç   rë   ©rð   zMode A downmixed to z for Ústereorf   r3   r.   rì   r˜   )rð   rï   zMode B downmixed to )Ú	test_caseÚmode_a_channelsÚmode_a_layoutÚmode_b_channelsÚmode_b_layoutÚtest_04_mixed_channelsN)r¬   r­   r®   r¯   r°   rR   rv   rl   r   rö   r€   rÚ   Úlowerrµ   r¸   r   )rO   r¹   Úv_monoÚv_stereoÚv_mono2Úprobe_mÚprobe_sÚ
test_casesÚtelemetry_channelsÚtcÚout_aÚout_bÚok_aÚprobe_out_aÚok_bÚprobe_out_bs                   r   Ú4test_adv_04_mixed_channel_counts_stereo_preservationzQTestAdversarialM3AudioEngine.test_adv_04_mixed_channel_counts_stereo_preservation�  s  € õ
 Ô(Ñ*Ô*ð 3	\¨bÝ”W—\’\ " oÑ6Ô6ˆFÝ”w—|’| BÐ(9Ñ:Ô:ˆHÝ”g—l’l 2Ð'7Ñ8Ô8ˆGà×#Ò# F°SÀ1ÈFÐ#ÑSÔSÐSØ×#Ò# H°sÀQÈiÐ#ÑXÔXÐXØ×#Ò# G°cÀAÈXÐ#ÑVÔVÐVð ×'Ò'¨Ñ/Ô/ˆGØ×'Ò'¨Ñ1Ô1ˆGØ×Ò˜W ZÔ0°!Ñ4Ô4Ð4Ø×Ò˜W ZÔ0°!Ñ4Ô4Ð4ð ,°v¸xÐ6HÐIÐIØ+°xÀÐ6HÐIÐIØ+°v¸xÈÐ6QÐRÐRðˆJð "$Ðà ð ñ �ÝœŸš RÐ)G°°6´
Ð)GÐ)GÐ)GÑHÔH�ÝœŸš RÐ)G°°6´
Ð)GÐ)GÐ)GÑHÔH�ð ”{×>Ò>¸rÀ'¼{ÈEÐXlÐ>ÑmÔm�Ø—’ Ñ%Ô%Ð%Ø"×/Ò/°Ñ6Ô6�Ø× Ò  ¨ZÔ!8¸!Ð=~ÐT_Ð`jÔTkÐ=~Ð=~ÐrtÐu{Ôr|Ð=~Ð=~ÑÔÐØ—’˜h¨Ð4DÔ(E×(KÒ(KÑ(MÔ(MÑNÔNÐNØ× Ò  ¨]Ô!;¸UÑCÔCÐCð ”{×>Ò>¸rÀ'¼{ÈEÐXdÐtwÐ>ÑxÔx�Ø—’ Ñ%Ô%Ð%Ø"×/Ò/°Ñ6Ô6�Ø× Ò  ¨ZÔ!8¸!Ð=~ÐT_Ð`jÔTkÐ=~Ð=~ÐrtÐu{Ôr|Ð=~Ð=~ÑÔÐØ—’˜h¨Ð4DÔ(E×(KÒ(KÑ(MÔ(MÑNÔNÐNØ× Ò  ¨]Ô!;¸UÑCÔCÐCà"×)Ò)Ø!# F¤Ø'2°:Ô'>Ø%0Ð1AÔ%BØ'2°:Ô'>Ø%0Ð1AÔ%Bð+ð +ñ ô ð ñ ð J\ˆDŒNÔ,Ð-EÑFðg3	\ð 3	\ð 3	\ñ 3	\ô 3	\ð 3	\ð 3	\ð 3	\ð 3	\ð 3	\ð 3	\ð 3	\øøøð 3	\ð 3	\ð 3	\ð 3	\ð 3	\ð 3	\s   ”MM6Í6M:Í=M:c           
      óô  — t          j        ¦   «         5 }g d¢}t          |¦  «        }g }t          |¦  «        D ]a\  }}t          j                             |d|› d|› d�¦  «        }|                      ||g d¢|         ¬¦  «         |                     |¦  «         Œbt          j                             |d¦  «        }| j	         
                    ||dd	¬
¦  «        }	|                      |	d¦  «         |                      |¦  «        }
t          |
d         |z
  ¦  «        }t          |
d         |z
  ¦  «        }t          |
d         |z
  ¦  «        }t          |
d         |
d         z
  ¦  «        }|                      |dd|
d         d›d|d›�¦  «         |                      |dd|
d         d›d|d›�¦  «         |                      |dd|
d         d›d|d›�¦  «         |                      |dd|d›d�¦  «         | j	                             |¦  «        }|                      |d         dd¦  «         ||
d         |
d         |
d         ||||dk    o|dk    dœ| j        j        d<   ddd¦  «         dS # 1 swxY w Y   dS )z¡
        Adversarial Test 5: Verify Micro-fade Mode A (boundary_smoothing) preserves
        overall duration with 0.0s timeline loss across boundaries.
        )r,   g      @g      @Úclip_rí   zs.mp4)râ   rä   rá   )r0   r1   zout_mode_a_duration.mp4g      ð?rë   rî   zMode A stitching failedri   rk   rh   gš™™™™™©?zVideo duration z.3fz deviates from expected zAudio duration zFormat duration zVideo/Audio duration delta z exceeds 0.05s thresholdÚmax_volume_dbg      IÀz#Audio should not be muted/corrupted)Úexpected_total_durationÚactual_video_durationÚactual_audio_durationÚactual_format_durationÚdelta_videoÚdelta_audioÚdelta_avÚzero_shrinkage_verifiedÚtest_05_mode_a_durationN)r¬   r­   ÚsumÚ	enumerater®   r¯   r°   rR   rµ   r   rö   r€   rv   r¶   r´   Úinspect_shot_audioÚassertGreaterr¸   r   )rO   r¹   Ú	durationsÚtotal_expectedrç   ÚidxÚdÚclip_pÚ
out_mode_arÀ   rÞ   Údelta_vÚdelta_aÚ	delta_fmtÚdelta_vaÚ
vol_reports                   r   Ú3test_adv_05_micro_fade_mode_a_duration_preservationzPTestAdversarialM3AudioEngine.test_adv_05_micro_fade_mode_a_duration_preservation¾  sP  € õ
 Ô(Ñ*Ô*ð 7	¨bØ'˜˜ˆIÝ  ™^œ^ˆNØˆEå# IÑ.Ô.ð %ð %‘��QÝœŸš bÐ*@°#Ð*@Ð*@¸Ð*@Ð*@Ð*@ÑAÔA�Ø×'Ò'¨¸ÐBZÐBZÐBZÐ[^ÔB_Ð'Ñ`Ô`Ð`Ø—’˜VÑ$Ô$Ð$Ð$åœŸš bÐ*CÑDÔDˆJØ”×8Ò8Ø�zØ!Ø)ð 9ñ ô ˆBð
 �OŠO˜BÐ 9Ñ:Ô:Ð:à×%Ò% jÑ1Ô1ˆEÝ˜%Ð 0Ô1°NÑBÑCÔCˆGÝ˜%Ð 0Ô1°NÑBÑCÔCˆGÝ˜EÐ"3Ô4°~ÑEÑFÔFˆIÝ˜5Ð!1Ô2°UÐ;KÔ5LÑLÑMÔMˆHð × Ò Ø˜Øk %Ð(8Ô"9ÐkÐkÐkÐWeÐkÐkÐkñô ð ð × Ò Ø˜Øk %Ð(8Ô"9ÐkÐkÐkÐWeÐkÐkÐkñô ð ð × Ò Ø˜4Øm 5Ð):Ô#;ÐmÐmÐmÐYgÐmÐmÐmñô ð ð × Ò Ø˜$ØT¨hÐTÐTÐTÐTñô ð ð œ×7Ò7¸
ÑCÔCˆJØ×Ò˜z¨/Ô:¸EÐChÑiÔiÐið ,:Ø).Ð/?Ô)@Ø).Ð/?Ô)@Ø*/Ð0AÔ*BØ&Ø&Ø$Ø+2°dª?Ð+N¸wÈ$ºð	Kð 	KˆDŒNÔ,Ð-FÑGð]7	ð 7	ð 7	ñ 7	ô 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	øøøð 7	ð 7	ð 7	ð 7	ð 7	ð 7	s   ”II-É-I1É4I1c                 ó  — t          j        ¦   «         5 }t          j                             |d¦  «        }|                      |dd¬¦  «         t          j                             |d¦  «        }|                      |dd¬¦  «         t          j                             |d¦  «        }| j                             ||g|dd	¬
¦  «        }|                      |¦  «         | j         	                    |¦  «        }|  
                    |d         dd|d         › d�¦  «         t          j                             |d¦  «        }t          j                             |d¦  «        }t          j                             |d¦  «        }	t          j                             |d¦  «        }
|                      |dd¬¦  «         |                      |dd¬¦  «         |                      |	dd¬¦  «         | j                             |||	g|
d¬¦  «        }|                      |d¦  «         |                      |
¦  «        }|                      |d         dd¦  «         |d         |d         dk    |d         |dœ| j        j        d<   ddd¦  «         dS # 1 swxY w Y   dS )z¾
        Adversarial Test 6: Verify active gain staging does not clip audio (respects -1.0 dBFS)
        and mismatched sample rates (22050, 44100, 48000) are unified without error.
        zhot_clip.mp4r,   z+sine=f=440:r=48000:d=3,volume=-0.2dB[a_out]r‘   znorm_clip.mp4z*sine=f=550:r=48000:d=3,volume=-18dB[a_out]zout_staged.mp4rë   T)rð   Úactive_gain_stagingr   rd   zAudio clipped: max volume is z dBFSz	c_22k.mp4z	c_44k.mp4z	c_48k.mp4zout_resampled.mp4rã   i"V  )r0   r3   iD¬  r.   r  z(Stitching mismatched sample rates failedr3   z"Final sample rate must be 48000 Hz)Úhot_clip_max_volumeÚclipping_avoidedÚunified_sample_rateÚresample_successÚtest_06_gain_and_sample_ratesN)r¬   r­   r®   r¯   r°   rR   r   rö   r€   r,  r´   rv   rl   r¸   r   )rO   r¹   Ú	loud_clipÚnormal_clipÚout_gain_stagedrÀ   Ú
staged_repÚc_22kÚc_44kÚc_48kÚout_resampledÚ	ok_resampÚprobe_resamps                r   Ú2test_adv_06_gain_staging_headroom_and_sample_rateszOTestAdversarialM3AudioEngine.test_adv_06_gain_staging_headroom_and_sample_ratesÿ  sÐ  € õ
 Ô(Ñ*Ô*ð -	¨bõ œŸš R¨Ñ8Ô8ˆIØ×#Ò# I¸ÐJwÐ#ÑxÔxÐxÝœ'Ÿ,š, r¨?Ñ;Ô;ˆKØ×#Ò# K¸#ÐLxÐ#ÑyÔyÐyå œgŸlšl¨2Ð/?Ñ@Ô@ˆOØ”×8Ò8Ø˜KÐ(¨/Ø)Ø$(ð 9ñ ô ˆBð
 �OŠO˜BÑÔÐàœ×7Ò7¸ÑHÔHˆJØ× Ò Ø˜?Ô+¨SØR°
¸?Ô0KÐRÐRÐRñô ð õ ”G—L’L  [Ñ1Ô1ˆEÝ”G—L’L  [Ñ1Ô1ˆEÝ”G—L’L  [Ñ1Ô1ˆEÝœGŸLšL¨Ð-@ÑAÔAˆMà×#Ò# E°CÀUÐ#ÑKÔKÐKØ×#Ò# E°CÀUÐ#ÑKÔKÐKØ×#Ò# E°CÀUÐ#ÑKÔKÐKàœ×?Ò?Ø˜˜uÐ% }Ø)ð @ñ ô ˆIð �OŠO˜IÐ'QÑRÔRÐRØ×,Ò,¨]Ñ;Ô;ˆLØ×Ò˜\¨-Ô8¸%ÐAeÑfÔfÐfð (2°/Ô'BØ$.¨Ô$?À3Ò$FØ'3°MÔ'BØ$-ð	Qð QˆDŒNÔ,Ð-LÑMðQ-	ð -	ð -	ñ -	ô -	ð -	ð -	ð -	ð -	ð -	ð -	ð -	øøøð -	ð -	ð -	ð -	ð -	ð -	s   ”I!JÊJÊ	J)r,   r-   Nr.   r!   T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   r+   rI   rp   r   rq   ÚboolrR   r   r   rv   r   r†   rË   rß   rý   r  r9  rK  © r   r   r   r   3   sž  € € € € € ðð ð ð`ð `ñ „[ð`ð ðAð Añ „[ðAð ØØ&*Ø ØØð#ð #àð#ð ð#ð ð	#ð
 ˜s”mð#ð ð#ð ð#ð ð#ð 
ð#ð #ð #ð #ðJ
 sð 
¨t°C¸°H¬~ð 
ð 
ð 
ð 
ð6'°cð '¸eÀEÈ5ÐRWÐDWÔ>Xð 'ð 'ð 'ð 'ð,m^ð m^ð m^ðd0ð 0ð 0ðj2cð 2cð 2cðn8\ð 8\ð 8\ðz<ð <ð <ðB2ð 2ð 2ð 2ð 2r   r   Ú__main__),rO  ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr®   Úsysr%   ÚmathÚshutilr¬   rJ   ÚunittestÚpathlibr   Útypingr   r   r   r   r   Úplatformrn   ÚreconfigurerN   r(   Ú__file__ÚresolveÚparentr   ÚPIPELINE_DIRrI   r¯   ÚinsertÚaudio_continuity_enginer   r   r   ÚTestCaser   rL  ÚmainrR  r   r   ú<module>rj     sø  ððð ð* € € € € € € € € € € € € €	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð „<�7ÒÐðØŒ
×Ò¨ÐÑ0Ô0Ð0ØŒ
×Ò¨ÐÑ0Ô0Ð0Ð0øØð ð ð Øˆðøøøð ˆ4�‰>Œ>×!Ò!Ñ#Ô#Ô*Ô1€ØÐ2Ñ2€Ø€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)à RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ Rð~ð ~ð ~ð ~ð ~ 8Ô#4ñ ~ô ~ð ~ðB ˆzÒÐØ€H„M�O„O€O€O€Oð Ðs   Á6B ÂBÂB