§
    Û×jÕÈ  ã                   óP  — 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c m	Z
 d dlmc m	Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dlZd dlmZ d dl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!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z- dd	l.m/Z/m0Z0m1Z1 d
„ Z2d„ Z3dZd„Z4d„ Z5d„ Z6d„ Z7d[d„Z8d„ Z9d\d„Z:d]d„Z;d„ Z<d„ Z=d„ Z>d„ Z?d^d „Z@d!„ ZAd"„ ZBd#„ ZCd_d$„ZDd`d%„ZEd&„ ZFdad(„ZGd)„ ZHd*„ ZId`d+„ZJd,„ ZKd-„ ZLdbd/„ZMdcd1eNdz  d2eNd3eNfd4„ZOd1eNdz  d5eNdz  d3ePeN         fd6„ZQd7„ ZRddd8„ZSded:„ZTd;eNd3eUeNeVeNef         eWf         fd<„ZXd=„ ZYdfd?„ZZ	 	 	 	 	 	 dgd@„Z[dA„ Z\	 dhdB„Z]didC„Z^	 	 	 	 	 	 	 	 djdH„Z_	 	 	 	 	 	 dkdI„Z`dJ„ Za	 	 	 	 	 dldL„ZbdidM„Zcd dNlmZmdZd dO„ ZedP„ ZfdQ„ ZgdR„ ZhdS„ ZidTZjdU„ ZkdV„ ZldW„ ZmdX„ ZndY„ ZodS )mé    N)ÚAny)Úimageio_ffmpeg_patch)ÚImageé   )Úhdr10_x265_paramsÚhdr10_zscale_filterÚiter_hdr_gbrpf32_framesÚiter_video_chunks)Úprobe_video_stream_metadataÚresolve_media_binary)ÚSUPPORTED_VIDEO_CONTAINERSÚget_imageio_codec_paramsÚget_video_encode_argsÚvalidate_video_output_settings)Úget_virtual_media_entryÚparse_virtual_media_pathÚstrip_virtual_media_suffixc                  ó$   — t          d¦  «        pdS )NÚffmpeg©r   © ó    ú@C:\Users\johnn\OneDrive\Documents\AI\shared\utils\audio_video.pyÚ_ffmpeg_binaryr      s   € Ý Ñ)Ô)Ð5¨XÐ5r   c                  ó$   — t          d¦  «        pdS )NÚffprober   r   r   r   Ú_ffprobe_binaryr   !   s   € Ý 	Ñ*Ô*Ð7¨iÐ7r   é   Ú c                 óº   — t          j        t          j        | ¦  «        ¦  «                             d¦  «        }|r|                     d¦  «        sd|z   }||z  }|S )Núutf-8ú.)ÚbinasciiÚb2a_hexÚosÚurandomÚdecodeÚ
startswith)ÚlengthÚsuffixÚnames      r   Ú	rand_namer,   %   s_   € ÝÔ�BœJ vÑ.Ô.Ñ/Ô/×6Ò6°wÑ?Ô?€DØð Ø× Ò  Ñ%Ô%ð 	"Ø˜6‘\ˆFØ�‰ˆØ€Kr   c                 óþ  — t          j        | ¦  «        rK|                      ¦   «                              ¦   «                              ¦   «                              ¦   «         } n t          j        | t          j        ¬¦  «        } | j	        dk    r3| j
        dk    r(|                      dt          | j        ¦  «        ¦  «        S | j	        dk    r4| j        d         dk    r#| j        d         | j        d         k    r| j        } | S )N©Údtypeé   r   r   r   )ÚtorchÚ	is_tensorÚdetachÚcpuÚfloatÚnumpyÚnpÚasarrayÚfloat32ÚndimÚsizeÚreshapeÚmaxÚshapeÚT)Ú
audio_datas    r   Ú_prepare_audio_arrayrA   .   sã   € Ý„�zÑ"Ô"ð >Ø×&Ò&Ñ(Ô(×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ˆ
ˆ
å”Z 
µ"´*Ð=Ñ=Ô=ˆ
Ø„˜!ÒÐ 
¤°1Ò 4Ð 4à×!Ò! !¥S¨Ô)9Ñ%:Ô%:Ñ;Ô;Ð;Ø„˜!ÒÐ 
Ô 0°Ô 3°qÒ 8Ð 8¸ZÔ=MÈaÔ=PÐS]ÔScÐdeÔSfÒ=fÐ=fØ”\ˆ
ØÐr   c                 ój   — t          |¦  «        }t          j        | |t          |¦  «        ¦  «         | S ©N)rA   ÚsfÚwriteÚint)Úpathr@   Úsample_rateÚaudio_arrays       r   Úwrite_wav_filerJ   ;   s0   € Ý& zÑ2Ô2€KÝ„HˆT�;¥ KÑ 0Ô 0Ñ1Ô1Ð1Ø€Kr   c                 óÒ  — t          j        | t           j        ¬¦  «        }t          |pd¦  «        }t          |pd¦  «        }|j        dk    s|dk    s|dk    s||k    r!|                     t           j        d¬¦  «        S dd lm} t          j	        |j
        dk    r|j                             ¦   «         n|d                               ¦   «         ¦  «                             t          j        ¬¦  «        }|                     |||¦  «                             ¦   «                              ¦   «         }|j
        dk    r|j        n|d                              t           j        d¬¦  «        S )Nr.   r   F)Úcopyr0   )r7   r8   r9   rF   r;   ÚastypeÚtorchaudio.functionalÚ
functionalr1   Ú
from_numpyr:   r?   rL   ÚtoÚresampler4   r6   )r@   Úsource_sample_rateÚtarget_sample_raterI   ÚtaFÚwaveÚ	resampleds          r   Úresample_audio_arrayrX   A   s]  € Ý”*˜Z­r¬zÐ:Ñ:Ô:€KÝÐ/Ð4°1Ñ5Ô5ÐÝÐ/Ð4°1Ñ5Ô5ÐØÔ˜1ÒÐÐ 2°aÒ 7Ð 7Ð;MÐQRÒ;RÐ;RÐVhÐl~ÒV~ÐV~Ø×!Ò!¥"¤*°5Ð!Ñ9Ô9Ð9Ø'Ð'Ð'Ð'Ð'Ð'ÝÔ°KÔ4DÈÒ4IÐ4I˜KœM×.Ò.Ñ0Ô0Ð0È{Ð[_ÔO`×OeÒOeÑOgÔOgÑhÔh×kÒkÕrwÔrÐkñ  Aô  A€DØ—’˜TÐ#5Ð7IÑJÔJ×NÒNÑPÔP×VÒVÑXÔX€IØ&Ô+¨qÒ0Ð0ˆIŒKˆK°iÀ´l×JÒJÍ2Ì:Ð\aÐJÑbÔbÐbr   Fr   c           	      ó8  — t          j        |t           j        ¬¦  «        }|j        dk    r|S t	          |p|¦  «        }| �!t          j        | t           j        ¬¦  «        }n:|r6t          j        t          j        |¦  «        d|j	        dk    ¬¦  «        \  }}n|S |t	          |¦  «        k    rt          |||¦  «        }t          dt	          |¦  «        ¦  «        t          dt	          |¦  «        ¦  «        }}||d …         }t          |||	|¦  «        }||z
  }|d ||r|j        d         ndz   …         }|
rY|sW|j        d         |k     rF|rt          d¦  «        ‚t          j        |d||j        d         z
  fgdg|j	        dz
  z  z   ¦  «        }|j        dk    r|S |j	        |j	        k    r2|j	        dk    r|d d …d f         n|}|j	        dk    r|d d …d f         n|}|j	        dk    rt|j        d         |j        d         k    rX|j        d         dk    r.t          j        |d d …d d…f         |j        d         d¬	¦  «        n|d d …d |j        d         …f         }t          j        ||t          d|j        d         |z
  ¦  «        d …         gd¬	¦  «        S )
Nr.   r   r9   r0   ©r/   Ú	always_2dzUAudio overlap is too short to repair the previous window; increase the video overlap.)r   r   r   ©Úaxis)r7   r8   r9   r;   rF   rD   Úreadr%   Úfspathr:   rX   r=   Útrim_audio_rangesr>   Ú
ValueErrorÚpadÚrepeatÚconcatenate)Úexisting_audio_dataÚexisting_audio_pathÚgenerated_audioÚaudio_sampling_rateÚcommitted_audio_samplesÚexisting_audio_sample_rateÚprefix_start_samplesÚkeep_existingÚtrim_rangesÚ	video_fpsÚalign_to_videoÚrepair_samplesÚprefix_sample_rateÚprefix_audioÚjoin_samples                  r   Úappend_sliding_window_audiort   M   sU  € å”j ½¼
ÐCÑCÔC€OØÔ˜qÒ Ð ØÐÝÐ7ÐNÐ;NÑOÔOÐØÐ&Ý”zÐ"5½R¼ZÐHÑHÔHˆˆØ	ð Ý+-¬7µ2´9Ð=PÑ3QÔ3QÐYbÐn}ô  oCð  GHò  oHð  ,Iñ  ,Iô  ,IÑ(ˆÐ(Ð(àÐØ�SÐ!4Ñ5Ô5Ò5Ð5Ý+¨LÐ:LÐNaÑbÔbˆÝ47¸½3Ð?SÑ;TÔ;TÑ4UÔ4UÕWZÐ[\Õ^aÐbyÑ^zÔ^zÑW{ÔW{Ð1ÐØÐ 4Ð 5Ð 5Ô6€LÝ$ \°;À	ÐK^Ñ_Ô_€LØ)¨NÑ:€KØÐ a ÈMÐ0`°Ô0EÀaÔ0HÐ0HÐ_`Ñ!aÐ aÔb€LØð }˜mð }°Ô0BÀ1Ô0EÈÒ0SÐ0SØð 	vÝÐtÑuÔuÐuå”v˜l¨a°¸|Ô?QÐRSÔ?TÑ1TÐ-UÐ,VÐZ`ÐYaÐeqÔevÐyzÑezÑY{Ñ,{Ñ|Ô|ˆØÔ˜AÒÐØÐØÔ˜OÔ0Ò0Ð0Ø0<Ô0AÀQÒ0FÐ0F�| A A A t GÔ,Ð,ÈLˆØ6EÔ6JÈaÒ6OÐ6O˜/¨!¨!¨!¨T¨'Ô2Ð2ÐUdˆØÔ˜AÒÐ ,Ô"4°QÔ"7¸?Ô;PÐQRÔ;SÒ"SÐ"SØ[gÔ[mÐnoÔ[pÐtuÒ[uÐ[u•r”y ¨a¨a¨a°°!°¨eÔ!4°oÔ6KÈAÔ6NÐUVÐWÑWÔWÐWð  |Hð  IJð  IJð  IJð  Leð  M\ô  Mbð  cdô  Með  Leð  Ieô  |fˆÝŒ>˜<¨½¸QÀÔ@RÐSTÔ@UÐXcÑ@cÑ9dÔ9dÐ9eÐ9eÔ)fÐgÐnoÐpÑpÔpÐpr   c                 ó&  — t          |pd¦  «                             ¦   «         t          j        |¦  «        }}t	          | |                     d¦  «        s|dv rdnd|dk    rdndz  |j        z  ¦  «        }|j        |j        z  |z
  |d	z  k    rd
n| S )aZ  Repair margin for continuing a source video: the model margin, unless the source audio runs past the continued frames (an audio
    tail saved with the video, or frames kept before its end) by at least that margin and two codec frames, a lossy encoder dropping a
    partial frame and coding the ~40 ms before the end of a stream less faithfully.r   Úpcm)ÚflacÚalacç        iÐ  Úmp3i€  i   éè  r   )ÚstrÚlowerrD   Úinfor=   r(   Ú
samplerateÚframes)Ú	repair_msÚ
audio_pathÚcodecÚvideo_secondsr~   Úclear_mss         r   Úsource_audio_repair_msr†   o   sÆ   € õ �e�k˜rÑ"Ô"×(Ò(Ñ*Ô*­B¬G°JÑ,?Ô,?ˆ4€EÝ�9 U×%5Ò%5°eÑ%<Ô%<ð  [ÀÐIYÐ@YÐ@Y˜c˜cÐ_cÐotÐx}Òo}Ðo}ÐgkÐgkð  DHñ  `Ið  LPô  L[ñ  `[ñ  \ô  \€HØ”˜dœoÑ-°Ñ=ÀÈDÁÒPÐPˆ1ˆ1ÐV_Ð_r   c           	      óØ   — | |z  }|�#t          d|t          |¦  «        |z  z
  ¦  «        nd}|dz  |z   }||dz   k    rt          d| › d|d›d|dz  d›d	�¦  «        ‚t          ||¦  «        S )
Nry   r{   g•Ö&è.>z#Audio continuation needs more than z overlap frames at Úgz2 FPS; increase the video overlap (repair requires z.1fz ms).)r=   Úlenra   Úmin)Úoverlap_framesrn   r�   Úoverlap_audiorH   Úoverlap_secondsÚ	shortfallÚrepair_secondss           r   Úaudio_overlap_repair_secondsr�   x   sÒ   € Ø$ yÑ0€OØP]ÐPi•�C˜­3¨}Ñ+=Ô+=ÀÑ+KÑKÑLÔLÐLÐor€IØ Ñ%¨	Ñ1€NØ˜¨$Ñ.Ò.Ð.Ýð  B¸~ð  Bð  BÐbkð  Bð  Bð  Bð  bpð  swñ  bwð  Bð  Bð  Bð  Bñ  Cô  Cð  	CÝˆ~˜Ñ/Ô/Ð/r   ry   é€>  Únull_audio_c           
      óX  — t          |¦  «        }t          dt          t          j        t	          |¦  «        |z  ¦  «        ¦  «        ¦  «        }t          j        |d| ¬¦  «        \  }}t          j        |¦  «         t          |t          j
        |t          j        ¬¦  «        |¦  «        S )Nr   ú.wav©Úprefixr*   Údirr.   )rF   r=   r7   Úceilr5   ÚtempfileÚmkstempr%   ÚcloserJ   Úzerosr9   )Ú
output_dirÚduration_secondsrH   r–   Únum_samplesÚfdrG   s          r   Úcreate_silent_wav_filer¡   �   s‰   € Ý�kÑ"Ô"€KÝ�a��RœW¥UÐ+;Ñ%<Ô%<¸{Ñ%JÑKÔKÑLÔLÑMÔM€KÝÔ v°fÀ*ÐMÑMÔM�H€BˆÝ„HˆR�L„L€LÝ˜$¥¤¨½B¼JÐ GÑ GÔ GÈÑUÔUÐUr   c                 ó”   — ||z  }t          ||z  ¦  «        }| j        d         t          ||z  ¦  «        z
  }| ||dk    r|nd …         S ©Nr   )rF   r>   )rg   Útrim_video_frames_beginningÚtrim_video_frames_endrn   rh   Úsamples_per_frameÚstartÚends           r   Útruncate_audior©   ‰   s^   € Ø+¨iÑ7ÐÝÐ+Ð.?Ñ?Ñ@Ô@€EØ
Ô
 Ô
"¥SÐ)>ÐARÑ)RÑ%SÔ%SÑ
S€CØ˜5¨¨aª¨  °TÐ9Ô:Ð:r   c                 ó�   — g }| D ]@\  }}||z  }||z   }|dk    rŒt          d|¦  «        }|                     |||z
  f¦  «         ŒA|S r£   )r=   Úappend)rm   Úoffset_framesÚshiftedÚstart_frameÚframe_countÚ	end_frames         r   Úshift_audio_trim_rangesr±   �   sn   € Ø€GØ$/ð ?ð ?Ñ ˆ�[Ø�}Ñ$ˆØ +Ñ-ˆ	Ø˜Š>ˆ>ØÝ˜!˜[Ñ)Ô)ˆØ�Š˜ Y°Ñ%<Ð=Ñ>Ô>Ð>Ð>Ø€Nr   c                 ó’  — t          |¦  «        dk    r| S t          j        | t          j        ¬¦  «        } ||z  }g }d}| j        d         }d}t          |¦  «        D ]•\  }	}
|	|z   }||
z   }t          |t          |t          ||z  ¦  «        ¦  «        ¦  «        }t          |t          |t          ||z  ¦  «        ¦  «        ¦  «        }||k    r| 	                    | ||…         ¦  «         |}||
z  }Œ–||k     r| 	                    | |d …         ¦  «         t          |¦  «        dk    rt          j
        |d¬¦  «        n	| d d…         S )Nr   r.   r\   )r‰   r7   r8   r9   r>   Úsortedr=   rŠ   rF   r«   rd   )r@   rm   rn   rh   r¦   ÚpiecesÚcursorÚtotal_samplesÚremoved_framesr®   r¯   Úsource_start_frameÚsource_end_framer§   r¨   s                  r   r`   r`   œ   se  € Ý
ˆ;ÑÔ˜1ÒÐØÐÝ”˜J­b¬jÐ9Ñ9Ô9€JØ+¨iÑ7ÐØ€FØ€FØÔ$ QÔ'€MØ€NÝ$*¨;Ñ$7Ô$7ð &ð &Ñ ˆ�[Ø(¨>Ñ9ÐØ-°Ñ;ÐÝ�F�C ­sÐ3EÐHYÑ3YÑ/ZÔ/ZÑ[Ô[Ñ\Ô\ˆÝ�%�˜]­CÐ0@ÐCTÑ0TÑ,UÔ,UÑVÔVÑWÔWˆØ�6Š>ˆ>Ø�MŠM˜* V¨E \Ô2Ñ3Ô3Ð3ØˆØ˜+Ñ%ˆˆØ�ÒÐØ�Š�j   Ô)Ñ*Ô*Ð*Ý-0°©[¬[¸1ª_¨_�2Œ>˜& qÐ)Ñ)Ô)Ð)À*ÈRÈaÈRÄ.ÐPr   c                 ó¤   — t          |¦  «        dk    r| S t          j        | d¬¦  «        \  }}t          ||||¦  «        }t	          |||¦  «        S )Nr   r9   r.   )r‰   rD   r^   r`   rJ   )r‚   rm   rn   Úoutput_pathr@   rh   Útrimmed_audios          r   Útrim_audio_file_rangesr½   ³   s\   € Ý
ˆ;ÑÔ˜1ÒÐØÐÝ&(¤g¨jÀ	Ð&JÑ&JÔ&JÑ#€JÐ#Ý% j°+¸yÐJ]Ñ^Ô^€MÝ˜+ }Ð6IÑJÔJÐJr   Tc                 óÎ  — t          |¦  «        t          |¦  «        z  }t          |¦  «        t          |¦  «        z  }	t          j        | ¦  «        5 }
|
j        }|
j        }t          |
¦  «        }t          t          ||z  ¦  «        ¦  «        }d}|dk     r|r| }|dk     rd}t          t          |	|z  ¦  «        ¦  «        }||k    r#t          j	        d|ft          j
        ¬¦  «        }n;|
                     t          ||¦  «        ¦  «         |
                     |dd¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |r>|dk    r8t          j        t          j	        ||ft          j
        ¬¦  «        |gd¬¦  «        }|rb|r|nd|z   }|j        d         |k     rH||j        d         z
  }t          j        |t          j	        ||ft          j
        ¬¦  «        gd¬¦  «        }||fS )Nr   r.   r9   TrZ   r\   )r5   rD   Ú	SoundFiler   Úchannelsr‰   rF   Úroundr7   rœ   r9   ÚseekrŠ   r^   rd   r>   )r‚   r®   Ú
num_framesÚfpsr�   r*   Úpad_headÚpad_tailÚ	start_secÚduration_secÚ
audio_filerH   rÀ   Útotal_framesÚstart_sampleÚ	pad_startÚframes_to_readÚdataÚtarget_framesÚpad_ends                       r   Úslice_audio_windowrÑ   »   s5  € Ý�kÑ"Ô"¥U¨3¡Z¤ZÑ/€IÝ˜Ñ$Ô$¥u¨S¡z¤zÑ1€Lå	Œ�jÑ	!Ô	!ð T ZØ Ô+ˆØÔ&ˆÝ˜:‘”ˆÝ�5 ¨[Ñ!8Ñ9Ô9Ñ:Ô:ˆØˆ	Ø˜!ÒÐ ÐØ%˜ˆIØ˜!ÒÐØˆLÝ�U <°+Ñ#=Ñ>Ô>Ñ?Ô?ˆØ˜,Ò&Ð&Ý”8˜Q ˜Mµ´Ð<Ñ<Ô<ˆDˆDà�OŠO�C ¨lÑ;Ô;Ñ<Ô<Ð<Ø—?’? >¸Èd�?ÑSÔSˆDðTð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tð" ð a�I ’M�MÝŒ~�rœx¨°HÐ(=ÅRÄZÐPÑPÔPÐRVÐWÐ^_Ð`Ñ`Ô`ˆØð cØ&.Ð5˜˜°A¸ÑGˆØŒ:�aŒ=˜=Ò(Ð(Ø# d¤j°¤mÑ3ˆGÝ”> 4­¬°7¸HÐ2EÍRÌZÐ)XÑ)XÔ)XÐ"YÐ`aÐbÑbÔbˆDØ�ÐÐs   ÁCD4Ä4D8Ä;D8c                 ó&  — t          j        t          j        | ¦  «        t	          ¦   «         ¬¦  «        }t          d„ |d         D ¦   «         d ¦  «        }|�|                     d¦  «        st          d| › �¦  «        ‚t          |d         ¦  «        S )N©Úcmdc              3   óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS ©Ú
codec_typeÚaudioN©Úget©Ú.0Ústreams     r   ú	<genexpr>z-get_audio_file_sample_rate.<locals>.<genexpr>Ü   ó9   è è € ÐfÐf FÀ&Ç*Â*È\ÑBZÔBZÐ^eÒBeÐBe˜ÐBeÐBeÐBeÐBeÐfÐfr   ÚstreamsrH   z&Unable to read audio sample rate from ©	r   Úprober%   r_   r   ÚnextrÚ   ra   rF   ©r‚   râ   Úaudio_streams      r   Úget_audio_file_sample_rateræ   Ú   s�   € ÝŒL�œ :Ñ.Ô.µOÑ4EÔ4EÐFÑFÔF€EÝÐfÐf¨e°IÔ.>ÐfÑfÔfÐhlÑmÔm€LØÐ <×#3Ò#3°MÑ#BÔ#BÐÝÐNÀ*ÐNÐNÑOÔOÐOÝˆ|˜MÔ*Ñ+Ô+Ð+r   c                 ó&  — t          j        t          j        | ¦  «        t	          ¦   «         ¬¦  «        }t          d„ |d         D ¦   «         d ¦  «        }|�|                     d¦  «        st          d| › �¦  «        ‚t          |d         ¦  «        S )NrÓ   c              3   óL   K  — | ]}|                      d ¦  «        dk    ¯|V — Œ dS rÖ   rÙ   rÛ   s     r   rÞ   z*get_audio_file_channels.<locals>.<genexpr>ä   rß   r   rà   rÀ   z(Unable to read audio channel count from rá   rä   s      r   Úget_audio_file_channelsré   â   s�   € ÝŒL�œ :Ñ.Ô.µOÑ4EÔ4EÐFÑFÔF€EÝÐfÐf¨e°IÔ.>ÐfÑfÔfÐhlÑmÔm€LØÐ <×#3Ò#3°JÑ#?Ô#?ÐÝÐPÀJÐPÐPÑQÔQÐQÝˆ|˜JÔ'Ñ(Ô(Ð(r   c                 óF  — t          j        t          j        | ¦  «        t	          ¦   «         ¬¦  «        }|                     di ¦  «                             d¦  «        }|dvrt          |¦  «        nd}g }|                     dg ¦  «        D ]“}|                     d¦  «        dk    rŒt          |                     d	d
¦  «        ¦  «        }|                     dd¦  «        }|dv r|dk    rdnd}n|r|r|dk    r|› d|› d�n|› d�}nd}|                     |¦  «         Œ”||fS )zKRead file duration and each audio track's channel layout, without decoding.rÓ   ÚformatÚduration)Nr   zN/ANrà   r×   rØ   rÀ   r   Úchannel_layoutr   )r   r0   r   ÚMonoÚStereoÚunknownz (z
 channels)z	 channelszUnknown channel layout)	r   râ   r%   r_   r   rÚ   r5   rF   r«   )Ú
media_pathrâ   rì   ÚlayoutsrÝ   rÀ   ÚlayoutÚlabels           r   Ú$get_media_duration_and_audio_layoutsrõ   ê   sM  € åŒL�œ :Ñ.Ô.µOÑ4EÔ4EÐFÑFÔF€EØ�yŠy˜ 2Ñ&Ô&×*Ò*¨:Ñ6Ô6€HØ"*Ð2CÐ"CÐ"C�u�X‰ŒˆÈ€HØ€GØ—)’)˜I rÑ*Ô*ð ð ˆØ�:Š:�lÑ#Ô# wÒ.Ð.ØÝ�v—z’z *¨aÑ0Ô0Ñ1Ô1ˆØ—’Ð,¨bÑ1Ô1ˆØ�vÐÐØ&¨!šm˜m�F�F°ˆEˆEØð 	-Ø9?ÐsÀFÈiÒDWÐDW�vÐ5Ð5 Ð5Ð5Ð5Ð5Ð`hÐ]sÐ]sÐ]sˆEˆEà,ˆEØ�Š�uÑÔÐÐØ�WÐÐr   c                 ó$  — t          | ¦  «        g}|pg D ]B}t          |                     dd¦  «        pd¦  «        }|dk    r|                     |¦  «         ŒC|pg D ]&}|r"|                     t          |¦  «        ¦  «         Œ't	          |¦  «        S )NrH   r   )rF   rÚ   r«   ræ   r=   )Údefault_rateÚsource_audio_metadataÚaudio_pathsÚsample_ratesÚmetarH   r‚   s          r   Úresolve_mux_audio_sampling_raterü   ÿ   s¯   € Ý˜Ñ%Ô%Ð&€LØ%Ð+¨ð -ð -ˆÝ˜$Ÿ(š( =°!Ñ4Ô4Ð9¸Ñ:Ô:ˆØ˜Š?ˆ?Ø×Ò Ñ,Ô,Ð,øØ!Ð' Rð Hð Hˆ
Øð 	HØ×ÒÕ :¸:Ñ FÔ FÑGÔGÐGøÝˆ|ÑÔÐr   c                 óÞ  — t          j        | t           j        ¬¦  «        } |�£t          j        |t           j        ¬¦  «                             d¦  «        dk    }| j        dk    r1|d | j        d         …         }| d |j        d         …         |         } n0|d | j        d         …         }| d |j        d         …         |         } t          j        | ¦  «                             d¦  «        }|j        dk    rdS t          | 	                    ¦   «         ¦  «        }|dk    rdS d|z  }||k    }t          j
        |¦  «        r't          ||          	                    ¦   «         ¦  «        n|}||fS )	Nr.   éÿÿÿÿç      à?r   r   )ry   ry   ry   gš™™™™™¹?)r7   r8   r9   r<   r:   r>   Úabsr;   r5   ÚmeanÚany)r@   Úactive_maskÚ	abs_audioÚavg_absÚ	thresholdÚactive_avg_abss         r   Ú_compute_active_abs_amplituder    se  € Ý”˜J­b¬jÐ9Ñ9Ô9€JØÐÝ”j µB´JÐ?Ñ?Ô?×GÒGÈÑKÔKÈcÒQˆØŒ?˜aÒÐØ%Ð&: zÔ'7¸Ô':Ð&:Ô;ˆKØ#Ð$9 [Ô%6°qÔ%9Ð$9Ô:¸;ÔGˆJˆJà%Ð&: zÔ'7¸Ô':Ð&:Ô;ˆKØ#Ð$9 [Ô%6°qÔ%9Ð$9Ô:¸;ÔGˆJÝ”�zÑ"Ô"×*Ò*¨2Ñ.Ô.€IØ„~˜ÒÐØˆxÝ�I—N’NÑ$Ô$Ñ%Ô%€GØ�#‚~€~ØˆxØ�g‘€IØ˜iÒ'€KÝ=?¼VÀKÑ=PÔ=PÐ]•U˜9 [Ô1×6Ò6Ñ8Ô8Ñ9Ô9Ð9ÐV]€NØ�NÐ"Ð"r   c                 óª   ‡— d„ | D ¦   «         } d„ | D ¦   «         }t          |¦  «        t          |¦  «        z  Šˆfd„t          | |¦  «        D ¦   «         S )z[Scale each audio so its active loudness matches the average active loudness of all of them.c                 óN   — g | ]"}t          j        |t           j        ¬ ¦  «        ‘Œ#S )r.   )r7   r8   r9   ©rÜ   rØ   s     r   ú
<listcomp>z+normalize_audio_volumes.<locals>.<listcomp>#  s)   € ÐFÐFÐF°e�bŒj˜¥b¤jÐ1Ñ1Ô1ÐFÐFÐFr   c                 ó8   — g | ]}t          |¦  «        d          ‘ŒS )r   )r  r  s     r   r  z+normalize_audio_volumes.<locals>.<listcomp>$  s&   € ÐJÐJÐJ¸%Õ+¨EÑ2Ô2°1Ô5ÐJÐJÐJr   c           	      óx   •— g | ]6\  }}t          j        |t          |d k    r‰|z  nd¦  «        z  dd¦  «        ‘Œ7S )g:Œ0âŽyE>ç      ð?g      ð¿)r7   Úclipr5   )rÜ   rØ   ÚlevelÚtargets      €r   r  z+normalize_audio_volumes.<locals>.<listcomp>&  sL   ø€ ÐÐÐÑ[gÐ[`Ðbg�BŒG�E�E°E¸D²L°L &¨5¡. .ÀcÑJÔJÑJÈDÐRUÑVÔVÐÐÐr   )Úsumr‰   Úzip)ÚaudiosÚlevelsr  s     @r   Únormalize_audio_volumesr  !  sf   ø€ àFÐF¸vÐFÑFÔF€FØJÐJÀ6ÐJÑJÔJ€FÝ�‰[Œ[�3˜v™;œ;Ñ&€FØÐÐÐÕknÐouÐw}Ñk~Ôk~ÐÑÔÐr   Úaudio_norm_c                 ó°  ‡— ˆfd„| D ¦   «         }|�t          j        |d¬¦  «         g }t          t          t	          d„ |D ¦   «         ¦  «        |¦  «        d¦  «        D ]v\  }\  }\  }}	t          j        |› |› d�d|¬¦  «        \  }
}t          j        |
¦  «         t          j	        ||t          |	¦  «        ¦  «         |                     |¦  «         Œw|S )	Nc                 óø   •— g | ]v}t          j        t          j        |¦  «        ‰€dnGt	          t          ‰¦  «        t          j        t          j        |¦  «        ¦  «        j        z  ¦  «        dd¬¦  «        ‘ŒwS )Nrþ   r9   F)r€   r/   r[   )rD   r^   r%   r_   rÁ   r5   r~   r   )rÜ   rG   Úmax_duration_secondss     €r   r  z9normalize_audio_volumes_to_temp_files.<locals>.<listcomp>*  sÌ   ø€ ð  [ð  [ð  [ð  GK�bŒg•b”i ‘o”oÐ4HÐ4P¨b¨bÕV[Õ\aÐbvÑ\wÔ\wÕz|ô  {Bõ  CEô  CLð  MQñ  CRô  CRñ  {Sô  {Sô  {^ñ  ]^ñ  W_ô  W_ð  gpð  |Að  Bñ  Bô  Bð  [ð  [ð  [r   T)Úexist_okc                 ó   — g | ]\  }}|‘ŒS r   r   )rÜ   rØ   Ú_s      r   r  z9normalize_audio_volumes_to_temp_files.<locals>.<listcomp>.  s    € ÐWuÐWuÐWuÑbjÐbgÐijÐX]ÐWuÐWuÐWur   r   r  r”   r•   )r%   ÚmakedirsÚ	enumerater  r  r™   rš   r›   rD   rE   rF   r«   )rù   r�   r–   r  r  ÚoutputsÚindexÚ
normalizedr  rH   r    Úoutputs      `        r   Ú%normalize_audio_volumes_to_temp_filesr%  )  s  ø€ ð [ð  [ð  [ð  [ð  OZð  [ñ  [ô  [€FØÐÝ
Œ�J¨Ð.Ñ.Ô.Ð.Ø€GÝ1:½3Õ?VÐWuÐWuÐntÐWuÑWuÔWuÑ?vÔ?vÐx~Ñ;Ô;ð  BCñ  2Dô  2Dð ð Ñ-ˆÑ-�
Ñ,˜Q ÝÔ%°Ð-@¸Ð-@Ð-@Ð-@ÈÐU_Ð`Ñ`Ô`‰
ˆˆFÝ
Œ�‰ŒˆÝ
Œ�˜¥S¨Ñ%5Ô%5Ñ6Ô6Ð6Ø�Š�vÑÔÐÐØ€Nr   c                 óÈ   — | sd} t          | ¦  «                             ¦   «         } | dk    rd} dddœdddœddddœddddœddd	dœd
œ}|                     | |d         ¦  «        S )NÚwavrz   Úmp3_192)Úextrë   rw   Ú128k)r)  rë   ÚbitrateÚ192kÚ320k)r'  rw   Úmp3_128r(  Úmp3_320©r|   r}   rÚ   ©Ú	codec_keyÚsettingss     r   Ú_get_audio_codec_settingsr4  6  s™   € Øð Øˆ	Ý�I‘”×$Ò$Ñ&Ô&€IØ�EÒÐØˆ	à¨Ð.Ð.Ø¨&Ð1Ð1Ø ¨E¸fÐEÐEØ ¨E¸fÐEÐEØ ¨E¸fÐEÐEðð €Hð �<Š<˜	 8¨E¤?Ñ3Ô3Ð3r   c           
      óÈ   — | sdn t          | ¦  «                             ¦   «         } 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œdœ}|                     | |d         ¦  «        S )NÚaac_128Úaacr*  z.aac©rƒ   r+  r)  r,  Ú256kr-  rx   z.m4arw   z.flacÚs16)rƒ   r+  r)  Ú
sample_fmt)r6  Úaac_192Úaac_256Úaac_320rx   rw   r0  r1  s     r   Úget_mp4_audio_codec_settingsr?  F  sš   € Ø!*ÐF�	�	µ°I±´×0DÒ0DÑ0FÔ0F€Ià"¨v¸fÐEÐEØ"¨v¸fÐEÐEØ"¨v¸fÐEÐEØ"¨v¸fÐEÐEØ ¨T¸&ÐAÐAØ ¨T¸'ÐQVÐWÐWðð €Hð �<Š<˜	 8¨IÔ#6Ñ7Ô7Ð7r   c                 ó  — t          | pd¦  «                             ¦   «         dk    rg S |�Qt          j        t	          j        |¦  «        ¦  «        d                              ¦   «         dk    rt          d¦  «        ‚g d¢S )Nr   rw   r   ú.movz@FLAC soundtracks require MP4 or MKV; choose AAC or ALAC for MOV.)z-sample_fmtr:  z-strictz-2)r|   r}   ÚospÚsplitextr%   r_   ra   )r2  r»   s     r   Úget_video_audio_extra_argsrD  S  s{   € Ý
ˆ9ˆ?˜ÑÔ×!Ò!Ñ#Ô# vÒ-Ð-Øˆ	ØÐ¥3¤<µ´	¸+Ñ0FÔ0FÑ#GÔ#GÈÔ#J×#PÒ#PÑ#RÔ#RÐV\Ò#\Ð#\ÝÐ[Ñ\Ô\Ð\Ø2Ð2Ð2Ð2r   c                 ó  — t          j        | ¦  «        rÁ| j        dk    r4t          | j        d         ¦  «        t          | j        d         ¦  «        fS | j        dk    rw| j        d         dv r4t          | j        d         ¦  «        t          | j        d         ¦  «        fS t          | j        d         ¦  «        t          | j        d         ¦  «        fS t          | t          t          f¦  «        r| D ]}t          |¦  «        }|�|c S Œd S )Né   rþ   éþÿÿÿé   ©r   é   rH  r0   r   )	r1   r2   r:   rF   r>   Ú
isinstanceÚlistÚtupleÚ_infer_video_dimensions)ÚtensorÚchunkÚdimss      r   rN  rN  [  s  € Ý„�vÑÔð @ØŒ;˜!ÒÐÝ�v”| BÔ'Ñ(Ô(­#¨f¬l¸2Ô.>Ñ*?Ô*?Ð?Ð?ØŒ;˜!ÒÐØŒ|˜BÔ 9Ð,Ð,Ý˜6œ<¨œ?Ñ+Ô+­S°´¸a´Ñ-AÔ-AÐAÐAÝ�v”| BÔ'Ñ(Ô(­#¨f¬l¸2Ô.>Ñ*?Ô*?Ð?Ð?Ý�&�4¥˜-Ñ(Ô(ð Øð 	ð 	ˆEÝ*¨5Ñ1Ô1ˆDØÐØ���ð  àˆ4r   c                 óŽ   — t          |¦  «        }d x}}|�|\  }}t          | |||t          ¬¦  «        }|�t          |¦  «        ‚d S )N)ÚwidthÚheightÚallowed_containers)rN  r   r   ÚRuntimeError)r×   Ú	containerrO  rQ  rS  rT  Úerrors          r   Ú_validate_video_save_settingsrY  k  sk   € Ý" 6Ñ*Ô*€DØÐ€EˆFØÐØ‰ˆˆvÝ*¨:°yÈÐV\õ  rLð  Mñ  Mô  M€EØÐÝ˜5Ñ!Ô!Ð!ð Ðr   ©rþ   r   c                 ó   — | j         t          j        k    rJ|                      ¦   «                              ¦   «                              ¦   «                              ¦   «         S |                      ¦   «                              t          j        d¬¦  «        } |r]t          |¦  «        t          |¦  «        }}|                      ||¦  «                             |¦  «                             ||z
  ¦  «         |                      d¦  «                             ¦   «                              dd¦  «                             t          j        ¦  «                             ¦   «                              ¦   «                              ¦   «         S )NT)r/   rL   ç     ào@r   éÿ   )r/   r1   Úuint8r3   r4   Ú
contiguousr6   rQ   r9   rŠ   r=   Úclamp_Úsub_Údiv_Úmul_Úround_)ÚframeÚ	normalizeÚvalue_rangeÚ	value_minÚ	value_maxs        r   Ú_video_frame_tensor_to_uint8rj  u  s  € Ø„{•e”kÒ!Ð!Ø�|Š|‰~Œ~×!Ò!Ñ#Ô#×.Ò.Ñ0Ô0×6Ò6Ñ8Ô8Ð8Ø�LŠL‰NŒN×Ò¥E¤M¸ÐÑ=Ô=€EØð WÝ" ;Ñ/Ô/µ°[Ñ1AÔ1A�9ˆ	Ø�Š�Y 	Ñ*Ô*×/Ò/°	Ñ:Ô:×?Ò?À	ÈIÑ@UÑVÔVÐVØ�:Š:�eÑÔ×#Ò#Ñ%Ô%×,Ò,¨Q°Ñ4Ô4×7Ò7½¼ÑDÔD×HÒHÑJÔJ×UÒUÑWÔW×]Ò]Ñ_Ô_Ð_r   Ú18r2  ÚdefaultÚreturnc                 ó  — t          | pd¦  «                             ¦   «                              ¦   «         } t          j        d| ¦  «        r| S t          j        d| ¦  «        }|�|                     d¦  «        nt          |¦  «        S )Nr   z\d+z_(\d+)$r   )r|   Ústripr}   ÚreÚ	fullmatchÚsearchÚgroup)r2  rl  Úmatchs      r   Ú_crf_from_video_codecru    su   € Ý�I�O Ñ$Ô$×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4€IÝ	„|�F˜IÑ&Ô&ð ØÐÝŒI�j )Ñ,Ô,€EØ"Ð.ˆ5�;Š;�q‰>Œ>ˆ>µC¸±L´LÐ@r   rW  c                 ó€   — t          | d¬¦  «        }dt          ¦   «         ddddd|d	d
dddddddddt          ¦   «         gS )Nrk  )rl  z-vfú-c:vÚlibx265z-presetÚmediumz-crfú-pix_fmtÚyuv420p10lez-tag:vÚhvc1z-color_primariesÚbt2020z
-color_trcÚ	smpte2084z-colorspaceÚbt2020ncz-x265-params)ru  r   r   )r2  rW  Úcrfs      r   Úget_hdr_video_encode_argsr�  ‡  s^   € Ý
 	°4Ð
8Ñ
8Ô
8€CàÕ"Ñ$Ô$Ø�	Ø�8Ø�Ø�MØ�&Ø˜HØ�kØ�zØÕ)Ñ+Ô+ðð r   c                 ó,   — t          | ¦  «        d         S )Nr)  )r4  )r2  s    r   Úget_audio_codec_extensionrƒ  —  s   € Ý$ YÑ/Ô/°Ô6Ð6r   c                 ó   — t          ¦   «         dddd| g}|r|                     d¦  «         |d|gz  }|r|d|gz  }|r!|dt          t          |¦  «        ¦  «        gz  }|                     |¦  «         t	          j        |d	d	d	d
d¬¦  «         d S )Nú-yú-vrX  ú-iz-vnú-c:aú-b:aú-arTr!   Úreplace©ÚcheckÚcapture_outputÚtextÚencodingÚerrors)r   r«   r|   rF   Ú
subprocessÚrun)Ú
input_pathr»   rƒ   r+  rH   Ú
drop_videorÔ   s          r   Ú_run_ffmpeg_encoder–  ›  s¶   € ÝÑÔ˜T 4¨°$¸
Ð
C€CØð Ø�
Š
�5ÑÔÐØˆF�Eˆ?Ñ€CØð !Ø�˜Ð Ñ ˆØð .Ø�•s�3˜{Ñ+Ô+Ñ,Ô,Ð-Ñ-ˆØ‡J‚Jˆ{ÑÔÐÝ„N�3˜d°4¸dÈWÐ]fÐgÑgÔgÐgÐgÐgr   r'  c                 óð  — t          |¦  «        }|d         }|                      ¦   «                              d|› �¦  «        s t          j        | ¦  «        d         d|› �z   } |d         dk    rt          | ||¦  «        S |d         dk    r5t          j        | t          |¦  «        t          |¦  «        dd¬	¦  «         | S t          j        d
d¬¦  «        \  }}t          j        |¦  «         	 t          |||¦  «         t          || d|                     d¦  «        |¬¦  «         	 t          j        |¦  «         n:# t"          $ r Y n.w xY w# 	 t          j        |¦  «         w # t"          $ r Y w w xY wxY w| S )Nr)  r"   r   rë   r'  rw   ÚFLACÚPCM_16)rë   Úsubtyper”   Úaudio_©r*   r–   Ú
libmp3lamer+  )r+  rH   )r4  r}   ÚendswithrB  rC  rJ   rD   rE   rA   rF   r™   rš   r%   r›   r–  rÚ   ÚremoveÚOSError)rG   r@   rH   r2  r3  r)  r    Útmp_paths           r   Úsave_audio_filer¢  ¨  sœ  € Ý(¨Ñ3Ô3€HØ
�5Œ/€CØ�:Š:‰<Œ<× Ò   S  Ñ+Ô+ð 1ÝŒ|˜DÑ!Ô! !Ô$ y¨3 y yÑ0ˆØ�Ô˜UÒ"Ð"Ý˜d J°Ñ<Ô<Ð<Ø�Ô˜VÒ#Ð#Ý
Œ�Õ+¨JÑ7Ô7½¸[Ñ9IÔ9IÐRXÐbjÐkÑkÔkÐkØˆÝÔ#¨6¸(ÐCÑCÔC�L€BˆÝ„HˆR�L„L€LðÝ�x ¨[Ñ9Ô9Ð9Ý˜8 T¨<ÀÇÂÈiÑAXÔAXÐfqÐrÑrÔrÐrð	ÝŒI�hÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøøð	ÝŒI�hÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøøøøà€KsB   Ã.8E Ä'D< Ä<
E	ÅE	ÅE3ÅE#Å"E3Å#
E0Å-E3Å/E0Å0E3Ú
video_pathc                 ó  — t          | t          j        ¦  «        rdi dfS t          | ¦  «        �di dfS t          | ¦  «        }t	          j        t          | ¦  «        ¦  «        }i }|€||dfS t          | ¦  «        }|�Ñ|                     d¦  «        �¼t          |                     d¦  «        pd¦  «        }t          |                     d¦  «        p|¦  «        }t          |                     d¦  «        p|                     d¦  «        pd¦  «        }|dk    r5t          d||z  ¦  «        |d<   t          |d         |d	z   |z  ¦  «        |d
<   |j        €d	n!t          d	t          |j        ¦  «        ¦  «        }|||d	z
  fS )Nr   r   Úvirtual_end_frameÚvirtual_start_frameÚ	fps_floatrÄ   ry   Ússr   rQ   )rK  r   r   r   r%   r_   r   r   rÚ   rF   r5   r=   Úaudio_track_no)	r£  ÚspecÚsource_pathÚ	time_argsÚmetadatar®   r°   r§  r©  s	            r   Ú_resolve_virtual_audio_segmentr®  ¿  sƒ  € Ý�*�eœkÑ*Ô*ð Ø�2�qˆyÐÝ˜zÑ*Ô*Ð6Ø�2�qˆyÐÝ# JÑ/Ô/€DÝ”)Õ6°zÑBÔBÑCÔC€KØ "€IØ€|Ø˜I qÐ(Ð(Ý*¨:Ñ6Ô6€HØÐ §¢Ð-@Ñ AÔ AÐ MÝ˜(Ÿ,š,Ð'<Ñ=Ô=ÐBÀÑCÔCˆÝ˜ŸšÐ%8Ñ9Ô9ÐH¸[ÑIÔIˆ	Ý˜(Ÿ,š, {Ñ3Ô3ÐQ°x·|²|ÀEÑ7JÔ7JÐQÈcÑRÔRˆ	Ø�qŠ=ˆ=Ý! # {°YÑ'>Ñ?Ô?ˆI�d‰OÝ! )¨D¤/°IÀ±MÀYÑ3NÑOÔOˆI�d‰OØÔ-Ð5�Q�Q½3¸qÅ#ÀdÔFYÑBZÔBZÑ;[Ô;[€NØ˜	 >°AÑ#5Ð5Ð5r   c           	      ó˜  — | sd S t          | t          j        ¦  «        rd S t          j        | ¦  «        } t	          | ¦  «        \  }}}t          |¦  «        dk    rd S dd l}	 d|› �ddœ}  |j        |fi |¤Žj        |fi |¤Ž 	                    ¦   «          
                    t          ¦   «         d¬¦  «         n’# |j        $ r…}t          |dd¦  «        }t          |t          t          f¦  «        r|                     d	d
¬¦  «        }|pt#          |¦  «                             ¦   «         }t'          d|› d|› d|› �¦  «        |‚d }~ww xY w|S )Nr   ú0:a:Ú	pcm_s16le)ÚmapÚacodecT©rÔ   ÚquietÚstderrr   r!   Úignore©r‘  z ffmpeg audio extract failed for z -> ú: )rK  r   r%   r_   r®  r‰   r   Úinputr$  Úoverwrite_outputr“  r   ÚErrorÚgetattrÚbytesÚ	bytearrayr'   r|   ro  rV  )	r£  r»   r«  r¬  Úaudio_track_indexr   Úoutput_kwargsÚerrr¶  s	            r   Úextract_audio_track_to_wavrÃ  Õ  s£  € Øð ØˆtÝ�*�eœkÑ*Ô*ð ØˆtÝ”˜:Ñ&Ô&€JÝ0NÈzÑ0ZÔ0ZÑ-€K�Ð-Ý
ˆ;ÑÔ˜1ÒÐØˆtØ€M€M€MðqØ :Ð'8Ð :Ð :ÀkÐRÐRˆØ5ˆˆŒ�[Ð.Ð. IÐ.Ð.Ô5°kÐSÐSÀ]ÐSÐS×dÒdÑfÔf×jÒjÕo}ÑoÔoð  HLÐjñ  	Mô  	Mð  	Mð  	MøØŒ<ð qð qð qÝ˜˜h¨Ñ,Ô,ˆÝ�f�u¥iÐ0Ñ1Ô1ð 	=Ø—]’] 7°8�]Ñ<Ô<ˆFØÐ$�C ™HœH×+Ò+Ñ-Ô-ˆÝÐf¸kÐfÐfÈ{ÐfÐfÐ^dÐfÐfÑgÔgÐmpÐpøøøøðqøøøð Ðs   Á"AB8 Â8
EÃB EÅEr6  c                 ó¨  — t          | t          j        ¦  «        r|rdng g fS t          | ¦  «        \  }}}t          |¦  «        dk    r|rdng g fS t          j                             |¦  «        s%d| › �}|rt          |¦  «         t          |¦  «        ‚	 t          j
        |t          ¦   «         ¬¦  «        }	n§# t          j        $ r•}
t          |
dd¦  «        }t          |t          t          f¦  «        r|                     dd¬¦  «        }|pt#          |
¦  «                             ¦   «         }d	|› d
|› �}|rt          |¦  «         t'          |¦  «        |
‚d}
~
ww xY wd„ |	d         D ¦   «         }t)          |	d                              dd¦  «        ¦  «        }|�(d|cxk    rt          |¦  «        k     rn n	||         gng }|s|rdS |rt          d| › �¦  «         g g fS |rt          |¦  «        S |r$t          dt          |¦  «        › d|d›d�¦  «         g }g }|dk    rddddœ}nt-          |¦  «        }t/          |¦  «        D �]…\  }}t1          j        d|› |d         › �d¬¦  «        \  }}t	          j        |¦  «         |                     |¦  «         |                     |                     d¦  «        t9          |                     dd¦  «        ¦  «        t9          |                     d d¦  «        ¦  «        ||                     d!i ¦  «                             d"d¦  «        d#œ¦  «         |€|n|}d$d%|› �d&|d'         i}|d(         r|d(         |d)<   |                     d*¦  «        r|d*         |d*<    t          j        |fi |¤Žj        |fi |¤Ž                     ¦   «                               tC          ¦   «         | ¬+¦  «         �Œ‡||fS ),az  
    Extract all audio tracks from a source video into temporary audio files.

    Returns:
        Tuple:
          - List of temp file paths for extracted audio tracks
          - List of corresponding metadata dicts:
              {'codec', 'sample_rate', 'channels', 'duration', 'language'}
              where 'duration' is set to container duration (for consistency).
    r   z!ffprobe skipped; file not found: rÓ   r¶  r   r!   r·  r¸  zffprobe failed for r¹  Nc                 ó*   — g | ]}|d          dk    ¯|‘ŒS )r×   rØ   r   ©rÜ   Úss     r   r  z(extract_audio_tracks.<locals>.<listcomp>  s&   € ÐOÐOÐO˜1°A°l´OÀwÒ4NÐ4N�QÐ4NÐ4NÐ4Nr   rà   rë   rì   ry   zNo audio track found in zFound z& audio track(s), container duration = ú.3frÇ  r'  r±  r”   r8  Ú_trackr)  r›  rœ  Ú
codec_namerH   rÀ   ÚtagsÚlanguage)rƒ   rH   rÀ   rì   rÌ  r²  r°  r³  rƒ   r+  zb:ar;  r´  )"rK  r   r®  r‰   r%   rG   ÚexistsÚprintÚFileNotFoundErrorr   râ   r   r¼  r½  r¾  r¿  r'   r|   ro  rV  r5   rÚ   r?  r   r™   rš   r›   r«   rF   rº  r$  r»  r“  r   )Úsource_videoÚverboseÚ
query_onlyr2  Útemp_formatr«  r¬  Úselected_track_indexÚmsgrâ   rÂ  r¶  ÚmessageÚaudio_streamsÚcontainer_durationÚ
file_pathsr­  Úaudio_settingsÚirÝ   r    Ú	temp_pathÚstream_indexrÁ  s                           r   Úextract_audio_tracksrÞ  ì  s‘  € õ �,¥¤Ñ,Ô,ð -ØÐ,ˆqˆq R¨ HÐ,Ý3QÐR^Ñ3_Ô3_Ñ0€K�Ð0Ý
ˆ;ÑÔ˜1ÒÐØÐ,ˆqˆq R¨ HÐ,ÝŒ7�>Š>˜+Ñ&Ô&ð %Ø@°,Ð@Ð@ˆØð 	Ý�#‰JŒJˆJÝ Ñ$Ô$Ð$ð
-Ý”˜[­oÑ.?Ô.?Ð@Ñ@Ô@ˆˆøÝŒ<ð -ð -ð -Ý˜˜h¨Ñ,Ô,ˆÝ�f�u¥iÐ0Ñ1Ô1ð 	=Ø—]’] 7°8�]Ñ<Ô<ˆFØÐ$�C ™HœH×+Ò+Ñ-Ô-ˆØ?¨Ð?Ð?°vÐ?Ð?ˆØð 	Ý�'‰NŒNˆNÝ˜7Ñ#Ô#¨Ð,øøøøð-øøøð PÐO  iÔ 0ÐOÑOÔO€MÝ˜u Xœ×2Ò2°:¸sÑCÔCÑDÔDÐØÐ'ØABÐFZÐAoÐAoÒAoÐAoÕ]`ÐanÑ]oÔ]oÒAoÐAoÐAoÐAoÐAo˜Ð';Ô<Ð=Ð=Ðuwˆàð ØÐ˜a˜aØÐD•EÐC°\ÐCÐCÑDÔDÐDØ�2ˆvˆàð "Ý�=Ñ!Ô!Ð!àð lÝÐj•s˜=Ñ)Ô)ÐjÐjÐQcÐjÐjÐjÐjÑkÔkÐkà€JØ€HØ�eÒÐØ#.¸4ÈÐOÐOˆˆå5°iÑ@Ô@ˆå˜}Ñ-Ô-ð Rñ R‰	ˆˆ6Ý Ô(Ð0S¸Ð0S¸NÈ5Ô<QÐ0SÐ0SÐ\dÐeÑeÔe‰ˆˆIÝ
Œ�‰Œˆà×Ò˜)Ñ$Ô$Ð$Ø�ŠØ—Z’Z Ñ-Ô-Ý˜vŸzšz¨-¸Ñ;Ô;Ñ<Ô<Ý˜FŸJšJ z°1Ñ5Ô5Ñ6Ô6Ø*ØŸ
š
 6¨2Ñ.Ô.×2Ò2°:¸tÑDÔDð
ð 
ñ 	ô 	ð 	ð 1Ð8�q�qÐ>RˆØÐ!6¨Ð!6Ð!6¸À.ÐQXÔBYÐZˆØ˜)Ô$ð 	=Ø#1°)Ô#<ˆM˜%Ñ Ø×Ò˜lÑ+Ô+ð 	GØ*8¸Ô*FˆM˜,Ñ'Ø5�Œ�[Ð.Ð. IÐ.Ð.Ô5°iÐQÐQÀ=ÐQÐQ×bÒbÑdÔd×hÒhÕm{Ñm}Ôm}ð  JQð  FQÐhñ  	Rô  	Rð  	Rñ  	Rà�xÐÐs   Â"B9 Â9EÃBEÅEc                 óL	  — t          || ¦  «        }t          |¦  «        }|d         }|d         }d|gg ddgdf\  }}}}g }|pg }|pg }t          |¦  «        dk    ot          |¦  «        dk    }|dk    rt          |¦  «        n+t          t          |¦  «        t          |¦  «        ¦  «        pd}t	          |¦  «        D �]Ã}|t          |¦  «        k     r||         n|r|d         nd}t          |¦  «        |k    r||         n|r|d         nd}|r|t          |¦  «        k     r||         ni }|r%t          |                     d	d¦  «        pd¦  «        nd}|r|dk    rt          |¦  «        }|rt          |¦  «        nd}t          ||¦  «        d
k    rdnd}|dk    rP|r-|d|gz  }|                     d|› d|› d|› d�¦  «         |dz  }�n¨|                     d|› d|› d|› d�¦  «         �n‡|rå|d|gz  }|                     d¦  «        |k    p@|                     d¦  «        |k    p'||dk    rd
ndk    p|                     dd¦  «        |k     } | r)|                     d|› d|› d|› d|› d|› d|› d�¦  «         n"|                     d|› d|› d|› d|› d�	¦  «         |                     d¦  «        x}!r|dt          |¦  «        z   d|!› �gz  }|dz  }n"|                     d|› d|› d|› d|› d�	¦  «         |r`|d|gz  }|rdn|}"|                     d|› d|› d|› d|"› d |› d�¦  «         |
rd!nd"}#|                     d#|› d$|› d%|#› d&|› d�	¦  «         |dz  }n|                     d#|› d'|› d�¦  «         |dd&|› d�gz  }�ŒÅd(g}$|dk    rft          t          d)„ t          j        |t          ¦   «         ¬*¦  «        d+         D ¦   «         ¦  «        d         ¦  «        }%d,t          |%|z   ¦  «        g}$t          ¦   «         d-g|¢d.‘d/                     |¦  «        ‘|¢|¢d0‘d1‘d2‘|‘|¢|rd3|gng ¢d4‘t          |¦  «        ‘|$¢| ‘}&|	rt#          d5|&› �¦  «         	 t%          j        |&d6d6d6d7d8¬9¦  «         dS # t$          j        $ r}'t+          d:|'j        › �¦  «        ‚d}'~'ww xY w);z»audio_tail_seconds keeps that much audio past the last video frame (instead of cutting at the video end), so the end of the
    video's own audio stays clear of the encoder's end effects.rƒ   r+  r‡  ú-mapú0:vr   r   NrÀ   r0   ÚstereoÚmonoú[z:a]aformat=channel_layouts=z,apad=pad_dur=100[aoutú]zanullsrc=r=z:cl=rH   rì   z:a]aresample=z,aformat=channel_layouts=z,apad=pad_dur=z	,atrim=0:z,asetpts=PTS-STARTPTS[sz:a]apad=pad_dur=rÌ  ú-metadata:s:a:ú	language=Ú0z,atrim=start=z,asetpts=PTS-STARTPTS[nz,apad=pad_dur=100r   z[sz][nz]concat=n=2:v=0:a=1z[aoutz]apad=pad_dur=100[aoutz	-shortestc              3   ó2   K  — | ]}|d          dk    ¯|V — ŒdS ©r×   ÚvideoNr   rÆ  s     r   rÞ   zBcombine_and_concatenate_video_with_audio_tracks.<locals>.<genexpr>�  s\   è è € ð  $Ið  $I¨!ÐmnÐo{Ôm|ð  AHò  nHð  nH Að  nHð  nHð  nHð  nHð  $Ið  $Ir   rÓ   rà   ú-tr…  z-filter_complexú;rw  rL   rˆ  r‰  rŠ  zffmpeg command: Tr!   r‹  rŒ  zFFmpeg error: )rD  r?  r‰   r=   ÚrangerF   rÚ   ré   r«   r|   r5   rã   r   râ   r   r   ÚjoinrÎ  r’  r“  ÚCalledProcessErrorÚ	Exceptionr¶  )(Úsave_path_tmpr£  Úsource_audio_tracksÚnew_audio_tracksÚsource_audio_durationrh   Únew_audio_from_startrø   Úaudio_codec_keyrÑ  Úpad_audio_to_videoÚaudio_tail_secondsÚextra_audio_argsrÚ  Úaudio_codecÚaudio_bitrateÚinputsÚfiltersÚmapsÚidxÚmetadata_argsÚsourcesÚnewsÚduplicate_sourceÚNrÛ  rÇ  Únrû   Úsource_channelsÚnew_channelsrí   Úneeds_filterÚlangr§   ÚpaddingÚduration_argsÚvideo_durationrÔ   Úes(                                           r   Ú/combine_and_concatenate_video_with_audio_tracksr  =  s�  € õ 2°/À=ÑQÔQÐÝ1°/ÑBÔB€NØ  Ô)€KØ" 9Ô-€MØ"&¨
Ð!3°R¸&À%¸È!Ð!KÑ€FˆG�T˜3Ø€MØ!Ð' R€GØÐ!˜r€Då˜7‘|”| qÒ(Ð:­S°©Y¬Y¸ª]ÐØ*¨aÒ/Ð/�ˆD‰	Œ	ˆ	µS½¸W¹¼ÅsÈ4ÁyÄyÑ5QÔ5QÐ5VÐUV€Aå�1‰XŒXð 5'ñ 5'ˆØ�s 7™|œ|Ò+Ð+ˆW�QŒZˆZØ 0Ð:�'˜!”*�*°dð 	
å˜4‘y”y A’~�~ˆD�ŒGˆG°tÐ,E¨D°¬G¨GÀˆØ+@ÐkÀQÍÐMbÑIcÔIcÒEcÐEcÐ$ QÔ'Ð'ÐikˆØ?@ÐG�#˜dŸhšh z°1Ñ5Ô5Ð:¸Ñ;Ô;Ð;ÀaˆØð 	9� AÒ%Ð%Ý5°aÑ8Ô8ˆOØ56Ð=Õ.¨qÑ1Ô1Ð1¸AˆÝ%(¨¸,Ñ%GÔ%GÈ1Ò%LÐ%L˜˜ÐRXˆà  AÒ%Ð%Øð rØ˜4 ˜)Ñ#�Ø—’Ðm 3ÐmÐmÀ>ÐmÐmÐijÐmÐmÐmÑnÔnÐnØ�q‘�‘à—’ÐpÐ-@ÐpÐpÀnÐpÐpÐlmÐpÐpÐpÑqÔqÐqÑqàð HØ˜4 ˜)Ñ#�à—H’H˜WÑ%Ô%¨Ò4ð DØ—H’H˜]Ñ+Ô+Ð/BÒBðDà#¨^¸xÒ-GÐ-G¨¨ÈQÒOðDð —H’H˜Z¨Ñ+Ô+Ð.CÒCð	 ð  ð EØ—N’Nð{˜Cð {ð {Ð.Að {ð {Ð\jð {ð {Ø(=ð{ð {ØH]ð{ð {Øvwð{ð {ð {ñ|ô |ð |ð |ð —N’Nð D˜Cð  Dð  DÐ1Fð  Dð  DÐQfð  Dð  Dð  @Að  Dð  Dð  DñEô Eð EàŸ8š8 JÑ/Ô/Ð/�4ð UØ!Ð&6½¸Q¹¼Ñ&?ÐASÈTÐASÐASÐ%TÑT�MØ�q‘��à—’ð GÐ"5ð  Gð  G¸>ð  Gð  GÐTið  Gð  Gð  CDð  Gð  Gð  GñHô Hð Hð ð 
CØ˜4 ˜)Ñ#�Ø3ÐN˜˜Ð9N�Ø—’ðF˜ð Fð FÐ*=ð Fð FÐXfð Fð FØ#(ðFð FØABðFð Fð FñGô Gð Gð 2DÐKÐ-Ð-È�Ø—’ÐR AÐRÐR¨!ÐRÐRÀÐRÐRÈaÐRÐRÐRÑSÔSÐSØ�q‘��à—’ÐA AÐAÐA¸QÐAÐAÐAÑBÔBÐBà�˜ ˜˜˜Ð&Ñ&ˆ‰à �M€MØ˜AÒÐÝ�tð  $Ið  $I­v¬|¸JÍOÑL]ÔL]Ð/^Ñ/^Ô/^Ð_hÔ/ið  $Iñ  $Iô  $Iñ   Iô   Ið  JTô   Uñ  Vô  VˆØ�s >Ð4FÑ#FÑGÔGÐHˆÝÑÔ˜Tð * Fð *Øð*Ø!Ÿhšh wÑ/Ô/ð*àð*à ð*ð ð*ð ð*ð ð	*ð ð	*ð "2ð	*ð
 )6Ð=ˆf�mÐ$Ð$¸2ð*ð ð*õ Ð)Ñ*Ô*ð*ð ð*ð )ð*€Cð ð (ÝÐ& Ð&Ð&Ñ'Ô'Ð'ð5ÝŒ�s $°tÀ$ÐQXÐajÐkÑkÔkÐkÐkÐkøÝÔ(ð 5ð 5ð 5ÝÐ3¨¬Ð3Ð3Ñ4Ô4Ð4øøøøð5øøøs   ÑQ8 Ñ8R#ÒRÒR#c                 ó¼   — t          | ¦  «        �dS t          d„ t          j        t	          | ¦  «        t          ¦   «         ¬¦  «        d         D ¦   «         ¦  «        S )Nr   c              3   ó.   K  — | ]}|d          dk    V — ŒdS )r×   ÚsubtitleNr   rÛ   s     r   rÞ   z(subtitle_stream_count.<locals>.<genexpr>¥  sD   è è € ð  Rð  R°fˆv�lÔ# zÒ1ð  Rð  Rð  Rð  Rð  Rð  Rr   rÓ   rà   )r   r  r   râ   r   r   )rG   s    r   Úsubtitle_stream_countr  ¢  s�   € Ý˜tÑ$Ô$Ð0ØˆqÝð  Rð  RÅÄÕMgÐhlÑMmÔMmõ  tCñ  tEô  tEð  AFñ  AFô  AFð  GPô  AQð  Rñ  Rô  Rñ  Rô  Rð  Rr   c           
      óx  — t          ||¦  «        }|s|€|rt          d¦  «         dS |€Rt          t          d„ t	          j        | t          ¦   «         ¬¦  «        d         D ¦   «         ¦  «        d         ¦  «        }|}	|rt          d|	d	›d
�¦  «         t          ¦   «         dd| g}
|D ]	}|
d|gz  }
Œ
|�‡t          |¦  «        \  }}}| 	                    ¦   «         D ]\  }}|
d|› �t          |¦  «        gz  }
Œ|
d|gz  }
|r:t          t          |	¦  «        |d         |d         z
  ¦  «        }|
dd|› d|› d�gz  }
|
ddgz  }
t          t          |¦  «        ¦  «        D ]}|
d|dz   › d�gz  }
Œ|�W|
dt          |¦  «        dz   › d�dt          j                             |¦  «        d                              ¦   «         dv rdndgz  }
t%          |pg ¦  «        D ]6\  }}|                     d¦  «        x}r|
dt          |¦  «        z   d|› �gz  }
Œ7t)          |¦  «        }|
d d!d"|d#         g|¢z  }
|d$         r|
d%|d$         gz  }
|
d&t          |	¦  «        |gz  }
t+          j        |
| d'd(d)¬*¦  «        }|j        d+k    rt1          d,|j        › �¦  «        ‚|r#t          d-|› d.t          |¦  «        › d/�¦  «         d'S )0zoMux audio tracks, and the subtitle tracks of subtitle_source when given, with the video stream of target_video.NzNo audio tracks to combine.Fc              3   ó2   K  — | ]}|d          dk    ¯|V — ŒdS rê  r   rÆ  s     r   rÞ   z2combine_video_with_audio_tracks.<locals>.<genexpr>°  s<   è è € ð $>ð $>¨!Ø"# L¤/°WÒ"<Ð"<ð %&Ø"<Ð"<Ð"<Ð"<ð$>ð $>r   rÓ   rà   rì   zVideo duration: rÈ  rÇ  r…  r‡  ú-rQ   r¨  z-bsf:sz4noise=amount=0:drop='lte(pts+duration,0)+gte(pts*tb,z3)',setts=ts='max(TS,0)':duration='min(PTS+DURATION,z/TB)-max(PTS,0)'rà  rá  r   z:az:sz-c:s)z.mp4rA  z.m4vÚmov_textÚsrtrÌ  ræ  rç  rw  rL   rˆ  rƒ   r+  r‰  rì  Tr!   r‹  )rŽ  r�  r�  r‘  r   zFFmpeg error:
zCreated z with z audio track(s))rD  rÎ  r5   rã   r   râ   r   r   r®  Úitemsr|   rŠ   rî  r‰   r%   rG   rC  r}   r   rÚ   r?  r’  r“  Ú
returncoderñ  r¶  )Útarget_videoÚaudio_tracksÚoutput_videoÚaudio_metadatar÷  rÑ  r  Úsubtitle_sourcerú  ÚdurrÔ   rG   r«  r¬  r  ÚkeyÚvalueÚsubtitle_durationrÛ  rû   r
  rÚ  Úresults                          r   Úcombine_video_with_audio_tracksr%  ¨  sÇ  € õ 2°/À<ÑPÔPÐØð G˜OÐ3ØÐF•EÐ7Ñ8Ô8Ð8ÀÀàÐÝ�tð $>ð $>­v¬|¸LÍoÑN_ÔN_Ð/`Ñ/`Ô/`ÐajÔ/kð $>ñ $>ô $>ñ  >ô  >Ø>Hô Jñ Kô Kˆà
€CØÐ4•Ð3¨Ð3Ð3Ð3Ð3Ñ4Ô4Ð4åÑÔ˜T 4¨Ð
6€CØð ð ˆØ��dˆ|ÑˆˆØÐ"Ý$BÀ?Ñ$SÔ$SÑ!ˆ�Y Ø#Ÿ/š/Ñ+Ô+ð 	+ð 	+‰JˆC�Ø�I˜�I�I�s 5™zœzÐ*Ñ*ˆCˆCØ��kÐ"Ñ"ˆØð 	lõ !$¥E¨#¡J¤J°	¸$´À)ÈDÄ/Ñ0QÑ RÔ RÐØ�Hð kÐUfð kð kØGXðkð kð kð lñ lˆCð ˆF�Eˆ?Ñ€CÝ•3�|Ñ$Ô$Ñ%Ô%ð $ð $ˆØ�˜1˜Q™3˜
˜
˜
Ð#Ñ#ˆˆØÐ"à��3˜|Ñ,Ô,¨qÑ0Ð4Ð4Ð4°fÍBÌG×L\ÒL\Ð]iÑLjÔLjÐklÔLm×LsÒLsÑLuÔLuð  zRð  MRð  MR¸j¸jð  X]ð  ^ñ  	^ˆå˜^Ð1¨rÑ2Ô2ð Cð C‰ˆˆ4Ø—H’H˜ZÑ(Ô(Ð(ˆDð 	CØÐ$¥s¨1¡v¤vÑ-Ð/A¸4Ð/AÐ/AÐBÑBˆCøå1°/ÑBÔB€NØˆF�F˜F N°7Ô$;ÐOÐ>NÐOÑO€CØ�iÔ ð 3Ø�˜ yÔ1Ð2Ñ2ˆØˆD•#�c‘(”(˜LÐ)Ñ)€CåŒ^˜C°G°À$ÐQXÐajÐkÑkÔk€FØÔ˜AÒÐÝÐ9¨&¬-Ð9Ð9Ñ:Ô:Ð:Øð QÝÐO˜ÐOÐO­S°Ñ->Ô->ÐOÐOÐOÑPÔPÐPØˆ4r   c                 óx  — d}| D ]™}	 t           j                             |¦  «        r-t          j        |¦  «         |dz  }|rt	          d|› �¦  «         ŒP# t
          $ r t	          d|› d�¦  «         Y Œot          $ r}t	          d|› d|› �¦  «         Y d}~Œ’d}~ww xY w|r|dk    rt	          d	|› d
�¦  «         |S )zì
    Clean up temporary audio files.
    
    Args:
        audio_tracks: List of audio file paths to delete
        verbose: Enable verbose output (default: False)
        
    Returns:
        Number of files successfully deleted
    r   r   zCleaned up zWarning: Could not delete z (file may be in use)zWarning: Error deleting r¹  NzSuccessfully deleted z temporary audio file(s))r%   rG   rÍ  ÚunlinkrÎ  ÚPermissionErrorrñ  )r  rÑ  Údeleted_countr‚   r  s        r   Úcleanup_temp_audio_filesr*  Ý  s+  € ð €Mà"ð 
@ð 
@ˆ
ð		@ÝŒw�~Š~˜jÑ)Ô)ð 6Ý”	˜*Ñ%Ô%Ð%Ø Ñ"�Øð 6ÝÐ4¨
Ð4Ð4Ñ5Ô5Ð5øøÝð 	Rð 	Rð 	RÝÐP¨zÐPÐPÐPÑQÔQÐQÐQÐQÝð 	@ð 	@ð 	@ÝÐ>¨ZÐ>Ð>¸1Ð>Ð>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøð ð O�= 1Ò$Ð$ÝÐM mÐMÐMÐMÑNÔNÐNàÐs   ˆAAÁBÁ4	BÁ=BÂBé   Ú	libx264_8Úmp4rF  c	           
      ó  — t          j        | ¦  «        r-t          | j        ¦  «        dk    r|                      d¦  «        } t          ||| ¦  «         d|› �}	|€#t          j        dt          |	¬¦  «        ¦  «        n|}
|
 	                    |	¦  «        st          j
        |
¦  «        d         |	z   }
t          ||¦  «        }d}t          |¦  «        D �].}	 t          j        |
f|ddœ|¤Ž}	 t          j        | ¦  «        �rÐ| j        t           j        k    r€| j        d	k    ru| j        d         d
k    rd|d
k    r^| d                              d
ddd¦  «        }|D ];}|                     |                     ¦   «                              ¦   «         ¦  «         Œ<�n| j        t           j        k    r:|                      ¦   «                              d¦  «                             d¦  «        } |                      d¦  «        D ]Õ}|                     t7          |¦  «        t9          |¦  «        ¦  «        }t:          j                             ||||¬¦  «        }|                      d¦  «         !                    t           j        ¦  «                             d
dd¦  «                             ¦   «                              ¦   «         }|                     |¦  «         ŒÖnÐtE          | tF          tH          f¦  «        rš| r˜t          j        | d         ¦  «        r~| D ]z}|€Œ|j        dk    rU|j        d         dv r|}n|                     d
ddd¦  «        }|D ]'}|                     tK          |||¬¦  «        ¦  «         Œ(Œe|                     |¦  «         Œ{n| D ]}|                     |¦  «         Œ| &                    ¦   «          n# | &                    ¦   «          w xY w|
c S # tN          $ r"}|}tQ          d|› d|› �¦  «         Y d}~�Œ(d}~ww xY wdS )zCSave tensor as video with configurable codec and container options.rH  r   r"   Nú/tmp©r*   rX  )rÄ   Úffmpeg_log_levelrF  r   r0   rJ  g     à_@r  ©Únrowrf  rg  r]  rþ   rI  )rf  rg  zerror saving r¹  ))r1   r2   r‰   r>   Ú	unsqueezerY  rB  rï  r,   rž  rC  Ú_get_codec_paramsrî  ÚimageioÚ
get_writerr/   r^  r:   ÚpermuteÚappend_datar4   r6   r5   rb  ra  ÚunbindÚclamprŠ   r=   ÚtorchvisionÚutilsÚ	make_gridÚmulÚtyperK  rL  rM  rj  r›   rñ  rÎ  )rO  Ú	save_filerÄ   r×   rW  r3  rf  rg  Úretryr*   Ú
cache_fileÚcodec_paramsrX  r  Úwriterr€   re  ÚuÚgridrP  r  s                        r   Ú
save_videorH  ü  si  € õ „�vÑÔð %¥3 v¤|Ñ#4Ô#4¸Ò#9Ð#9Ø×!Ò! !Ñ$Ô$ˆå! *¨i¸Ñ@Ô@Ð@à�ˆ_ˆ_€FØ?HÐ?P•”˜&¥)°6Ð":Ñ":Ô":Ñ;Ô;Ð;ÐV_€JØ×Ò˜vÑ&Ô&ð :Ý”\ *Ñ-Ô-¨aÔ0°6Ñ9ˆ
õ % Z°Ñ;Ô;€Lð €EÝ�5‰\Œ\ð ,4ñ ,4ˆð+	4åÔ'¨
Ðf¸ÈgÐfÐfÐYeÐfÐfˆFð"Ý”? 6Ñ*Ô*ñ 2à”|¥u¤{Ò2Ð2°v´{ÀaÒ7GÐ7GÈFÌLÐYZÌOÐ_`ÒL`ÐL`ÐeiÐmnÒenÐenØ!'¨¤×!2Ò!2°1°a¸¸AÑ!>Ô!>˜Ø%+ð Dð D˜EØ"×.Ò.¨u¯yªy©{¬{×/@Ò/@Ñ/BÔ/BÑCÔCÐCÐCñDð "œ<­5¬;Ò6Ð6Ø%+§\¢\¡^¤^×%8Ò%8¸Ñ%?Ô%?×%DÒ%DÀSÑ%IÔ%I˜FØ!'§¢¨qÑ!1Ô!1ð 6ð 6˜AØ !§¢­¨KÑ(8Ô(8½#¸kÑ:JÔ:JÑ KÔ K˜AÝ#.Ô#4×#>Ò#>Ø !¨¸	È{ð $?ñ $ô $˜Dð %)§H¢H¨S¡M¤M×$6Ò$6µu´{Ñ$CÔ$C×$KÒ$KÈAÈqÐRSÑ$TÔ$T×$XÒ$XÑ$ZÔ$Z×$`Ò$`Ñ$bÔ$b˜EØ"×.Ò.¨uÑ5Ô5Ð5Ð5ð6õ   ­­u¨Ñ6Ô6ð 2¸6ð 2ÅeÄoÐV\Ð]^ÔV_ÑF`ÔF`ð 2Ø!'ð 6ð 6˜Ø ˜=Ø$Ø œ:¨š?˜?Ø$œ{¨2œ°)Ð;Ð;Ø).  à).¯ª°q¸!¸QÀÑ)BÔ)B Ø)/ð Fð F Ø &× 2Ò 2Õ3OÐPUÐajð  yDð  4Eñ  4Eô  4Eñ  !Fô  !Fð  !Fð  !FðFð #×.Ò.¨uÑ5Ô5Ð5Ð5ð6ð "(ð 2ð 2˜Ø×*Ò*¨5Ñ1Ô1Ð1Ð1à—’‘”��ø�—’‘”��øøøàÐÐÐøåð 	4ð 	4ð 	4ØˆEÝÐ2 )Ð2Ð2¨qÐ2Ð2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ñ3øøøøð	4øøøðU,4ð ,4s1   ÃOÃ,J5N6Î!OÎ6OÏOÏ
O?ÏO:Ï:O?c                 ó
  — d|› �}|€#t          j        dt          |¬¦  «        ¦  «        n|}|                     |¦  «        st          j        |¦  «        d         |z   }t          d¦  «        }	|	€t          d¦  «        ‚dx}
}t          | ¦  «        D ]l}|€Œ|j        dk    r|j	        d         d	k    r|d         n|}|j        d
k    r6t          |j	        d         ¦  «        t          |j	        d         ¦  «        }
} nŒm|
�|€t          d¦  «        ‚d}t          |¦  «        D �]Ì}|	dddddddd|
› d|› �dt          |¦  «        d›ddgt          ||¦  «        ¢d‘|‘}t          j        |t          j        t          j        t          j        ¬¦  «        }	 |j        €J ‚d}t'          | ¦  «        D ]}|j                             |¦  «         d}Œ|st          d¦  «        ‚|j                             ¦   «          |j        �@|j                             ¦   «                              d d!¬"¦  «                             ¦   «         nd#}|                     ¦   «         }|dk    rt          |pd$¦  «        ‚|c S # t6          $ rt}|}	 |j        �%|j        j        s|j                             ¦   «          n# t6          $ r Y nw xY w|                     ¦   «          t=          d%|› d&|› �¦  «         Y d}~�ŒÆd}~ww xY w|pt          d'|› �¦  «        ‚)(z7Save linear HDR video as a tagged 10-bit HEVC HDR file.r"   Nr/  r0  r   r   zffmpeg binary not foundrF  r   rH  r0   rJ  z)Unable to determine HDR video dimensions.r…  r†  rX  z-fÚrawvideorz  Ú	gbrpf32lez-video_sizeÚxz
-frameratez.12gr‡  zpipe:0z-an)ÚstdinÚstdoutr¶  FTz No HDR frames available to save.r!   r·  r¸  r   zffmpeg HDR encode failedzerror saving HDR r¹  zFailed to save HDR video: )rB  rï  r,   rž  rC  r   rV  r
   r:   r>   rF   rî  r5   r�  r’  ÚPopenÚPIPEÚDEVNULLrM  r	   rE   r›   r¶  r^   r'   ro  Úwaitrñ  ÚclosedÚkillrÎ  )rO  rA  rÄ   r×   rW  Úpreview_exposurerB  r*   Úoutput_fileÚffmpeg_pathrS  rT  rP  ÚcurrX  r  rÔ   ÚprocessÚwrote_frameÚframe_bytesr¶  Úretr  s                          r   Úsave_hdr_videor]  E  s‹  € ð �ˆ_ˆ_€FØ@IÐ@Q•#”(˜6¥9°FÐ#;Ñ#;Ô#;Ñ<Ô<Ð<ÐW`€KØ×Ò Ñ'Ô'ð <Ý”l ;Ñ/Ô/°Ô2°VÑ;ˆÝ& xÑ0Ô0€KØÐÝÐ4Ñ5Ô5Ð5àÐ€EˆFÝ" 6Ñ*Ô*ð ð ˆØˆ=ØØœ*¨š/˜/¨e¬k¸!¬nÀÒ.AÐ.Aˆe�AŒhˆhÀuˆØŒ8�qŠ=ˆ=Ý ¤	¨!¤Ñ-Ô-­s°3´9¸Q´<Ñ/@Ô/@�EˆFØˆEð ð €}˜˜ÝÐFÑGÔGÐGØ€EÝ�5‰\Œ\ð #8ñ #8ˆà˜˜t WØ�*Ø˜Ø˜eÐ.Ð. fÐ.Ð.Ø�U 3™ZœZÐ.Ð.Ø�(ð

õ ' z°9Ñ=Ô=ð

ð ð

ð ð

ˆõ Ô" 3­j¬oÅjÔFXÕakÔapÐqÑqÔqˆð	8Ø”=Ð,Ð,Ð,ØˆKÝ6°vÑ>Ô>ð #ð #�Ø”×#Ò# KÑ0Ô0Ð0Ø"��Øð GÝ"Ð#EÑFÔFÐFØŒM×ÒÑ!Ô!Ð!ØW^ÔWeÐWq�W”^×(Ò(Ñ*Ô*×1Ò1°'À(Ð1ÑKÔK×QÒQÑSÔSÐSÐwyˆFØ—,’,‘.”.ˆCØ�aŠxˆxÝ" 6Ð#GÐ-GÑHÔHÐHØÐÐÐøÝð 	8ð 	8ð 	8ØˆEðØ”=Ð,°W´]Ô5IÐ,Ø”M×'Ò'Ñ)Ô)Ð)øøÝð ð ð Ø�ðøøøà�LŠL‰NŒNˆNÝÐ6 iÐ6Ð6°1Ð6Ð6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ñ7øøøøð	8øøøð Ð
I•<Ð H¸YÐ HÐ HÑIÔIÐIs=   ÆCI0É0
K.É:K)É=,J*Ê)K)Ê*
J7Ê4K)Ê6J7Ê7,K)Ë)K.c                 ó"   — t          | |¦  «        S )z7Get codec parameters based on codec type and container.)r   )r×   rW  s     r   r5  r5  ˆ  s   € å# J°	Ñ:Ô:Ð:r   Újpeg_95c                 óN  — | j         d         dk    }t          ||¬¦  «        }t          j        |¦  «        d         |d         z   }d}	t	          |¦  «        D �]3}
	 |d         s|�rv| j        t          j        k    r\t          j	         
                    | |d¬¦  «                             d	d
d¦  «                             ¦   «                              ¦   «         }nÔ|                      t          |¦  «        t!          |¦  «        ¦  «        } t          j	         
                    | |||¬¦  «        }|                     d¦  «                             d¦  «                             dd¦  «                             d	d
d¦  «                             dt          j        ¦  «                             ¦   «         }|rdnd}t+          j        ||¬¦  «        } |j        |fi |d         ¤Ž n”| j        t          j        k    }|r'|                      ¦   «                              d¦  «        n/|                      t          |¦  «        t!          |¦  «        ¦  «        } t          j	        j        | |f||rdn||dœ|d         ¤Ž  n3# t6          $ r}|}	Y d}~�Œ-d}~ww xY wt9          d|› d|› d|	› �¦  «        |	‚|S )z:Save tensor as image with configurable format and quality.r   rH  )Úrgbar)  NÚuse_pilF)r3  rf  r   r0   r2  r]  rÿ   r4   ÚRGBAÚRGB)ÚmodeÚparamsr\  zFailed to save image 'z' after z attempts: )r>   Úget_image_formatrB  rC  rî  r/   r1   r^  r<  r=  r>  r8  r4   r6   r;  rŠ   r=   r?  Úadd_r`  rQ   r   Ú	fromarrayÚsaver5   rb  Ú
save_imagerñ  r   )rO  rA  r3  rf  rg  ÚqualityrB  rc  Úformat_inforX  r  rG  re  ÚimgÚ	was_uint8r  s                   r   rk  rk  �  sâ  € ð Œ<˜Œ?˜aÒ€Dõ # 7°Ð6Ñ6Ô6€Kõ ”˜YÑ'Ô'¨Ô*¨[¸Ô-?Ñ?€Ið €Eå�5‰\Œ\ð hñ hˆð	Ø˜9Ô%ð j¨ñ jà”<¥5¤;Ò.Ð.Ý&Ô,×6Ò6°vÀDÐTYÐ6ÑZÔZ×bÒbÐcdÐfgÐijÑkÔk×oÒoÑqÔq×wÒwÑyÔy�D�Dà#Ÿ\š\­#¨kÑ*:Ô*:½CÀÑ<LÔ<LÑMÔM�FÝ&Ô,×6Ò6°vÀDÐT]ÐkvÐ6ÑwÔw�DØŸ8š8 C™=œ=×-Ò-¨cÑ2Ô2×9Ò9¸!¸SÑAÔA×IÒIÈ!ÈQÐPQÑRÔR×UÒUÐV[Õ]bÔ]hÑiÔi×oÒoÑqÔq�DØ!%Ð0�v�v¨5�Ý”o d°Ð6Ñ6Ô6�Ø�”˜Ð<Ð< k°(Ô&;Ð<Ð<Ð<Ð<ð #œL­E¬KÒ7�	Ø7@Ðv˜Ÿš™œ×,Ò,¨UÑ3Ô3Ð3ÀfÇlÂlÕSVÐWbÑScÔScÕehÐitÑeuÔeuÑFvÔFv�ÝÔ!Ô,¨V°Yð  jÀTÐ^gÐUvÐUZÐUZÐmvð  EPð  jð  jð  T_ð  `hô  Tið  jð  jð  jØˆEøÝð 	ð 	ð 	ØˆEØˆHˆHˆH‰Høøøøð	øøøõ Ð[¨yÐ[Ð[À%Ð[Ð[ÐTYÐ[Ð[Ñ\Ô\ÐbgÐgàÐs   ÁHI2É2
J	É<JÊJ	c                 óÐ   — |rd} dddiddœdddiddœdddiddœddd	iddœd
i ddœdddiddœdddiddœdddiddœddd	iddœdddiddœdœ
}|                      | |d         ¦  «        S )zDGet the saved format and parameters; transparent images require PNG.Úpngú.jpgrl  é_   T)r)  rf  rb  éU   éF   é2   ú.pngFú.webpÚlossless)
r_  Újpeg_85Újpeg_70Újpeg_50rq  Úwebp_95Úwebp_85Úwebp_70Úwebp_50Úwebp_losslessr_  rÙ   )rl  ra  Úformatss      r   rg  rg  ¿  sä   € àð Øˆð "¨i¸¨_ÈÐNÐNØ!¨i¸¨_ÈÐNÐNØ!¨i¸¨_ÈÐNÐNØ!¨i¸¨_ÈÐNÐNð ¨¸Ð>Ð>ð #¨y¸"¨oÈ$ÐOÐOØ"¨y¸"¨oÈ$ÐOÐOØ"¨y¸"¨oÈ$ÐOÐOØ"¨y¸"¨oÈ$ÐOÐOØ!(°ZÀÐ4FÐSWÐXÐXðð €Gð" �;Š;�w ¨	Ô 2Ñ3Ô3Ð3r   )r   ÚPngImagePluginc                 ó‚   — d|                       d¦  «        z   S # t          $ r d|                       d¦  «        z   cY S w xY w)Nó   ASCII   Úasciió   UNICODE úutf-16le)ÚencodeÚUnicodeEncodeError)rÇ  s    r   Ú_enc_ucr‹  Ù  sH   € Ø §¢¨'Ñ!2Ô!2Ñ2Ð	2øÝÐIÐIÐI l°Q·X²X¸jÑ5IÔ5IÑ&IÐIÐIÐIÐIøøøs   � ™">½>c                 ót  — t          | t          t          f¦  «        s!t          | ¦  «        } n# t          $ r Y d S w xY w|                      d¦  «        r| dd …                              dd¦  «        S |                      d¦  «        r| dd …                              dd¦  «        S |                      dd¦  «        S )Nr…  r   r†  r·  r‡  rˆ  r!   )rK  r¾  r¿  rñ  r(   r'   )Úbs    r   Ú_dec_ucrŽ  Ý  s­   € Ý�a�%¥Ð+Ñ,Ô,ð &Ý�q‘”ˆQˆQøÝÐ%Ð%Ð%   Ð%øøøØ‡|‚|�NÑ#Ô#ÐK¨A¨a¨b¨b¬E¯LªL¸À(Ñ,KÔ,KÐ%KØ‡|‚|�LÑ!Ô!ÐN¨A¨a¨b¨b¬E¯LªL¸ÀXÑ,NÔ,NÐ%NØ�8Š8�G˜XÑ&Ô&Ð&s   �- ­
;º;c                  ó   — i i i i d dœS )N)Ú0thÚExifÚGPSÚ1stÚ	thumbnailr   r   r   r   Ú_blank_exif_dictr•  æ  s   € Ø˜r¨"°RÀdÐKÐKÐKr   c                 ó^  — dd l }	 |dv r|                     | ¦  «        S |dk    rkt          j        | ¦  «        5 }|j                             d¦  «        }d d d ¦  «         n# 1 swxY w Y   |r|                     |¦  «        nt          ¦   «         S n# t          $ r Y nw xY wt          ¦   «         S )Nr   ©rr  ú.jpegrx  Úexif)ÚpiexifÚloadr   Úopenr~   rÚ   r•  rñ  )Ú
image_pathr)  rš  ÚimÚ
exif_bytess        r   Ú_load_exif_dictr   ê  s  € Ø€M€M€MðØÐ#Ð#Ð#Ø—;’;˜zÑ*Ô*Ð*Ø�'Š>ˆ>Ý”˜JÑ'Ô'ð 1¨2ØœWŸ[š[¨Ñ0Ô0�
ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1à.8ÐP�6—;’;˜zÑ*Ô*Ð*Õ>NÑ>PÔ>PÐPð øõ ð ð ð ØˆðøøøåÑÔÐs9   †B ŸB ¹A ÁB Á A$Á$B Á'A$Á('B Â
BÂBc                 óð   — dd l }t          | |¦  «        }|                     di ¦  «         t          |¦  «        |d         |j        j        <   |                     |                     |¦  «        | ¦  «         d S )Nr   r‘  )rš  r   Ú
setdefaultr‹  ÚExifIFDÚUserCommentÚinsertÚdump)r�  Úcomment_textr)  rš  Ú	exif_dicts        r   Ú_insert_exif_user_commentr©  ø  sr   € Ø€M€M€MÝ 
¨CÑ0Ô0€IØ×Ò˜ Ñ$Ô$Ð$Ý4;¸LÑ4IÔ4I€IˆfÔ�f”nÔ0Ñ1Ø
‡M‚M�&—+’+˜iÑ(Ô(¨*Ñ5Ô5Ð5Ð5Ð5r   s   ‰PNG

c                 ó®   — t          j        dt          |¦  «        ¦  «        | z   |z   t          j        dt          j        | |z   ¦  «        dz  ¦  «        z   S )Nú>Il   ÿÿ )ÚstructÚpackr‰   ÚzlibÚcrc32©Ú
chunk_typerÎ   s     r   Ú_build_png_chunkr²    sN   € ÝŒ;�t�S ™YœYÑ'Ô'¨*Ñ4°tÑ;½f¼kÈ$ÕPTÔPZÐ[eÐhlÑ[lÑPmÔPmÐpzÑPzÑ>{Ô>{Ñ{Ð{r   c                 óN   — | dvrdS |                      dd¦  «        d         dk    S )N>   ó   iTXtó   tEXtó   zTXtFó    r   r   s   comment)Úsplitr°  s     r   Ú_is_png_comment_chunkr¹    s1   € ØÐ4Ð4Ð4ØˆuØ�:Š:�g˜qÑ!Ô! !Ô$¨
Ò2Ð2r   c                 óø  — t          | d¦  «                             ¦   «         }|                     t          ¦  «        st	          d¦  «        ‚t          dd|                     d¦  «        z   ¦  «        }t          t          ¦  «        }t          t          ¦  «        }d}|t          |¦  «        k     rü|dz   t          |¦  «        k    rt	          d¦  «        ‚t          j
        d	|||d
z   …         ¦  «        d         }||d
z   |dz   …         }|dz   |z   }	|	t          |¦  «        k    rt	          d¦  «        ‚||dz   |dz   |z   …         }
|||	…         }|	}t          ||
¦  «        rŒÈ|s|dk    r|                     |¦  «         d}|                     |¦  «         |t          |¦  «        k     °ü|st	          d¦  «        ‚t          | d¦  «        5 }|                     |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NÚrbúInvalid PNG signaturer´  s   comment     r!   Fr   zCorrupted PNG chunk headerr«  rH  r   é   zCorrupted PNG chunk payloads   IDATTzPNG image data chunk not foundÚwb)rœ  r^   r(   Ú_PNG_SIGNATUREra   r²  r‰  r¿  r‰   r¬  Úunpackr¹  ÚextendrE   )r�  r§  ÚrawÚcomment_chunkÚoutÚposÚinsertedr)   r±  r¨   Ú
chunk_datarP  rE  s                r   Ú_write_png_comment_metadatarÈ    sF  € Ý
ˆz˜4Ñ
 Ô
 ×
%Ò
%Ñ
'Ô
'€CØ�>Š>�.Ñ)Ô)ð 2ÝÐ0Ñ1Ô1Ð1Ý$ WÐ.LÈ|×ObÒObÐcjÑOkÔOkÑ.kÑlÔl€MÝ
•NÑ
#Ô
#€CÝ
�nÑ
Ô
€CØ€HØ
•�C‘”Š.ˆ.Ø�‰7•S˜‘X”XÒÐÝÐ9Ñ:Ô:Ð:Ý”˜t S¨¨S°1©W¨Ô%5Ñ6Ô6°qÔ9ˆØ˜˜q™  q¡˜Ô)ˆ
Ø�B‰h˜ÑˆØ•�S‘”Š>ˆ>ÝÐ:Ñ;Ô;Ð;Ø˜˜q™  q¡¨6Ñ!1Ð1Ô2ˆ
Ø�C˜�G”ˆØˆÝ  ¨ZÑ8Ô8ð 	ØØð 	˜J¨'Ò1Ð1Ø�JŠJ�}Ñ%Ô%Ð%ØˆHØ�
Š
�5ÑÔÐð! •�C‘”Š.ˆ.ð" ð ;ÝÐ9Ñ:Ô:Ð:Ý	ˆj˜$Ñ	Ô	ð  6Ø�Š�SÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÇG/Ç/G3Ç6G3c                 ón  — 	 t          j        |d¬¦  «        }t          j                             | ¦  «        d                              ¦   «         }|dk    rt          | |¦  «         dS |dv rt          | ||¦  «         dS t          d¦  «        ‚# t          $ r}t          d|› �¦  «         Y d }~dS d }~ww xY w)	NF)Úensure_asciir   rw  T)rr  r˜  rx  zUnsupported formatzError saving metadata: )ÚjsonÚdumpsr%   rG   rC  r}   rÈ  r©  ra   rñ  rÎ  )r�  Úmetadata_dictÚsave_kwargsÚjr)  r  s         r   Úsave_image_metadatarÐ  +  sÑ   € ð	;ÝŒJ�}°5Ð9Ñ9Ô9ˆÝŒg×Ò˜zÑ*Ô*¨1Ô-×3Ò3Ñ5Ô5ˆØ�&Š=ˆ=Ý'¨
°AÑ6Ô6Ð6¸t¸tØÐ,Ð,Ð,Ý% j°!°SÑ9Ô9Ð9À$À$ÝÐ-Ñ.Ô.Ð.øÝð ;ð ;ð ;ÝÐ+¨Ð+Ð+Ñ,Ô,Ð,°U°U°U°U°U°Uøøøøð;øøøs$   ‚A#B Á'B Á>B Â
B4ÂB/Â/B4c                 ó2  — 	 t           j                             | ¦  «        d                              ¦   «         }|dk    �r6t	          | d¦  «        5 }|                     d¦  «        t          k    rt          d¦  «        ‚t          j	        |¦  «        }	 	 |                     ¦   «         \  }}}|dk    rnL|dv r.| 
                    |||¦  «        }|                     ||¦  «         n|                     |d	z   d¦  «         Œk|j                             d
¦  «        }|rt          j        |¦  «        nd 	 |                     ¦   «          cd d d ¦  «         S # |                     ¦   «          w xY w# 1 swxY w Y   t%          j        | ¦  «        5 }	|dv �r“dd l}
	 |
                     | ¦  «                             di ¦  «                             |
j        j        ¦  «        }|rt/          |¦  «        nd }|r t          j        |¦  «        cd d d ¦  «         S n# t0          $ r Y nw xY w|	j                             d
¦  «        }t5          |t6          t8          f¦  «        r|                     dd¦  «        }|r0t          j        |¦  «        cd d d ¦  «         S # t0          $ r Y nw xY w t=          |	dd„ ¦  «        ¦   «         }|rZ|                     d¦  «        }|rt/          |¦  «        nd }|r0t          j        |¦  «        cd d d ¦  «         S # t0          $ r Y nw xY w	 d d d ¦  «         d S |dk    r«dd l}
|	j                             d¦  «        }|s	 d d d ¦  «         d S |
                     |¦  «                             di ¦  «                             |
j        j        ¦  «        }|rt/          |¦  «        nd }|rt          j        |¦  «        nd cd d d ¦  «         S 	 d d d ¦  «         d S # 1 swxY w Y   d S # t0          $ r}t?          d|› �¦  «         Y d }~d S d }~ww xY w)Nr   rw  r»  r   r¼  Ts   IEND)rµ  r¶  r´  rH  Úcommentr—  r   r‘  r!   r·  Úgetexifc                  ó   — d S rC   r   r   r   r   ú<lambda>z%read_image_metadata.<locals>.<lambda>]  s   € °d€ r   i†’  rx  r™  zError reading metadata: ) r%   rG   rC  r}   rœ  r^   r¿  ra   rƒ  Ú	PngStreamÚcallÚcrcrÂ   Úim_textrÚ   rË  Úloadsr›   r   rš  r›  r£  r¤  rŽ  rñ  r~   rK  r¾  r¿  r'   r½  rÎ  )r�  r)  Úfprq  ÚcidrÅ  r)   rÎ   Úvalrž  rš  ÚucrÇ  r™  rŸ  r  s                   r   Úread_image_metadatarß  7  sM  € ð6;ÝŒg×Ò˜zÑ*Ô*¨1Ô-×3Ò3Ñ5Ô5ˆØ�&Š=‰=å�j $Ñ'Ô'ð  ¨2Ø—7’7˜1‘:”:¥Ò/Ð/Ý$Ð%<Ñ=Ô=Ð=Ý$Ô.¨rÑ2Ô2�ð ð3Ø+.¯8ª8©:¬:Ñ(˜˜S &Ø 'š>˜>Ø!ØÐ"=Ð=Ð=Ø#&§8¢8¨C°°fÑ#=Ô#=˜DØŸGšG C¨Ñ.Ô.Ð.Ð.àŸGšG F¨Q¡J°Ñ2Ô2Ð2ð3ð œ+Ÿ/š/¨)Ñ4Ô4�CØ.1Ð;�4œ: c™?œ?˜?°tÐ;à—I’I‘K”K�Kð# ð  ð  ð  ñ  ô  ð  ð  øð" —I’I‘K”K�K�Køøøð# ð  ð  ð  øøøð  ð  ð  ð  õ$ ŒZ˜
Ñ#Ô#ð 	 rØÐ'Ð'Ñ'Ø���ðØŸš ZÑ0Ô0×4Ò4°V¸RÑ@Ô@×DÒDÀVÄ^ÔE_Ñ`Ô`�BØ')Ð3� ™œ˜¨t�AØð -Ý#œz¨!™}œ}ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð-øå ð ð ð Ø�Dðøøøà”g—k’k )Ñ,Ô,�Ý˜c¥E­9Ð#5Ñ6Ô6Ð[¸c¿jºjÈÐRZÑ>[Ô>[¸Øð +Ý $¤
¨3¡¤ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øõ %Ð*Ð*Ð* d dÐ*øøøØ;•w˜r 9¨l¨lÑ;Ô;Ñ=Ô=�Øð /ØŸš %™œ�BØ')Ð3� ™œ˜¨t�AØð /Ý$(¤J¨q¡M¤Mð)	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øõ*  )Ð.Ð.Ð.¨$¨$Ð.øøøØð-	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð. �gŠ~ˆ~Ø���ØœWŸ[š[¨Ñ0Ô0�
Ø!Ð.¨$ð5	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð6 —[’[ Ñ,Ô,×0Ò0°¸Ñ<Ô<×@Ò@ÀÄÔA[Ñ\Ô\�Ø#%Ð/•G˜B‘K”K�K¨4�Ø()Ð3•t”z !‘}”}�}¨tð;	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð< ð=	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øõ> ð ;ð ;ð ;ÝÐ,¨Ð,Ð,Ñ-Ô-Ð-°d°d°d°d°d°døøøøð;øøøs  ‚AO/ ÁAE+ÂBEÄ1E+ÅO/ ÅE(Å(E+Å+E/Å/O/ Å2E/Å3O/ Æ

O"ÆA.HÈO/ ÈO"È
HÈO"ÈHÈAO"É/JÊO/ Ê
JÊO"ÊJÊA	O"Ë%LË8O/ Ì
LÌO"ÌLÌO"ÌO/ Ì#'O"Í
O/ ÍA0O"ÏO/ ÏO"ÏO/ Ï"O&Ï&O/ Ï)O&Ï*O/ Ï/
PÏ9PÐP)r   r   )Nr   Fr   NFr   r£   )Nry   r‘   r’   )Nr   TT)NNrC   )Nr  N)TrZ  )rk  )NNF)r'  )FFr6  N)FNr6  FFry   )Nr6  FNN)F)Nr+  r,  r-  r   TrZ  rF  )Nr+  r,  r-  ry   rF  )r   TrZ  r_  rF  )pr’  r™   r%   r   r¬  Útypingr   Ú!torchvision.transforms.functionalÚ
transformsrO   ÚTFÚtorch.nn.functionalÚnnÚFÚcv2r6  Úsharedr   r#   r<  r1   ÚPILr   Úos.pathrG   rB  rË  r6   r7   Ú	soundfilerD   r®  rp  Úhdrr   r   r	   r
   Úvideo_decoder   r   Úvideo_codecsr   r   r   r   Úvirtual_mediar   r   r   r   r   r,   rA   rJ   rX   rt   r†   r�   r¡   r©   r±   r`   r½   rÑ   ræ   ré   rõ   rü   r  r  r%  r4  r?  rD  rN  rY  rj  r|   ru  rL  r�  rƒ  r–  r¢  rM  ÚdictrF   r®  rÃ  rÞ  r  r  r%  r*  rH  r]  r5  rk  rg  rƒ  r‹  rŽ  r•  r   r©  r¿  r²  r¹  rÈ  rÐ  rß  r   r   r   ú<module>rñ     sª  ðà Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ð Ð Ð Ø 
€
€
€
Ø €€€Ø €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø cÐ cÐ cÐ cÐ cÐ cÐ cÐ cÐ cÐ cÐ cÐ cà KÐ KÐ KÐ KÐ KÐ KÐ KÐ Kð Fð  Fð  Fð  Fð  Fð  Fð  Fð  Fð  Fð  Fð  Fð  FØ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hð6ð 6ð 6ð8ð 8ð 8ðð ð ð ð
ð 
ð 
ðð ð ð	cð 	cð 	cðqð qð qð qðD`ð `ð `ð0ð 0ð 0ð 0ðVð Vð Vð Vð;ð ;ð ;ð	ð 	ð 	ðQð Qð Qð.Kð Kð Kðð ð ð ð>,ð ,ð ,ð)ð )ð )ðð ð ð*	ð 	ð 	ð 	ð#ð #ð #ð #ð,@ð @ð @ð
ð 
ð 
ð 
ð4ð 4ð 4ð 
8ð 
8ð 
8ð3ð 3ð 3ð 3ðð ð ð "ð "ð "ð`ð `ð `ð `ðAð A S¨4¡Zð A¸#ð AÈð Að Að Að Að¨¨t©ð ÀÀdÁ
ð ÈtÐTWÌyð ð ð ð ð 7ð 7ð 7ð
hð 
hð 
hð 
hðð ð ð ð.6¨sð 6°u¸SÀ$ÀsÈCÀxÄ.ÐRUÐ=UÔ7Vð 6ð 6ð 6ð 6ð,ð ð ð.M ð M ð M ð M ðj ØØØØØðb5ð b5ð b5ð b5ðJRð Rð Rð JNð2ð 2ð 2ð 2ðjð ð ð ð@ ØØ&ØØØØ#ØðF4ð F4ð F4ð F4ðV ØØ&ØØ!$Øð@Jð @Jð @Jð @JðF;ð ;ð ;ð ØØ#Ø!Øð-ð -ð -ð -ð`4ð 4ð 4ð 4ð0 &Ð %Ð %Ð %Ð %Ð %Ð %Ð %ðJð Jð Jð'ð 'ð 'ðLð Lð Lðð ð ð6ð 6ð 6ð &€ð|ð |ð |ð3ð 3ð 3ðð ð ð<
;ð 
;ð 
;ð7;ð 7;ð 7;ð 7;ð 7;r   