
    \j+m                        d dl Z d dl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 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 d dlmZm Z  ejB                  dejD                  ejF                     dejD                  e   dejH                  fd       Z%ejB                  de&fd       Z'ejP                  ejR                   G d de*                    Z&y)    N)libav)BitStreamFilterContext)Codec)CodecContextwrap_codec_context)HWAccel)StreamContainer)
Dictionary)	err_check)Packet)Streamwrap_stream)dict_to_avdictto_avrational)uint8_t)memcpymemsetstreamdatasizec                    t        j                  t         j                  t        j                  |t        j
                  z               }|t         j                  k(  rt        d      t        |||       t        ||z   dt        j
                         t        j                  t        j                  | j                  j                               || j                  _        || j                  _        y )NzCould not allocate extradatar   )cythoncastp_ucharlib	av_mallocAV_INPUT_BUFFER_PADDING_SIZENULLMemoryErrorr   r   av_freepaddresscodecpar	extradataextradata_size)r   r   r   bufs       F/root/.hermes/venv/lib/python3.12/site-packages/av/container/output.py_set_codecpar_extradatar'      s     !++dS-M-M&MNC fkk899
3d
3:q#::;LL 9 9:; #FOO%)FOO"    selfc                    | j                   t        j                  k7  r7| j                  r+| j                  }g | _        |D ]  }| j	                  |        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   )
packet_ptrr   r   _buffered_packets_mux_oner	   streams_myflagfilegetattrr   r   av_write_trailerptroformatflagsAVFMT_NOFILEavio_closepr!   pb)r)   bufferedpackets      r&   close_outputr?   '   sb   &++%$*@*@//!# 	"FMM&!	" #$DL||bA 99 WTYY^^Xu%MLLAL	NN3//9:yy $((*:*:*@*@3CSCS*Stxx{{ ;<LLAL  yy $((*:*:*@*@3CSCS*Stxx{{ ;<LLALs   ;.E9 9BH	c                      e Zd Zd Zd Zd Z	 	 	 d dedz  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ej<                  defd       Zej<                  defd       Z ej<                  defd       Z!y)#OutputContainerc                     t               | _        i | _        g | _        t        j
                  5  t        j                         | _        d d d        y # 1 sw Y   y xY wN)	r	   r2   _extradata_bsfsr0   r   nogilr   av_packet_allocr/   )r)   argskwargss      r&   	__cinit__zOutputContainer.__cinit__E   sH    &(!!#\\ 	4!113DO	4 	4 	4s   AAc                     t        |        y rC   r?   r)   s    r&   __del__zOutputContainer.__del__L   
    Tr(   c                     t         j                  5  t        j                  t        j                  | j
                               d d d        y # 1 sw Y   y xY wrC   )r   rE   r   av_packet_freer!   r/   rL   s    r&   __dealloc__zOutputContainer.__dealloc__O   s=    \\ 	@v~~doo>?	@ 	@ 	@s   3AANoptionshwaccelc           	      	   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_        |	||      }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, *, hwaccel=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 HWAccel hwaccel: Optional settings for hardware-accelerated encoding.
            Only applies to video streams (e.g. ``h264_vaapi``); software frames
            passed to :meth:`~av.codec.context.CodecContext.encode` are uploaded to
            the device automatically.
        :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 }  i  'audio stream `rate` must be: int | None   )7r   r7   r   avformat_query_codecr8   idFF_COMPLIANCE_NORMAL
ValueErrorformatnameavformat_new_streamavcodec_alloc_context3typeAVMEDIA_TYPE_VIDEOAV_PIX_FMT_YUV420Ppix_fmtpoprX   rY   rZ   r[   r   r   r!   r\   KeyError	framerateavg_frame_rateAVMEDIA_TYPE_AUDIOr   avcodec_get_supported_configAV_CODEC_CONFIG_SAMPLE_FORMATr   pointerAVSampleFormat
sample_fmtsample_rateint	TypeErrorav_channel_layout_default	ch_layoutr9   AVFMT_GLOBALHEADERAV_CODEC_FLAG_GLOBAL_HEADERr   avcodec_parameters_from_contextr"   r   r   r2   
add_streamrR   updateitemssetattr)r)   
codec_nameraterR   rS   rH   	codec_objcodecr   ctxoutpy_codec_context	py_streamkvs                  r&   r~   zOutputContainer.add_streamS   sr   2 !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)P'f6FG		*$$W-LLN 	%DAqIq!$	% s  0  s$   8Q+ 8Q; +	Q87Q8;	RRr   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: rV   rW   Could not allocate streamrX   r   rY   Nr^   )%encoder   avcodec_find_encoder_by_namer   r   avcodec_find_decoder_by_nameavcodec_descriptor_get_by_namerc   ra   rh   r`   r7   r8   rb   rd   re   rf   r   r"   codec_id
codec_typeri   rl   rX   rY   r   r!   ro   rp   rw   rv   rx   r   r2   r~   r   r   )r)   r   r   rH   codec_name_bytesr   codec_descriptorr   r   r   r   r   r   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!$	% r(   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videorU   rV   rW   r      ) rh   codec_context'_add_stream_without_codec_from_templater   r   re   r7   r   r`   r8   ra   rb   rc   rd   rf   rg   r   avcodec_parameters_to_contextr"   	codec_tagr\   r9   r{   r|   r}   r   	_ctxflagsr   r2   r~   r   r   )r)   r   r   rH   r   r   r   r   r   r   r   r   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!$	% r(   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 contextr   )r7   r"   r   r   AVMEDIA_TYPE_ATTACHMENTAVMEDIA_TYPE_DATArc   rh   rf   r   r   r   r   avcodec_parameters_copyr\   
start_timedurationdispositionr   r2   r~   dictmetadatar   r   )r)   r   rH   r   r   r   r   r   s           r&   r   z7OutputContainer._add_stream_without_codec_from_templateQ  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!$	% r(   re   mimetyper   c                 8   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                  _        t        j                  t        j"                  |      |j                  _        t        j&                  |j(                        }t+        t        j,                  |d|j/                         d             |j/                         }	t+        t        j,                  |d|	d             t1        | |d      }
| j2                  j5                  |
       |
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.
        r   r   z"Could not allocate attachment datar   s   filenames   mimetypeN)r   rf   r7   r   r   r   r   r"   r   AV_CODEC_ID_NONEr   lenr   r   r   ranger#   rw   r$   r!   r   r   av_dict_setr   r   r2   r~   )r)   re   r   r   r   payload_sizer%   imeta_ptr
mime_bytesr   s              r&   add_attachmentzOutputContainer.add_attachmentr  s    03/F/FHHfkk0
 V[[ 9::%(%@%@"#&#7#7  '*$i++fnncmmL1<L.MNCfkk!!"FGG<( !aA! !C(.FNNC(HFOO%-3[[\-RFOO* >>&//2#//(KJK__&
#//(KQGH'fd;		*r(   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: rV   rW   r   z Could not allocate codec context)!r   r   r   r   r   r   r   rc   ra   r`   r7   r8   rb   rd   re   rf   r   rg   r9   r{   r|   r   r}   r"   r   r   r   r   r   r2   r~   rR   r   )r)   r   rR   r   r   r   r   r   r   r   r   s              r&   add_data_streamzOutputContainer.add_data_stream  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-r(   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|
        | 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: )(r3   setr2   r   is_openrR   r   
setdefaultr   openadd_finalize_for_outputosfsencoder4   re   r7   r<   r   r   r8   r9   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_optionsr   r   r   r   name_objre   all_optionsrR   unused_optionsr   logs                r&   start_encodingzOutputContainer.start_encoding  s{    <<!  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6~6FGH
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   r   r   av_codec_iterater!   r`   r7   r8   ra   rb   r   re   )r)   resultr   r   s       r&   supported_codecsz OutputContainer.supported_codecs"  s    
 e;A;; &(()?@E#  ((HH$$ehh0H0H 
 

5::& r(   c                 h    t        j                  | j                  j                  j                        S )zL
        Returns the default video codec this container recommends.
        )r   avcodec_get_namerd   optrvideo_codecrL   s    r&   default_video_codecz#OutputContainer.default_video_codec:  %    
 ##DKK$4$4$@$@AAr(   c                 h    t        j                  | j                  j                  j                        S )zL
        Returns the default audio codec this container recommends.
        )r   r   rd   r   audio_codecrL   s    r&   default_audio_codecz#OutputContainer.default_audio_codecA  r   r(   c                 h    t        j                  | j                  j                  j                        S )zO
        Returns the default subtitle codec this container recommends.
        )r   r   rd   r   subtitle_codecrL   s    r&   default_subtitle_codecz&OutputContainer.default_subtitle_codecH  s%    
 ##DKK$4$4$C$CDDr(   c                     t        |        y rC   rK   rL   s    r&   closezOutputContainer.closeO  rN   r(   c                 x    t        |t              r| j                  |       y |D ]  }| j                  |        y rC   )
isinstancer   mux_one)r)   packetsr>   s      r&   muxzOutputContainer.muxR  s5     gv&LL!! %V$%r(   r>   c                 h    | j                   dz  s| j                  |      ry | j                  |       y )Nr,   )r3   _buffer_for_extradatar1   )r)   r>   s     r&   r   zOutputContainer.mux_one[  s*    q d&@&@&Hf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   r7   stream_indexr   r   uint
nb_streamsrc   r2   _rebase_timer\   r   r   av_packet_refr/   rE   av_interleaved_write_frame)r)   r>   r   rets       r&   r1   zOutputContainer._mux_onea  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#c                    | j                   dz  s| xj                   dz  c_         | j                  j                  j                  t        j
                  z  r| j                  D ]q  }|j                  1|j                  j                  j                  t        j                  k7  rA	 t        d|      }|| j                  |j                  j                  <   s | j                  sy| j!                  |       | j"                  j%                  |       | j                  ry| j"                  }g | _        |D ]  }| j'                  |        y# t        $ r Y w xY w)zBuffer ``packet`` until extradata is known for all mux streams that
        need it. Returns True if the packet was buffered (caller should stop).   extract_extradata)	in_streamFT)r3   r7   r8   r9   r   r{   r2   r   r"   r#   r   r   r   	ExceptionrD   index_try_extract_extradatar0   appendr1   )r)   r>   r   bsfr=   buffered_packets         r&   r   z%OutputContainer._buffer_for_extradataw  s0    r!LLBLxx%%(>(>>"ll AF,,8!::..88FKKG !4/6
 >AD(()9)9:A ####F+%%f- //!#' 	+OMM/*	+% % ! !s   $E	EEc                 2   |j                   j                  }|| j                  vry | j                  |   }|j                   }t        j                         }|t
        j                  k(  rt        d      d}	 t        j                  ||j                         dk  r7	 t        j                  t        j                  |             | j                  |= y t        j                  ||      dk  rLt        j                  |       	 t        j                  t        j                  |             | j                  |= y t        j                  ||      dk(  rt        j                  |t        j                  t        j                  |            }|t
        j                  k7  ra|dkD  r\t!        | j                   j"                  |   |t        j$                  t
        j&                  |             t        j                  |       n/t        j                  |       t        j                  ||      dk(  rt        j                  t        j                  |             | j                  |= y # t        j                  t        j                  |             | j                  |= w xY w)NzCould not allocate packetr   )r7   r   rD   r   rF   r   r   r   r   rP   r!   av_bsf_send_packetav_packet_unrefav_bsf_receive_packetav_packet_get_side_dataAV_PKT_DATA_NEW_EXTRADATAr'   r2   r   rw   )r)   r>   idxbsf_wrapperr   tmpr   sds           r&   r   z&OutputContainer._try_extract_extradata  s    **11d***.2.B.B3.G0;,/,?,?,A&++9::	*  fjj1A5* v~~c23 $$S)/ %%c3/!3##C(" v~~c23 $$S)! ++C5:0066t8L $+((-r6;;vzz43P '',##C( ++C5: v~~c23 $$S)	 v~~c23 $$S)s   6#I .I 5C3I 7J)NNNrC   )NN)"r   
__module____qualname__rI   rM   rQ   r   r   r~   strr   r   boolr   r   bytesr   r   r   ccallr   propertyr   r   r   r   r   r   r   r   cfuncr1   r   r    r(   r&   rA   rA   B   s   4@ #"&j 	j
 4jX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  \\v  * \\#F # #J \\**V ** **r(   rA   )+r   r   cython.cimportsr   r   cython.cimports.av.bitstreamr   cython.cimports.av.codec.codecr    cython.cimports.av.codec.contextr   r    cython.cimports.av.codec.hwaccelr   $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   cython.cimports.libc.stdintr   cython.cimports.libc.stringr   r   r  rs   AVStreamrw   r'   rA   r?   finalcclass	Containerr  r(   r&   <module>r%     s    	  ( ? 0 M 4 @ 4 . , 9 B / 6 *NN3<<(*
..
!* *** *&   4 D
*i D
*  D
*r(   