
    qi                        d dl mZ d dlZd dlmZ d dlmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ e G d d             Z G d d      Zy)    )annotationsN)	dataclass)AnyAsyncIteratorOptional   )	FfiClient	FfiHandle)ffi_pb2)video_frame_pb2)TrackSource)	RingQueuetask_done_logger)Participant)Track)
VideoFramec                  ,    e Zd ZU ded<   ded<   ded<   y)VideoFrameEventr   frameinttimestamp_uszproto_video_frame.VideoRotationrotationN)__name__
__module____qualname____annotations__     J/opt/pipecat/venv/lib/python3.12/site-packages/livekit/rtc/video_stream.pyr   r      s    --r   r   c                      e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZedddd	 	 	 	 	 	 	 	 	 	 	 dd       Zedddd	 	 	 	 	 	 	 	 	 dd       ZddZdd	Z		 	 	 	 	 	 dd
Z
ddZddZddZddZddZy)VideoStreamzDVideoStream is a stream of video frames received from a RemoteTrack.Nr   c                p   |xs t        j                         | _        t        j                  j
                  j                  | j                  d       | _        t        |      | _	        || _
        || _        || _        || _        d }d|v r| j                  |d   |d         }n| j                         }t        |j                   j"                        | _        |j&                  | _        | j                  j+                  | j-                               | _        | j.                  j1                  t2               y )Nc                *    | j                  d      dk(  S )Nmessagevideo_stream_event)
WhichOneof)es    r   <lambda>z&VideoStream.__init__.<locals>.<lambda>6   s    Y 7;O O r   )	filter_fnparticipanttrack_source)r*   r+   )asyncioget_event_loop_loopr	   instancequeue	subscribe
_ffi_queuer   _queue_track_format	_capacity%_create_owned_stream_from_participant_create_owned_streamr
   handleid_ffi_handleinfo_infocreate_task_run_taskadd_done_callbackr   )selftrackloopcapacityformatkwargsstreams          r   __init__zVideoStream.__init__)   s    5W335
 $,,22<<JJO = 
 :C89L$)!F"??"=1~@V @ F ..0F$V]]%5%56[[
ZZ++DIIK8


$$%56r   )rD   rF   rE   c               $    t        |||||d       S )N)r*   r+   rD   rE   rF   rC   r!   )clsr*   r+   rD   rF   rE   s         r   from_participantzVideoStream.from_participantK   s#     #%
 	
r   c                    t        ||||      S )N)rC   rD   rE   rF   rK   )rL   rC   rD   rF   rE   s        r   
from_trackzVideoStream.from_track^   s     	
 	
r   c                j    t         j                  j                  j                  | j                         y N)r	   r/   r0   unsubscriber2   rB   s    r   __del__zVideoStream.__del__n   s       ,,T__=r   c                   | j                   J t        j                         }|j                  }| j                   j                  j
                  |_        t        j                  j                  |_
        | j                  | j                  |_        d|_        t        j                  j!                  |      }|j                  j"                  S NT)r4   	proto_ffi
FfiRequestnew_video_streamr;   r9   track_handleproto_video_frameVideoStreamTypeVIDEO_STREAM_NATIVEtyper5   rF   normalize_strider	   r/   requestrH   )rB   reqrY   resps       r   r8   z VideoStream._create_owned_streamq   s    {{&&&""$//(,(?(?(F(F% 1 A A U U<<#&*ll#,0)!!))#.$$+++r   c                v   t        j                         }|j                  }|j                  j                  |_        t        j                  j                  |_	        ||_
        d|_        | j                  | j                  |_        t        j                  j!                  |      }|j                  j"                  S rV   )rW   rX   video_stream_from_participantr;   r9   participant_handler[   r\   r]   r^   r+   r_   r5   rF   r	   r/   r`   rH   )rB   r*   r+   ra   rd   rb   s         r   r7   z1VideoStream._create_owned_stream_from_participant}   s     ""$(+(I(I%;F;R;R;Y;Y%8->-N-N-b-b%*5A%29=%6<<#37<<)0!!))#.11888r   c                ,  K   	 | j                   j                  | j                         d {   }|j                  }|j	                  d      r}|j
                  j                  }t        j                  |      }t        ||j
                  j                  |j
                  j                        }| j                  j                  |       n|j	                  d      rnt        j                  j                   j#                  | j                          y 7 w)Nframe_received)r   r   r   eos)r2   wait_for	_is_eventr%   HasFieldrg   bufferr   _from_owned_infor   r   r   r3   putr	   r/   r0   rR   )rB   eventvideo_eventowned_buffer_infor   s        r   r?   zVideoStream._run   s     //224>>BBE22K##$45$/$>$>$E$E!"334EF'!,!;!;!H!H(77@@ &%%e,! $ 	  ,,T__=# Cs   *DDC&Dc                l   K   | j                   j                          | j                   d {    y 7 wrQ   )r;   disposer@   rS   s    r   aclosezVideoStream.aclose   s%       "jjs   *424c                \    |j                   j                  | j                  j                  k(  S rQ   )r%   stream_handler;   r9   )rB   r'   s     r   rj   zVideoStream._is_event   s%    ##11T5E5E5L5LLLr   c                    | S rQ   r   rS   s    r   	__aiter__zVideoStream.__aiter__   s    r   c                   K   | j                   j                         rt        | j                  j	                          d {   }|t        |S 7 wrQ   )r@   doneStopAsyncIterationr3   get)rB   items     r   	__anext__zVideoStream.__anext__   sB     ::??$$[[__&&<$$	 's   >A AA)Nr   N)
rC   r   rD   #Optional[asyncio.AbstractEventLoop]rE   r   rF   5Optional[proto_video_frame.VideoBufferType.ValueType]returnNone)r*   r   r+   TrackSource.ValueTyperD   r   rF   r   rE   r   r   r!   )
rC   r   rD   r   rF   r   rE   r   r   r!   )r   r   )r   r   )r*   r   r+   r   r   r   )r'   zproto_ffi.FfiEventr   bool)r   zAsyncIterator[VideoFrameEvent])r   r   )r   r   r   __doc__rI   classmethodrM   rO   rT   r8   r7   r?   rt   rj   rx   r~   r   r   r   r!   r!   &   s6   N
 59HL 7 7 2 7 	 7
 F 7 
 7D  59HL
 !
 ,	

 2
 F
 
 

 
$ 
 59HL
 
 2	

 F
 
 

 
>
,9&96K9	9>*Mr   r!   )
__future__r   r,   dataclassesr   typingr   r   r   _ffi_clientr	   r
   _protor   rW   r   r[   _proto.track_pb2r   _utilsr   r   r*   r   rC   r   video_framer   r   r!   r   r   r   <module>r      sS    #  ! / / - ( 8 ) / $  # . . .L Lr   