summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2017-05-17 20:16:04 +0200
committerJonas Smedegaard <dr@jones.dk>2017-05-17 20:16:04 +0200
commitb33f2677290bbbb6588ed1abce8f97fba4ec5b0c (patch)
treef046970767226909c265b8298fd331be0f728875
parentc0dd40df55cc249daf25bf97fc0d01baf6f17e73 (diff)
Vary vp8 speed based on height.
-rwxr-xr-xbin/capture+encode+serve32
-rwxr-xr-xbin/decode+edit+encode5
-rwxr-xr-xbin/decode+edit+loop+encode+stream21
-rwxr-xr-xbin/encodevideo+loop+stream21
-rwxr-xr-xbin/loop+encode+stream21
-rwxr-xr-xbin/stream25
6 files changed, 72 insertions, 53 deletions
diff --git a/bin/capture+encode+serve b/bin/capture+encode+serve
index ad97c24..26c5f40 100755
--- a/bin/capture+encode+serve
+++ b/bin/capture+encode+serve
@@ -47,45 +47,59 @@ my $HEIGHT = 240;
my $FRAMERATE = 25;
my $AUDIORATE = 48000;
-# TODO: Vary vpx quality based on height
-my $SPEED_VP8 = 15;
-
-# inspired by Apple HLS recommendations
-# TODO: Externalize to site-specific configfile
+# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html
+# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer
+# TODO: adjust height steps or bitrates for 4:3 aspect ratio
+# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264
+# TODO: Externalize speeds to site-specific configfile
my ( $VBITRATE, $SPEED_X264, $SPEED_X264_ALONE );
if ( $HEIGHT le 234 ) {
$VBITRATE = 145000;
- $SPEED_X264 = 'slow';
+ $SPEED_X264 = 'fast';
$SPEED_X264_ALONE = 'fast';
+ $SPEED_VP8 = 3;
+ $SPEED_VP8_ALONE = 2;
}
elsif ( $HEIGHT le 270 ) {
$VBITRATE = 365000;
$SPEED_X264 = 'faster';
$SPEED_X264_ALONE = 'fast';
+ $SPEED_VP8 = 4;
+ $SPEED_VP8_ALONE = 2;
}
elsif ( $HEIGHT le 360 ) {
$VBITRATE = 730000;
- $SPEED_X264 = 'faster';
+ $SPEED_X264 = 'veryfast';
$SPEED_X264_ALONE = 'fast';
+ $SPEED_VP8 = 5;
+ $SPEED_VP8_ALONE = 3;
}
elsif ( $HEIGHT le 432 ) {
$VBITRATE = 1100000;
- $SPEED_X264 = 'veryfast';
+ $SPEED_X264 = 'ultrafast';
$SPEED_X264_ALONE = 'fast';
+ $SPEED_VP8 = 8;
+ $SPEED_VP8_ALONE = 4;
}
elsif ( $HEIGHT le 540 ) {
$VBITRATE = 2000000;
$SPEED_X264 = 'toofast';
$SPEED_X264_ALONE = 'veryfast';
+ $SPEED_VP8_ALONE = 5;
}
elsif ( $HEIGHT le 720 ) {
$VBITRATE = 3000000;
$SPEED_X264 = 'toofast';
$SPEED_X264_ALONE = 'ultrafast';
+ $SPEED_VP8_ALONE = 15;
}
-unless ($HEIGHTS_WEBM) { $SPEED_X264 = $SPEED_X264_ALONE }
if ( toofast == $SPEED_X264 ) die "Not enough CPU - reduce size or streams";
+# TODO: implement codec-specific height pools
+#if ( toofast == $SPEED_X264 ) { @HEIGHTS_MPEG = () };
+#unless (@HEIGHTS_MPEG) { $SPEED_VP8 = $SPEED_VP8_ALONE }
+#unless (@HEIGHTS_WEBM) { $SPEED_X264 = $SPEED_X264_ALONE }
+
my $VCAPS = "video/x-raw,height=$HEIGHT";
my $ACAPS = "audio/x-raw,rate=$AUDIORATE,channels=2,depth=16";
diff --git a/bin/decode+edit+encode b/bin/decode+edit+encode
index 96b7081..7499130 100755
--- a/bin/decode+edit+encode
+++ b/bin/decode+edit+encode
@@ -10,10 +10,11 @@ OUTPUT=../tmp/omni/show0/earth.webm
HEIGHT=360
-# TODO: Vary vpx quality based on height
SPEED_VP8=4
-# inspired by Apple HLS recommendations
+# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html
+# TODO: adjust height steps or bitrates for 4:3 aspect ratio
+# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264
if [ $HEIGHT -le 234 ]; then VBITRATE=145000;
elif [ $HEIGHT -le 270 ]; then VBITRATE=365000;
elif [ $HEIGHT -le 360 ]; then VBITRATE=730000;
diff --git a/bin/decode+edit+loop+encode+stream b/bin/decode+edit+loop+encode+stream
index d0888fb..5d9a89e 100755
--- a/bin/decode+edit+loop+encode+stream
+++ b/bin/decode+edit+loop+encode+stream
@@ -21,16 +21,17 @@ ITERATIONS=${3-0} # endless by default
HEIGHT=360
-# TODO: Vary vpx quality based on height
-SPEED_VP8=15
-
-# inspired by Apple HLS recommendations
- if [ $HEIGHT -le 234 ]; then VBITRATE=145000;
-elif [ $HEIGHT -le 270 ]; then VBITRATE=365000;
-elif [ $HEIGHT -le 360 ]; then VBITRATE=730000;
-elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000;
-elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000;
-elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000;
+# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html
+# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer
+# TODO: adjust height steps or bitrates for 4:3 aspect ratio
+# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264
+# TODO: Externalize speeds to site-specific configfile
+ if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_VP8=2;
+elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_VP8=2;
+elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_VP8=3;
+elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_VP8=4;
+elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_VP8=5;
+elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_VP8=15;
fi
# based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming
diff --git a/bin/encodevideo+loop+stream b/bin/encodevideo+loop+stream
index b0c5c4c..8a438f7 100755
--- a/bin/encodevideo+loop+stream
+++ b/bin/encodevideo+loop+stream
@@ -16,16 +16,17 @@ FIRSTPORT=${2:-5002} # even number - next 3 ports used too
# TODO: resolve this or resize based on it
HEIGHT=360
-# TODO: Vary vpx quality based on height
-SPEED_VP8=15
-
-# inspired by Apple HLS recommendations
- if [ $HEIGHT -le 234 ]; then VBITRATE=145000;
-elif [ $HEIGHT -le 270 ]; then VBITRATE=365000;
-elif [ $HEIGHT -le 360 ]; then VBITRATE=730000;
-elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000;
-elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000;
-elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000;
+# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html
+# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer
+# TODO: adjust height steps or bitrates for 4:3 aspect ratio
+# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264
+# TODO: Externalize speeds to site-specific configfile
+ if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_VP8=2;
+elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_VP8=2;
+elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_VP8=3;
+elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_VP8=4;
+elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_VP8=5;
+elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_VP8=15;
fi
# based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming
diff --git a/bin/loop+encode+stream b/bin/loop+encode+stream
index 4151789..5331121 100755
--- a/bin/loop+encode+stream
+++ b/bin/loop+encode+stream
@@ -22,16 +22,17 @@ ABITRATE_OPUS=48000
# TODO
HEIGHT=360
-# TODO: Vary vpx quality based on height
-SPEED_VP8=15
-
-# inspired by Apple HLS recommendations
- if [ $HEIGHT -le 234 ]; then VBITRATE=145000;
-elif [ $HEIGHT -le 270 ]; then VBITRATE=365000;
-elif [ $HEIGHT -le 360 ]; then VBITRATE=730000;
-elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000;
-elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000;
-elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000;
+# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html
+# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer
+# TODO: adjust height steps or bitrates for 4:3 aspect ratio
+# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264
+# TODO: Externalize speeds to site-specific configfile
+ if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_VP8=2;
+elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_VP8=2;
+elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_VP8=3;
+elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_VP8=4;
+elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_VP8=5;
+elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_VP8=15;
fi
# based on http://www.webmproject.org/docs/encoder-parameters/#real-time-cbr-encoding-and-streaming
diff --git a/bin/stream b/bin/stream
index a326003..b758a49 100755
--- a/bin/stream
+++ b/bin/stream
@@ -88,20 +88,21 @@ HEIGHT=270
HEIGHTS_WEBM="$HEIGHT"
HEIGHTS_MPEG="$HEIGHT"
-# TODO: Vary vpx quality based on height
-SPEED_VP8=15
-
-# inspired by Apple HLS recommendations
-# TODO: Externalize to site-specific configfile
- if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_X264=slow; SPEED_X264_ALONE=fast;
-elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_X264=faster; SPEED_X264_ALONE=fast;
-elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_X264=faster; SPEED_X264_ALONE=fast;
-elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_X264=veryfast; SPEED_X264_ALONE=fast;
-elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_X264=toofast; SPEED_X264_ALONE=veryfast;
-elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_X264=toofast; SPEED_X264_ALONE=ultrafast;
+# * height steps and bitrates based on https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html
+# * speeds tuned to just below 100% cpu usage for each combination on a multi-core computer
+# TODO: adjust height steps or bitrates for 4:3 aspect ratio
+# TODO: resolve steps from source height using http://aarmstrong.org/tutorials/aspect-ratios-and-h264
+# TODO: Externalize speeds to site-specific configfile
+ if [ $HEIGHT -le 234 ]; then VBITRATE=145000; SPEED_X264=fast; SPEED_X264_ALONE=fast; SPEED_VP8=3; SPEED_VP8_ALONE=2;
+elif [ $HEIGHT -le 270 ]; then VBITRATE=365000; SPEED_X264=faster; SPEED_X264_ALONE=fast; SPEED_VP8=4; SPEED_VP8_ALONE=2;
+elif [ $HEIGHT -le 360 ]; then VBITRATE=730000; SPEED_X264=veryfast; SPEED_X264_ALONE=fast; SPEED_VP8=5; SPEED_VP8_ALONE=3;
+elif [ $HEIGHT -le 432 ]; then VBITRATE=1100000; SPEED_X264=ultrafast; SPEED_X264_ALONE=fast; SPEED_VP8=8; SPEED_VP8_ALONE=4;
+elif [ $HEIGHT -le 540 ]; then VBITRATE=2000000; SPEED_X264=toofast; SPEED_X264_ALONE=veryfast; SPEED_VP8_ALONE=5;
+elif [ $HEIGHT -le 720 ]; then VBITRATE=3000000; SPEED_X264=toofast; SPEED_X264_ALONE=ultrafast; SPEED_VP8_ALONE=15;
fi
+[ toofast != "$SPEED_X264" ] || HEIGHTS_MPEG=
+[ -n "$HEIGHTS_MPEG" ] || SPEED_VP8="$SPEED_VP8_ALONE"
[ -n "$HEIGHTS_WEBM" ] || SPEED_X264="$SPEED_X264_ALONE"
-[ toofast != "$SPEED_X264" ] || exit1 "Not enough CPU - reduce size or streams"
# shellcheck disable=SC2048,SC2059
echo_n() {