
    dj"(                        d Z ddlZddlZddlmZmZ ddlZddlmZm	Z	 ddl
mZmZ ej        Zej        Zej        Zej        Zej        Zej        Zej        Zej        ZeZej        dej         fd            Z! ej"        e#d          a$dej%        j&        j'        vr( ej(        d          )                    ej                   d	 Z*d
 Z+d Z,d Z- ej"        ej.        d          a/ ej"        e# e                      Z0 ej"        e#d          a1 ej"        ej         d          a2d Z3d Z4 ej"        e#d          a5 ej"        ej         d          a6ej        d             Z7 ej"        e8g           Z9 ej"        e:i           Z;ej<         G d d                      Z= ej>        ej?        ej@                 ejA                  ZB ejC        d          ZDejE        ejF         ejG        d          dejH        dejA        fd                                    ZI ej"        ej@                  ZJ ejK        eDeI          eJ_L        ej        dej         deMdeMfd            ZNejE        dej         dejO        dejA        fd            ZPejE        d              ZQejE        ejF         ejG        d          dejH        dej         d!ejO        d"ejR        dejS        f
d#                                    ZTejE        ejF         ejG        d          dejH        dej         d!ejO        d"ejR        dejS        f
d$                                    ZUeV                    eU           dS )%a[  
FFmpeg has a logging system that it uses extensively. It's very noisy, so PyAV turns it
off by default. This unfortunately has the effect of making raised errors have less
detailed messages. It's therefore recommended to use VERBOSE when developing.

.. _enable_logging:

Enabling Logging
~~~~~~~~~~~~~~~~~

You can hook into the logging system with Python by setting the log level::

    import av

    av.logging.set_level(av.logging.VERBOSE)


PyAV hooks into that system to translate FFmpeg logs into Python's
`logging system <https://docs.python.org/3/library/logging.html#logging.basicConfig>`_.

If you are not already using Python's logging system, you can initialize it
quickly with::

    import logging
    logging.basicConfig()


Note that handling logs with Python sometimes doesn't play nicely with multi-threaded workflows.
An alternative is :func:`restore_default_callback`.

This restores FFmpeg's default logging system, which prints to the terminal.
Like with setting the log level to ``None``, this may also result in raised errors
having less detailed messages.


API Reference
~~~~~~~~~~~~~

    N)Lock	get_ident)fprintfstderr)freemalloclevelc                     | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS | t           j        k    rdS dS )z2Convert a library log level to a Python log level.2   (         
         )libAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUGr	   s    E/home/agentuser/manim-venv/lib/python3.11/site-packages/av/logging.pyadapt_levelr   @   sz        r	#"	"	"r	#$	$	$r	#/	!	!r	#$	$	$r	#"	"	"qq    libavc                      t           S )z5Returns the current log level. See :func:`set_level`.)level_threshold r   r   	get_levelr!   Z   s    r   c                     | #| a t                              t                     dS t	          |           t
          u r#| a t                              t                     dS t          d          )a  set_level(level)

    Sets PyAV's log level. It can be set to constants available in this
    module: ``PANIC``, ``FATAL``, ``ERROR``, ``WARNING``, ``INFO``,
    ``VERBOSE``, ``DEBUG``, or ``None`` (the default).

    PyAV defaults to totally ignoring all ffmpeg logs. This has the side effect of
    making certain Exceptions have no messages. It's therefore recommended to use:

         av.logging.set_level(av.logging.VERBOSE)

    When developing your application.
    Nzlevel must be: int | None)r   r   av_log_set_callbacknolog_callbacktypeintlog_callback
ValueErrorr   s    r   	set_levelr)   _   sg      }/////	e		-----4555r   c                 :    t                               |            dS )a  Set libav's log level.  It can be set to constants available in this
    module: ``PANIC``, ``FATAL``, ``ERROR``, ``WARNING``, ``INFO``,
    ``VERBOSE``, ``DEBUG``.

    When PyAV logging is disabled, setting this will change the level of
    the logs printed to the terminal.
    N)r   av_log_set_levelr   s    r   set_libav_levelr,   y   s     r   c                  N    t                               t           j                   dS )zCRevert back to FFmpeg's log callback, which prints to the terminal.N)r   r#   av_log_default_callbackr    r   r   restore_default_callbackr/      s    C788888r   Tc                      t           S )zWill identical logs be emitted?)skip_repeatedr    r   r   get_skip_repeatedr2      s    r   c                 $    t          |           adS )z%Set if identical logs will be emittedN)boolr1   )vs    r   set_skip_repeatedr6      s     GGMMMr   c                  r    t           r/t          5  t           t          fcddd           S # 1 swxY w Y   dS dS )z-Get the last log that was at least ``ERROR``.N)r   N)error_count	skip_lock
last_errorr    r   r   get_last_errorr;      s       	+ 	+
*	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ ws   *..c                   ~    e Zd ZdZ ej        ed          Z ej        ed          Zddej	        fdZ
d Zd	 Zd
S )Capturea!  A context manager for capturing logs.

    :param bool local: Should logs from all threads be captured, or just one
        this object is constructed in?

    e.g.::

        with Capture() as logs:
            # Do something.
        for log in logs:
            print(log.message)

    readonly)
visibilityprivateTlocalc                     g | _         |r.t                              t                      g           | _        d S t
          | _        d S N)logsthread_captures
setdefaultr   capturesglobal_captures)selfrA   s     r   __init__zCapture.__init__   s;    	 	,+66y{{BGGDMMM+DMMMr   c                 N    | j                             | j                   | j        S rC   )rG   appendrD   )rI   s    r   	__enter__zCapture.__enter__   s"    TY'''yr   c                 8    | j                                          d S rC   )rG   pop)rI   type_value	tracebacks       r   __exit__zCapture.__exit__   s    r   N)T)__name__
__module____qualname____doc__cythondeclarelistrD   rG   bintrJ   rM   rS   r    r   r   r=   r=      s          6>$:666Dv~dy999H, ,fk , , , ,      r   r=   )class_namez4const char *(*item_name_func)(void *) noexcept nogilF)checkptrreturnc                 d    t          j        t           j        t                   |           }|j        S rC   )rX   castpointerlog_contextr]   )r_   objs     r   log_context_namerf      s$     (.{6>+3NPS'T'TC8Or   r]   messagec           	         t          j        t           j        t                   t	          t          j        t                                        }t          j        t                    |_        ||_	        |
                    d          }t                              t          j        t           j        |          | dt          j        t           j        |                     t          |           dS )zTSend a log through the library logging system.

    This is mostly for testing.
    zutf-8z%sN)rX   rb   rc   rd   r   sizeofaddress	log_classr\   r]   encoder   av_logp_voidp_charr   )r	   r]   rg   re   message_bytess        r   logrq      s     (.{{#VFM+,F,F%G%G( (C 	**CJCH">>'22MJJFM3''FM=11	   	IIIIIr   c_name	c_messagec                    |t           j        urt          j        t          |          nd}t          j        t          |                              dd          }| ||f}| t          k    }d}d }t          5  |rmt          o
t          |k    }|rt          dz  a
nLt          rEt          dk    rt          }n0t          d         t          d         dt          d         t          fz  f}da
|a	| t          j        k    rt          dz  a|ad d d            n# 1 swxY w Y   |t          |           |r|st          |           d S d S d S )	N utf8backslashreplaceFr   r   z%s (repeated %d more times)   )rX   NULLrb   strbytesdecoder   r9   r1   last_log
skip_countr   r   r8   r:   log_callback_emit)	r	   rr   rs   r]   rg   rq   is_interestingis_repeated
repeat_logs	            r   log_callback_gilr      s    (.V['@'@6;sF###bDk%++226;MNNG$
 C
 #(?":N  %KJ	   	';HOK a

 
??!)JJ ! 5!j8QQ"J
 
H C$$$1KJ1              4 *%%% k #   s   4BDDDc                 R   | \  }}}t                               t                                pt          }|r|d                             |            d S t          |          }|rd|z   nd}t          j        |          }|                    ||	                                           d S )Nzlibav.zlibav.generic)
rE   getr   rH   rL   r   logging	getLoggerrq   strip)rq   	lib_levelr]   rg   rG   py_levellogger_nameloggers           r   r   r   1  s    "ItW""9;;//B?H C   9%%H%)>(T//K{++F
JJx)))))r   formatargsc           	         t                      }|sd S t          j        5  |t          k    r|t          j        k    r	 d d d            d S d d d            n# 1 swxY w Y   t          |d||           t          j        }| rEt          j        t          j	        t          j	        t          j
                          |           d         nt          j        }|r|j        r|                    |           }t          j        5  	 t          |||           nP# t          $ rC t          t          d|||           t!          j                    \  }}	}
t%          ||	|
           Y nw xY wd d d            d S # 1 swxY w Y   d S )Ni  r   z0av.logging: exception while handling %s[%d]: %s
)Py_IsInitializedrX   gilr   r   r   	vsnprintfry   rb   rc   AVClass	item_namer   	Exceptionr   r   sysexc_infoPyErr_Display)r_   r	   r   r   initedrg   r]   clsexcrP   tbs              r   r'   r'   A  s&    +,,F 	  ?""u0@'@'@                       gtVT*** !'D 	FN6>#+#>?EEaHH[ 
  "s} "}}S!!	 * *	*UD'2222 
	* 
	* 
	*C   !\^^NC#ub)))))
	** * * * * * * * * * * * * * * * * *sH   AAA;E,=DE,A
EE,EE,,E03E0c                     d S rC   r    )r_   r	   r   r   s       r   r$   r$   p  s	     	Dr   )WrW   r   r   	threadingr   r   rX   cython.cimports.libc.stdior   r   cython.cimports.libc.stdlibr   r   r   AV_LOG_PANICPANICr   FATALr   ERRORr   WARNINGr   INFOr   VERBOSEr   DEBUGAV_LOG_TRACETRACECRITICALccallr&   r   rY   objectr   Loggermanager
loggerDictr   setLevelr!   r)   r,   r/   r[   r1   r9   r}   r~   r2   r6   r:   r8   r;   rZ   rH   dictrE   cclassr=   structrc   r   ro   rd   typedefitem_name_funccfuncnogil	exceptvalrn   rf   rk   rb   r   rz   rq   p_const_charr   r   va_listvoidr'   r$   r#   r    r   r   <module>r      s  & &P  



 % % % % % % % %  6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4 	




  vz    $ !&... '.(333Gg''888  
6 6 64     9 9 9
 v{D11FN64466**	6>&$''V^FJ**
  
   V^FD))
fnVZ++    !&.r** &.r**        B fm>#+&	  
   VWW &- FM      
 FN3;''	!fk.2BCC	  vz  s    * 4:4%24?E}4 4 4 4n * * * )*	)*:)* )* +	)*
 [)* )* )*   )*X 			:	 	 +		
 [	 	 	   	    ' ' ' ' 'r   