§
    >ËjI  ã                  ó¾   — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlZddlmZmZmZ e G d	„ d
¦  «        ¦   «         Zdd„Z G d„ d¦  «        ZdS )už   
Video Ingestion Module for VideoDetection.
Sá»­ dá»¥ng FFmpeg trá»±c tiáº¿p qua subprocess Ä‘á»ƒ stream raw frames mÃ  khÃ´ng gÃ¢y ngháº½n I/O Ä‘Ä©a cá»©ng.
é    )ÚannotationsN)Ú	dataclass)ÚPath)Ú	GeneratorÚListÚOptionalÚTupleé   )ÚTEMP_DIRÚget_ffmpeg_pathÚget_ffprobe_pathc                  óL   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   d
S )ÚVideoMetadatar   ÚpathÚfloatÚduration_secÚintÚwidthÚheightÚfpsÚtotal_framesN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú8C:\Projects\VideoDetection\src\ingestion\video_loader.pyr   r      sN   € € € € € € à€J€J�JØÐÐÑØ€J€J�JØ€K€K�KØ€J€J�JØÐÐÑÐÐr   r   Ú
video_pathr   Úreturnc                ó  — t          ¦   «         dddddddddd	t          | ¦  «        g}t          j        |t          j        t          j        d
d¬¦  «        }|j        dk    rt          d| › d|j        › �¦  «        ‚t          j	        |j
        ¦  «        }|                     di g¦  «        d         }|                     di ¦  «        }t          |                     dd¦  «        ¦  «        }t          |                     dd¦  «        ¦  «        }|                     dd¦  «        }d|v rM|                     d¦  «        \  }	}
t          |
¦  «        dk    rt          |	¦  «        t          |
¦  «        z  nd}nt          |¦  «        }|                     d¦  «        p|                     d¦  «        pd}t          |¦  «        }t          |                     d¦  «        pt          ||z  ¦  «        ¦  «        }t          | |||||¬¦  «        S )uB   Láº¥y thÃ´ng tin ká»¹ thuáº­t cá»§a video báº±ng ffprobe portable.ú-vÚerrorz-select_streamszv:0z-show_entriesz3stream=width,height,r_frame_rate,duration,nb_frameszformat=durationz-ofÚjsonTF)ÚstdoutÚstderrÚtextÚcheckr   u$   KhÃ´ng thá»ƒ Ä‘á»�c metadata video 'z': ÚstreamsÚformatr   r   Úr_frame_ratez25/1ú/g      9@ÚdurationÚ0Ú	nb_frames)r   r   r   r   r   r   )r   ÚstrÚ
subprocessÚrunÚPIPEÚ
returncodeÚRuntimeErrorr&   r$   Úloadsr%   Úgetr   Úsplitr   r   )r   Úffprobe_cmdÚresultÚinfoÚstreamÚfmtr   r   Úfps_strÚnumÚdenr   Úduration_strr   r   s                  r   Úget_video_metadatarB      sý  € õ 	ÑÔØˆgØ˜5ØÐNØÐ*ØˆvÝˆJ‰Œð€Kõ Œ^ØÝŒÝŒØØðñ ô €Fð Ô˜AÒÐÝÐ`À*Ð`Ð`ÐQWÔQ^Ð`Ð`ÑaÔaÐaåŒ:�f”mÑ$Ô$€DØ�XŠX�i " Ñ&Ô& qÔ)€FØ
�(Š(�8˜RÑ
 Ô
 €Cå�—
’
˜7 AÑ&Ô&Ñ'Ô'€EÝ�—’˜H aÑ(Ô(Ñ)Ô)€Fð �jŠj˜¨Ñ0Ô0€GØ
ˆg€~€~Ø—=’= Ñ%Ô%‰ˆˆSÝ).¨s©¬°qª¨�e�C‰jŒj�5 ™:œ:Ñ%Ð%¸dˆˆå�G‰nŒnˆð —:’:˜jÑ)Ô)ÐG¨S¯WªW°ZÑ-@Ô-@ÐGÀC€LÝ˜Ñ&Ô&€Lå�v—z’z +Ñ.Ô.ÐIµ#°lÀSÑ6HÑ2IÔ2IÑJÔJ€LåØØ!ØØØØ!ðñ ô ð r   c                  ó,   — e Zd ZdZ	 	 	 	 ddd„Zdd„ZdS )ÚVideoClipExtractoru²   
    TrÃ­ch xuáº¥t spatio-temporal video clips cho mÃ´ hÃ¬nh V-JEPA 2.
    Má»—i clip gá»“m T frames (máº·c Ä‘á»‹nh 16) táº¡i Ä‘á»™ phÃ¢n giáº£i HxW (máº·c Ä‘á»‹nh 224x224).
    é   éà   ç      0@ç      ð?Úclip_framesr   Útarget_sizeÚ
target_fpsr   Ú
stride_secr    ÚNonec                ód   — || _         || _        || _        || _        t	          ¦   «         | _        d S )N)rI   rJ   rK   rL   r   Ú
ffmpeg_bin)ÚselfrI   rJ   rK   rL   s        r   Ú__init__zVideoClipExtractor.__init__X   s3   € ð 'ˆÔØ&ˆÔØ$ˆŒØ$ˆŒÝ)Ñ+Ô+ˆŒˆˆr   r   r   ú/Generator[Tuple[float, np.ndarray], None, None]c              #  óÖ  K  — t          |¦  «        }|j        dk    rdS | j        dddt          |¦  «        dd| j        › d| j        › d	| j        › �d
ddddg}| j        | j        z  dz  }g }d}d| j        z  }t          j        |t          j        t          j        d¬¦  «        5 }|j	        €J ‚d}		 |j	         
                    |¦  «        }
t          |
¦  «        |k     rnòt          j        |
t          j        ¬¦  «                             | j        | j        df¦  «        }|                     |¦  «         t          |¦  «        | j        k    ryt          j        |d¬¦  «        }t'          d|| j        |z  z
  ¦  «        }||fV — t'          dt)          | j        | j        z  ¦  «        ¦  «        }|| j        k    rg }n
||d…         }||z  }|	dz  }	�Œ 	 ddd¦  «         dS # 1 swxY w Y   dS )u†   
        Sinh cÃ¡c video clips theo dáº¡ng generator.
        Yield: (timestamp_start_sec, clip_array[16, 224, 224, 3] uint8)
        r   Nr"   r#   z-iz-vfzfps=z,scale=ú:z-fÚrawvideoz-pix_fmtÚrgb24ú-é   g        rH   i€–˜ )r%   r&   ÚbufsizeT)Údtype)Úaxisé   )rB   r   rO   r0   rK   rJ   r1   ÚPopenr3   r%   ÚreadÚlenÚnpÚ
frombufferÚuint8ÚreshapeÚappendrI   ÚstackÚmaxr   rL   )rP   r   ÚmetaÚcmdÚframe_bytesÚclip_bufferÚcurrent_time_secÚframe_interval_secÚprocÚ	frame_idxÚ	raw_frameÚframeÚclip_npÚtimestamp_startÚskip_framess                  r   Úextract_clipsz VideoClipExtractor.extract_clipse   s~  è è € õ " *Ñ-Ô-ˆØÔ Ò!Ð!ØˆFð ŒOØ�'Ø•#�j‘/”/ØÐW˜$œ/ÐWÐW°$Ô2BÐWÐWÀTÔEUÐWÐWØ�*Ø˜Øð
ˆð Ô&¨Ô)9Ñ9¸AÑ=ˆØ(*ˆØÐØ  4¤?Ñ2ÐåÔØÝ”?Ý”?Øð	
ñ 
ô 
ð 	ð
 Ø”;Ð*Ð*Ð*ØˆIðØ œK×,Ò,¨[Ñ9Ô9�	Ý�y‘>”> KÒ/Ð/Øåœ iµr´xÐ@Ñ@Ô@×HÒHØÔ% tÔ'7¸Ð;ñô �ð ×"Ò" 5Ñ)Ô)Ð)å�{Ñ#Ô# tÔ'7Ò7Ð7Ý œh {¸Ð;Ñ;Ô;�GÝ&)¨#Ð/?À4ÔCSÐVhÑChÑ/iÑ&jÔ&j�OØ*¨GÐ4Ð4Ð4Ð4õ #& a­¨T¬_¸t¼Ñ-NÑ)OÔ)OÑ"PÔ"P�KØ" dÔ&6Ò6Ð6Ø&(˜˜à&1°+°,°,Ô&?˜à Ð$6Ñ6Ð Ø˜Q‘�	ñ/ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   Â#D-GÇG"Ç%G"N)rE   rF   rG   rH   )
rI   r   rJ   r   rK   r   rL   r   r    rM   )r   r   r    rR   )r   r   r   Ú__doc__rQ   rt   r   r   r   rD   rD   R   sY   € € € € € ðð ð ØØ Øð,ð ,ð ,ð ,ð ,ð:ð :ð :ð :ð :ð :r   rD   )r   r   r    r   )ru   Ú
__future__r   r$   r1   Údataclassesr   Úpathlibr   Útypingr   r   r   r	   Únumpyr`   Ú
core.pathsr   r   r   r   rB   rD   r   r   r   ú<module>r|      s/  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à Ð Ð Ð à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dð ðð ð ð ð ñ ô ñ „ðð3ð 3ð 3ð 3ðlMð Mð Mð Mð Mñ Mô Mð Mð Mð Mr   