summaryrefslogtreecommitdiff
path: root/bin/capture+encode+serve
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 /bin/capture+encode+serve
parentc0dd40df55cc249daf25bf97fc0d01baf6f17e73 (diff)
Vary vp8 speed based on height.
Diffstat (limited to 'bin/capture+encode+serve')
-rwxr-xr-xbin/capture+encode+serve32
1 files changed, 23 insertions, 9 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";