
    HuiI                        d dl Z d dlmZ d dl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 d d	lmZ d d
lmZmZ d dlmZmZ d dlmZ ej8                  defd       Zej>                   G d de              Zy)    N)Fraction)libav)Codec)CodecContextwrap_codec_context)StreamContainer)_Dictionary)	err_check)Packet)Streamwrap_stream)dict_to_avdictto_avrational)
Dictionaryselfc                    t               | _        | j                  r| j                  s	 | j	                  t        j                  | j                               | j                  m| j                  j                  j                  t
        j                  z  s<t        j                  t        j                  | j                  j                               d| _        y y y # | j                  m| j                  j                  j                  t
        j                  z  s<t        j                  t        j                  | j                  j                               d| _        w xY w)NT)r   streams_started_doner
   libav_write_trailerptrfileoformatflagsAVFMT_NOFILEavio_closepcythonaddresspbr   s    E/opt/pipecat/venv/lib/python3.12/site-packages/av/container/output.pyclose_outputr#      s    "$DL}}TZZ	NN3//9:yy $((*:*:*@*@3CSCS*Stxx{{ ;<DJ (} yy $((*:*:*@*@3CSCS*Stxx{{ ;<DJs   .C BEc                       e Zd Zd Zd Zddedz  fdZ	 ddededz  fdZ	ded	efd
Z
dededefdZddedz  fdZej                   d        Zed        Zed        Zed        Zed        Zd Zd ZdefdZy)OutputContainerc                     t               | _        i | _        t        j                  5  t        j                         | _        d d d        y # 1 sw Y   y xY wN)r   r   metadatar   nogilr   av_packet_alloc
packet_ptr)r   argskwargss      r"   	__cinit__zOutputContainer.__cinit__#   s?    &(\\ 	4!113DO	4 	4 	4s   A

Ac                     t        |        t        j                  5  t        j                  t        j
                  | j                               d d d        y # 1 sw Y   y xY wr'   )r#   r   r)   r   av_packet_freer   r+   r!   s    r"   __dealloc__zOutputContainer.__dealloc__)   sE    T\\ 	@v~~doo>?	@ 	@ 	@s   3AA!Noptionsc                    t        |d      }|j                  }t        j                  | j                  j                  |j
                  t        j                        s/t        | j                  j                  d|j                  d      t        j                  | j                  |      }t        j                  |      }|j                  t        j                  k(  rt        j                  |_        |j!                  dd      |_        |j!                  dd      |_        |j!                  dd	      |_        |j!                  d
d      |_        	 t+        |j!                  d      t-        j.                  |j0                               t+        |xs dt-        j.                  |j4                               |j4                  |_        |j0                  |_        n
|j                  t        j8                  k(  r|j:                  d	   |_        |j!                  dd	      |_        |j!                  d
d      |_        	 t+        |j!                  d      t-        j.                  |j0                               |d|_        n$t        |      t@        u r||_        ntC        d      |j0                  |_        t        jD                  t-        j.                  |jF                        d       | j                  j                  jH                  t        jJ                  z  r#|xjH                  t        jL                  z  c_$        tO        t        jP                  |jR                  |             tU        ||d      }	tW        | ||	      }
| jX                  j[                  |
       |r|
j\                  j_                  |       |ja                         D ]  \  }}tc        |
||        |
S # t2        $ r Y ]w xY w# t2        $ r Y w xY w)a  add_stream(codec_name, rate=None)

        Creates a new stream from a codec name and returns it.
        Supports video, audio, and subtitle streams.

        :param codec_name: The name of a codec.
        :type codec_name: str
        :param dict options: Stream options.
        :param \**kwargs: Set attributes for the stream.
        :rtype: The new :class:`~av.stream.Stream`.

        w format does not support  codecwidthi  heighti  bit_rater   bit_rate_tolerancei  	time_base   i }  Ni  z'audio stream `rate` must be: int | None   )2r   r   r   avformat_query_codecr   idFF_COMPLIANCE_NORMAL
ValueErrorformatnameavformat_new_streamavcodec_alloc_context3typeAVMEDIA_TYPE_VIDEOAV_PIX_FMT_YUV420Ppix_fmtpopr7   r8   r9   r:   r   r   r   r;   KeyError	framerateavg_frame_rateAVMEDIA_TYPE_AUDIOsample_fmts
sample_fmtsample_rateint	TypeErrorav_channel_layout_default	ch_layoutr   AVFMT_GLOBALHEADERAV_CODEC_FLAG_GLOBAL_HEADERr
   avcodec_parameters_from_contextcodecparr   r   r   
add_streamr2   updateitemssetattr)r   
codec_namerater2   r-   	codec_objcodecstreamctxpy_codec_context	py_streamkvs                r"   rZ   zOutputContainer.add_stream.   s    !S1	;D== ''HHehh(@(@
 ;;##&&?	?QQWX 
 03/F/FtxxQV/W252L2LU2S ::///00CK

7C0CIHc2CJ!::j!4CL%+ZZ0Df%MC"fjj5v~~cmm7TU $*"fnnS]]&CD$'MMF!"}}F ZZ3111"..q1CN!::j!4CL%+ZZ0De%LC"fjj5v~~cmm7TU |"'ds""& IJJ"}}F))&..*GK 88!!C$:$::II888I 	#55foosKL *<C)M'f6FG		*$$W-LLN 	%DAqIq!$	% _    s$   8O 88O( 	O%$O%(	O54O5templateopaquec                    ||j                   dk7  }|j                   | j                  |fi |S |r|j                  j                  }n*t	        |j                  j                  j
                  d      }|j                  }t        j                  | j                  j                  |j                  t        j                        s/t        | j                  j
                  d|j
                  d      t        j                  | j                  |      }t        j                  |      }t!        t        j"                  ||j                  j$                               d|_        | j                  j                  j(                  t        j*                  z  r#|xj(                  t        j,                  z  c_        |s|j                  j(                  |_        t!        t        j.                  |j$                  |             t1        ||d      }t3        | ||      }	| j4                  j7                  |	       |j9                         D ]  \  }
}t;        |	|
|        |	S )a  
        Creates a new stream from a template. Supports video, audio, subtitle, data and attachment streams.

        :param template: Copy codec from another :class:`~av.stream.Stream` instance.
        :param opaque: If True, copy opaque data from the template's codec context.
        :param \**kwargs: Set attributes for the stream.
        :rtype: The new :class:`~av.stream.Stream`.
        Nvideor4   r5   r6   r   )rF   codec_context'_add_stream_without_codec_from_templatera   r   rC   r   r   r>   r   r?   r@   rA   rB   rD   rE   r
   avcodec_parameters_to_contextrY   	codec_tagr   rV   rW   rX   r   r   r   rZ   r\   r]   )r   rh   ri   r-   r`   ra   rb   rc   rd   re   rf   rg   s               r"   add_stream_from_templatez(OutputContainer.add_stream_from_template   s    >]]g-F!!)?4??SFSS  ..44Ih44::??EI;D== ''HHehh(@(@
 ;;##&&?	?QQWX 
 03/F/FtxxQV/W252L2LU2S#33C9N9NOP 88!!C$:$::II888I  ..44CI 	#55foosKL *<C)M'f6FG		*LLN 	%DAqIq!$	%     returnc                 t   |j                   j                  j                  }|t        j                  t        j
                  hvrt        d|j                   d      t        j                  | j                   t        j                        }|t        j                  k(  rt        d      t        t        j                  |j                  |j                   j                               |j                   j                  |_        |j                   j                  |_        |j                   j                   |_        |j                   j"                  |_        t%        | |d       }| j&                  j)                  |       t+        |j,                        |_        |j/                         D ]  \  }}t1        |||        |S )Nztemplate stream of type  has no codec contextCould not allocate stream)r   rY   
codec_typer   AVMEDIA_TYPE_ATTACHMENTAVMEDIA_TYPE_DATArA   rF   rD   r   NULLMemoryErrorr
   avcodec_parameters_copyr;   
start_timedurationdispositionr   r   rZ   dictr(   r\   r]   )r   rh   r-   rv   rb   re   rf   rg   s           r"   rm   z7OutputContainer._add_stream_without_codec_from_template   sU    "*!6!6!A!A
c993;P;PQQ*8==/9NO  03/F/FHHfkk0
 V[[ 9::#--foox||?T?TUV $<<11$LL33",,//%\\55'fd;		*!("3"34	LLN 	%DAqIq!$	% rq   rC   mimetypedatac                    t        j                  | j                  t        j                        }|t        j                  k(  rt        d      t         j                  |j                  _        t         j                  |j                  _
        t        |      }|rt        j                  t        j                  t        j                  |dz               }|t        j                  k(  rt        d      t        |      D ]
  }||   ||<    d||<   t        j                  t        j                  |      |j                  _        ||j                  _        t        j$                  |j&                        }t)        t        j*                  |d|j-                         d             |j-                         }	t)        t        j*                  |d|	d             t/        | |d      }
| j0                  j3                  |
       |
S )a  
        Create an attachment stream and embed its payload into the container header.

        - Only supported by formats that support attachments (e.g. Matroska).
        - No per-packet muxing is required; attachments are written at header time.
        ru      z"Could not allocate attachment datar   s   filenames   mimetypeN)r   rD   r   r   ry   rz   rw   rY   rv   AV_CODEC_ID_NONEcodec_idlencastp_uchar	av_mallocrange	extradataextradata_sizer   r(   r
   av_dict_setencoder   r   rZ   )r   rC   r   r   rb   payload_sizebufimeta_ptr
mime_bytesre   s              r"   add_attachmentzOutputContainer.add_attachment   ss    03/F/FHHfkk0
 V[[ 9::%(%@%@"#&#7#7  '*$i++fnncmmL1<L.MNCfkk!!"FGG<( !aA! !C(.FNNC(HFOO%-9FOO* >>&//2#//(KJK__&
#//(KQGH'fd;		*rq   c                 J   t         j                  }t         j                  }|9t        j                  |j	                               }|t         j                  k(  r#t        j
                  |j	                               }|t         j                  k(  rDt        j                  |j	                               }|t         j                  k(  rt        d|       |t         j                  k7  r|j                  n|j                  }t        j                  | j                  j                  |t        j                        s%t        | j                  j                  d|d      t        j                  | j                  |      }|t         j                  k(  rt!        d      t         j                  }|t         j                  k7  rt        j"                  |      }|t         j                  k(  rt!        d      | j                  j                  j$                  t        j&                  z  r#|xj$                  t        j(                  z  c_        t+        t        j,                  |j.                  |             nMt        j0                  |j.                  _        |t         j                  k7  r|j                  |j.                  _        d}|t         j                  k7  rt7        ||d      }t9        | ||      }	| j:                  j=                  |	       |r|	j>                  jA                  |       |	S )a4  add_data_stream(codec_name=None)

        Creates a new data stream and returns it.

        :param codec_name: Optional name of the data codec (e.g. 'klv')
        :type codec_name: str | None
        :param dict options: Stream options.
        :rtype: The new :class:`~av.data.stream.DataStream`.
        NzUnknown data codec: r5   r6   ru   z Could not allocate codec context)!r   ry   r   avcodec_find_encoder_by_namer   avcodec_find_decoder_by_nameavcodec_descriptor_get_by_namerA   r?   r>   r   r   r@   rB   rC   rD   rz   rE   r   rV   rW   r
   rX   rY   rx   rv   r   r   r   r   rZ   r2   r[   )
r   r^   r2   ra   codec_descriptorr   rb   rc   rd   re   s
             r"   add_data_streamzOutputContainer.add_data_stream  sh    <B;;BH++!44Z5F5F5HIE#889J9J9LM##&#E#E%%'$  $v{{2$';J<%HII $)FKK#7uxx=M=P=PH++  (C,D,D !{{''**CJ>QWX 
 03/F/FtxxQV/WV[[ 9:: 39++FKK,,U3Cfkk!!"DEE xx%%(>(>>		S<<<	 c99&//3OP *-)>)>FOO&6;;.+;+>+>( 15&++1#udC'f6FG		*$$W-rq   c                 b   | j                   ryt               }| j                  D ]  }|j                  }|'|j                  dvrt        d|j                   d      |j                  s| j                  j                         D ]!  \  }}|j                  j                  ||       # |j                          | j                  D ]"  }||j                  vs|j                  |       $ |j                           t        j                  | j                   | j"                  nd      }|}| j$                  j&                  t(        j*                  k(  r| j$                  j,                  j.                  t0        j2                  z  sUt5        t1        j6                  t)        j8                  | j$                  j&                        |t0        j:                               t=        t)        j8                  | j$                  j>                        | j>                  | j@                  | jB                         tE        | j                  | jF                        }|jI                         }	| j5                  t1        jJ                  | j$                  t)        j8                  |	j$                                     |D ]  }||	vs|j                  |        | j                  j                         D ci c]  \  }}||vs|| }
}}|
r-ddl&}|jO                  tP              }|jS                  d|
z         d	| _         yc c}}w )
z,Write the file header! Called automatically.N>   r   
attachmentzStream rt    )encodingerrorsr   zSome options were not used: %sT)*r   setr   rl   rF   rA   indexis_openr2   r\   
setdefaultopenadd_finalize_for_outputosfsencoder   rC   r   r    r   ry   r   r   r   r   r
   	avio_openr   AVIO_FLAG_WRITEr   r(   metadata_encodingmetadata_errorsr   container_optionscopyavformat_write_headerlogging	getLogger__name__warning)r   used_optionsrb   rc   rf   rg   name_objrC   all_optionsr2   unused_optionsr   logs                r"   start_encodingzOutputContainer.start_encodingT  s    ==  E ll 	*F&&C{;;&<<$wv||n<Q%RSS{{ $ 2 2 4 51..q!45HHJ "\\ 0CKK/(,,Q/0 '')#	*( ++4993Ddii"M&88;;&++%dhh.>.>.D.DsGWGW.WfnnTXX[[94ATATU
 	NN488,,-MM++''		
 $.dllD<R<R#S*//1s006>>'++;VWX  	$A  #	$ "\\//1
QQl5JAqD
 
 ##H-CKK8>IJ
s   L+,L+c                    t               }t        j                  }t        j                  }	 t        j                  t        j
                  |            }|t        j                  k(  r	 |S t        j                  | j                  j                  |j                  t        j                        dk(  r|j                  |j                         )zC
        Returns a set of all codecs this format supports.
        r   )r   r   ry   r   av_codec_iterater   r>   r   r   r?   r@   r   rC   )r   resultra   ri   s       r"   supported_codecsz OutputContainer.supported_codecs  s    
 e;A;; &(()?@E#  ((HH$$ehh0H0H 
 

5::& rq   c                 h    t        j                  | j                  j                  j                        S )zL
        Returns the default video codec this container recommends.
        )r   avcodec_get_namerB   optrvideo_codecr!   s    r"   default_video_codecz#OutputContainer.default_video_codec  %    
 ##DKK$4$4$@$@AArq   c                 h    t        j                  | j                  j                  j                        S )zL
        Returns the default audio codec this container recommends.
        )r   r   rB   r   audio_codecr!   s    r"   default_audio_codecz#OutputContainer.default_audio_codec  r   rq   c                 h    t        j                  | j                  j                  j                        S )zO
        Returns the default subtitle codec this container recommends.
        )r   r   rB   r   subtitle_codecr!   s    r"   default_subtitle_codecz&OutputContainer.default_subtitle_codec  s%    
 ##DKK$4$4$C$CDDrq   c                     t        |        y r'   )r#   r!   s    r"   closezOutputContainer.close  s
    Trq   c                 x    t        |t              r| j                  |       y |D ]  }| j                  |        y r'   )
isinstancer   mux_one)r   packetspackets      r"   muxzOutputContainer.mux  s5     gv&LL!! %V$%rq   r   c                    | j                          |j                  j                  dk  sOt        j                  t        j
                  |j                  j                        | j                  j                  k\  rt        d      | j                  j                  |j                  j                     }|j                  |j                         | j                  t        j                  | j                  |j                               t        j                  5  t        j                   | j                  | j                        }d d d        | j                         y # 1 sw Y   xY w)Nr   zBad Packet stream_index.)r   r   stream_indexr   r   uint
nb_streamsrA   r   _rebase_timer;   r
   r   av_packet_refr+   r)   av_interleaved_write_frame)r   r   rb   rets       r"   r   zOutputContainer.mux_one  s     JJ##a'{{6;;

(?(?@DHHDWDWW788/3xx/?/?

@W@W/XF,,- 	s((&**EF\\ 	X!<<TXXtWC	Xs	X 	Xs   +EE#)NNr'   )r   
__module____qualname__r.   r1   r   rZ   r   boolrp   rm   strbytesr   r   r   ccallr   propertyr   r   r   r   r   r   r   r    rq   r"   r%   r%   !   s
   4@
U Up 7;>>(,t>@	B&3 &# &U &PDt DL \\A AF  . B B B B E E%f rq   r%   )!r   	fractionsr   r   cython.cimportsr   r   cython.cimports.av.codec.codecr    cython.cimports.av.codec.contextr   r   $cython.cimports.av.container.streamsr   cython.cimports.av.dictionaryr	   cython.cimports.av.errorr
   cython.cimports.av.packetr   cython.cimports.av.streamr   r   cython.cimports.av.utilsr   r   av.dictionaryr   cfuncr%   r#   cclass	Containerr   rq   r"   <module>r      sm    	   ( 0 M @ 5 . , 9 B $    Bi B Brq   