-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathdecode-vp9-wav
62 lines (55 loc) · 2.61 KB
/
decode-vp9-wav
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl
# Copyright 2017 Mike Radford <[email protected]>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
use strict;
use warnings;
use Fcntl qw(SEEK_CUR); sub systell ($) { sysseek($_[0], 0, SEEK_CUR) }
use constant HEADER_LEN => 20;
use constant MARKER => 0xFFFFFFFF;
my $chunk = 0;
my $wav = shift or die "usage: $0 <wav>\n";
open my $in, "<$wav" or die "$wav: $!\n";
my $size = -s $in;
my ($out, $pid) = ! -t STDOUT ? \*STDOUT : do {
my $pid = open my $fd, '|-', 'ffplay', '-loglevel', '24', '-'
or die "This utility requires 'ffplay'.\n";
($fd, $pid)
};
while (sysread($in, my $buf, HEADER_LEN) == HEADER_LEN) {
{ my $i = systell $in; printf STDERR "\rOffset=%d Chunk=%d [%.1f%%]", $i , $chunk, 100 * $i / $size };
my ($mrk1, $chunk_len, $block_len, $hdr_len, $mrk2) = unpack "N5", $buf;
if ($mrk1 == MARKER and $mrk2 == MARKER) {
$chunk++;
sysread($in, my $vp9_hdr, $hdr_len ) == $hdr_len or die;
sysread($in, my $vp9_seg, $chunk_len) == $chunk_len or die;
sysseek $in, $block_len - $chunk_len - $hdr_len - HEADER_LEN, SEEK_CUR;
syswrite $out, $vp9_hdr if $chunk == 1;
syswrite $out, $vp9_seg;
next;
}
sysseek $in, 1 - HEADER_LEN, SEEK_CUR or die; # rewind to next byte
}
print STDERR "\n";
kill 2, $pid if $pid;
die "No valid essence found\n" unless $chunk;