
    Cc(                        d Z ddgZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZ e G d de             Zej                   d	ej"                  d
ej$                  d	ej&                  dej(                  dej*                  dej,                  dej.                  diZdZg dZg dZe G d de             Zg dZ G d de	      Z G d de      Z G d de      Z e Z!eZ"y)zPure AC3 file information.
AC3Open    )
StreamInfo)FileType)	BitReaderBitReaderErrorMutagenErrorconvert_errorenumloadfileendswithc                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
ChannelModer                        N)__name__
__module____qualname__DUALMONOMONOSTEREOC3FC2F1RC3F1RC2F2RC3F2R     -/usr/lib/python3/dist-packages/mutagen/ac3.pyr   r      s*    HDF
CEEEEr#   r   r   r   r   r   r   r   )i  iD  i }  )    (   0   8   @   P   `   p                  i@  i  i  i   i@  i  c                       e Zd ZdZdZdZdZy)EAC3FrameTyper   r   r   r   N)r   r   r   INDEPENDENT	DEPENDENTAC3_CONVERTRESERVEDr"   r#   r$   r3   r3   <   s    KIKHr#   r3   )r   r   r   r   c                       e Zd Zy)AC3ErrorN)r   r   r   r"   r#   r$   r9   r9   G   s    r#   r9   c                       e Zd ZdZdZdZdZdZdZ e	e
e      d        Zd Zd Zd Zed        Zed	        Zed
        Zd Zd Zy)AC3Infoa  AC3 stream information.
    The length of the stream is just a guess and might not be correct.

    Attributes:
        channels (`int`): number of audio channels
        length (`float`): file length in seconds, as a float
        sample_rate (`int`): audio sampling rate in Hz
        bitrate (`int`): audio bitrate, in bits per second
        codec (`str`): ac-3 or ec-3 (Enhanced AC-3)
    r   zac-3c                    t        |j                  d            }t        |      dk  rt        d      |j	                  d      st        d      |d   dz	  }|dkD  rt        d|z        |j                  d	       | j                  ||       y
)zRaises AC3Errorr   znot enough data   wznot a AC3 filer   r      zinvalid bitstream_id %ir   N)	bytearrayreadlenr9   
startswithseek_read_header)selffileobjheaderbitstream_ids       r$   __init__zAC3Info.__init__^   s     7<<?+v;?,--  -+,,ayA~"4|CDDQ'<0r#   c                     t        |      }	 |dk  r| j                  ||       n| j                  |       | j                  |      | _        y # t        $ r}t	        |      d }~ww xY w)N
   )r   _read_header_normal_read_header_enhancedr   r9   _guess_lengthlength)rE   rF   rH   	bitreaderes        r$   rD   zAC3Info._read_headerp   si    g&		 r!((LA**95 ((1  	1+	s   )A 	A&A!!A&c                 p   |}|j                  d       |j                  d      }|dk(  rt        d|z        |j                  d      }|dkD  rt        d|z        |j                  d       |j                  d       t        |j                  d            }|j                  d       |j                  d	      }t	        |d
      d
z
  }	 t
        |   |z	  | _        t        |d	z	     dz  |z	  | _        | j                  ||      | _        | j                  ||       y # t        $ r}	t        |	      d }	~	ww xY w)Nr>   r   r   invalid sample rate code %ir   %   zinvalid frame size code %ir   r      i  )skipbitsr9   r   maxAC3_SAMPLE_RATESsample_rateAC3_BITRATESbitrateKeyError_get_channelschannels_skip_unused_header_bits_normal)
rE   rP   rH   rsr_codeframe_size_codechannel_modelfe_onsr_shiftrQ   s
             r$   rL   zAC3Info._read_header_normal~   s%   	r
&&)a<87BCC&&)R7/IJJ	q		q	"166!9-	q	|Q'!+	/8HDD(A)=>E!)*DL **<@,,Q=  	1+	s   
(D 	D5%D00D5c                 $   |}d| _         |j                  d      }|t        j                  k(  rt	        d|z        |j                  d       |j                  d      dz   dz  }|t        k  rt	        d|z        |j                  d      }	 |dk(  r8|j                  d      }|dk(  rt	        d|z        d}t        |   dz  | _        n|j                  d      }t        |   | _        t        |j                  d            }|j                  d      }	d	|z  | j                  z  t        |   d
z  z  | _        |j                  d       | j                  ||	      | _        | j                  |||||       y # t        $ r}
t	        |
      d }
~
ww xY w)Nzec-3r   zinvalid frame type %ir      r   zinvalid frame size %irS   rU   r1   r   )codecrW   r3   r7   r9   rV   AC3_HEADER_SIZErY   rZ   r   EAC3_BLOCKSr\   r]   r^   r_   !_skip_unused_header_bits_enhanced)rE   rP   ra   
frame_type
frame_sizerb   sr_code2numblocks_coderd   re   rQ   s              r$   rM   zAC3Info._read_header_enhanced   s   
VVAY
///2Z?@@	q	ffRj1n*
'2Z?@@&&)	!|66!9q="#@8#KLL!"#3H#=#B !"#3G#< &qvvay1LVVAYFz>D,<,<<N+c13DL 	
q	**<@..z<.	B	  	1+	s   B+E6 6	F?F

Fc                 0   | }|j                  d       |j                  d      r|j                  d       |j                  d      r|j                  d       |j                  d      r|j                  d       |t        j                  k(  rw|j                  d       |j                  d      r|j                  d       |j                  d      r|j                  d       |j                  d      r|j                  d       |j                  d       |j                  d      }|j                  d      }|r|j                  d       |r|j                  d       |j                  d      r)|j	                  d      }|j                  |dz   dz         y y )Nr   r   rU   r   r      r   )rV   rW   r   r   bit)rP   rd   ra   	timecod1e	timecod2eaddbsils         r$   r`   z'AC3Info._skip_unused_header_bits_normal   s(   	q	66!9FF1I66!9FF1I66!9 FF1I;///FF1Ivvayq	vvayq	vvay q	 	
q	FF1I	FF1I	FF2JFF2J66!9eeAhGFFGaK1$% r#   c                 r   | }|j                  d       |j                  d      r|j                  d       |t        j                  k(  r3|j                  d       |j                  d      r|j                  d       |t        j
                  k(  r"|j                  d      r|j                  d       |j                  d      ry |j                  d      r|j                  d       |t        j                  k(  r|j                  d       n$|t        j                  k\  r|j                  d       |j                  d      r|j                  d       |t        j                  k(  r"|j                  d      r|j                  d       |dk  r|j                  d       |t        j                  k(  r|dk(  r|j                  d       |t        j                  k(  r'|dk7  r"|j                  d      r|j                  d       |j                  d      r)|j                  d      }|j                  |dz   dz         y y )	Nr   r   rU   r>   r   r   r   r   )rV   rW   r   r   r3   r5   r   r    r4   r6   rs   )rP   rm   rd   rb   rp   ra   rv   s          r$   rl   z)AC3Info._skip_unused_header_bits_enhanced   s    	q	66!9FF1I;///FF1Ivvayq	000vvayr
66!966!9 FF1I{111 q	!2!22q	vvay q	{33366!9 FF1I{q	222~7JFF1I222"66!9FF1I66!9eeAhGFFGaK1$% r#   c                 T    	 t         |    |z   S # t        $ r}t        |      d }~ww xY wN)AC3_CHANNELSr]   r9   )rd   re   rQ   s      r$   r^   zAC3Info._get_channels  s1    	-66 	1+	s    	'"'c                     | j                   dk(  ry |j                         }|j                  dd       |j                         |z
  }d|z  | j                   z  S )Nr   r   g       @)r\   tellrC   )rE   rF   startrO   s       r$   rN   zAC3Info._guess_length  sM    <<1Q%'V|dll**r#   c                 z    d| j                   | j                  | j                  | j                  | j                  fz  S )Nz.%s, %d Hz, %.2f seconds, %d channel(s), %d bps)ri   rZ   rO   r_   r\   rE   s    r$   pprintzAC3Info.pprint$  s7    @JJ(($++t}}LLD  	r#   N)r   r   r   __doc__r_   rO   rZ   r\   ri   r
   IOErrorr9   rI   rD   rL   rM   staticmethodr`   rl   r^   rN   r   r"   r#   r$   r;   r;   K   s    	 HFKGE7H%1 &1"2>6#BJ  &  &D 0& 0&d  +r#   r;   c                   F    e Zd ZdZdgZ e       d        Zd Zed        Z	y)r   zAC3(filething)

    Arguments:
        filething (filething)

    Load AC3 or EAC3 files.

    Tagging is not supported.
    Use the ID3/APEv2 classes directly instead.

    Attributes:
        info (`AC3Info`)
    z	audio/ac3c                 8    t        |j                        | _        y ry   )r;   rF   info)rE   	filethings     r$   loadzAC3.load;  s    I--.	r#   c                     t        d      )Nzdoesn't support tags)r9   r   s    r$   add_tagszAC3.add_tags?  s    -..r#   c                 `    |j                  d      dz  t        | d      xs t        | d      z   S )Nr=   r   z.ac3z.eac3)rB   r   )filenamerF   rG   s      r$   scorez	AC3.scoreB  s7      -1&)HXh-HJ 	Jr#   N)
r   r   r   r   _mimesr   r   r   r   r   r"   r#   r$   r   r   *  s?     ]FZ/ // J Jr#   N)#r   __all__mutagenr   mutagen._filer   mutagen._utilr   r   r	   r
   r   r   r   objectr   r   r   r   r   r   r   r    r!   rz   rj   rY   r[   r3   rk   r9   r;   r   r   errorr"   r#   r$   <module>r      s   &/  "   &   !aOOQqqqq	 (  F   	| 	\j \~J( J< r#   