
    EjX                        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	 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 ej0                  defd       Zej6                  ej8                   G d de                    Zy)    N)libav)Codec)CodecContextwrap_codec_context)StreamContainer)
Dictionary)	err_check)Packet)Streamwrap_stream)dict_to_avdictto_avrationalselfc                 p   t               | _        | j                  dz  dk(  r| j                  7t	        | j                  j                  dd      r| xj                  dz  c_        y 	 | j                  t        j                  | j                               | j                  m| j                  j                  j                  t        j                  z  s<t        j                  t        j                  | j                  j                               | xj                  dz  c_        y y # | j                  m| j                  j                  j                  t        j                  z  s<t        j                  t        j                  | j                  j                               | xj                  dz  c_        w xY w)N      closedF   )r   streams_myflagfilegetattrr	   libav_write_trailerptroformatflagsAVFMT_NOFILEavio_closepcythonaddresspbr   s    I/var/www/html/qr/venv/lib/python3.12/site-packages/av/container/output.pyclose_outputr%      s   "$DL||bA 99 WTYY^^Xu%MLLAL	NN3//9:yy $((*:*:*@*@3CSCS*Stxx{{ ;<LLAL  yy $((*:*:*@*@3CSCS*Stxx{{ ;<LLALs   '.D% %BF5c                      e Zd Zd Zd Zd Zddedz  fdZddede	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        |        y r)   r%   r#   s    r$   __del__zOutputContainer.__del__,   
    T    c                     t         j                  5  t        j                  t        j                  | j
                               d d d        y # 1 sw Y   y xY wr)   )r    r+   r   av_packet_freer!   r-   r#   s    r$   __dealloc__zOutputContainer.__dealloc__/   s=    \\ 	@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t,        j:                  }	t        j<                  t,        j:                  |t        j>                  d	t-        j.                  |	      t,        j:                         |	r=t-        j@                  t,        jB                  t        jD                     |	      d	   |_#        |j!                  dd	      |_        |j!                  d
d      |_        	 t+        |j!                  d      t-        j.                  |j0                               |d|_$        n$t        |      tJ        u r||_$        ntM        d      |j0                  |_        t        jN                  t-        j.                  |jP                        d       | j                  j                  jR                  t        jT                  z  r#|xjR                  t        jV                  z  c_)        tY        t        jZ                  |j\                  |             t_        ||d      }
ta        | ||
      }| jb                  je                  |       |r|jf                  ji                  |       |jk                         D ]  \  }}tm        |||        |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  'audio stream `rate` must be: int | None   )7r   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popr>   r?   r@   rA   r   r    r!   rB   KeyError	framerateavg_frame_rateAVMEDIA_TYPE_AUDIONULLavcodec_get_supported_configAV_CODEC_CONFIG_SAMPLE_FORMATcastpointerAVSampleFormat
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_streamr9   updateitemssetattr)r   
codec_namerater9   r/   	codec_objcodecstreamctxoutpy_codec_context	py_streamkvs                 r$   rg   zOutputContainer.add_stream3   sr    !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=C[[C,,11s# !'V^^C<N<N-OQT!UVW!X!::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  0  s$   8Q+ 8Q; +	Q87Q8;	RRrk   returnc                    |j                         }t        j                  |      }t        j                  }|t        j                  k(  rt        j
                  |      }|t        j                  k(  r6t        j                  |      }|t        j                  k(  rt        d|      |t        j                  k7  r|j                  }|j                  }n|j                  }|j                  }t        j                  | j                  j                  |t        j                        s%t        | j                  j                  d|d      t        j                   | j                  t        j                        }	|	t        j                  k(  rt#        d      ||	j$                  _        ||	j$                  _        |t        j*                  k(  rn|j-                  dd      |	j$                  _        |j-                  dd      |	j$                  _        |mt3        |t        j4                  |	j6                               nC|t        j8                  k(  r0|.t        |      t:        u r||	j$                  _        nt?        d	      tA        | |	d      }
| jB                  jE                  |
       |jG                         D ]  \  }}tI        |
||        |
S )
a  add_mux_stream(codec_name, rate=None)

        Creates a new stream for muxing pre-encoded data without creating a
        :class:`.CodecContext`. Use this when you want to mux packets that were
        already encoded externally and no encoding/decoding is needed.

        :param codec_name: The name of a codec.
        :type codec_name: str
        :param \**kwargs: Set attributes for the stream (e.g. ``width``, ``height``,
            ``time_base``).
        :rtype: The new :class:`~av.stream.Stream`.

        zUnknown codec: r<   r=   Could not allocate streamr>   r   r?   NrD   )%encoder   avcodec_find_encoder_by_namer    rW   avcodec_find_decoder_by_nameavcodec_descriptor_get_by_namerI   rG   rN   rF   r   r   rH   rJ   rK   rL   MemoryErrorrf   codec_id
codec_typerO   rR   r>   r?   r   r!   rU   rV   r_   r^   r`   r   r   rg   ri   rj   )r   rk   rl   r/   codec_name_bytesrn   codec_descriptorr~   r   ro   rs   rt   ru   s                r$   add_mux_streamzOutputContainer.add_mux_stream   sK    #-"3"3"5,,-=> 	 KK 	 FKK445EFEFKK"AABRS6;;. ?:.!ABB FKKxxHJ'**H)..J ''HHh(@(@
 ;;##&&?
~VT 
 03/F/FHHfkk0
 V[[ 9::#+ %/"///$*JJw$:FOO!%+ZZ!%<FOO"dFNN63H3H$IJ3111:$26FOO/#$MNN (fd;		*LLN 	%DAqIq!$	% r5   templateopaquec                 D   ||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                  j(                  |_        | j                  j                  j*                  t        j,                  z  r#|xj*                  t        j.                  z  c_        |s|j                  j*                  |_        t!        t        j0                  |j$                  |             t3        ||d      }|xj4                  dz  c_        t7        | ||      }	| j8                  j;                  |	       |j=                         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videor;   r<   r=   r      ) rN   codec_context'_add_stream_without_codec_from_templatern   r   rK   r   r   rF   r   rG   rH   rI   rJ   rL   rM   r	   avcodec_parameters_to_contextrf   	codec_tagrB   r   rc   rd   re   r   	_ctxflagsr   r   rg   ri   rj   )r   r   r   r/   rm   rn   ro   rp   rr   rs   rt   ru   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 $<<11 .. 88!!C$:$::II888I  ..44CI 	#55foosKL *<C)M""a'"'f6FG		*LLN 	%DAqIq!$	% r5   c                 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 z has no codec contextrx   )r   rf   r   r   AVMEDIA_TYPE_ATTACHMENTAVMEDIA_TYPE_DATArI   rN   rL   r    rW   r}   r	   avcodec_parameters_copyrB   
start_timedurationdispositionr   r   rg   dictr*   ri   rj   )r   r   r/   r   ro   rs   rt   ru   s           r$   r   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!$	% r5   rK   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.
        rx   r   z"Could not allocate attachment datar   s   filenames   mimetypeN)r   rL   r   r    rW   r}   r   rf   r   AV_CODEC_ID_NONEr~   lenrZ   p_uchar	av_mallocrange	extradataextradata_sizer!   r*   r	   av_dict_setry   r   r   rg   )r   rK   r   r   ro   payload_sizebufimeta_ptr
mime_bytesrs   s              r$   add_attachmentzOutputContainer.add_attachmentG  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;		*r5   c                    t         j                  }t         j                  }||j                         }t        j                  |      }|t         j                  k(  rt        j
                  |      }|t         j                  k(  r6t        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: r<   r=   rx   z Could not allocate codec context)!r    rW   ry   r   rz   r{   r|   rI   rG   rF   r   r   rH   rJ   rK   rL   r}   rM   r   rc   rd   r	   re   rf   r   r   r~   r   r   r   rg   r9   rh   )r   rk   r9   rn   r   r   r~   ro   rp   rr   rs   s              r$   add_data_streamzOutputContainer.add_data_streamo  s^    <B;;KK 	 !&0&7&7&9445EFE#889IJ##&#E#EFV#W #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-r5   c                 T   | j                   dz  ryt               }| j                  D ]  }|j                  }||j                  s| j
                  j                         D ]!  \  }}|j
                  j                  ||       # |j                  dz  sA|j                          | j
                  D ]"  }||j
                  vs|j                  |       $ |j                           t        j                  | j                  | j                  nd      }|}| j                   j"                  t$        j&                  k(  r| j                   j(                  j*                  t,        j.                  z  sUt1        t-        j2                  t%        j4                  | j                   j"                        |t,        j6                               t9        t%        j4                  | j                   j:                        | j:                  | j<                  | j>                         tA        | j
                  | jB                        }|jE                         }	| j1                  t-        jF                  | j                   t%        j4                  |	j                                      |D ]  }||	vs|j                  |        | j
                  j                         D ci c]  \  }}||vs|| }
}}|
r-ddl$}|jK                  tL              }|jO                  d|
z         | xj                   dz  c_         yc c}}w )z,Write the file header! Called automatically.r   Nr    )encodingerrorsr   zSome options were not used: %s)(r   setr   r   is_openr9   ri   
setdefaultr   openadd_finalize_for_outputosfsencoder   rK   r   r"   r    rW   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_optionsro   rp   rt   ru   name_objrK   all_optionsr9   unused_optionsr   logs                r$   start_encodingzOutputContainer.start_encoding  sx    <<!  E ll 	*F&&Cs{{ LL..0 1DAqKK**1a01 )HHJ "\\ 0CKK/(,,Q/0 '')	*" ++4993Ddii"M&88;;&++%dhh.>.>.D.DsGWGW.WfnnTXX[[94ATATU
 	NN488,,-MM++''		
 #-T\\4;Q;Q"R)..0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    rW   r   av_codec_iterater!   rF   r   r   rG   rH   r   rK   )r   resultrn   r   s       r$   supported_codecsz OutputContainer.supported_codecs  s    
 e;A;; &(()?@E#  ((HH$$ehh0H0H 
 

5::& r5   c                 h    t        j                  | j                  j                  j                        S )zL
        Returns the default video codec this container recommends.
        )r   avcodec_get_namerJ   optrvideo_codecr#   s    r$   default_video_codecz#OutputContainer.default_video_codec  %    
 ##DKK$4$4$@$@AAr5   c                 h    t        j                  | j                  j                  j                        S )zL
        Returns the default audio codec this container recommends.
        )r   r   rJ   r   audio_codecr#   s    r$   default_audio_codecz#OutputContainer.default_audio_codec  r   r5   c                 h    t        j                  | j                  j                  j                        S )zO
        Returns the default subtitle codec this container recommends.
        )r   r   rJ   r   subtitle_codecr#   s    r$   default_subtitle_codecz&OutputContainer.default_subtitle_codec  s%    
 ##DKK$4$4$C$CDDr5   c                     t        |        y r)   r2   r#   s    r$   closezOutputContainer.close$  r4   r5   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$%r5   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    rZ   uint
nb_streamsrI   r   _rebase_timerB   r	   r   av_packet_refr-   r+   av_interleaved_write_frame)r   r   ro   rets       r$   r   zOutputContainer.mux_one0  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__r0   r3   r8   r   rg   strr   r   boolr   r   bytesr   r   r    ccallr   propertyr   r   r   r   r   r   r
   r    r5   r$   r'   r'   #   s'   4@_ _BK Kf K\ 7;CC(,tCJ	B&3 &# &U &PEt EN \\> >@  . B B B B E E%f r5   r'   )r   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   cfuncr'   r%   finalcclass	Containerr   r5   r$   <module>r      ss    	  ( 0 M @ 4 . , 9 B   & ^i ^  ^r5   