annotate mp4.t @ 1542:451e787aad76

Tests: reworked libgd version detection. The "libgd-config" binary is deprecated in recent versions and may not exist or have unexpected output. More, it may not present within older versions, as well, if installed separately, which previously broke test assumptions. The fix is change the fallback to skip tests. In addition, recent Perl GD module (2.57) started to export libgd version, which is now also consulted.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 13 Jan 2020 18:15:35 +0300
parents 1220f0055135
children 809d67d48d21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
5
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
6 # Tests for mp4 module.
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7 # Ensures that requested stream duration is given with sane accuracy.
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
9 ###############################################################################
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
10
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
11 use warnings;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
12 use strict;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
13
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
14 use Test::More;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
15
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
16 BEGIN { use FindBin; chdir($FindBin::Bin); }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
17
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
18 use lib 'lib';
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
19 use Test::Nginx;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
20
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
21 ###############################################################################
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
22
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
23 select STDERR; $| = 1;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
24 select STDOUT; $| = 1;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
25
389
c24d1c0b4c73 Tests: fixed invocation of has_daemon().
Sergey Kandaurov <pluknet@nginx.com>
parents: 388
diff changeset
26 my $t = Test::Nginx->new()->has(qw/http mp4/)->has_daemon('ffprobe')
c24d1c0b4c73 Tests: fixed invocation of has_daemon().
Sergey Kandaurov <pluknet@nginx.com>
parents: 388
diff changeset
27 ->has_daemon('ffmpeg')
390
7a65ebfdb02e Tests: skip mp4 if ffmpeg does not support lavfi format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 389
diff changeset
28 ->write_file_expand('nginx.conf', <<'EOF');
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
29
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
30 %%TEST_GLOBALS%%
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
31
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
32 daemon off;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
33
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
34 events {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
35 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
36
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
37 http {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
38 %%TEST_GLOBALS_HTTP%%
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
39
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
40 server {
974
882267679006 Tests: simplified parallel modifications in tests.
Andrey Zelenkov <zelenkov@nginx.com>
parents: 952
diff changeset
41 listen 127.0.0.1:8080;
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
42 server_name localhost;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
43
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
44 location / {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
45 mp4;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
46 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
47 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
48 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
49
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
50 EOF
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
51
390
7a65ebfdb02e Tests: skip mp4 if ffmpeg does not support lavfi format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 389
diff changeset
52 plan(skip_all => 'no lavfi')
7a65ebfdb02e Tests: skip mp4 if ffmpeg does not support lavfi format.
Sergey Kandaurov <pluknet@nginx.com>
parents: 389
diff changeset
53 unless grep /lavfi/, `ffmpeg -loglevel quiet -formats`;
1268
1923461981c9 Tests: prevent broken terminal after tc[gs]etattr ffmpeg race.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1251
diff changeset
54 system('ffmpeg -nostdin -loglevel quiet -y '
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
55 . '-f lavfi -i testsrc=duration=10:size=320x200:rate=15 '
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
56 . '-f lavfi -i testsrc=duration=20:size=320x200:rate=15 '
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
57 . '-map 0:0 -map 1:0 -pix_fmt yuv420p -g 15 -c:v libx264 '
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
58 . "${\($t->testdir())}/test.mp4") == 0
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
59 or die "Can't create mp4 file: $!";
1268
1923461981c9 Tests: prevent broken terminal after tc[gs]etattr ffmpeg race.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1251
diff changeset
60 system('ffmpeg -nostdin -loglevel quiet -y '
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
61 . '-f lavfi -i testsrc=duration=10:size=320x200:rate=15 '
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
62 . '-f lavfi -i testsrc=duration=20:size=320x200:rate=15 '
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
63 . '-map 0:0 -map 1:0 -pix_fmt yuv420p -g 15 -c:v libx264 '
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
64 . '-movflags +faststart '
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
65 . "${\($t->testdir())}/no_mdat.mp4") == 0
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
66 or die "Can't create mp4 file: $!";
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
67
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
68 $t->run()->plan(26);
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
69
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
70 ###############################################################################
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
71
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
72 my $test_uri = '/test.mp4';
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
73
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
74 again:
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
75
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
76 is(durations($t, 0.0), '10.0 20.0', 'start zero');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
77 is(durations($t, 2), '8.0 18.0', 'start integer');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
78 is(durations($t, 7.1), '2.9 12.9', 'start float');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
79
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
80 is(durations($t, 6, 9), '3.0 3.0', 'start end integer');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
81 is(durations($t, 2.7, 5.6), '2.9 2.9', 'start end float');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
82
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
83 is(durations($t, undef, 9), '9.0 9.0', 'end integer');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
84 is(durations($t, undef, 5.6), '5.6 5.6', 'end float');
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
85
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
86 # invalid range results in ignoring end argument
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
87
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
88 like(http_head("$test_uri?start=1&end=1"), qr/200 OK/, 'zero range');
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
89 like(http_head("$test_uri?start=1&end=0"), qr/200 OK/, 'negative range');
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
90
387
ff2e9afde90d Tests: adjusted mp4 test for end value beyond track duration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 384
diff changeset
91 # start/end values exceeding track/file duration
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
92
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
93 unlike(http_head("$test_uri?end=11"), qr!HTTP/1.1 500!,
387
ff2e9afde90d Tests: adjusted mp4 test for end value beyond track duration.
Sergey Kandaurov <pluknet@nginx.com>
parents: 384
diff changeset
94 'end beyond short track');
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
95 unlike(http_head("$test_uri?end=21"), qr!HTTP/1.1 500!, 'end beyond EOF');
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
96 unlike(http_head("$test_uri?start=11"), qr!HTTP/1.1 500!,
388
3d4506565f43 Tests: more mp4 tests for exceeding start/end values.
Sergey Kandaurov <pluknet@nginx.com>
parents: 387
diff changeset
97 'start beyond short track');
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
98 like(http_head("$test_uri?start=21"), qr!HTTP/1.1 500!, 'start beyond EOF');
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
99
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
100 $test_uri = '/no_mdat.mp4', goto again unless $test_uri eq '/no_mdat.mp4';
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
101
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
102 ###############################################################################
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
103
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
104 sub durations {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
105 my ($t, $start, $end) = @_;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
106 my $path = $t->{_testdir} . '/frag.mp4';
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
107
1037
92479d9429ff Tests: added mp4 tests for moov atom before mdat atom.
Sergey Kandaurov <pluknet@nginx.com>
parents: 974
diff changeset
108 my $uri = $test_uri;
384
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
109 if (defined $start) {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
110 $uri .= "?start=$start";
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
111 if (defined $end) {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
112 $uri .= "&end=$end";
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
113 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
114
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
115 } elsif (defined $end) {
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
116 $uri .= "?end=$end";
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
117 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
118
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
119 $t->write_file('frag.mp4', Test::Nginx::http_content(http_get($uri)));
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
120
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
121 my $r = `ffprobe -show_streams $path 2>/dev/null`;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
122 Test::Nginx::log_core('||', $r);
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
123 sprintf "%.1f %.1f", $r =~ /duration=(\d+\.\d+)/g;
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
124 }
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
125
1d67bc8fa680 Tests: mp4 tests added.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
126 ###############################################################################