1
0

Updated entry points to cover all wiki usages

Signed-off-by: James P. Ketrenos <james.p.ketrenos@intel.com>
This commit is contained in:
James P. Ketrenos 2019-09-19 16:53:48 -07:00
parent 50e14133ad
commit d9bc121e2a
6 changed files with 387 additions and 61 deletions

View File

@ -3,7 +3,9 @@
This project hosts a container demonstrating the use of ffmpeg This project hosts a container demonstrating the use of ffmpeg
using GPU offload for transcode operations. using GPU offload for transcode operations.
# Using # Usage examples
## Build the container
Build the container: Build the container:
@ -11,17 +13,13 @@ Build the container:
docker build . -t intel-media-ffmpeg docker build . -t intel-media-ffmpeg
``` ```
Run the container: or you can pull the container from Harbor:
```bash ```bash
docker run \ docker pull amr-registry.caas.intel.com/vtt-osgc/solutions/intel-media-ffmpeg
--rm \ docker tag amr-registry.caas.intel.com/vtt-osgc/solutions/intel-media-ffmpeg intel-media-ffmpeg
--device=/dev/dri \
-it \
intel-media-ffmpeg
``` ```
# Usage examples
## Download test content ## Download test content
@ -33,9 +31,65 @@ test stream here:
wget -q -O media/AUD_MW_E.264 https://fate-suite.libav.org/h264-conformance/AUD_MW_E.264 wget -q -O media/AUD_MW_E.264 https://fate-suite.libav.org/h264-conformance/AUD_MW_E.264
``` ```
## Run a set of tests in sequence
The following will decode, encode, and transcode the sample content:
```bash
HOST_MEDIA=$(pwd)/media
[ ! -e "${HOST_MEDIA}/AUD_MW_E.264" ] && {
mkdir -p ${HOST_MEDIA}
wget -q -O ${HOST_MEDIA}/AUD_MW_E.264 https://fate-suite.libav.org/h264-conformance/AUD_MW_E.264
}
tests=(
"decode AUD_MW_E.264 AUD_MW.yuv"
"encode AUD_MW.yuv AUD_MW_E.h264"
"transcode AUD_MW_E.264 AUD_MW_E.hevc"
"1N_transcode AUD_MW_E.264 AUD_1N"
)
for test in "${tests[@]}"; do
test=($test)
docker run --rm \
--volume ${HOST_MEDIA}:/media -it \
--device=/dev/dri -e QSV_DEVICE=${QSV_DEVICE:-/dev/dri/D128} \
intel-media-ffmpeg ${test[*]} || {
echo "Error: Test failed: ${test[*]}"
break
}
done
```
The above will download the file AUD_MW_E.264 and then perform various actions on it.
If successful, looking in $(HOST_MEDIA} should show the following files (all with data
in them.)
```bash
$ ls -1tr "${HOST_MEDIA}"
AUD_MW_E.264
AUD_MW.yuv
AUD_MW_E.h264
AUD_MW_E.hevc
AUD_1N-5M.mp4
AUD_1N-4M60FPS.h264
```
## Launch a shell in the container
The examples below are all assumed to be running in the container's environment:
```bash
docker run \
--rm \
--device=/dev/dri \
-e QSV_DEVICE=${QSV_DEVICE:-/dev/dri/renderD128} \
-it \
intel-media-ffmpeg \
shell
```
## Decode ## Decode
H264 video decode and save as raw file: AVC (H.264) video decode and save as YUV 420P raw file:
```bash ```bash
IN_FILE=AUD_WM_E.264 IN_FILE=AUD_WM_E.264
@ -51,10 +105,10 @@ docker run \
-hwaccel qsv \ -hwaccel qsv \
-qsv_device ${QSV_DEVICE:-/dev/dri/renderD128} \ -qsv_device ${QSV_DEVICE:-/dev/dri/renderD128} \
-c:v h264_qsv \ -c:v h264_qsv \
-i /media/${IN_FILE} \ -i /media/"${IN_FILE}" \
-vf hwdownload,format=nv12 -pix_fmt yuv420p \ -vf hwdownload,format=nv12 -pix_fmt yuv420p \
-y \ -y \
/media/${OUT_FILE} /media/"${OUT_FILE}"
``` ```
## Encode ## Encode
@ -79,13 +133,13 @@ docker run \
-f rawvideo \ -f rawvideo \
-pix_fmt yuv420p \ -pix_fmt yuv420p \
-s:v 176x144 \ -s:v 176x144 \
-i /media/${IN_FILE} \ -i /media/"${IN_FILE}" \
-vf hwupload=extra_hw_frames=64,format=qsv \ -vf hwupload=extra_hw_frames=64,format=qsv \
-c:v h264_qsv \ -c:v h264_qsv \
-b:v 5M \ -b:v 5M \
-frames:v 10 \ -frames:v 10 \
-y \ -y \
/media/${OUT_FILE} /media/"${OUT_FILE}"
``` ```
## Transcode ## Transcode
@ -111,15 +165,14 @@ docker run \
-c:v hevc_qsv \ -c:v hevc_qsv \
-b:v 5M \ -b:v 5M \
-y \ -y \
/media/${OUT_FILE} /media/"${OUT_FILE}"
``` ```
### 1:N transcoding ### 1:N transcoding
```bash ```bash
QSV_DEVICE=${QSV_DEVICE:-/dev/dri/renderD128}
IN_FILE=AUD_MW_E.264 IN_FILE=AUD_MW_E.264
OUT_FILE_BASE=AUD_1N_ OUT_FILE=AUD_1N_
HOST_MEDIA=$(pwd)/media HOST_MEDIA=$(pwd)/media
docker run \ docker run \
--rm \ --rm \
@ -129,14 +182,14 @@ docker run \
intel-media-ffmpeg \ intel-media-ffmpeg \
ffmpeg \ ffmpeg \
-hwaccel qsv \ -hwaccel qsv \
-qsv_device ${QSV_DEVICE} \ -qsv_device ${QSV_DEVICE} \
-c:v h264_qsv \ -c:v h264_qsv \
-i /media/${IN_FILE} \ -i /media/"${IN_FILE}" \
-filter_complex "split=2[s1][s2]; \ -filter_complex "split=2[s1][s2]; \
[s1]scale_qsv=1280:720[o1]; \ [s1]scale_qsv=1280:720[o1]; \
[s2]vpp_qsv=framerate=60[o2]" \ [s2]vpp_qsv=framerate=60[o2]" \
-map [o1] -c:v h264_qsv -b:v 5M /media/"${OUT_FILE_BASE}5M.mp4" \ -map [o1] -c:v h264_qsv -b:v 5M /media/"${OUT_FILE}-5M.mp4" \
-map [o2] -c:v h264_qsv -b:v 4M /media/"${OUT_FILE_BASE}4M60FPS.h264" -map [o2] -c:v h264_qsv -b:v 4M /media/"${OUT_FILE}-4M60FPS.h264"
``` ```
## Developing ## Developing

127
assets/cmd_1N_transcode Executable file
View File

@ -0,0 +1,127 @@
#!/bin/bash
PARAM=$0
# Strip path and cmd_ prefix from command name
PARAM=${PARAM##*/cmd_}
short() {
echo "Transcode AVC (H.264) to to streams: 1280x720@5Mbps and 60FPS@4Mbps"
}
help() {
cat << EOF
$(short)
$(info)
IN_FILE AVC (H.264) format input stream
OUT_FILE Base filename. "-5M.mp4" and "-4M60FPS.h264" will be added.
NOTE: Above paths are read from the container volume /media.
EOF
}
details() {
cat << EOF
$(short)
This script provides a quick reference example using the following
ffmpeg command:
ffmpeg \
-hwaccel qsv \
-qsv_device ${QSV_DEVICE} \
-c:v h264_qsv \
-i /media/"\${IN_FILE}" \
-filter_complex "split=2[s1][s2]; \
[s1]scale_qsv=1280:720[o1]; \
[s2]vpp_qsv=framerate=60[o2]" \
-y \
-map [o1] -c:v h264_qsv -b:v 5M /media/"\${OUT_FILE}-5M.mp4" \
-map [o2] -c:v h264_qsv -b:v 4M /media/"\${OUT_FILE}-4M60FPS.h264"
EOF
}
arguments=()
for arg in $*; do
[[ $arg =~ ^-- ]] && {
command=${arg/--}
case $command in
short) short
exit 0
;;
help) help
exit 0
;;
details) details
exit 0
;;
*) echo "Unrecognized command."
exit 1
;;
esac
} || {
arguments+=("$arg")
}
done
info() {
cat << EOF
usage: $PARAM INPUT-FILE OUTPUT-FILE
EOF
}
QSV_DEVICE=${QSV_DEVICE:-/dev/dri/renderD128}
[ "${arguments[0]}" == "" ] || [ "${arguments[1]}" == "" ] && {
info
exit 1
}
[ ! -e /media/"${arguments[0]}" ] && {
cat << EOF
Error: '${arguments[0]}' not found.
Was the volume /media mounted when launching the container?
docker ... --volume \$(pwd)/media:/media ...
or similar?
EOF
exit 1
}
[ ! -e ${QSV_DEVICE} ] && {
cat << EOF
Error: '${QSV_DEVICE}' not found.
Did you pass /dev/dri to Docker?
docker ... --device=/dev/dri ...
or similar?
EOF
exit 2
}
IN_FILE="${arguments[0]}"
OUT_FILE="${arguments[1]}"
ffmpeg \
-hwaccel qsv \
-qsv_device ${QSV_DEVICE} \
-c:v h264_qsv \
-i /media/"${IN_FILE}" \
-filter_complex "split=2[s1][s2]; \
[s1]scale_qsv=1280:720[o1]; \
[s2]vpp_qsv=framerate=60[o2]" \
-map [o1] -c:v h264_qsv -b:v 5M /media/"${OUT_FILE}-5M.mp4" \
-map [o2] -c:v h264_qsv -b:v 4M /media/"${OUT_FILE}-4M60FPS.h264"

View File

@ -5,7 +5,7 @@ PARAM=$0
PARAM=${PARAM##*/cmd_} PARAM=${PARAM##*/cmd_}
short() { short() {
echo "Decode H264 video and save as raw file" echo "Decode AVC (H.264) video and save as YUV 420P raw file"
} }
help() { help() {
@ -14,8 +14,8 @@ $(short)
$(info) $(info)
INFILE Input stream must be H264 video IN_FILE Input stream must be AVC (H.264) video
OUTFILE Will be decoded and saved as YUV420P OUT_FILE Output stream as YUV 420P
NOTE: Above paths are read from the container volume /media. NOTE: Above paths are read from the container volume /media.
@ -29,14 +29,14 @@ $(short)
This script provides a quick reference example using the following This script provides a quick reference example using the following
ffmpeg command: ffmpeg command:
ffmpeg \ ffmpeg \
-hwaccel qsv \ -hwaccel qsv \
-qsv_device ${QSV_DEVICE} \ -qsv_device \${QSV_DEVICE:-/dev/dri/renderD128} \
-c:v h264_qsv \ -c:v h264_qsv \
-i /media/INFILE \ -i /media/"\${IN_FILE}" \
-vf hwdownload,format=nv12 \ -vf hwdownload,format=nv12 -pix_fmt yuv420p \
-pix_fmt yuv420p \ -y \
/media/OUTFILE /media/"\${OUT_FILE}"
EOF EOF
} }
@ -95,7 +95,7 @@ EOF
[ ! -e ${QSV_DEVICE} ] && { [ ! -e ${QSV_DEVICE} ] && {
cat << EOF cat << EOF
Error: '${QSV_DEVCIE}' not found. Error: '${QSV_DEVICE}' not found.
Did you pass /dev/dri to Docker? Did you pass /dev/dri to Docker?
@ -107,8 +107,15 @@ EOF
exit 2 exit 2
} }
ffmpeg -hwaccel qsv -qsv_device ${QSV_DEVICE} \ IN_FILE="${arguments[0]}"
-c:v h264_qsv -i /media/"${arguments[0]}" \ OUT_FILE="${arguments[1]}"
-vf hwdownload,format=nv12 -pix_fmt yuv420p \
/media/"${arguments[1]}" ffmpeg \
-hwaccel qsv \
-qsv_device ${QSV_DEVICE:-/dev/dri/renderD128} \
-c:v h264_qsv \
-i /media/"${IN_FILE}" \
-vf hwdownload,format=nv12 -pix_fmt yuv420p \
-y \
/media/"${OUT_FILE}"

View File

@ -14,8 +14,8 @@ $(short)
$(info) $(info)
INFILE Must 720p raw IN_FILE YUV 420p raw stream
OUTFILE Will be encoded as H264 w/ 5Mbps using VBR OUT_FILE Encoded to AVC (H.264) with 5Mbps using VBR
NOTE: Above paths are read from the container volume /media. NOTE: Above paths are read from the container volume /media.
@ -29,17 +29,21 @@ $(short)
This script provides a quick reference example using the following This script provides a quick reference example using the following
ffmpeg command: ffmpeg command:
ffmpeg -loglevel debug \ ffmpeg \
-init_hw_device qsv=hw \ -loglevel debug \
-filter_hw_device hw \ -init_hw_device vaapi=va:\${QSV_DEVICE:-/dev/dri/renderD128} \
-f rawvideo -pix_fmt yuv420p \ -init_hw_device qsv=hw@va \
-s:v 176x144 \ -filter_hw_device hw \
-i /media/INFILE \ -f rawvideo \
-vf hwupload=extra_hw_frames=64,format=qsv \ -pix_fmt yuv420p \
-c:v h264_qsv \ -s:v 176x144 \
-b:v 5M \ -i /media/\$(IN_FILE} \
-frames:v 10 \ -vf hwupload=extra_hw_frames=64,format=qsv \
-y /media/OUTFILE -c:v h264_qsv \
-b:v 5M \
-frames:v 10 \
-y \
/media/\${OUT_FILE}
EOF EOF
} }
@ -99,7 +103,7 @@ EOF
[ ! -e ${QSV_DEVICE} ] && { [ ! -e ${QSV_DEVICE} ] && {
cat << EOF cat << EOF
Error: '${QSV_DEVCIE}' not found. Error: '${QSV_DEVICE}' not found.
Did you pass /dev/dri to Docker? Did you pass /dev/dri to Docker?
@ -111,12 +115,21 @@ EOF
exit 2 exit 2
} }
INFILE="${arguments[0]}" IN_FILE="${arguments[0]}"
OUTFILE="${arguments[1]}" OUT_FILE="${arguments[1]}"
ffmpeg -loglevel debug -init_hw_device qsv=hw \ ffmpeg \
-filter_hw_device hw -f rawvideo -pix_fmt \ -loglevel debug \
yuv420p -s:v 176x144 -i /media/"${INFILE}" -vf \ -init_hw_device vaapi=va:${QSV_DEVICE:-/dev/dri/renderD128} \
hwupload=extra_hw_frames=64,format=qsv \ -init_hw_device qsv=hw@va \
-c:v h264_qsv -b:v 5M -frames:v 10 \ -filter_hw_device hw \
-y /media/"${OUTFILE}" -f rawvideo \
-pix_fmt yuv420p \
-s:v 176x144 \
-i /media/${IN_FILE} \
-vf hwupload=extra_hw_frames=64,format=qsv \
-c:v h264_qsv \
-b:v 5M \
-frames:v 10 \
-y \
/media/${OUT_FILE}

125
assets/cmd_transcode Executable file
View File

@ -0,0 +1,125 @@
#!/bin/bash
PARAM=$0
# Strip path and cmd_ prefix from command name
PARAM=${PARAM##*/cmd_}
short() {
echo "Transcode AVC (H.264) to HEVC (H.265) with 5Mbps using VBR"
}
help() {
cat << EOF
$(short)
$(info)
IN_FILE AVC (H.264) format input stream
OUT_FILE HEVC (H.265) output stream
NOTE: Above paths are read from the container volume /media.
EOF
}
details() {
cat << EOF
$(short)
This script provides a quick reference example using the following
ffmpeg command:
ffmpeg \
-loglevel debug \
-hwaccel qsv \
-qsv_device \${QSV_DEVICE:-/dev/dri/renderD128} \
-c:v h264_qsv \
-i /media/"\${IN_FILE}" \
-c:v hevc_qsv \
-b:v 5M \
-y \
/media/"\${OUT_FILE}"
EOF
}
arguments=()
for arg in $*; do
[[ $arg =~ ^-- ]] && {
command=${arg/--}
case $command in
short) short
exit 0
;;
help) help
exit 0
;;
details) details
exit 0
;;
*) echo "Unrecognized command."
exit 1
;;
esac
} || {
arguments+=("$arg")
}
done
info() {
cat << EOF
usage: $PARAM INPUT-FILE OUTPUT-FILE
EOF
}
QSV_DEVICE=${QSV_DEVICE:-/dev/dri/renderD128}
[ "${arguments[0]}" == "" ] || [ "${arguments[1]}" == "" ] && {
info
exit 1
}
[ ! -e /media/"${arguments[0]}" ] && {
cat << EOF
Error: '${arguments[0]}' not found.
Was the volume /media mounted when launching the container?
docker ... --volume \$(pwd)/media:/media ...
or similar?
EOF
exit 1
}
[ ! -e ${QSV_DEVICE} ] && {
cat << EOF
Error: '${QSV_DEVICE}' not found.
Did you pass /dev/dri to Docker?
docker ... --device=/dev/dri ...
or similar?
EOF
exit 2
}
IN_FILE="${arguments[0]}"
OUT_FILE="${arguments[1]}"
ffmpeg \
-loglevel debug \
-hwaccel qsv \
-qsv_device ${QSV_DEVICE:-/dev/dri/renderD128} \
-c:v h264_qsv \
-i /media/"${IN_FILE}" \
-c:v hevc_qsv \
-b:v 5M \
-y \
/media/"${OUT_FILE}"

View File

@ -6,6 +6,7 @@ export $(grep -v '^#' SOLUTION | xargs -d '\n')
export $(grep -v '^#' MANIFEST | xargs -d '\n') export $(grep -v '^#' MANIFEST | xargs -d '\n')
docker build . -t ${CONTAINER}:agama-${AGAMA_VERSION} docker build . -t ${CONTAINER}:agama-${AGAMA_VERSION}
docker tag ${CONTAINER}:agama-${AGAMA_VERSION} ${CONTAINER}
cat << EOM cat << EOM