# OpenVX Media Extension Library

`vx_amd_media` is an OpenVX AMD media extension module. This module has mainly two OpenVX extension nodes. `com.amd.amd_media.decode` node for video/jpeg decoding and `com.amd.amd_media.encode` node for video encoding

### List of OpenVX Media Extension Nodes:

| Node name                | Function           | Parameters                                                     |
|--------------------------|--------------------|----------------------------------------------------------------|
| com.amd.amd_media.decode | Video/JPEG decoder | Supports MP4/JPEG input files and outputs YUV or RGB           |
| com.amd.amd_media.encode | Video encoder      | Supports input YUV/RGB input and .264 elementary stream output |

## Build Instructions

### Pre-requisites

* AMD OpenVX™ library
* FFMPEG 4.0 or above, installed via MIVisionX setup script or download from following link
    - [download](https://ffmpeg.org/download.html)
* amdgpu Linux mesa driver for hardware support. Install with --no-dkms after installing ROCm.
    - [amdgpu](https://amdgpu-install.readthedocs.io/en/latest/)
    
### Example 1: decode video with runvx using software decoder

Following is an example gdf to decode 1 video stream using CPU decoder and decoded images will be written to output.yuv file

``` 
import vx_amd_media

# read input sequences
data vid1 = scalar:STRING,"1,<fname_with_full_path.mp4>:0"
data nvimg  = image:1920,1080,NV12:write,output.yuv
data loop = scalar:INT32,0
data opencl_out = scalar:INT32,0
node com.amd.amd_media.decode vid1 nvimg NULL loop opencl_out
```

### Example 2: decode video with runvx using hardware decoder

Following is an example gdf to encode 1 video stream using hardware and decoded images will be written to output.yuv file

``` 
import vx_amd_media

# read input sequences
data vid1 = scalar:STRING,"1,<fname_with_full_path.mp4>:1"
data nvimg  = image:1920,1080,NV12:write,output.yuv
data loop = scalar:INT32,0
data opencl_out = scalar:INT32,0
node com.amd.amd_media.decode vid1 nvimg NULL loop opencl_out
```

### Example 3: Encoding from yuv image to .264 file

Following is an example gdf to encode to .h264 stream from a YUV input file

Sample command: runvx -frames:<#framestoencode> file <encoder.gdf>

``` 
import vx_amd_media

# read input sequences
data yuvimg  = image:1920,1080,NV12:read,input.yuv
data vid1 = scalar:STRING,"fname_with_full_path.264"
data aux_output = array:UINT8,256
data gpu_mode = scalar:BOOL,FALSE
node com.amd.amd_media.encode vid1 yuvimg NULL aux_output gpu_mode
```

**NOTE:** OpenVX and the OpenVX logo are trademarks of the Khronos Group Inc.