o
    0i1                     @   s(  d dl mZ d dlmZmZ d dlmZ d dlZddlm	Z	 ddl
mZ ze	d W n eefyF Z zed	e d
 W Y dZ[ndZ[ww G dd deZdedejfddZdedejddfddZejdfdejdededejfddZd3dejdedejfddZd3dejdedefdd Zejd!dfdejded"ededejf
d#d$Z	%d4deejeej f d&edeejeej f fd'd(Zd4dejded&efd)d*Zejdfdejdededejfd+d,Zejdfdedededejfd-d.Zejfdededejfd/d0Zdejdejfd1d2Z dS )5    )Enum)ListUnion)warnN   )_load_library)_log_api_usage_onceimagez(Failed to load image Python extension: 'z'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?c                   @   s$   e Zd ZdZdZdZdZdZdZdS )ImageReadModeaV  
    Support for various modes while reading images.

    Use ``ImageReadMode.UNCHANGED`` for loading the image as-is,
    ``ImageReadMode.GRAY`` for converting to grayscale,
    ``ImageReadMode.GRAY_ALPHA`` for grayscale with transparency,
    ``ImageReadMode.RGB`` for RGB and ``ImageReadMode.RGB_ALPHA`` for
    RGB with transparency.
    r      r         N)	__name__
__module____qualname____doc__	UNCHANGEDGRAY
GRAY_ALPHARGB	RGB_ALPHA r   r   R/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torchvision/io/image.pyr
      s    
r
   pathreturnc                 C   s2   t j st j stt t jjt| }|S )z
    Reads and outputs the bytes contents of a file as a uint8 Tensor
    with one dimension.

    Args:
        path (str or ``pathlib.Path``): the path to the file to be read

    Returns:
        data (Tensor)
    )	torchjitis_scripting
is_tracingr   	read_fileopsr	   str)r   datar   r   r   r   (   s   r   filenamer"   c                 C   s4   t j st j stt t jjt| | dS )z
    Writes the contents of an uint8 tensor with one dimension to a
    file.

    Args:
        filename (str or ``pathlib.Path``): the path to the file to be written
        data (Tensor): the contents to be written to the output file
    N)	r   r   r   r   r   
write_filer    r	   r!   )r#   r"   r   r   r   r$   9   s   	r$   Finputmodeapply_exif_orientationc                 C   s6   t j st j stt t jj| |jd|}|S )a  
    Decodes a PNG image into a 3 dimensional RGB or grayscale Tensor.
    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 in [0, 255].

    Args:
        input (Tensor[1]): a one dimensional uint8 tensor containing
            the raw bytes of the PNG image.
        mode (ImageReadMode): the read mode used for optionally
            converting the image. Default: ``ImageReadMode.UNCHANGED``.
            See `ImageReadMode` class for more information on various
            available modes.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    F)	r   r   r   r   r   
decode_pngr    r	   valuer%   r&   r'   outputr   r   r   r(   G   s   r(      compression_levelc                 C   s0   t j st j stt t jj| |}|S )a	  
    Takes an input tensor in CHW layout and returns a buffer with the contents
    of its corresponding PNG file.

    Args:
        input (Tensor[channels, image_height, image_width]): int8 image tensor of
            ``c`` channels, where ``c`` must 3 or 1.
        compression_level (int): Compression factor for the resulting file, it must be a number
            between 0 and 9. Default: 6

    Returns:
        Tensor[1]: A one dimensional int8 tensor that contains the raw bytes of the
            PNG file.
    )r   r   r   r   r   
encode_pngr    r	   )r%   r-   r+   r   r   r   r.   d   s   r.   c                 C   s4   t j st j stt t| |}t|| dS )a  
    Takes an input tensor in CHW layout (or HW in the case of grayscale images)
    and saves it in a PNG file.

    Args:
        input (Tensor[channels, image_height, image_width]): int8 image tensor of
            ``c`` channels, where ``c`` must be 1 or 3.
        filename (str or ``pathlib.Path``): Path to save the image.
        compression_level (int): Compression factor for the resulting file, it must be a number
            between 0 and 9. Default: 6
    N)r   r   r   r   r   	write_pngr.   r$   )r%   r#   r-   r+   r   r   r   r/   y   s   
r/   cpudevicec                 C   s`   t j st j stt t |}|jdkr$t jj	
| |j|}|S t jj	| |j|}|S )a  
    Decodes a JPEG image into a 3 dimensional RGB or grayscale Tensor.
    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 between 0 and 255.

    Args:
        input (Tensor[1]): a one dimensional uint8 tensor containing
            the raw bytes of the JPEG image. This tensor must be on CPU,
            regardless of the ``device`` parameter.
        mode (ImageReadMode): the read mode used for optionally
            converting the image. The supported modes are: ``ImageReadMode.UNCHANGED``,
            ``ImageReadMode.GRAY`` and ``ImageReadMode.RGB``
            Default: ``ImageReadMode.UNCHANGED``.
            See ``ImageReadMode`` class for more information on various
            available modes.
        device (str or torch.device): The device on which the decoded image will
            be stored. If a cuda device is specified, the image will be decoded
            with `nvjpeg <https://developer.nvidia.com/nvjpeg>`_. This is only
            supported for CUDA version >= 10.1

            .. betastatus:: device parameter

            .. warning::
                There is a memory leak in the nvjpeg library for CUDA versions < 11.6.
                Make sure to rely on CUDA 11.6 or above before using ``device="cuda"``.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Default: False. Only implemented for JPEG format on CPU.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    cuda)r   r   r   r   r   decode_jpegr1   typer    r	   decode_jpeg_cudar)   )r%   r&   r1   r'   r+   r   r   r   r3      s   %

r3   K   qualityc                    s   t j st j stt  dk s dkrtdt| tr>| s%td| d j	j
dkr5t jj|  S  fdd| D S | j	j
dkrOt jj| g d S t jj|  S )	a-  
    Takes a (list of) input tensor(s) in CHW layout and returns a (list of) buffer(s) with the contents
    of the corresponding JPEG file(s).

    .. note::
        Passing a list of CUDA tensors is more efficient than repeated individual calls to ``encode_jpeg``.
        For CPU tensors the performance is equivalent.

    Args:
        input (Tensor[channels, image_height, image_width] or List[Tensor[channels, image_height, image_width]]):
            (list of) uint8 image tensor(s) of ``c`` channels, where ``c`` must be 1 or 3
        quality (int): Quality of the resulting JPEG file(s). Must be a number between
            1 and 100. Default: 75

    Returns:
        output (Tensor[1] or list[Tensor[1]]): A (list of) one dimensional uint8 tensor(s) that contain the raw bytes of the JPEG file.
    r   d   z;Image quality should be a positive number between 1 and 100zDencode_jpeg requires at least one input tensor when a list is passedr   r2   c                    s   g | ]
}t jj| qS r   )r   r    r	   encode_jpeg).0r	   r7   r   r   
<listcomp>   s    zencode_jpeg.<locals>.<listcomp>)r   r   r   r   r   r9   
ValueError
isinstancelistr1   r4   r    r	   encode_jpegs_cuda)r%   r7   r   r;   r   r9      s   
r9   c                 C   sD   t j st j stt t| |}t|t jsJ t	|| dS )a  
    Takes an input tensor in CHW layout and saves it in a JPEG file.

    Args:
        input (Tensor[channels, image_height, image_width]): int8 image tensor of ``c``
            channels, where ``c`` must be 1 or 3.
        filename (str or ``pathlib.Path``): Path to save the image.
        quality (int): Quality of the resulting JPEG file, it must be a number
            between 1 and 100. Default: 75
    N)
r   r   r   r   r   
write_jpegr9   r>   Tensorr$   )r%   r#   r7   r+   r   r   r   rA      s
   
rA   c                 C   s4   t j st j stt t jj| |j|}|S )a{  
    Detect whether an image is a JPEG, PNG or GIF and performs the appropriate
    operation to decode the image into a 3 dimensional RGB or grayscale Tensor.

    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 in [0, 255].

    Args:
        input (Tensor): a one dimensional uint8 tensor containing the raw bytes of the
            PNG or JPEG image.
        mode (ImageReadMode): the read mode used for optionally converting the image.
            Default: ``ImageReadMode.UNCHANGED``.
            See ``ImageReadMode`` class for more information on various
            available modes. Ignored for GIFs.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Ignored for GIFs. Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    )	r   r   r   r   r   decode_imager    r	   r)   r*   r   r   r   rC      s   rC   c                 C   s2   t j st j stt t| }t|||dS )a  
    Reads a JPEG, PNG or GIF image into a 3 dimensional RGB or grayscale Tensor.
    Optionally converts the image to the desired format.
    The values of the output tensor are uint8 in [0, 255].

    Args:
        path (str or ``pathlib.Path``): path of the JPEG, PNG or GIF image.
        mode (ImageReadMode): the read mode used for optionally converting the image.
            Default: ``ImageReadMode.UNCHANGED``.
            See ``ImageReadMode`` class for more information on various
            available modes. Ignored for GIFs.
        apply_exif_orientation (bool): apply EXIF orientation transformation to the output tensor.
            Ignored for GIFs. Default: False.

    Returns:
        output (Tensor[image_channels, image_height, image_width])
    )r'   )r   r   r   r   r   
read_imager   rC   )r   r&   r'   r"   r   r   r   rD     s   rD   c                 C   s   t | }tjj||jdS )NT)r   r   r    r	   r(   r)   )r   r&   r"   r   r   r   _read_png_16-  s   rE   c                 C   s*   t j st j stt t jj| S )a&  
    Decode a GIF image into a 3 or 4 dimensional RGB Tensor.

    The values of the output tensor are uint8 between 0 and 255.
    The output tensor has shape ``(C, H, W)`` if there is only one image in the
    GIF, and ``(N, C, H, W)`` if there are ``N`` images.

    Args:
        input (Tensor[1]): a one dimensional contiguous uint8 tensor containing
            the raw bytes of the GIF image.

    Returns:
        output (Tensor[image_channels, image_height, image_width] or Tensor[num_images, image_channels, image_height, image_width])
    )r   r   r   r   r   
decode_gifr    r	   )r%   r   r   r   rF   2  s   rF   )r,   )r6   )!enumr   typingr   r   warningsr   r   	extensionr   utilsr   ImportErrorOSErrorer
   r!   rB   r   r$   r   boolr(   intr.   r/   r3   r9   rA   rC   rD   rE   rF   r   r   r   r   <module>   s    
	

0
&
!
