annotate src/http/modules/ngx_http_mp4_module.c @ 6791:cb4a4e9bba8e

Perl: fixed optimization in SSI command handler. As the pointer to the first argument was tested instead of the argument itself, array of arguments was always created, even if there were no arguments. Fix is to test args[0] instead of args. Found by Coverity (CID 1356862).
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 01 Nov 2016 20:39:21 +0300
parents b123eae3fd4e
children 2b2239a1e0d4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4402
diff changeset
4 * Copyright (C) Nginx, Inc.
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_http.h>
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
12 #define NGX_HTTP_MP4_TRAK_ATOM 0
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
13 #define NGX_HTTP_MP4_TKHD_ATOM 1
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
14 #define NGX_HTTP_MP4_MDIA_ATOM 2
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
15 #define NGX_HTTP_MP4_MDHD_ATOM 3
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
16 #define NGX_HTTP_MP4_HDLR_ATOM 4
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
17 #define NGX_HTTP_MP4_MINF_ATOM 5
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
18 #define NGX_HTTP_MP4_VMHD_ATOM 6
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
19 #define NGX_HTTP_MP4_SMHD_ATOM 7
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
20 #define NGX_HTTP_MP4_DINF_ATOM 8
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
21 #define NGX_HTTP_MP4_STBL_ATOM 9
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
22 #define NGX_HTTP_MP4_STSD_ATOM 10
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
23 #define NGX_HTTP_MP4_STTS_ATOM 11
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
24 #define NGX_HTTP_MP4_STTS_DATA 12
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
25 #define NGX_HTTP_MP4_STSS_ATOM 13
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
26 #define NGX_HTTP_MP4_STSS_DATA 14
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
27 #define NGX_HTTP_MP4_CTTS_ATOM 15
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
28 #define NGX_HTTP_MP4_CTTS_DATA 16
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
29 #define NGX_HTTP_MP4_STSC_ATOM 17
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
30 #define NGX_HTTP_MP4_STSC_START 18
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
31 #define NGX_HTTP_MP4_STSC_DATA 19
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
32 #define NGX_HTTP_MP4_STSC_END 20
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
33 #define NGX_HTTP_MP4_STSZ_ATOM 21
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
34 #define NGX_HTTP_MP4_STSZ_DATA 22
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
35 #define NGX_HTTP_MP4_STCO_ATOM 23
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
36 #define NGX_HTTP_MP4_STCO_DATA 24
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
37 #define NGX_HTTP_MP4_CO64_ATOM 25
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
38 #define NGX_HTTP_MP4_CO64_DATA 26
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
39
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
40 #define NGX_HTTP_MP4_LAST_ATOM NGX_HTTP_MP4_CO64_DATA
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
43 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 size_t buffer_size;
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
45 size_t max_buffer_size;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 } ngx_http_mp4_conf_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49 typedef struct {
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
50 u_char chunk[4];
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
51 u_char samples[4];
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
52 u_char id[4];
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
53 } ngx_mp4_stsc_entry_t;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
54
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
55
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
56 typedef struct {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 uint32_t timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 uint32_t time_to_sample_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 uint32_t sample_to_chunk_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 uint32_t sync_samples_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 uint32_t composition_offset_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62 uint32_t sample_sizes_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 uint32_t chunks;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
65 ngx_uint_t start_sample;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
66 ngx_uint_t end_sample;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 ngx_uint_t start_chunk;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
68 ngx_uint_t end_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
69 ngx_uint_t start_chunk_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
70 ngx_uint_t end_chunk_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
71 uint64_t start_chunk_samples_size;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
72 uint64_t end_chunk_samples_size;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 off_t start_offset;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
74 off_t end_offset;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76 size_t tkhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 size_t mdhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78 size_t hdlr_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 size_t vmhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 size_t smhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 size_t dinf_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 size_t size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_chain_t out[NGX_HTTP_MP4_LAST_ATOM + 1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 ngx_buf_t trak_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 ngx_buf_t tkhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 ngx_buf_t mdia_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 ngx_buf_t mdhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 ngx_buf_t hdlr_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 ngx_buf_t minf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 ngx_buf_t vmhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 ngx_buf_t smhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_buf_t dinf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 ngx_buf_t stbl_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 ngx_buf_t stsd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
97 ngx_buf_t stts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_buf_t stts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 ngx_buf_t stss_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 ngx_buf_t stss_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
101 ngx_buf_t ctts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ngx_buf_t ctts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 ngx_buf_t stsc_atom_buf;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
104 ngx_buf_t stsc_start_chunk_buf;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
105 ngx_buf_t stsc_end_chunk_buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106 ngx_buf_t stsc_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 ngx_buf_t stsz_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108 ngx_buf_t stsz_data_buf;
4107
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
109 ngx_buf_t stco_atom_buf;
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
110 ngx_buf_t stco_data_buf;
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
111 ngx_buf_t co64_atom_buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
112 ngx_buf_t co64_data_buf;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
113
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
114 ngx_mp4_stsc_entry_t stsc_start_chunk_entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
115 ngx_mp4_stsc_entry_t stsc_end_chunk_entry;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 } ngx_http_mp4_trak_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
118
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
119 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 ngx_file_t file;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 u_char *buffer;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 u_char *buffer_start;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 u_char *buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 u_char *buffer_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 size_t buffer_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
127
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 off_t offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 off_t end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130 off_t content_length;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 ngx_uint_t start;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
132 ngx_uint_t length;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 uint32_t timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_http_request_t *request;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 ngx_array_t trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_http_mp4_trak_t traks[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138 size_t ftyp_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 size_t moov_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 ngx_chain_t *out;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 ngx_chain_t ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143 ngx_chain_t moov_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 ngx_chain_t mvhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 ngx_chain_t mdat_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 ngx_chain_t mdat_data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
147
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 ngx_buf_t ftyp_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 ngx_buf_t moov_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 ngx_buf_t mvhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 ngx_buf_t mdat_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 ngx_buf_t mdat_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 u_char moov_atom_header[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 u_char mdat_atom_header[16];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 } ngx_http_mp4_file_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 char *name;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 ngx_int_t (*handler)(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 } ngx_http_mp4_atom_handler_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166 #define ngx_mp4_atom_header(mp4) (mp4->buffer_pos - 8)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 #define ngx_mp4_atom_data(mp4) mp4->buffer_pos
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
168 #define ngx_mp4_atom_data_size(t) (uint64_t) (sizeof(t) - 8)
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
169
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
170
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
171 #define ngx_mp4_atom_next(mp4, n) \
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
172 mp4->buffer_pos += (size_t) n; \
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
173 mp4->offset += n
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 #define ngx_mp4_set_atom_name(p, n1, n2, n3, n4) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 ((u_char *) (p))[4] = n1; \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178 ((u_char *) (p))[5] = n2; \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 ((u_char *) (p))[6] = n3; \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 ((u_char *) (p))[7] = n4
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 #define ngx_mp4_get_32value(p) \
4402
b20019ecfdcc Fixed handling of mp4 above 2G and 32bit offsets (ticket #84).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4382
diff changeset
183 ( ((uint32_t) ((u_char *) (p))[0] << 24) \
b20019ecfdcc Fixed handling of mp4 above 2G and 32bit offsets (ticket #84).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4382
diff changeset
184 + ( ((u_char *) (p))[1] << 16) \
b20019ecfdcc Fixed handling of mp4 above 2G and 32bit offsets (ticket #84).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4382
diff changeset
185 + ( ((u_char *) (p))[2] << 8) \
b20019ecfdcc Fixed handling of mp4 above 2G and 32bit offsets (ticket #84).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4382
diff changeset
186 + ( ((u_char *) (p))[3]) )
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188 #define ngx_mp4_set_32value(p, n) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 ((u_char *) (p))[0] = (u_char) ((n) >> 24); \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
190 ((u_char *) (p))[1] = (u_char) ((n) >> 16); \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
191 ((u_char *) (p))[2] = (u_char) ((n) >> 8); \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
192 ((u_char *) (p))[3] = (u_char) (n)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
194 #define ngx_mp4_get_64value(p) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
195 ( ((uint64_t) ((u_char *) (p))[0] << 56) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
196 + ((uint64_t) ((u_char *) (p))[1] << 48) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
197 + ((uint64_t) ((u_char *) (p))[2] << 40) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198 + ((uint64_t) ((u_char *) (p))[3] << 32) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 + ((uint64_t) ((u_char *) (p))[4] << 24) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 + ( ((u_char *) (p))[5] << 16) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
201 + ( ((u_char *) (p))[6] << 8) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202 + ( ((u_char *) (p))[7]) )
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
204 #define ngx_mp4_set_64value(p, n) \
4155
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
205 ((u_char *) (p))[0] = (u_char) ((uint64_t) (n) >> 56); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
206 ((u_char *) (p))[1] = (u_char) ((uint64_t) (n) >> 48); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
207 ((u_char *) (p))[2] = (u_char) ((uint64_t) (n) >> 40); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
208 ((u_char *) (p))[3] = (u_char) ((uint64_t) (n) >> 32); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
209 ((u_char *) (p))[4] = (u_char) ( (n) >> 24); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
210 ((u_char *) (p))[5] = (u_char) ( (n) >> 16); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
211 ((u_char *) (p))[6] = (u_char) ( (n) >> 8); \
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
212 ((u_char *) (p))[7] = (u_char) (n)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 #define ngx_mp4_last_trak(mp4) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 &((ngx_http_mp4_trak_t *) mp4->trak.elts)[mp4->trak.nelts - 1]
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
216
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
218 static ngx_int_t ngx_http_mp4_handler(ngx_http_request_t *r);
6782
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
219 static ngx_int_t ngx_http_mp4_atofp(u_char *line, size_t n, size_t point);
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
220
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 static ngx_int_t ngx_http_mp4_process(ngx_http_mp4_file_t *mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
222 static ngx_int_t ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size);
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
224 static ngx_int_t ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 static ngx_int_t ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
226 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 static ngx_int_t ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
228 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 static ngx_int_t ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
230 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 static size_t ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
232 off_t start_offset, off_t end_offset);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 static ngx_int_t ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
234 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 static ngx_int_t ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
236 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 static void ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
238 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 static ngx_int_t ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
240 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
241 static ngx_int_t ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
242 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
243 static ngx_int_t ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
244 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
245 static void ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
246 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
247 static ngx_int_t ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
248 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
249 static ngx_int_t ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
250 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
251 static ngx_int_t ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 static void ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
254 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 static ngx_int_t ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
256 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 static ngx_int_t ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
258 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 static ngx_int_t ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
260 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 static ngx_int_t ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
262 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 static void ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
264 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
265 static ngx_int_t ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
266 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267 static ngx_int_t ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
268 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 static ngx_int_t ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
270 ngx_http_mp4_trak_t *trak);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
271 static ngx_int_t ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
272 ngx_http_mp4_trak_t *trak, ngx_uint_t start);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 static ngx_int_t ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
274 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
275 static ngx_int_t ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
276 ngx_http_mp4_trak_t *trak);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
277 static void ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
278 ngx_http_mp4_trak_t *trak, ngx_uint_t start);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
279 static ngx_int_t ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
280 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 static void ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
282 ngx_http_mp4_trak_t *trak);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
283 static void ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
284 ngx_http_mp4_trak_t *trak, ngx_uint_t start);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 static ngx_int_t ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 static ngx_int_t ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 ngx_http_mp4_trak_t *trak);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
289 static ngx_int_t ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
290 ngx_http_mp4_trak_t *trak, ngx_uint_t start);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 static ngx_int_t ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 uint64_t atom_data_size);
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
293 static ngx_int_t ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4,
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 static ngx_int_t ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
296 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 static ngx_int_t ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 static void ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300 ngx_http_mp4_trak_t *trak, int32_t adjustment);
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
301 static ngx_int_t ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
302 uint64_t atom_data_size);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
303 static ngx_int_t ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
304 ngx_http_mp4_trak_t *trak);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
305 static void ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
306 ngx_http_mp4_trak_t *trak, off_t adjustment);
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
307
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 static char *ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 static void *ngx_http_mp4_create_conf(ngx_conf_t *cf);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310 static char *ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
312
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 static ngx_command_t ngx_http_mp4_commands[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315 { ngx_string("mp4"),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 ngx_http_mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 NULL },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
321
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
322 { ngx_string("mp4_buffer_size"),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 ngx_conf_set_size_slot,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325 NGX_HTTP_LOC_CONF_OFFSET,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326 offsetof(ngx_http_mp4_conf_t, buffer_size),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 NULL },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
329 { ngx_string("mp4_max_buffer_size"),
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 ngx_conf_set_size_slot,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 NGX_HTTP_LOC_CONF_OFFSET,
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
333 offsetof(ngx_http_mp4_conf_t, max_buffer_size),
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 NULL },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 ngx_null_command
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
340 static ngx_http_module_t ngx_http_mp4_module_ctx = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341 NULL, /* preconfiguration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342 NULL, /* postconfiguration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344 NULL, /* create main configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345 NULL, /* init main configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347 NULL, /* create server configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348 NULL, /* merge server configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
349
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
350 ngx_http_mp4_create_conf, /* create location configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
351 ngx_http_mp4_merge_conf /* merge location configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 ngx_module_t ngx_http_mp4_module = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356 NGX_MODULE_V1,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 &ngx_http_mp4_module_ctx, /* module context */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
358 ngx_http_mp4_commands, /* module directives */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359 NGX_HTTP_MODULE, /* module type */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 NULL, /* init master */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361 NULL, /* init module */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362 NULL, /* init process */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 NULL, /* init thread */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
364 NULL, /* exit thread */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365 NULL, /* exit process */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 NULL, /* exit master */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367 NGX_MODULE_V1_PADDING
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
368 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
369
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
370
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
371 static ngx_http_mp4_atom_handler_t ngx_http_mp4_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 { "ftyp", ngx_http_mp4_read_ftyp_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 { "moov", ngx_http_mp4_read_moov_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 { "mdat", ngx_http_mp4_read_mdat_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
375 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
376 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
377
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
378 static ngx_http_mp4_atom_handler_t ngx_http_mp4_moov_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 { "mvhd", ngx_http_mp4_read_mvhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 { "trak", ngx_http_mp4_read_trak_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 { "cmov", ngx_http_mp4_read_cmov_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 static ngx_http_mp4_atom_handler_t ngx_http_mp4_trak_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
386 { "tkhd", ngx_http_mp4_read_tkhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 { "mdia", ngx_http_mp4_read_mdia_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
389 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
390
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
391 static ngx_http_mp4_atom_handler_t ngx_http_mp4_mdia_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 { "mdhd", ngx_http_mp4_read_mdhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 { "hdlr", ngx_http_mp4_read_hdlr_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 { "minf", ngx_http_mp4_read_minf_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 static ngx_http_mp4_atom_handler_t ngx_http_mp4_minf_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 { "vmhd", ngx_http_mp4_read_vmhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 { "smhd", ngx_http_mp4_read_smhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 { "dinf", ngx_http_mp4_read_dinf_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 { "stbl", ngx_http_mp4_read_stbl_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
406 static ngx_http_mp4_atom_handler_t ngx_http_mp4_stbl_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 { "stsd", ngx_http_mp4_read_stsd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 { "stts", ngx_http_mp4_read_stts_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409 { "stss", ngx_http_mp4_read_stss_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410 { "ctts", ngx_http_mp4_read_ctts_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 { "stsc", ngx_http_mp4_read_stsc_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 { "stsz", ngx_http_mp4_read_stsz_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413 { "stco", ngx_http_mp4_read_stco_atom },
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
414 { "co64", ngx_http_mp4_read_co64_atom },
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 ngx_http_mp4_handler(ngx_http_request_t *r)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 u_char *last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 size_t root;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
424 ngx_int_t rc, start, end;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
425 ngx_uint_t level, length;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426 ngx_str_t path, value;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 ngx_log_t *log;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428 ngx_buf_t *b;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 ngx_chain_t out;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 ngx_http_mp4_file_t *mp4;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431 ngx_open_file_info_t of;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 ngx_http_core_loc_conf_t *clcf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
433
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435 return NGX_HTTP_NOT_ALLOWED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
437
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 if (r->uri.data[r->uri.len - 1] == '/') {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 return NGX_DECLINED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442 rc = ngx_http_discard_request_body(r);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
444 if (rc != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
447
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
448 last = ngx_http_map_uri_to_path(r, &path, &root, 0);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 if (last == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 log = r->connection->log;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
454
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
455 path.len = last - path.data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458 "http mp4 filename: \"%V\"", &path);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 ngx_memzero(&of, sizeof(ngx_open_file_info_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464 of.read_ahead = clcf->read_ahead;
4087
3aa3b7bb9f0d Bugfix of r4086: directio was always enabled if mp4 file was sent as is.
Igor Sysoev <igor@sysoev.ru>
parents: 4085
diff changeset
465 of.directio = NGX_MAX_OFF_T_VALUE;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466 of.valid = clcf->open_file_cache_valid;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 of.min_uses = clcf->open_file_cache_min_uses;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 of.errors = clcf->open_file_cache_errors;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 of.events = clcf->open_file_cache_events;
4494
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
470
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
471 if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) {
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
472 return NGX_HTTP_INTERNAL_SERVER_ERROR;
13e09cf11d4e Disable symlinks: initialization of the "disable_symlinks" field in
Valentin Bartenev <vbart@nginx.com>
parents: 4478
diff changeset
473 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 != NGX_OK)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 switch (of.err) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
479
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
480 case 0:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 case NGX_ENOENT:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 case NGX_ENOTDIR:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 case NGX_ENAMETOOLONG:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
486
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
487 level = NGX_LOG_ERR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 rc = NGX_HTTP_NOT_FOUND;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 case NGX_EACCES:
4478
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
492 #if (NGX_HAVE_OPENAT)
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
493 case NGX_EMLINK:
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
494 case NGX_ELOOP:
08713bac87fc Support for disable_symlinks in various modules.
Andrey Belov <defan@nginx.com>
parents: 4412
diff changeset
495 #endif
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497 level = NGX_LOG_ERR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 rc = NGX_HTTP_FORBIDDEN;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
501 default:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
502
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
503 level = NGX_LOG_CRIT;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
504 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
505 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
506 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
507
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
508 if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
509 ngx_log_error(level, log, of.err,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
510 "%s \"%s\" failed", of.failed, path.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
511 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 if (!of.is_file) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
518 if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520 ngx_close_file_n " \"%s\" failed", path.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 return NGX_DECLINED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526 r->root_tested = !r->error_page;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 r->allow_ranges = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 start = -1;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
530 length = 0;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 r->headers_out.content_length_n = of.size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532 mp4 = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 b = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535 if (r->args.len) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538
4156
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
539 /*
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
540 * A Flash player may send start value with a lot of digits
6782
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
541 * after dot so a custom function is used instead of ngx_atofp().
4156
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
542 */
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
543
6782
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
544 start = ngx_http_mp4_atofp(value.data, value.len, 3);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 }
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
546
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
547 if (ngx_http_arg(r, (u_char *) "end", 3, &value) == NGX_OK) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
548
6782
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
549 end = ngx_http_mp4_atofp(value.data, value.len, 3);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
550
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
551 if (end > 0) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
552 if (start < 0) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
553 start = 0;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
554 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
555
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
556 if (end > start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
557 length = end - start;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
558 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
559 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
560 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
563 if (start >= 0) {
5621
345e4fd4bb64 Range filter: single_range flag in request.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5620
diff changeset
564 r->single_range = 1;
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
565
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
566 mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t));
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
567 if (mp4 == NULL) {
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
568 return NGX_HTTP_INTERNAL_SERVER_ERROR;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
569 }
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
570
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
571 mp4->file.fd = of.fd;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
572 mp4->file.name = path;
5496
9d056f10fb99 Style: removed surplus semicolons.
Valentin Bartenev <vbart@nginx.com>
parents: 5359
diff changeset
573 mp4->file.log = r->connection->log;
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
574 mp4->end = of.size;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
575 mp4->start = (ngx_uint_t) start;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
576 mp4->length = length;
5202
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
577 mp4->request = r;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
578
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
579 switch (ngx_http_mp4_process(mp4)) {
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
580
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
581 case NGX_DECLINED:
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
582 if (mp4->buffer) {
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
583 ngx_pfree(r->pool, mp4->buffer);
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
584 }
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
585
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
586 ngx_pfree(r->pool, mp4);
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
587 mp4 = NULL;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
588
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
589 break;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
590
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
591 case NGX_OK:
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
592 r->headers_out.content_length_n = mp4->content_length;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
593 break;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
594
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
595 default: /* NGX_ERROR */
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
596 if (mp4->buffer) {
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
597 ngx_pfree(r->pool, mp4->buffer);
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
598 }
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
599
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
600 ngx_pfree(r->pool, mp4);
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
601
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
602 return NGX_HTTP_INTERNAL_SERVER_ERROR;
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
603 }
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
604 }
322434f13bd8 Mp4: indentation and style, no functional changes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5097
diff changeset
605
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 log->action = "sending mp4 to client";
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
607
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
608 if (clcf->directio <= of.size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611 * DIRECTIO is set on transfer only
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 * to allow kernel to cache "moov" atom
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 if (ngx_directio_on(of.fd) == NGX_FILE_ERROR) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617 ngx_directio_on_n " \"%s\" failed", path.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619
4087
3aa3b7bb9f0d Bugfix of r4086: directio was always enabled if mp4 file was sent as is.
Igor Sysoev <igor@sysoev.ru>
parents: 4085
diff changeset
620 of.is_directio = 1;
3aa3b7bb9f0d Bugfix of r4086: directio was always enabled if mp4 file was sent as is.
Igor Sysoev <igor@sysoev.ru>
parents: 4085
diff changeset
621
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622 if (mp4) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
623 mp4->file.directio = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
626
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
627 r->headers_out.status = NGX_HTTP_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 r->headers_out.last_modified_time = of.mtime;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629
4748
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4705
diff changeset
630 if (ngx_http_set_etag(r) != NGX_OK) {
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4705
diff changeset
631 return NGX_HTTP_INTERNAL_SERVER_ERROR;
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4705
diff changeset
632 }
192f54280a7a Entity tags: set for static respones.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4705
diff changeset
633
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 if (ngx_http_set_content_type(r) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
636 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
637
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
638 if (mp4 == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640 if (b == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
642 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645 if (b->file == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 rc = ngx_http_send_header(r);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
651
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
652 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 if (mp4) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 return ngx_http_output_filter(r, mp4->out);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
658 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
659
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
660 b->file_pos = 0;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661 b->file_last = of.size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 b->in_file = b->file_last ? 1 : 0;
4611
2b6cb7528409 Allows particular modules to handle subrequests properly.
Andrey Belov <defan@nginx.com>
parents: 4585
diff changeset
664 b->last_buf = (r == r->main) ? 1 : 0;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 b->last_in_chain = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
666
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
667 b->file->fd = of.fd;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 b->file->name = path;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669 b->file->log = log;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 b->file->directio = of.is_directio;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
672 out.buf = b;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673 out.next = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
675 return ngx_http_output_filter(r, &out);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
677
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679 static ngx_int_t
6782
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
680 ngx_http_mp4_atofp(u_char *line, size_t n, size_t point)
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
681 {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
682 ngx_int_t value, cutoff, cutlim;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
683 ngx_uint_t dot;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
684
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
685 /* same as ngx_atofp(), but allows additional digits */
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
686
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
687 if (n == 0) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
688 return NGX_ERROR;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
689 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
690
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
691 cutoff = NGX_MAX_INT_T_VALUE / 10;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
692 cutlim = NGX_MAX_INT_T_VALUE % 10;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
693
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
694 dot = 0;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
695
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
696 for (value = 0; n--; line++) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
697
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
698 if (*line == '.') {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
699 if (dot) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
700 return NGX_ERROR;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
701 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
702
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
703 dot = 1;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
704 continue;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
705 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
706
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
707 if (*line < '0' || *line > '9') {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
708 return NGX_ERROR;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
709 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
710
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
711 if (point == 0) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
712 continue;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
713 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
714
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
715 if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
716 return NGX_ERROR;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
717 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
718
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
719 value = value * 10 + (*line - '0');
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
720 point -= dot;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
721 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
722
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
723 while (point--) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
724 if (value > cutoff) {
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
725 return NGX_ERROR;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
726 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
727
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
728 value = value * 10;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
729 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
730
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
731 return value;
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
732 }
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
733
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
734
b123eae3fd4e Mp4: introduced custom version of ngx_atofp().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6722
diff changeset
735 static ngx_int_t
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
736 ngx_http_mp4_process(ngx_http_mp4_file_t *mp4)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
737 {
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
738 off_t start_offset, end_offset, adjustment;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
739 ngx_int_t rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
740 ngx_uint_t i, j;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 ngx_chain_t **prev;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 ngx_http_mp4_conf_t *conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
745 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
746 "mp4 start:%ui, length:%ui", mp4->start, mp4->length);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748 conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750 mp4->buffer_size = conf->buffer_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
752 rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_atoms, mp4->end);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
753 if (rc != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
755 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
756
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757 if (mp4->trak.nelts == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759 "no mp4 trak atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
761 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
762 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
763
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
764 if (mp4->mdat_atom.buf == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
766 "no mp4 mdat atom was found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
767 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
768 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
769 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
770
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
771 prev = &mp4->out;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
772
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
773 if (mp4->ftyp_atom.buf) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
774 *prev = &mp4->ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
775 prev = &mp4->ftyp_atom.next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
776 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
777
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
778 *prev = &mp4->moov_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
779 prev = &mp4->moov_atom.next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
780
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
781 if (mp4->mvhd_atom.buf) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
782 mp4->moov_size += mp4->mvhd_atom_buf.last - mp4->mvhd_atom_buf.pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
783 *prev = &mp4->mvhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
784 prev = &mp4->mvhd_atom.next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
785 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
786
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
787 start_offset = mp4->end;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
788 end_offset = 0;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
789 trak = mp4->trak.elts;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
790
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
791 for (i = 0; i < mp4->trak.nelts; i++) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
792
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
793 if (ngx_http_mp4_update_stts_atom(mp4, &trak[i]) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
794 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
795 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
796
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
797 if (ngx_http_mp4_update_stss_atom(mp4, &trak[i]) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
798 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
799 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
800
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
801 ngx_http_mp4_update_ctts_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
802
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
803 if (ngx_http_mp4_update_stsc_atom(mp4, &trak[i]) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
804 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
805 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
806
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
807 if (ngx_http_mp4_update_stsz_atom(mp4, &trak[i]) != NGX_OK) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
808 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
809 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
810
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
811 if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
812 if (ngx_http_mp4_update_co64_atom(mp4, &trak[i]) != NGX_OK) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
813 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
814 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
815
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
816 } else {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
817 if (ngx_http_mp4_update_stco_atom(mp4, &trak[i]) != NGX_OK) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
818 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
819 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
820 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
821
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
822 ngx_http_mp4_update_stbl_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
823 ngx_http_mp4_update_minf_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
824 trak[i].size += trak[i].mdhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
825 trak[i].size += trak[i].hdlr_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
826 ngx_http_mp4_update_mdia_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
827 trak[i].size += trak[i].tkhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
828 ngx_http_mp4_update_trak_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
829
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
830 mp4->moov_size += trak[i].size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
831
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
832 if (start_offset > trak[i].start_offset) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
833 start_offset = trak[i].start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
834 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
835
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
836 if (end_offset < trak[i].end_offset) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
837 end_offset = trak[i].end_offset;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
838 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
839
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
840 *prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
841 prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM].next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
842
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
843 for (j = 0; j < NGX_HTTP_MP4_LAST_ATOM + 1; j++) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
844 if (trak[i].out[j].buf) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
845 *prev = &trak[i].out[j];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
846 prev = &trak[i].out[j].next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
847 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
848 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
849 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
850
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
851 if (end_offset < start_offset) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
852 end_offset = start_offset;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
853 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
854
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
855 mp4->moov_size += 8;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
856
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
857 ngx_mp4_set_32value(mp4->moov_atom_header, mp4->moov_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
858 ngx_mp4_set_atom_name(mp4->moov_atom_header, 'm', 'o', 'o', 'v');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
859 mp4->content_length += mp4->moov_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
860
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
861 *prev = &mp4->mdat_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
862
5097
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
863 if (start_offset > mp4->mdat_data.buf->file_last) {
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
864 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
865 "start time is out mp4 mdat atom in \"%s\"",
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
866 mp4->file.name.data);
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
867 return NGX_ERROR;
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
868 }
37671d0042b7 Mp4: fixed handling of too small mdat atoms (ticket #266).
Maxim Dounin <mdounin@mdounin.ru>
parents: 4820
diff changeset
869
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
870 adjustment = mp4->ftyp_size + mp4->moov_size
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
871 + ngx_http_mp4_update_mdat_atom(mp4, start_offset, end_offset)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
872 - start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
873
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
874 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4579
778ea2f7268c Fixed debug logging.
Igor Sysoev <igor@sysoev.ru>
parents: 4578
diff changeset
875 "mp4 adjustment:%O", adjustment);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
876
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
877 for (i = 0; i < mp4->trak.nelts; i++) {
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
878 if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
879 ngx_http_mp4_adjust_co64_atom(mp4, &trak[i], adjustment);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
880 } else {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
881 ngx_http_mp4_adjust_stco_atom(mp4, &trak[i], (int32_t) adjustment);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
882 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
883 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
884
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
885 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
886 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
887
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
888
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
889 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
890 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
891 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
892 } ngx_mp4_atom_header_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
893
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
894 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
895 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
896 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
897 u_char size64[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
898 } ngx_mp4_atom_header64_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
899
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
900
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
901 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
902 ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
903 ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
904 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
905 off_t end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
906 size_t atom_header_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
907 u_char *atom_header, *atom_name;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
908 uint64_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
909 ngx_int_t rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
910 ngx_uint_t n;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
911
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
912 end = mp4->offset + atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
913
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
914 while (mp4->offset < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
915
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
916 if (ngx_http_mp4_read(mp4, sizeof(uint32_t)) != NGX_OK) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
917 return NGX_ERROR;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
918 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
919
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
920 atom_header = mp4->buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
921 atom_size = ngx_mp4_get_32value(atom_header);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
922 atom_header_size = sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
923
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
924 if (atom_size == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
925 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
926 "mp4 atom end");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
927 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
928 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
929
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
930 if (atom_size < sizeof(ngx_mp4_atom_header_t)) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
931
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
932 if (atom_size == 1) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
933
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
934 if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header64_t))
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
935 != NGX_OK)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
936 {
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
937 return NGX_ERROR;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
938 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
939
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
940 /* 64-bit atom size */
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
941 atom_header = mp4->buffer_pos;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942 atom_size = ngx_mp4_get_64value(atom_header + 8);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943 atom_header_size = sizeof(ngx_mp4_atom_header64_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
944
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
945 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
946 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
947 "\"%s\" mp4 atom is too small:%uL",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
948 mp4->file.name.data, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
949 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
950 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
951 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
952
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
953 if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header_t)) != NGX_OK) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
954 return NGX_ERROR;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
955 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
956
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
957 atom_header = mp4->buffer_pos;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958 atom_name = atom_header + sizeof(uint32_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
959
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
960 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961 "mp4 atom: %*s @%O:%uL",
6478
3ef7bb882ad4 Fixed logging with variable field width.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6474
diff changeset
962 (size_t) 4, atom_name, mp4->offset, atom_size);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
964 if (atom_size > (uint64_t) (NGX_MAX_OFF_T_VALUE - mp4->offset)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
965 || mp4->offset + (off_t) atom_size > end)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
966 {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
967 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
968 "\"%s\" mp4 atom too large:%uL",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
969 mp4->file.name.data, atom_size);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
970 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
971 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
972
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
973 for (n = 0; atom[n].name; n++) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
974
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
975 if (ngx_strncmp(atom_name, atom[n].name, 4) == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
976
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
977 ngx_mp4_atom_next(mp4, atom_header_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
978
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
979 rc = atom[n].handler(mp4, atom_size - atom_header_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980 if (rc != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
981 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
982 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
983
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
984 goto next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
985 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
986 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
987
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
988 ngx_mp4_atom_next(mp4, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
989
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
990 next:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
991 continue;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
992 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
993
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
994 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
995 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
996
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
997
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
998 static ngx_int_t
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
999 ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1000 {
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1001 ssize_t n;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1002
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1003 if (mp4->buffer_pos + size <= mp4->buffer_end) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1004 return NGX_OK;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1005 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1007 if (mp4->offset + (off_t) mp4->buffer_size > mp4->end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1008 mp4->buffer_size = (size_t) (mp4->end - mp4->offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1009 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1010
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1011 if (mp4->buffer_size < size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1012 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1013 "\"%s\" mp4 file truncated", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1014 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1015 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1016
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1017 if (mp4->buffer == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1018 mp4->buffer = ngx_palloc(mp4->request->pool, mp4->buffer_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1019 if (mp4->buffer == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1020 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1022
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1023 mp4->buffer_start = mp4->buffer;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1024 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1025
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1026 n = ngx_read_file(&mp4->file, mp4->buffer_start, mp4->buffer_size,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1027 mp4->offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1028
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1029 if (n == NGX_ERROR) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1030 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1033 if ((size_t) n != mp4->buffer_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1034 ngx_log_error(NGX_LOG_CRIT, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1035 ngx_read_file_n " read only %z of %z from \"%s\"",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1036 n, mp4->buffer_size, mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1037 return NGX_ERROR;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1038 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 mp4->buffer_pos = mp4->buffer_start;
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1041 mp4->buffer_end = mp4->buffer_start + mp4->buffer_size;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1044 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1045
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1046
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1047 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1048 ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1049 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1050 u_char *ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1051 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1053
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1054 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ftyp atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1056 if (atom_data_size > 1024
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
1057 || ngx_mp4_atom_data(mp4) + (size_t) atom_data_size > mp4->buffer_end)
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1058 {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1059 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1060 "\"%s\" mp4 ftyp atom is too large:%uL",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1061 mp4->file.name.data, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1062 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1063 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1064
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1065 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1066
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1067 ftyp_atom = ngx_palloc(mp4->request->pool, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1068 if (ftyp_atom == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1069 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1070 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1071
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1072 ngx_mp4_set_32value(ftyp_atom, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1073 ngx_mp4_set_atom_name(ftyp_atom, 'f', 't', 'y', 'p');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1074
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1075 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1076 * only moov atom content is guaranteed to be in mp4->buffer
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1077 * during sending response, so ftyp atom content should be copied
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1078 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1079 ngx_memcpy(ftyp_atom + sizeof(ngx_mp4_atom_header_t),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1080 ngx_mp4_atom_data(mp4), (size_t) atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1081
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1082 atom = &mp4->ftyp_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1083 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1084 atom->pos = ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1085 atom->last = ftyp_atom + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1086
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1087 mp4->ftyp_atom.buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1088 mp4->ftyp_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1089 mp4->content_length = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1090
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1091 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1092
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1093 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1094 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1095
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1096
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1097 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1098 * Small excess buffer to process atoms after moov atom, mp4->buffer_start
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1099 * will be set to this buffer part after moov atom processing.
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1100 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1101 #define NGX_HTTP_MP4_MOOV_BUFFER_EXCESS (4 * 1024)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1102
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1103 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1104 ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1105 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1106 ngx_int_t rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1107 ngx_uint_t no_mdat;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1108 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 ngx_http_mp4_conf_t *conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1111 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1113 no_mdat = (mp4->mdat_atom.buf == NULL);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1114
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1115 if (no_mdat && mp4->start == 0 && mp4->length == 0) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1117 * send original file if moov atom resides before
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1118 * mdat atom and client requests integral file
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1119 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1120 return NGX_DECLINED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1121 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1123 conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1124
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1125 if (atom_data_size > mp4->buffer_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
1127 if (atom_data_size > conf->max_buffer_size) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1128 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1129 "\"%s\" mp4 moov atom is too large:%uL, "
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
1130 "you may want to increase mp4_max_buffer_size",
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1131 mp4->file.name.data, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1132 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1135 ngx_pfree(mp4->request->pool, mp4->buffer);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1136 mp4->buffer = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1137 mp4->buffer_pos = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1138 mp4->buffer_end = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1139
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 mp4->buffer_size = (size_t) atom_data_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141 + NGX_HTTP_MP4_MOOV_BUFFER_EXCESS * no_mdat;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1142 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1143
4705
9a43b145a8ba Mp4: fixed build on win32 after r4689.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4688
diff changeset
1144 if (ngx_http_mp4_read(mp4, (size_t) atom_data_size) != NGX_OK) {
4688
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1145 return NGX_ERROR;
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1146 }
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1147
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1148 mp4->trak.elts = &mp4->traks;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1149 mp4->trak.size = sizeof(ngx_http_mp4_trak_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150 mp4->trak.nalloc = 2;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151 mp4->trak.pool = mp4->request->pool;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1152
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153 atom = &mp4->moov_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1155 atom->pos = mp4->moov_atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1156 atom->last = mp4->moov_atom_header + 8;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1157
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1158 mp4->moov_atom.buf = &mp4->moov_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1159
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1160 rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_moov_atoms, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1161
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1162 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom done");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1163
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1164 if (no_mdat) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1165 mp4->buffer_start = mp4->buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1166 mp4->buffer_size = NGX_HTTP_MP4_MOOV_BUFFER_EXCESS;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167
4688
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1168 if (mp4->buffer_start + mp4->buffer_size > mp4->buffer_end) {
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1169 mp4->buffer = NULL;
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1170 mp4->buffer_pos = NULL;
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1171 mp4->buffer_end = NULL;
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1172 }
5fedb27c3e36 Mp4: fixed streaming if moov atom is at buffer edge.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4687
diff changeset
1173
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1174 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1175 /* skip atoms after moov atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1176 mp4->offset = mp4->end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1177 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1178
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1179 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1180 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1181
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1182
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1183 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1184 ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1185 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1186 ngx_buf_t *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1187
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1188 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdat atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1189
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1190 data = &mp4->mdat_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1191 data->file = &mp4->file;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1192 data->in_file = 1;
6722
6136a51f9c21 Do not set last_buf flag in subrequests.
Roman Arutyunyan <arut@nginx.com>
parents: 6504
diff changeset
1193 data->last_buf = (mp4->request == mp4->request->main) ? 1 : 0;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1194 data->last_in_chain = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1195 data->file_last = mp4->offset + atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1196
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1197 mp4->mdat_atom.buf = &mp4->mdat_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1198 mp4->mdat_atom.next = &mp4->mdat_data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1199 mp4->mdat_data.buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1200
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1201 if (mp4->trak.nelts) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1202 /* skip atoms after mdat atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1203 mp4->offset = mp4->end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1204
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1205 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1206 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1207 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1208
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1209 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1210 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1211
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1212
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1213 static size_t
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1214 ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4, off_t start_offset,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1215 off_t end_offset)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1216 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1217 off_t atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1218 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1219 uint32_t atom_header_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1220 uint64_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1221 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1222
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1223 atom_data_size = end_offset - start_offset;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1224 mp4->mdat_data.buf->file_pos = start_offset;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1225 mp4->mdat_data.buf->file_last = end_offset;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1226
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
1227 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1228 "mdat new offset @%O:%O", start_offset, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1229
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1230 atom_header = mp4->mdat_atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1231
5358
670ceaba03d8 Win32: Open Watcom C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5202
diff changeset
1232 if ((uint64_t) atom_data_size > (uint64_t) 0xffffffff) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1233 atom_size = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1234 atom_header_size = sizeof(ngx_mp4_atom_header64_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1235 ngx_mp4_set_64value(atom_header + sizeof(ngx_mp4_atom_header_t),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1236 sizeof(ngx_mp4_atom_header64_t) + atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1237 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1238 atom_size = sizeof(ngx_mp4_atom_header_t) + atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1239 atom_header_size = sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1240 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1241
4282
71cdac0b9ea6 Fix of "Content-Length" header of MP4 response if start argument was used.
Igor Sysoev <igor@sysoev.ru>
parents: 4189
diff changeset
1242 mp4->content_length += atom_header_size + atom_data_size;
71cdac0b9ea6 Fix of "Content-Length" header of MP4 response if start argument was used.
Igor Sysoev <igor@sysoev.ru>
parents: 4189
diff changeset
1243
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1244 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1245 ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'a', 't');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1246
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1247 atom = &mp4->mdat_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1248 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1249 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1250 atom->last = atom_header + atom_header_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1251
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1252 return atom_header_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1253 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1254
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1255
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1256 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1257 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1258 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1259 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1260 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1261 u_char creation_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1262 u_char modification_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1263 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1264 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1265 u_char rate[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1266 u_char volume[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1267 u_char reserved[10];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1268 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1269 u_char preview_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1270 u_char preview_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1271 u_char poster_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1272 u_char selection_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1273 u_char selection_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1274 u_char current_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1275 u_char next_track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1276 } ngx_mp4_mvhd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1277
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1278 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1279 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1280 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1281 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1282 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1283 u_char creation_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1284 u_char modification_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1285 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1286 u_char duration[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1287 u_char rate[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1288 u_char volume[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1289 u_char reserved[10];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1290 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1291 u_char preview_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1292 u_char preview_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1293 u_char poster_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1294 u_char selection_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1295 u_char selection_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1296 u_char current_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1297 u_char next_track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1298 } ngx_mp4_mvhd64_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1299
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1300
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1301 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1302 ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1303 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1304 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1305 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1306 uint32_t timescale;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1307 uint64_t duration, start_time, length_time;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1308 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1309 ngx_mp4_mvhd_atom_t *mvhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1310 ngx_mp4_mvhd64_atom_t *mvhd64_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1311
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1312 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mvhd atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1313
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1314 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1315 mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1316 mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1317 ngx_mp4_set_atom_name(atom_header, 'm', 'v', 'h', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1318
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1319 if (ngx_mp4_atom_data_size(ngx_mp4_mvhd_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1320 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1321 "\"%s\" mp4 mvhd atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1322 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1323 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1324
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1325 if (mvhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1326 /* version 0: 32-bit duration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1327 timescale = ngx_mp4_get_32value(mvhd_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1328 duration = ngx_mp4_get_32value(mvhd_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1329
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1330 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1331 /* version 1: 64-bit duration */
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1332
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1333 if (ngx_mp4_atom_data_size(ngx_mp4_mvhd64_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1334 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1335 "\"%s\" mp4 mvhd atom too small",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1336 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1337 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1338 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1339
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1340 timescale = ngx_mp4_get_32value(mvhd64_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1341 duration = ngx_mp4_get_64value(mvhd64_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1342 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1343
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1344 mp4->timescale = timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1345
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1346 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1347 "mvhd timescale:%uD, duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1348 timescale, duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1349
5543
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1350 start_time = (uint64_t) mp4->start * timescale / 1000;
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1351
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1352 if (duration < start_time) {
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1353 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1354 "\"%s\" mp4 start time exceeds file duration",
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1355 mp4->file.name.data);
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1356 return NGX_ERROR;
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1357 }
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1358
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1359 duration -= start_time;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1360
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1361 if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1362 length_time = (uint64_t) mp4->length * timescale / 1000;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1363
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1364 if (duration > length_time) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1365 duration = length_time;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1366 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1367 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1368
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1369 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1370 "mvhd new duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1371 duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1372
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1373 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1374 ngx_mp4_set_32value(mvhd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1375
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1376 if (mvhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1377 ngx_mp4_set_32value(mvhd_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1378
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1379 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1380 ngx_mp4_set_64value(mvhd64_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1381 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1382
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1383 atom = &mp4->mvhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1384 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1385 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1386 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1387
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1388 mp4->mvhd_atom.buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1389
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1390 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1391
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1392 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1393 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1394
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1395
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1396 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1397 ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1398 {
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1399 u_char *atom_header, *atom_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1400 off_t atom_file_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1401 ngx_int_t rc;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1402 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1403 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1404
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1405 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 trak atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1406
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1407 trak = ngx_array_push(&mp4->trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1408 if (trak == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1409 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1410 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1411
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1412 ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1413
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1414 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1415 ngx_mp4_set_atom_name(atom_header, 't', 'r', 'a', 'k');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1416
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1417 atom = &trak->trak_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1418 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1419 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1420 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1421
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1422 trak->out[NGX_HTTP_MP4_TRAK_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1423
5359
2fda9065d0f4 Win32: Borland C compatibility fixes.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5358
diff changeset
1424 atom_end = mp4->buffer_pos + (size_t) atom_data_size;
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1425 atom_file_end = mp4->offset + atom_data_size;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1426
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1427 rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_trak_atoms, atom_data_size);
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1428
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1429 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1430 "mp4 trak atom: %i", rc);
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1431
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1432 if (rc == NGX_DECLINED) {
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1433 /* skip this trak */
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1434 ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1435 mp4->trak.nelts--;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1436 mp4->buffer_pos = atom_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1437 mp4->offset = atom_file_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1438 return NGX_OK;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1439 }
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1440
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1441 return rc;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1442 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1443
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1444
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1445 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1446 ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1447 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1448 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1449 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1450
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1451 trak->size += sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1452 atom = &trak->trak_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1453 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1454 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1455
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1456
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1457 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1458 ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1459 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1460 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1461 "\"%s\" mp4 compressed moov atom (cmov) is not supported",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1462 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1463
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1464 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1465 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1466
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1467
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1468 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1469 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1470 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1471 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1472 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1473 u_char creation_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1474 u_char modification_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1475 u_char track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1476 u_char reserved1[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1477 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1478 u_char reserved2[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1479 u_char layer[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1480 u_char group[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1481 u_char volume[2];
6504
293413010217 Fixed spelling.
Josh Soref <timeless@gmail.com>
parents: 6478
diff changeset
1482 u_char reserved3[2];
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1483 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1484 u_char width[4];
6504
293413010217 Fixed spelling.
Josh Soref <timeless@gmail.com>
parents: 6478
diff changeset
1485 u_char height[4];
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1486 } ngx_mp4_tkhd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1487
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1488 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1489 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1490 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1491 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1492 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1493 u_char creation_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1494 u_char modification_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1495 u_char track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1496 u_char reserved1[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1497 u_char duration[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1498 u_char reserved2[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1499 u_char layer[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1500 u_char group[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1501 u_char volume[2];
6504
293413010217 Fixed spelling.
Josh Soref <timeless@gmail.com>
parents: 6478
diff changeset
1502 u_char reserved3[2];
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1503 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1504 u_char width[4];
6504
293413010217 Fixed spelling.
Josh Soref <timeless@gmail.com>
parents: 6478
diff changeset
1505 u_char height[4];
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1506 } ngx_mp4_tkhd64_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1507
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1508
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1509 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1510 ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1511 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1512 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1513 size_t atom_size;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1514 uint64_t duration, start_time, length_time;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1515 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1516 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1517 ngx_mp4_tkhd_atom_t *tkhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1518 ngx_mp4_tkhd64_atom_t *tkhd64_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1519
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1520 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 tkhd atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1521
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1522 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1523 tkhd_atom = (ngx_mp4_tkhd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1524 tkhd64_atom = (ngx_mp4_tkhd64_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1525 ngx_mp4_set_atom_name(tkhd_atom, 't', 'k', 'h', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1526
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1527 if (ngx_mp4_atom_data_size(ngx_mp4_tkhd_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1528 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1529 "\"%s\" mp4 tkhd atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1530 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1531 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1532
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1533 if (tkhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1534 /* version 0: 32-bit duration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1535 duration = ngx_mp4_get_32value(tkhd_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1536
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1537 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1538 /* version 1: 64-bit duration */
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1539
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1540 if (ngx_mp4_atom_data_size(ngx_mp4_tkhd64_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1541 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1542 "\"%s\" mp4 tkhd atom too small",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1543 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1544 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1545 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1546
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1547 duration = ngx_mp4_get_64value(tkhd64_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1548 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1549
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1550 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1551 "tkhd duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1552 duration, (double) duration / mp4->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1553
5543
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1554 start_time = (uint64_t) mp4->start * mp4->timescale / 1000;
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1555
5629
c7bbc5fcf27c Mp4: fixed seeking to a track end.
Roman Arutyunyan <arut@nginx.com>
parents: 5622
diff changeset
1556 if (duration <= start_time) {
5543
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1557 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1558 "tkhd duration is less than start time");
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1559 return NGX_DECLINED;
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1560 }
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1561
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1562 duration -= start_time;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1563
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1564 if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1565 length_time = (uint64_t) mp4->length * mp4->timescale / 1000;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1566
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1567 if (duration > length_time) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1568 duration = length_time;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1569 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1570 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1571
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1572 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1573 "tkhd new duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1574 duration, (double) duration / mp4->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1575
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1576 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1577
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1578 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1579 trak->tkhd_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1580
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1581 ngx_mp4_set_32value(tkhd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1582
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1583 if (tkhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1584 ngx_mp4_set_32value(tkhd_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1585
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1586 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1587 ngx_mp4_set_64value(tkhd64_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1588 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1589
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1590 atom = &trak->tkhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1591 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1592 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1593 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1594
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1595 trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1596
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1597 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1598
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1599 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1600 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1601
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1602
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1603 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1604 ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1605 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1606 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1607 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1608 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1609
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1610 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process mdia atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1611
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1612 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1613 ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'i', 'a');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1614
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1615 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1616
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1617 atom = &trak->mdia_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1618 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1619 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1620 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1621
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1622 trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1623
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1624 return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_mdia_atoms, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1625 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1626
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1627
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1628 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1629 ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1630 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1631 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1632 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1633
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1634 trak->size += sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1635 atom = &trak->mdia_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1636 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1637 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1638
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1639
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1640 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1641 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1642 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1643 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1644 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1645 u_char creation_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1646 u_char modification_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1647 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1648 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1649 u_char language[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1650 u_char quality[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1651 } ngx_mp4_mdhd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1652
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1653 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1654 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1655 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1656 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1657 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1658 u_char creation_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1659 u_char modification_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1660 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1661 u_char duration[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1662 u_char language[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1663 u_char quality[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1664 } ngx_mp4_mdhd64_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1665
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1666
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1667 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1668 ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1669 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1670 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1671 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1672 uint32_t timescale;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1673 uint64_t duration, start_time, length_time;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1674 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1675 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1676 ngx_mp4_mdhd_atom_t *mdhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1677 ngx_mp4_mdhd64_atom_t *mdhd64_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1678
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1679 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdhd atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1680
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1681 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1682 mdhd_atom = (ngx_mp4_mdhd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1683 mdhd64_atom = (ngx_mp4_mdhd64_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1684 ngx_mp4_set_atom_name(mdhd_atom, 'm', 'd', 'h', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1685
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1686 if (ngx_mp4_atom_data_size(ngx_mp4_mdhd_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1687 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1688 "\"%s\" mp4 mdhd atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1689 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1690 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1691
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1692 if (mdhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1693 /* version 0: everything is 32-bit */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1694 timescale = ngx_mp4_get_32value(mdhd_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1695 duration = ngx_mp4_get_32value(mdhd_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1696
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1697 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1698 /* version 1: 64-bit duration and 32-bit timescale */
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1699
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1700 if (ngx_mp4_atom_data_size(ngx_mp4_mdhd64_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1701 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1702 "\"%s\" mp4 mdhd atom too small",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1703 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1704 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1705 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1706
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1707 timescale = ngx_mp4_get_32value(mdhd64_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1708 duration = ngx_mp4_get_64value(mdhd64_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1709 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1710
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1711 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1712 "mdhd timescale:%uD, duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1713 timescale, duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1714
5543
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1715 start_time = (uint64_t) mp4->start * timescale / 1000;
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1716
5629
c7bbc5fcf27c Mp4: fixed seeking to a track end.
Roman Arutyunyan <arut@nginx.com>
parents: 5622
diff changeset
1717 if (duration <= start_time) {
5543
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1718 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1719 "mdhd duration is less than start time");
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1720 return NGX_DECLINED;
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1721 }
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1722
5730c0193842 Mp4: skip tracks shorter than seek position (ticket #414).
Roman Arutyunyan <arut@nginx.com>
parents: 5542
diff changeset
1723 duration -= start_time;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1724
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1725 if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1726 length_time = (uint64_t) mp4->length * timescale / 1000;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1727
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1728 if (duration > length_time) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1729 duration = length_time;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1730 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1731 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
1732
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1733 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1734 "mdhd new duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1735 duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1736
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1737 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1738
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1739 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1740 trak->mdhd_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1741 trak->timescale = timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1742
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1743 ngx_mp4_set_32value(mdhd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1744
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1745 if (mdhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1746 ngx_mp4_set_32value(mdhd_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1747
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1748 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1749 ngx_mp4_set_64value(mdhd64_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1750 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1751
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1752 atom = &trak->mdhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1753 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1754 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1755 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1756
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1757 trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1758
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1759 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1760
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1761 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1762 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1763
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1764
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1765 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1766 ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1767 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1768 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1769 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1770 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1771 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1772
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1773 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 hdlr atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1774
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1775 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1776 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1777 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1778 ngx_mp4_set_atom_name(atom_header, 'h', 'd', 'l', 'r');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1779
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1780 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1781
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1782 atom = &trak->hdlr_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1783 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1784 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1785 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1786
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1787 trak->hdlr_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1788 trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1789
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1790 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1791
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1792 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1793 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1794
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1795
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1796 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1797 ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1798 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1799 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1800 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1801 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1802
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1803 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process minf atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1804
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1805 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1806 ngx_mp4_set_atom_name(atom_header, 'm', 'i', 'n', 'f');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1807
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1808 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1809
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1810 atom = &trak->minf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1811 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1812 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1813 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1814
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1815 trak->out[NGX_HTTP_MP4_MINF_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1816
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1817 return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_minf_atoms, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1818 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1819
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1820
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1821 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1822 ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1823 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1824 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1825 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1826
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1827 trak->size += sizeof(ngx_mp4_atom_header_t)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1828 + trak->vmhd_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1829 + trak->smhd_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1830 + trak->dinf_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1831 atom = &trak->minf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1832 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1833 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1834
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1835
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1836 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1837 ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1838 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1839 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1840 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1841 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1842 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1843
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1844 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 vmhd atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1845
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1846 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1847 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1848 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1849 ngx_mp4_set_atom_name(atom_header, 'v', 'm', 'h', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1850
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1851 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1852
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1853 atom = &trak->vmhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1854 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1855 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1856 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1857
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1858 trak->vmhd_size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1859 trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1860
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1861 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1862
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1863 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1864 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1865
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1866
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1867 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1868 ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1869 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1870 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1871 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1872 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1873 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1874
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1875 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 smhd atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1876
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1877 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1878 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1879 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1880 ngx_mp4_set_atom_name(atom_header, 's', 'm', 'h', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1881
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1882 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1883
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1884 atom = &trak->smhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1885 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1886 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1887 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1888
5807
6d468b45f40e Mp4: use trak->smhd_size in ngx_http_mp4_read_smhd_atom().
Roman Arutyunyan <arut@nginx.com>
parents: 5638
diff changeset
1889 trak->smhd_size += atom_size;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1890 trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1891
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1892 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1893
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1894 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1895 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1896
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1897
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1898 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1899 ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1900 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1901 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1902 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1903 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1904 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1905
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1906 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 dinf atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1907
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1908 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1909 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1910 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1911 ngx_mp4_set_atom_name(atom_header, 'd', 'i', 'n', 'f');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1912
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1913 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1914
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1915 atom = &trak->dinf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1916 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1917 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1918 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1919
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1920 trak->dinf_size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1921 trak->out[NGX_HTTP_MP4_DINF_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1922
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1923 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1924
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1925 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1926 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1927
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1928
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1929 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1930 ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1931 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1932 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1933 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1934 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1935
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1936 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process stbl atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1937
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1938 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1939 ngx_mp4_set_atom_name(atom_header, 's', 't', 'b', 'l');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1940
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1941 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1942
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1943 atom = &trak->stbl_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1944 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1945 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1946 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1947
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1948 trak->out[NGX_HTTP_MP4_STBL_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1949
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1950 return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_stbl_atoms, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1951 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1952
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1953
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1954 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1955 ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1956 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1957 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1958 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1959
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1960 trak->size += sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1961 atom = &trak->stbl_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1962 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1963 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1964
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1965
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1966 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1967 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1968 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1969 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1970 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1971 u_char entries[4];
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1972
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1973 u_char media_size[4];
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1974 u_char media_name[4];
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1975 } ngx_mp4_stsd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1976
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1977
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1978 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1979 ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1980 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1981 u_char *atom_header, *atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1982 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1983 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1984 ngx_mp4_stsd_atom_t *stsd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1985 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1986
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1987 /* sample description atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1988
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1989 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsd atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1990
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1991 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1992 stsd_atom = (ngx_mp4_stsd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1993 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1994 atom_table = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1995 ngx_mp4_set_32value(stsd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1996 ngx_mp4_set_atom_name(stsd_atom, 's', 't', 's', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1997
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
1998 if (ngx_mp4_atom_data_size(ngx_mp4_stsd_atom_t) > atom_data_size) {
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1999 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2000 "\"%s\" mp4 stsd atom too small", mp4->file.name.data);
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2001 return NGX_ERROR;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2002 }
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2003
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2004 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2005 "stsd entries:%uD, media:%*s",
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2006 ngx_mp4_get_32value(stsd_atom->entries),
6478
3ef7bb882ad4 Fixed logging with variable field width.
Sergey Kandaurov <pluknet@nginx.com>
parents: 6474
diff changeset
2007 (size_t) 4, stsd_atom->media_name);
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
2008
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2009 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2010
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2011 atom = &trak->stsd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2012 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2013 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2014 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2015
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2016 trak->out[NGX_HTTP_MP4_STSD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2017 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2018
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2019 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2020
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2021 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2022 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2023
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2024
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2025 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2026 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2027 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2028 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2029 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2030 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2031 } ngx_mp4_stts_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2032
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2033 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2034 u_char count[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2035 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2036 } ngx_mp4_stts_entry_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2037
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2038
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2039 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2040 ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2041 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2042 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2043 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2044 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2045 ngx_mp4_stts_atom_t *stts_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2046 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2047
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2048 /* time-to-sample atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2049
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2050 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stts atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2051
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2052 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2053 stts_atom = (ngx_mp4_stts_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2054 ngx_mp4_set_atom_name(stts_atom, 's', 't', 't', 's');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2055
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2056 if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2057 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2058 "\"%s\" mp4 stts atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2059 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2060 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2061
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2062 entries = ngx_mp4_get_32value(stts_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2063
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2064 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4096
f9a1646b9611 Fix of debug message format.
Igor Sysoev <igor@sysoev.ru>
parents: 4095
diff changeset
2065 "mp4 time-to-sample entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2066
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2067 if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2068 + entries * sizeof(ngx_mp4_stts_entry_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2069 {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2070 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2071 "\"%s\" mp4 stts atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2072 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2073 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2074
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2075 atom_table = atom_header + sizeof(ngx_mp4_stts_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2076 atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2077
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2078 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2079 trak->time_to_sample_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2080
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2081 atom = &trak->stts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2082 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2083 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2084 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2086 data = &trak->stts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2087 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2088 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2089 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2090
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2091 trak->out[NGX_HTTP_MP4_STTS_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2092 trak->out[NGX_HTTP_MP4_STTS_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2093
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2094 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2095
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2096 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2097 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2098
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2099
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2100 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2101 ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2102 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2103 {
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2104 size_t atom_size;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2105 ngx_buf_t *atom, *data;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2106 ngx_mp4_stts_atom_t *stts_atom;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2107
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2108 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2109 * mdia.minf.stbl.stts updating requires trak->timescale
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2110 * from mdia.mdhd atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2111 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2112
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2113 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2114 "mp4 stts atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2115
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2116 data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2117
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2118 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2119 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2120 "no mp4 stts atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2121 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2122 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2123 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2124
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2125 if (ngx_http_mp4_crop_stts_data(mp4, trak, 1) != NGX_OK) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2126 return NGX_ERROR;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2127 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2128
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2129 if (ngx_http_mp4_crop_stts_data(mp4, trak, 0) != NGX_OK) {
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2130 return NGX_ERROR;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2131 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2132
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2133 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2134 "time-to-sample entries:%uD", trak->time_to_sample_entries);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2135
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2136 atom_size = sizeof(ngx_mp4_stts_atom_t) + (data->last - data->pos);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2137 trak->size += atom_size;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2138
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2139 atom = trak->out[NGX_HTTP_MP4_STTS_ATOM].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2140 stts_atom = (ngx_mp4_stts_atom_t *) atom->pos;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2141 ngx_mp4_set_32value(stts_atom->size, atom_size);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2142 ngx_mp4_set_32value(stts_atom->entries, trak->time_to_sample_entries);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2143
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2144 return NGX_OK;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2145 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2146
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2147
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2148 static ngx_int_t
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2149 ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2150 ngx_http_mp4_trak_t *trak, ngx_uint_t start)
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2151 {
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2152 uint32_t count, duration, rest;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2153 uint64_t start_time;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2154 ngx_buf_t *data;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2155 ngx_uint_t start_sample, entries, start_sec;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2156 ngx_mp4_stts_entry_t *entry, *end;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2157
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2158 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2159 start_sec = mp4->start;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2160
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2161 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2162 "mp4 stts crop start_time:%ui", start_sec);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2163
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2164 } else if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2165 start_sec = mp4->length;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2166
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2167 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2168 "mp4 stts crop end_time:%ui", start_sec);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2169
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2170 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2171 return NGX_OK;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2172 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2173
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2174 data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2175
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2176 start_time = (uint64_t) start_sec * trak->timescale / 1000;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2177
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2178 entries = trak->time_to_sample_entries;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2179 start_sample = 0;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2180 entry = (ngx_mp4_stts_entry_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2181 end = (ngx_mp4_stts_entry_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2182
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2183 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2184 count = ngx_mp4_get_32value(entry->count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2185 duration = ngx_mp4_get_32value(entry->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2186
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2187 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2188 "time:%uL, count:%uD, duration:%uD",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2189 start_time, count, duration);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2190
4306
05f3174483de Fix of mp4 module seeking.
Igor Sysoev <igor@sysoev.ru>
parents: 4282
diff changeset
2191 if (start_time < (uint64_t) count * duration) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2192 start_sample += (ngx_uint_t) (start_time / duration);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2193 rest = (uint32_t) (start_time / duration);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2194 goto found;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2195 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2196
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2197 start_sample += count;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2198 start_time -= count * duration;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2199 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2200 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2201 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2202
5638
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2203 if (start) {
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2204 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2205 "start time is out mp4 stts samples in \"%s\"",
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2206 mp4->file.name.data);
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2207
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2208 return NGX_ERROR;
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2209
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2210 } else {
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2211 trak->end_sample = trak->start_sample + start_sample;
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2212
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2213 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2214 "end_sample:%ui", trak->end_sample);
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2215
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2216 return NGX_OK;
0c0dd1aacdf5 Mp4: allow end values bigger than track duration.
Roman Arutyunyan <arut@nginx.com>
parents: 5630
diff changeset
2217 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2218
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2219 found:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2220
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2221 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2222 ngx_mp4_set_32value(entry->count, count - rest);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2223 data->pos = (u_char *) entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2224 trak->time_to_sample_entries = entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2225 trak->start_sample = start_sample;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2226
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2227 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2228 "start_sample:%ui, new count:%uD",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2229 trak->start_sample, count - rest);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2230
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2231 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2232 ngx_mp4_set_32value(entry->count, rest);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2233 data->last = (u_char *) (entry + 1);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2234 trak->time_to_sample_entries -= entries - 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2235 trak->end_sample = trak->start_sample + start_sample;
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2236
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2237 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2238 "end_sample:%ui, new count:%uD",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2239 trak->end_sample, rest);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2240 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2241
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2242 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2243 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2244
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2245
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2246 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2247 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2248 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2249 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2250 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2251 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2252 } ngx_http_mp4_stss_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2253
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2254
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2255 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2256 ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2257 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2258 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2259 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2260 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2261 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2262 ngx_http_mp4_stss_atom_t *stss_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2263
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2264 /* sync samples atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2265
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2266 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stss atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2267
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2268 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2269 stss_atom = (ngx_http_mp4_stss_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2270 ngx_mp4_set_atom_name(stss_atom, 's', 't', 's', 's');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2271
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2272 if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2273 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2274 "\"%s\" mp4 stss atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2275 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2276 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2277
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2278 entries = ngx_mp4_get_32value(stss_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2279
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2280 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4096
f9a1646b9611 Fix of debug message format.
Igor Sysoev <igor@sysoev.ru>
parents: 4095
diff changeset
2281 "sync sample entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2282
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2283 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2284 trak->sync_samples_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2285
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2286 atom_table = atom_header + sizeof(ngx_http_mp4_stss_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2287
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2288 atom = &trak->stss_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2289 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2290 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2291 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2292
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2293 if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2294 + entries * sizeof(uint32_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2295 {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2296 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2297 "\"%s\" mp4 stss atom too small", mp4->file.name.data);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2298 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2299 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2300
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2301 atom_end = atom_table + entries * sizeof(uint32_t);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2302
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2303 data = &trak->stss_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2304 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2305 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2306 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2307
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2308 trak->out[NGX_HTTP_MP4_STSS_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2309 trak->out[NGX_HTTP_MP4_STSS_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2310
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2311 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2312
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2313 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2314 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2315
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2316
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2317 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2318 ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2319 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2320 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2321 size_t atom_size;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2322 uint32_t sample, start_sample, *entry, *end;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2323 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2324 ngx_http_mp4_stss_atom_t *stss_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2325
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2326 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2327 * mdia.minf.stbl.stss updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2328 * from mdia.minf.stbl.stts which depends on value from mdia.mdhd
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2329 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2330 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2331
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2332 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2333 "mp4 stss atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2334
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2335 data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2336
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2337 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2338 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2339 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2340
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2341 ngx_http_mp4_crop_stss_data(mp4, trak, 1);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2342 ngx_http_mp4_crop_stss_data(mp4, trak, 0);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2343
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2344 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2345 "sync sample entries:%uD", trak->sync_samples_entries);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2346
5622
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2347 if (trak->sync_samples_entries) {
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2348 entry = (uint32_t *) data->pos;
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2349 end = (uint32_t *) data->last;
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2350
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2351 start_sample = trak->start_sample;
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2352
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2353 while (entry < end) {
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2354 sample = ngx_mp4_get_32value(entry);
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2355 sample -= start_sample;
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2356 ngx_mp4_set_32value(entry, sample);
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2357 entry++;
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2358 }
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2359
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2360 } else {
a23c35496c2f Mp4: skipped empty stss atom table in output.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5621
diff changeset
2361 trak->out[NGX_HTTP_MP4_STSS_DATA].buf = NULL;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2362 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2363
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2364 atom_size = sizeof(ngx_http_mp4_stss_atom_t) + (data->last - data->pos);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2365 trak->size += atom_size;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2366
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2367 atom = trak->out[NGX_HTTP_MP4_STSS_ATOM].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2368 stss_atom = (ngx_http_mp4_stss_atom_t *) atom->pos;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2369
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2370 ngx_mp4_set_32value(stss_atom->size, atom_size);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2371 ngx_mp4_set_32value(stss_atom->entries, trak->sync_samples_entries);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2372
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2373 return NGX_OK;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2374 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2375
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2376
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2377 static void
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2378 ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2379 ngx_http_mp4_trak_t *trak, ngx_uint_t start)
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2380 {
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2381 uint32_t sample, start_sample, *entry, *end;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2382 ngx_buf_t *data;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2383 ngx_uint_t entries;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2384
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2385 /* sync samples starts from 1 */
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2386
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2387 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2388 start_sample = trak->start_sample + 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2389
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2390 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2391 "mp4 stss crop start_sample:%uD", start_sample);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2392
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2393 } else if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2394 start_sample = trak->end_sample + 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2395
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2396 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2397 "mp4 stss crop end_sample:%uD", start_sample);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2398
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2399 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2400 return;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2401 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2402
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2403 data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2404
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2405 entries = trak->sync_samples_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2406 entry = (uint32_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2407 end = (uint32_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2408
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2409 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2410 sample = ngx_mp4_get_32value(entry);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2411
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2412 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2413 "sync:%uD", sample);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2414
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2415 if (sample >= start_sample) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2416 goto found;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2417 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2418
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2419 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2420 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2421 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2422
5542
847c308917af Mp4: fix seeks after the last key frame.
Roman Arutyunyan <arut@nginx.com>
parents: 5496
diff changeset
2423 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2424 "sample is out of mp4 stss atom");
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2425
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2426 found:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2427
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2428 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2429 data->pos = (u_char *) entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2430 trak->sync_samples_entries = entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2431
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2432 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2433 data->last = (u_char *) entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2434 trak->sync_samples_entries -= entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2435 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2436 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2437
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2438
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2439 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2440 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2441 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2442 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2443 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2444 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2445 } ngx_mp4_ctts_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2446
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2447 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2448 u_char count[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2449 u_char offset[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2450 } ngx_mp4_ctts_entry_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2451
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2452
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2453 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2454 ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2455 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2456 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2457 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2458 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2459 ngx_mp4_ctts_atom_t *ctts_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2460 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2461
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2462 /* composition offsets atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2463
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2464 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ctts atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2465
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2466 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2467 ctts_atom = (ngx_mp4_ctts_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2468 ngx_mp4_set_atom_name(ctts_atom, 'c', 't', 't', 's');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2469
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2470 if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2471 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2472 "\"%s\" mp4 ctts atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2473 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2474 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2475
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2476 entries = ngx_mp4_get_32value(ctts_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2477
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2478 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4096
f9a1646b9611 Fix of debug message format.
Igor Sysoev <igor@sysoev.ru>
parents: 4095
diff changeset
2479 "composition offset entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2480
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2481 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2482 trak->composition_offset_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2483
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2484 atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2485
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2486 atom = &trak->ctts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2487 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2488 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2489 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2490
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2491 if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2492 + entries * sizeof(ngx_mp4_ctts_entry_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2493 {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2494 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2495 "\"%s\" mp4 ctts atom too small", mp4->file.name.data);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2496 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2497 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2498
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2499 atom_end = atom_table + entries * sizeof(ngx_mp4_ctts_entry_t);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2500
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2501 data = &trak->ctts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2502 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2503 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2504 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2505
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2506 trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2507 trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2508
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2509 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2510
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2511 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2512 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2513
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2514
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2515 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2516 ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2517 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2518 {
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2519 size_t atom_size;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2520 ngx_buf_t *atom, *data;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2521 ngx_mp4_ctts_atom_t *ctts_atom;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2522
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2523 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2524 * mdia.minf.stbl.ctts updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2525 * from mdia.minf.stbl.stts which depends on value from mdia.mdhd
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2526 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2527 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2528
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2529 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2530 "mp4 ctts atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2531
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2532 data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2533
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2534 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2535 return;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2536 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2537
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2538 ngx_http_mp4_crop_ctts_data(mp4, trak, 1);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2539 ngx_http_mp4_crop_ctts_data(mp4, trak, 0);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2540
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2541 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2542 "composition offset entries:%uD",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2543 trak->composition_offset_entries);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2544
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2545 if (trak->composition_offset_entries == 0) {
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2546 trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = NULL;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2547 trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = NULL;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2548 return;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2549 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2550
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2551 atom_size = sizeof(ngx_mp4_ctts_atom_t) + (data->last - data->pos);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2552 trak->size += atom_size;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2553
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2554 atom = trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2555 ctts_atom = (ngx_mp4_ctts_atom_t *) atom->pos;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2556
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2557 ngx_mp4_set_32value(ctts_atom->size, atom_size);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2558 ngx_mp4_set_32value(ctts_atom->entries, trak->composition_offset_entries);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2559
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2560 return;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2561 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2562
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2563
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2564 static void
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2565 ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2566 ngx_http_mp4_trak_t *trak, ngx_uint_t start)
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2567 {
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2568 uint32_t count, start_sample, rest;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2569 ngx_buf_t *data;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2570 ngx_uint_t entries;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2571 ngx_mp4_ctts_entry_t *entry, *end;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2572
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2573 /* sync samples starts from 1 */
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2574
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2575 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2576 start_sample = trak->start_sample + 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2577
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2578 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2579 "mp4 ctts crop start_sample:%uD", start_sample);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2580
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2581 } else if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2582 start_sample = trak->end_sample - trak->start_sample + 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2583
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2584 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2585 "mp4 ctts crop end_sample:%uD", start_sample);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2586
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2587 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2588 return;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2589 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2590
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2591 data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2592
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2593 entries = trak->composition_offset_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2594 entry = (ngx_mp4_ctts_entry_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2595 end = (ngx_mp4_ctts_entry_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2596
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2597 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2598 count = ngx_mp4_get_32value(entry->count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2599
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
2600 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2601 "sample:%uD, count:%uD, offset:%uD",
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2602 start_sample, count, ngx_mp4_get_32value(entry->offset));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2603
6474
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2604 if (start_sample <= count) {
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2605 rest = start_sample - 1;
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2606 goto found;
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2607 }
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2608
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2609 start_sample -= count;
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2610 entries--;
Ruslan Ermilov <ru@nginx.com>
parents: 5807
diff changeset
2611 entry++;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2612 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2613
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2614 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2615 data->pos = (u_char *) end;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2616 trak->composition_offset_entries = 0;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2617 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2618
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2619 return;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2620
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2621 found:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2622
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2623 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2624 ngx_mp4_set_32value(entry->count, count - rest);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2625 data->pos = (u_char *) entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2626 trak->composition_offset_entries = entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2627
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2628 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2629 ngx_mp4_set_32value(entry->count, rest);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2630 data->last = (u_char *) (entry + 1);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2631 trak->composition_offset_entries -= entries - 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2632 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2633 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2634
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2635
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2636 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2637 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2638 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2639 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2640 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2641 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2642 } ngx_mp4_stsc_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2643
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2644
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2645 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2646 ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2647 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2648 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2649 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2650 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2651 ngx_mp4_stsc_atom_t *stsc_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2652 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2653
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2654 /* sample-to-chunk atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2655
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2656 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsc atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2657
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2658 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2659 stsc_atom = (ngx_mp4_stsc_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2660 ngx_mp4_set_atom_name(stsc_atom, 's', 't', 's', 'c');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2661
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2662 if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2663 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2664 "\"%s\" mp4 stsc atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2665 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2666 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2667
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2668 entries = ngx_mp4_get_32value(stsc_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2669
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2670 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4096
f9a1646b9611 Fix of debug message format.
Igor Sysoev <igor@sysoev.ru>
parents: 4095
diff changeset
2671 "sample-to-chunk entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2672
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2673 if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2674 + entries * sizeof(ngx_mp4_stsc_entry_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2675 {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2676 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2677 "\"%s\" mp4 stsc atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2678 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2679 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2680
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2681 atom_table = atom_header + sizeof(ngx_mp4_stsc_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2682 atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2683
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2684 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2685 trak->sample_to_chunk_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2686
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2687 atom = &trak->stsc_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2688 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2689 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2690 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2691
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2692 data = &trak->stsc_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2693 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2694 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2695 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2696
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2697 trak->out[NGX_HTTP_MP4_STSC_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2698 trak->out[NGX_HTTP_MP4_STSC_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2699
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2700 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2701
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2702 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2703 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2704
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2705
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2706 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2707 ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2708 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2709 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2710 size_t atom_size;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2711 uint32_t chunk;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2712 ngx_buf_t *atom, *data;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2713 ngx_mp4_stsc_atom_t *stsc_atom;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2714 ngx_mp4_stsc_entry_t *entry, *end;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2715
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2716 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2717 * mdia.minf.stbl.stsc updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2718 * from mdia.minf.stbl.stts which depends on value from mdia.mdhd
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2719 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2720 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2721
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2722 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2723 "mp4 stsc atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2724
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2725 data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2726
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2727 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2728 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2729 "no mp4 stsc atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2730 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2731 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2732 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2733
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2734 if (trak->sample_to_chunk_entries == 0) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2735 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2736 "zero number of entries in stsc atom in \"%s\"",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2737 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2738 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2739 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
2740
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2741 if (ngx_http_mp4_crop_stsc_data(mp4, trak, 1) != NGX_OK) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2742 return NGX_ERROR;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2743 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2744
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2745 if (ngx_http_mp4_crop_stsc_data(mp4, trak, 0) != NGX_OK) {
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2746 return NGX_ERROR;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2747 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2748
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2749 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2750 "sample-to-chunk entries:%uD",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2751 trak->sample_to_chunk_entries);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2752
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2753 entry = (ngx_mp4_stsc_entry_t *) data->pos;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2754 end = (ngx_mp4_stsc_entry_t *) data->last;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2755
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2756 while (entry < end) {
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2757 chunk = ngx_mp4_get_32value(entry->chunk);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2758 chunk -= trak->start_chunk;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2759 ngx_mp4_set_32value(entry->chunk, chunk);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2760 entry++;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2761 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2762
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2763 atom_size = sizeof(ngx_mp4_stsc_atom_t)
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2764 + trak->sample_to_chunk_entries * sizeof(ngx_mp4_stsc_entry_t);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2765
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2766 trak->size += atom_size;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2767
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2768 atom = trak->out[NGX_HTTP_MP4_STSC_ATOM].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2769 stsc_atom = (ngx_mp4_stsc_atom_t *) atom->pos;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2770
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2771 ngx_mp4_set_32value(stsc_atom->size, atom_size);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2772 ngx_mp4_set_32value(stsc_atom->entries, trak->sample_to_chunk_entries);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2773
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2774 return NGX_OK;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2775 }
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2776
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2777
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2778 static ngx_int_t
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2779 ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2780 ngx_http_mp4_trak_t *trak, ngx_uint_t start)
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2781 {
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2782 uint32_t start_sample, chunk, samples, id, next_chunk, n,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2783 prev_samples;
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2784 ngx_buf_t *data, *buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2785 ngx_uint_t entries, target_chunk, chunk_samples;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2786 ngx_mp4_stsc_entry_t *entry, *end, *first;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2787
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2788 entries = trak->sample_to_chunk_entries - 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2789
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2790 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2791 start_sample = (uint32_t) trak->start_sample;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2792
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2793 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2794 "mp4 stsc crop start_sample:%uD", start_sample);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2795
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2796 } else if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2797 start_sample = (uint32_t) (trak->end_sample - trak->start_sample);
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2798 samples = 0;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2799
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2800 data = trak->out[NGX_HTTP_MP4_STSC_START].buf;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2801
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2802 if (data) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2803 entry = (ngx_mp4_stsc_entry_t *) data->pos;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2804 samples = ngx_mp4_get_32value(entry->samples);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2805 entries--;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2806
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2807 if (samples > start_sample) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2808 samples = start_sample;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2809 ngx_mp4_set_32value(entry->samples, samples);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2810 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2811
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2812 start_sample -= samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2813 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2814
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2815 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2816 "mp4 stsc crop end_sample:%uD, ext_samples:%uD",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2817 start_sample, samples);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2818
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2819 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2820 return NGX_OK;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2821 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2822
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2823 data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2824
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2825 entry = (ngx_mp4_stsc_entry_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2826 end = (ngx_mp4_stsc_entry_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2827
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2828 chunk = ngx_mp4_get_32value(entry->chunk);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2829 samples = ngx_mp4_get_32value(entry->samples);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2830 id = ngx_mp4_get_32value(entry->id);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2831 prev_samples = 0;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2832 entry++;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2833
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2834 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2835
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2836 next_chunk = ngx_mp4_get_32value(entry->chunk);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2837
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2838 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2839 "sample:%uD, chunk:%uD, chunks:%uD, "
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2840 "samples:%uD, id:%uD",
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2841 start_sample, chunk, next_chunk - chunk, samples, id);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2842
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2843 n = (next_chunk - chunk) * samples;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2844
5578
e280ece17020 Mp4: remove useless leading stsc entry in result mp4.
Roman Arutyunyan <arut@nginx.com>
parents: 5544
diff changeset
2845 if (start_sample < n) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2846 goto found;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2847 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2848
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2849 start_sample -= n;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2850
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2851 prev_samples = samples;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2852 chunk = next_chunk;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2853 samples = ngx_mp4_get_32value(entry->samples);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2854 id = ngx_mp4_get_32value(entry->id);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2855 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2856 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2857 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2858
5544
2f586f1684fa Mp4: fix seeks to standalone last chunk.
Roman Arutyunyan <arut@nginx.com>
parents: 5543
diff changeset
2859 next_chunk = trak->chunks + 1;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2860
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2861 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2862 "sample:%uD, chunk:%uD, chunks:%uD, samples:%uD",
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2863 start_sample, chunk, next_chunk - chunk, samples);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2864
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2865 n = (next_chunk - chunk) * samples;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2866
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2867 if (start_sample > n) {
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2868 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2869 "%s time is out mp4 stsc chunks in \"%s\"",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2870 start ? "start" : "end", mp4->file.name.data);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2871 return NGX_ERROR;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2872 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2873
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2874 found:
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2875
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2876 entries++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2877 entry--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2878
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2879 if (samples == 0) {
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2880 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2881 "zero number of samples in \"%s\"",
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2882 mp4->file.name.data);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2883 return NGX_ERROR;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2884 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2885
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2886 target_chunk = chunk - 1;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2887 target_chunk += start_sample / samples;
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2888 chunk_samples = start_sample % samples;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2889
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2890 if (start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2891 data->pos = (u_char *) entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2892
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2893 trak->sample_to_chunk_entries = entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2894 trak->start_chunk = target_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2895 trak->start_chunk_samples = chunk_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2896
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2897 ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 1);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2898
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2899 samples -= chunk_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2900
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2901 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2902 "start_chunk:%ui, start_chunk_samples:%ui",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2903 trak->start_chunk, trak->start_chunk_samples);
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2904
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2905 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2906 if (start_sample) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2907 data->last = (u_char *) (entry + 1);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2908 trak->sample_to_chunk_entries -= entries - 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2909 trak->end_chunk_samples = samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2910
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2911 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2912 data->last = (u_char *) entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2913 trak->sample_to_chunk_entries -= entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2914 trak->end_chunk_samples = prev_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2915 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2916
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2917 if (chunk_samples) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2918 trak->end_chunk = target_chunk + 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2919 trak->end_chunk_samples = chunk_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2920
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2921 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2922 trak->end_chunk = target_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2923 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2924
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2925 samples = chunk_samples;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2926 next_chunk = chunk + 1;
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2927
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2928 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2929 "end_chunk:%ui, end_chunk_samples:%ui",
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
2930 trak->end_chunk, trak->end_chunk_samples);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2931 }
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2932
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2933 if (chunk_samples && next_chunk - target_chunk == 2) {
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2934
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2935 ngx_mp4_set_32value(entry->samples, samples);
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2936
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2937 } else if (chunk_samples && start) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2938
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2939 first = &trak->stsc_start_chunk_entry;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2940 ngx_mp4_set_32value(first->chunk, 1);
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2941 ngx_mp4_set_32value(first->samples, samples);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2942 ngx_mp4_set_32value(first->id, id);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2943
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2944 buf = &trak->stsc_start_chunk_buf;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2945 buf->temporary = 1;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2946 buf->pos = (u_char *) first;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2947 buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2948
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2949 trak->out[NGX_HTTP_MP4_STSC_START].buf = buf;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2950
5619
517b5b599e3f Mp4: moved atom cropping code out of update functions.
Roman Arutyunyan <arut@nginx.com>
parents: 5578
diff changeset
2951 ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 2);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2952
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2953 trak->sample_to_chunk_entries++;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2954
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2955 } else if (chunk_samples) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2956
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2957 first = &trak->stsc_end_chunk_entry;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2958 ngx_mp4_set_32value(first->chunk, trak->end_chunk - trak->start_chunk);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2959 ngx_mp4_set_32value(first->samples, samples);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2960 ngx_mp4_set_32value(first->id, id);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2961
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2962 buf = &trak->stsc_end_chunk_buf;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2963 buf->temporary = 1;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2964 buf->pos = (u_char *) first;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2965 buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2966
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2967 trak->out[NGX_HTTP_MP4_STSC_END].buf = buf;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2968
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
2969 trak->sample_to_chunk_entries++;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2970 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2971
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2972 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2973 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2974
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2975
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2976 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2977 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2978 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2979 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2980 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2981 u_char uniform_size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2982 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2983 } ngx_mp4_stsz_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2984
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2985
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2986 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2987 ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2988 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2989 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2990 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2991 uint32_t entries, size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2992 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2993 ngx_mp4_stsz_atom_t *stsz_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2994 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2995
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2996 /* sample sizes atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2997
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2998 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsz atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2999
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3000 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3001 stsz_atom = (ngx_mp4_stsz_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3002 ngx_mp4_set_atom_name(stsz_atom, 's', 't', 's', 'z');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3003
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3004 if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3005 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3006 "\"%s\" mp4 stsz atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3007 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3008 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3009
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3010 size = ngx_mp4_get_32value(stsz_atom->uniform_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3011 entries = ngx_mp4_get_32value(stsz_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3012
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3013 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3014 "sample uniform size:%uD, entries:%uD", size, entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3015
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3016 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3017 trak->sample_sizes_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3018
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3019 atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3020
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3021 atom = &trak->stsz_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3022 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3023 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3024 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3025
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3026 trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3027
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3028 if (size == 0) {
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3029 if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3030 + entries * sizeof(uint32_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3031 {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3032 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3033 "\"%s\" mp4 stsz atom too small",
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3034 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3035 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3036 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3037
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3038 atom_end = atom_table + entries * sizeof(uint32_t);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3039
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3040 data = &trak->stsz_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3041 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3042 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3043 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3044
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3045 trak->out[NGX_HTTP_MP4_STSZ_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3046
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3047 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3048 /* if size != 0 then all samples are the same size */
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3049 /* TODO : chunk samples */
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3050 atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3051 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3052 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3053 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3054
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3055 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3056
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3057 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3058 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3059
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3060
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3061 static ngx_int_t
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3062 ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3063 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3064 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3065 size_t atom_size;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3066 uint32_t *pos, *end, entries;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3067 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3068 ngx_mp4_stsz_atom_t *stsz_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3069
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3070 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3071 * mdia.minf.stbl.stsz updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3072 * from mdia.minf.stbl.stts which depends on value from mdia.mdhd
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3073 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3074 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3075
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3076 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3077 "mp4 stsz atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3078
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3079 data = trak->out[NGX_HTTP_MP4_STSZ_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3080
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3081 if (data) {
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3082 entries = trak->sample_sizes_entries;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3083
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3084 if (trak->start_sample > entries) {
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3085 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3086 "start time is out mp4 stsz samples in \"%s\"",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3087 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3088 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3089 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3090
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3091 entries -= trak->start_sample;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3092 data->pos += trak->start_sample * sizeof(uint32_t);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3093 end = (uint32_t *) data->pos;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3094
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3095 for (pos = end - trak->start_chunk_samples; pos < end; pos++) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3096 trak->start_chunk_samples_size += ngx_mp4_get_32value(pos);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3097 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3099 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3100 "chunk samples sizes:%uL",
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3101 trak->start_chunk_samples_size);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3102
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3103 if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3104 if (trak->end_sample - trak->start_sample > entries) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3105 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3106 "end time is out mp4 stsz samples in \"%s\"",
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3107 mp4->file.name.data);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3108 return NGX_ERROR;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3109 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3110
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3111 entries = trak->end_sample - trak->start_sample;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3112 data->last = data->pos + entries * sizeof(uint32_t);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3113 end = (uint32_t *) data->last;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3114
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3115 for (pos = end - trak->end_chunk_samples; pos < end; pos++) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3116 trak->end_chunk_samples_size += ngx_mp4_get_32value(pos);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3117 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3118
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3119 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3120 "mp4 stsz end_chunk_samples_size:%uL",
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3121 trak->end_chunk_samples_size);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3122 }
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3123
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3124 atom_size = sizeof(ngx_mp4_stsz_atom_t) + (data->last - data->pos);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3125 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3126
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3127 atom = trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3128 stsz_atom = (ngx_mp4_stsz_atom_t *) atom->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3129
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3130 ngx_mp4_set_32value(stsz_atom->size, atom_size);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3131 ngx_mp4_set_32value(stsz_atom->entries, entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3132 }
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3133
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3134 return NGX_OK;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3135 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3136
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3137
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3138 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3139 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3140 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3141 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3142 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3143 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3144 } ngx_mp4_stco_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3145
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3146
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3147 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3148 ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3149 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3150 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3151 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3152 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3153 ngx_mp4_stco_atom_t *stco_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3154 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3155
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3156 /* chunk offsets atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3157
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3158 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stco atom");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3159
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3160 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3161 stco_atom = (ngx_mp4_stco_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3162 ngx_mp4_set_atom_name(stco_atom, 's', 't', 'c', 'o');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3163
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3164 if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3165 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3166 "\"%s\" mp4 stco atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3167 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3168 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3169
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3170 entries = ngx_mp4_get_32value(stco_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3171
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3172 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3173
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3174 if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3175 + entries * sizeof(uint32_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3176 {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3177 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3178 "\"%s\" mp4 stco atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3179 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3180 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3181
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3182 atom_table = atom_header + sizeof(ngx_mp4_stco_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3183 atom_end = atom_table + entries * sizeof(uint32_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3184
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3185 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3186 trak->chunks = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3187
4107
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
3188 atom = &trak->stco_atom_buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3189 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3190 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3191 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3192
4107
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
3193 data = &trak->stco_data_buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3194 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3195 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3196 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3197
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3198 trak->out[NGX_HTTP_MP4_STCO_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3199 trak->out[NGX_HTTP_MP4_STCO_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3200
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3201 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3202
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3203 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3204 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3205
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3206
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3207 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3208 ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3209 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3210 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3211 size_t atom_size;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3212 uint32_t entries;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3213 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3214 ngx_mp4_stco_atom_t *stco_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3215
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3216 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3217 * mdia.minf.stbl.stco updating requires trak->start_chunk
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3218 * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3219 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3220 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3221
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3222 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3223 "mp4 stco atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3224
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3225 data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3226
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3227 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3228 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3229 "no mp4 stco atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3230 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3231 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3232 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3233
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3234 if (trak->start_chunk > trak->chunks) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3235 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3236 "start time is out mp4 stco chunks in \"%s\"",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3237 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3238 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3239 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3240
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3241 data->pos += trak->start_chunk * sizeof(uint32_t);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3242
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3243 trak->start_offset = ngx_mp4_get_32value(data->pos);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3244 trak->start_offset += trak->start_chunk_samples_size;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
3245 ngx_mp4_set_32value(data->pos, trak->start_offset);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3246
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3247 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
3248 "start chunk offset:%O", trak->start_offset);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3249
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3250 if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3251
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3252 if (trak->end_chunk > trak->chunks) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3253 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3254 "end time is out mp4 stco chunks in \"%s\"",
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3255 mp4->file.name.data);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3256 return NGX_ERROR;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3257 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3258
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3259 entries = trak->end_chunk - trak->start_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3260 data->last = data->pos + entries * sizeof(uint32_t);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3261
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3262 if (entries) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3263 trak->end_offset =
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3264 ngx_mp4_get_32value(data->last - sizeof(uint32_t));
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3265 trak->end_offset += trak->end_chunk_samples_size;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3266
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3267 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3268 "end chunk offset:%O", trak->end_offset);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3269 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3270
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3271 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3272 entries = trak->chunks - trak->start_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3273 trak->end_offset = mp4->mdat_data.buf->file_last;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3274 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3275
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3276 if (entries == 0) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3277 trak->start_offset = mp4->end;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3278 trak->end_offset = 0;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3279 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3280
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3281 atom_size = sizeof(ngx_mp4_stco_atom_t) + (data->last - data->pos);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3282 trak->size += atom_size;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3283
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3284 atom = trak->out[NGX_HTTP_MP4_STCO_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3285 stco_atom = (ngx_mp4_stco_atom_t *) atom->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3286
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3287 ngx_mp4_set_32value(stco_atom->size, atom_size);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3288 ngx_mp4_set_32value(stco_atom->entries, entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3289
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3290 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3291 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3292
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3293
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3294 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3295 ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3296 ngx_http_mp4_trak_t *trak, int32_t adjustment)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3297 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3298 uint32_t offset, *entry, *end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3299 ngx_buf_t *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3300
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3301 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3302 * moov.trak.mdia.minf.stbl.stco adjustment requires
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3303 * minimal start offset of all traks and new moov atom size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3304 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3305
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3306 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3307 "mp4 stco atom adjustment");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3308
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3309 data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3310 entry = (uint32_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3311 end = (uint32_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3312
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3313 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3314 offset = ngx_mp4_get_32value(entry);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3315 offset += adjustment;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3316 ngx_mp4_set_32value(entry, offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3317 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3318 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3319 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3320
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3321
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3322 typedef struct {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3323 u_char size[4];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3324 u_char name[4];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3325 u_char version[1];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3326 u_char flags[3];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3327 u_char entries[4];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3328 } ngx_mp4_co64_atom_t;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3329
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3330
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3331 static ngx_int_t
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3332 ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3333 {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3334 u_char *atom_header, *atom_table, *atom_end;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3335 uint32_t entries;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3336 ngx_buf_t *atom, *data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3337 ngx_mp4_co64_atom_t *co64_atom;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3338 ngx_http_mp4_trak_t *trak;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3339
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3340 /* chunk offsets atom */
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3341
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3342 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 co64 atom");
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3343
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3344 atom_header = ngx_mp4_atom_header(mp4);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3345 co64_atom = (ngx_mp4_co64_atom_t *) atom_header;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3346 ngx_mp4_set_atom_name(co64_atom, 'c', 'o', '6', '4');
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3347
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3348 if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t) > atom_data_size) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3349 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3350 "\"%s\" mp4 co64 atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3351 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3352 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3353
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3354 entries = ngx_mp4_get_32value(co64_atom->entries);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3355
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3356 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3357
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3358 if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3359 + entries * sizeof(uint64_t) > atom_data_size)
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3360 {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3361 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3362 "\"%s\" mp4 co64 atom too small", mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3363 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3364 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3365
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3366 atom_table = atom_header + sizeof(ngx_mp4_co64_atom_t);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3367 atom_end = atom_table + entries * sizeof(uint64_t);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3368
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3369 trak = ngx_mp4_last_trak(mp4);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3370 trak->chunks = entries;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3371
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3372 atom = &trak->co64_atom_buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3373 atom->temporary = 1;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3374 atom->pos = atom_header;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3375 atom->last = atom_table;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3376
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3377 data = &trak->co64_data_buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3378 data->temporary = 1;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3379 data->pos = atom_table;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3380 data->last = atom_end;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3381
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3382 trak->out[NGX_HTTP_MP4_CO64_ATOM].buf = atom;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3383 trak->out[NGX_HTTP_MP4_CO64_DATA].buf = data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3384
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3385 ngx_mp4_atom_next(mp4, atom_data_size);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3386
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3387 return NGX_OK;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3388 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3389
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3390
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3391 static ngx_int_t
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3392 ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3393 ngx_http_mp4_trak_t *trak)
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3394 {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3395 size_t atom_size;
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3396 uint64_t entries;
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3397 ngx_buf_t *atom, *data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3398 ngx_mp4_co64_atom_t *co64_atom;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3399
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3400 /*
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3401 * mdia.minf.stbl.co64 updating requires trak->start_chunk
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3402 * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3403 * atom which may reside after mdia.minf
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3404 */
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3405
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3406 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3407 "mp4 co64 atom update");
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3408
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3409 data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3410
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3411 if (data == NULL) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3412 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3413 "no mp4 co64 atoms were found in \"%s\"",
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3414 mp4->file.name.data);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3415 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3416 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3417
4585
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3418 if (trak->start_chunk > trak->chunks) {
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3419 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3420 "start time is out mp4 co64 chunks in \"%s\"",
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3421 mp4->file.name.data);
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3422 return NGX_ERROR;
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3423 }
3f874d645f45 Mp4: sanity checks cleanup.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4579
diff changeset
3424
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3425 data->pos += trak->start_chunk * sizeof(uint64_t);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3426
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3427 trak->start_offset = ngx_mp4_get_64value(data->pos);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3428 trak->start_offset += trak->start_chunk_samples_size;
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3429 ngx_mp4_set_64value(data->pos, trak->start_offset);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3430
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3431 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
5630
02584b335727 Mp4: improved logging after adding "end" support.
Roman Arutyunyan <arut@nginx.com>
parents: 5629
diff changeset
3432 "start chunk offset:%O", trak->start_offset);
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3433
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3434 if (mp4->length) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3435
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3436 if (trak->end_chunk > trak->chunks) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3437 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3438 "end time is out mp4 co64 chunks in \"%s\"",
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3439 mp4->file.name.data);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3440 return NGX_ERROR;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3441 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3442
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3443 entries = trak->end_chunk - trak->start_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3444 data->last = data->pos + entries * sizeof(uint64_t);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3445
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3446 if (entries) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3447 trak->end_offset =
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3448 ngx_mp4_get_64value(data->last - sizeof(uint64_t));
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3449 trak->end_offset += trak->end_chunk_samples_size;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3450
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3451 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3452 "end chunk offset:%O", trak->end_offset);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3453 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3454
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3455 } else {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3456 entries = trak->chunks - trak->start_chunk;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3457 trak->end_offset = mp4->mdat_data.buf->file_last;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3458 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3459
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3460 if (entries == 0) {
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3461 trak->start_offset = mp4->end;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3462 trak->end_offset = 0;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3463 }
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3464
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3465 atom_size = sizeof(ngx_mp4_co64_atom_t) + (data->last - data->pos);
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3466 trak->size += atom_size;
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3467
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3468 atom = trak->out[NGX_HTTP_MP4_CO64_ATOM].buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3469 co64_atom = (ngx_mp4_co64_atom_t *) atom->pos;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3470
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3471 ngx_mp4_set_32value(co64_atom->size, atom_size);
5620
0a567878254b Mp4: added "end" argument support.
Roman Arutyunyan <arut@nginx.com>
parents: 5619
diff changeset
3472 ngx_mp4_set_32value(co64_atom->entries, entries);
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3473
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3474 return NGX_OK;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3475 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3476
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3477
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3478 static void
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3479 ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3480 ngx_http_mp4_trak_t *trak, off_t adjustment)
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3481 {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3482 uint64_t offset, *entry, *end;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3483 ngx_buf_t *data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3484
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3485 /*
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3486 * moov.trak.mdia.minf.stbl.co64 adjustment requires
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3487 * minimal start offset of all traks and new moov atom size
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3488 */
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3489
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3490 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3491 "mp4 co64 atom adjustment");
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3492
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3493 data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3494 entry = (uint64_t *) data->pos;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3495 end = (uint64_t *) data->last;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3496
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3497 while (entry < end) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3498 offset = ngx_mp4_get_64value(entry);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3499 offset += adjustment;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3500 ngx_mp4_set_64value(entry, offset);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3501 entry++;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3502 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3503 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3504
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
3505
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3506 static char *
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3507 ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3508 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3509 ngx_http_core_loc_conf_t *clcf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3510
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3511 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3512 clcf->handler = ngx_http_mp4_handler;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3513
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3514 return NGX_CONF_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3515 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3516
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3517
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3518 static void *
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3519 ngx_http_mp4_create_conf(ngx_conf_t *cf)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3520 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3521 ngx_http_mp4_conf_t *conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3522
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3523 conf = ngx_palloc(cf->pool, sizeof(ngx_http_mp4_conf_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3524 if (conf == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3525 return NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3526 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3527
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3528 conf->buffer_size = NGX_CONF_UNSET_SIZE;
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
3529 conf->max_buffer_size = NGX_CONF_UNSET_SIZE;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3530
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3531 return conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3532 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3533
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3534
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3535 static char *
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3536 ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3537 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3538 ngx_http_mp4_conf_t *prev = parent;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3539 ngx_http_mp4_conf_t *conf = child;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3540
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3541 ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, 512 * 1024);
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
3542 ngx_conf_merge_size_value(conf->max_buffer_size, prev->max_buffer_size,
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3543 10 * 1024 * 1024);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3544
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3545 return NGX_CONF_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3546 }