annotate src/http/modules/ngx_http_mp4_module.c @ 4377:726a1ca9b52b

Proxy: made proxy_pass with variables more consistent. If proxy_pass was used with variables and there was no URI component, nginx always used unparsed URI. This isn't consistent with "no variables" case, where e.g. rewrites are applied even if there is no URI component. Fix is to use the same logic in both cases, i.e. only use unparsed URI if it's valid and request is the main one.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 23 Dec 2011 16:04:09 +0000
parents 05f3174483de
children b4d54fa76853
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
4 */
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 #include <ngx_config.h>
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_core.h>
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_http.h>
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
11 #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
12 #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
13 #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
14 #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
15 #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
16 #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
17 #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
18 #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
19 #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
20 #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
21 #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
22 #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
23 #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
24 #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
25 #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
26 #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
27 #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
28 #define NGX_HTTP_MP4_STSC_ATOM 17
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_CHUNK 18
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
30 #define NGX_HTTP_MP4_STSC_DATA 19
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_STSZ_ATOM 20
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
32 #define NGX_HTTP_MP4_STSZ_DATA 21
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
33 #define NGX_HTTP_MP4_STCO_ATOM 22
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
34 #define NGX_HTTP_MP4_STCO_DATA 23
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
35 #define NGX_HTTP_MP4_CO64_ATOM 24
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
36 #define NGX_HTTP_MP4_CO64_DATA 25
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
37
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
38 #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
39
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
42 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
43 size_t max_buffer_size;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
44 } ngx_http_mp4_conf_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
47 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
48 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
49 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
50 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
51 } 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
52
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
53
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
54 typedef struct {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
55 uint32_t timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 uint32_t time_to_sample_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57 uint32_t sample_to_chunk_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58 uint32_t sync_samples_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
59 uint32_t composition_offset_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
60 uint32_t sample_sizes_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
61 uint32_t chunks;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
62
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 ngx_uint_t start_sample;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
64 ngx_uint_t start_chunk;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
65 ngx_uint_t chunk_samples;
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
66 uint64_t chunk_samples_size;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
67 off_t start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
69 size_t tkhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
70 size_t mdhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 size_t hdlr_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 size_t vmhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
73 size_t smhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
74 size_t dinf_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75 size_t size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
77 ngx_chain_t out[NGX_HTTP_MP4_LAST_ATOM + 1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
78
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
79 ngx_buf_t trak_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
80 ngx_buf_t tkhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
81 ngx_buf_t mdia_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
82 ngx_buf_t mdhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
83 ngx_buf_t hdlr_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
84 ngx_buf_t minf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
85 ngx_buf_t vmhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
86 ngx_buf_t smhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
87 ngx_buf_t dinf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
88 ngx_buf_t stbl_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
89 ngx_buf_t stsd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
90 ngx_buf_t stts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
91 ngx_buf_t stts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92 ngx_buf_t stss_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
93 ngx_buf_t stss_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
94 ngx_buf_t ctts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
95 ngx_buf_t ctts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
96 ngx_buf_t stsc_atom_buf;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
97 ngx_buf_t stsc_chunk_buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
98 ngx_buf_t stsc_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
99 ngx_buf_t stsz_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 ngx_buf_t stsz_data_buf;
4107
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
101 ngx_buf_t stco_atom_buf;
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
102 ngx_buf_t stco_data_buf;
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
103 ngx_buf_t co64_atom_buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
104 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
105
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
106 ngx_mp4_stsc_entry_t stsc_chunk_entry;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
107 } ngx_http_mp4_trak_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
108
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
109
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
110 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
111 ngx_file_t file;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
112
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
113 u_char *buffer;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
114 u_char *buffer_start;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
115 u_char *buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
116 u_char *buffer_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
117 size_t buffer_size;
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 off_t offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
120 off_t end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
121 off_t content_length;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
122 ngx_uint_t start;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
123 uint32_t timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
124 ngx_http_request_t *request;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
125 ngx_array_t trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
126 ngx_http_mp4_trak_t traks[2];
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 size_t ftyp_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 size_t moov_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131 ngx_chain_t *out;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
132 ngx_chain_t ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
133 ngx_chain_t moov_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
134 ngx_chain_t mvhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135 ngx_chain_t mdat_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 ngx_chain_t mdat_data;
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 ngx_buf_t ftyp_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 ngx_buf_t moov_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 ngx_buf_t mvhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141 ngx_buf_t mdat_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
142 ngx_buf_t mdat_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
143
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 u_char moov_atom_header[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145 u_char mdat_atom_header[16];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146 } ngx_http_mp4_file_t;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
149 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
150 char *name;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 ngx_int_t (*handler)(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 } ngx_http_mp4_atom_handler_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 #define ngx_mp4_atom_header(mp4) (mp4->buffer_pos - 8)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 #define ngx_mp4_atom_data(mp4) mp4->buffer_pos
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 #define ngx_mp4_atom_next(mp4, n) mp4->buffer_pos += n; mp4->offset += n
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161 #define ngx_mp4_set_atom_name(p, n1, n2, n3, n4) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162 ((u_char *) (p))[4] = n1; \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
163 ((u_char *) (p))[5] = n2; \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
164 ((u_char *) (p))[6] = n3; \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
165 ((u_char *) (p))[7] = n4
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
166
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
167 #define ngx_mp4_get_32value(p) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
168 ( (((u_char *) (p))[0] << 24) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
169 + (((u_char *) (p))[1] << 16) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
170 + (((u_char *) (p))[2] << 8) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
171 + (((u_char *) (p))[3]) )
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
172
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
173 #define ngx_mp4_set_32value(p, n) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
174 ((u_char *) (p))[0] = (u_char) ((n) >> 24); \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
175 ((u_char *) (p))[1] = (u_char) ((n) >> 16); \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
176 ((u_char *) (p))[2] = (u_char) ((n) >> 8); \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
177 ((u_char *) (p))[3] = (u_char) (n)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
178
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 #define ngx_mp4_get_64value(p) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
180 ( ((uint64_t) ((u_char *) (p))[0] << 56) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 + ((uint64_t) ((u_char *) (p))[1] << 48) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
182 + ((uint64_t) ((u_char *) (p))[2] << 40) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 + ((uint64_t) ((u_char *) (p))[3] << 32) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
184 + ((uint64_t) ((u_char *) (p))[4] << 24) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 + ( ((u_char *) (p))[5] << 16) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
186 + ( ((u_char *) (p))[6] << 8) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 + ( ((u_char *) (p))[7]) )
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
188
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
189 #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
190 ((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
191 ((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
192 ((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
193 ((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
194 ((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
195 ((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
196 ((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
197 ((u_char *) (p))[7] = (u_char) (n)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
198
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
199 #define ngx_mp4_last_trak(mp4) \
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200 &((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
201
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
202
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
203 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
204 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
205 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
206 static ngx_int_t ngx_http_mp4_read(ngx_http_mp4_file_t *mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207 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
208 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
209 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
210 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211 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
212 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
213 static size_t ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
214 off_t start_offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
215 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
216 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
217 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
218 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219 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
220 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
221 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
222 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
223 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
224 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
225 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
226 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
227 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
228 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
229 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
230 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
231 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
232 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
233 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
234 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235 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
236 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
237 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
238 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
239 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
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_smhd_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_stbl_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_stbl_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_stsd_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_stts_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_update_stts_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
252 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
253 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
254 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
255 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
256 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
257 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
258 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
259 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
260 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
261 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
262 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263 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
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_stsz_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 void 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
268 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
269 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
270 uint64_t atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
271 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
272 ngx_http_mp4_trak_t *trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
273 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
274 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
275 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
276 uint64_t atom_data_size);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
277 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
278 ngx_http_mp4_trak_t *trak);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
279 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
280 ngx_http_mp4_trak_t *trak, off_t adjustment);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
281 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
282 static void *ngx_http_mp4_create_conf(ngx_conf_t *cf);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
283 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
284
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
285 static ngx_command_t ngx_http_mp4_commands[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
286
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
287 { ngx_string("mp4"),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288 NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
289 ngx_http_mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
290 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
292 NULL },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
294 { ngx_string("mp4_buffer_size"),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
295 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
296 ngx_conf_set_size_slot,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
297 NGX_HTTP_LOC_CONF_OFFSET,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
298 offsetof(ngx_http_mp4_conf_t, buffer_size),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299 NULL },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
300
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
301 { ngx_string("mp4_max_buffer_size"),
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302 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
303 ngx_conf_set_size_slot,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
304 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
305 offsetof(ngx_http_mp4_conf_t, max_buffer_size),
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306 NULL },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 ngx_null_command
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
312 static ngx_http_module_t ngx_http_mp4_module_ctx = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
313 NULL, /* preconfiguration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
314 NULL, /* postconfiguration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
315
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
316 NULL, /* create main configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
317 NULL, /* init main configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
318
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
319 NULL, /* create server configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
320 NULL, /* merge server configuration */
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_http_mp4_create_conf, /* create location configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
323 ngx_http_mp4_merge_conf /* merge location configuration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
324 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
325
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
326
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
327 ngx_module_t ngx_http_mp4_module = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
328 NGX_MODULE_V1,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
329 &ngx_http_mp4_module_ctx, /* module context */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
330 ngx_http_mp4_commands, /* module directives */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
331 NGX_HTTP_MODULE, /* module type */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
332 NULL, /* init master */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
333 NULL, /* init module */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
334 NULL, /* init process */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
335 NULL, /* init thread */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
336 NULL, /* exit thread */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
337 NULL, /* exit process */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
338 NULL, /* exit master */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
339 NGX_MODULE_V1_PADDING
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
340 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
341
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
342
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
343 static ngx_http_mp4_atom_handler_t ngx_http_mp4_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
344 { "ftyp", ngx_http_mp4_read_ftyp_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
345 { "moov", ngx_http_mp4_read_moov_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
346 { "mdat", ngx_http_mp4_read_mdat_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
347 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
348 };
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 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
351 { "mvhd", ngx_http_mp4_read_mvhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
352 { "trak", ngx_http_mp4_read_trak_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
353 { "cmov", ngx_http_mp4_read_cmov_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
354 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
355 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
356
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
357 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
358 { "tkhd", ngx_http_mp4_read_tkhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
359 { "mdia", ngx_http_mp4_read_mdia_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
360 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
361 };
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
362
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
363 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
364 { "mdhd", ngx_http_mp4_read_mdhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
365 { "hdlr", ngx_http_mp4_read_hdlr_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
366 { "minf", ngx_http_mp4_read_minf_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
367 { NULL, NULL }
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 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
371 { "vmhd", ngx_http_mp4_read_vmhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
372 { "smhd", ngx_http_mp4_read_smhd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
373 { "dinf", ngx_http_mp4_read_dinf_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
374 { "stbl", ngx_http_mp4_read_stbl_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_stbl_atoms[] = {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
379 { "stsd", ngx_http_mp4_read_stsd_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
380 { "stts", ngx_http_mp4_read_stts_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
381 { "stss", ngx_http_mp4_read_stss_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
382 { "ctts", ngx_http_mp4_read_ctts_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
383 { "stsc", ngx_http_mp4_read_stsc_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
384 { "stsz", ngx_http_mp4_read_stsz_atom },
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
385 { "stco", ngx_http_mp4_read_stco_atom },
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
386 { "co64", ngx_http_mp4_read_co64_atom },
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
387 { NULL, NULL }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
388 };
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_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
392 ngx_http_mp4_handler(ngx_http_request_t *r)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
394 u_char *last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395 size_t root;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 ngx_int_t rc, start;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
397 ngx_uint_t level;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
398 ngx_str_t path, value;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399 ngx_log_t *log;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
400 ngx_buf_t *b;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
401 ngx_chain_t out;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
402 ngx_http_mp4_file_t *mp4;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403 ngx_open_file_info_t of;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
404 ngx_http_core_loc_conf_t *clcf;
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 if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
407 return NGX_HTTP_NOT_ALLOWED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
409
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410 if (r->uri.data[r->uri.len - 1] == '/') {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
411 return NGX_DECLINED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
412 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
413
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 rc = ngx_http_discard_request_body(r);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
416 if (rc != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 return rc;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
420 last = ngx_http_map_uri_to_path(r, &path, &root, 0);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
421 if (last == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
422 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
423 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
424
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
425 log = r->connection->log;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
426
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
427 path.len = last - path.data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
428
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
429 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
430 "http mp4 filename: \"%V\"", &path);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
431
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
432 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
433
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
434 ngx_memzero(&of, sizeof(ngx_open_file_info_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
435
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 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
437 of.directio = NGX_MAX_OFF_T_VALUE;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 of.valid = clcf->open_file_cache_valid;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
439 of.min_uses = clcf->open_file_cache_min_uses;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
440 of.errors = clcf->open_file_cache_errors;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
441 of.events = clcf->open_file_cache_events;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
442
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443 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
444 != NGX_OK)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
445 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
446 switch (of.err) {
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 case 0:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
449 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
450
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
451 case NGX_ENOENT:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
452 case NGX_ENOTDIR:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
453 case NGX_ENAMETOOLONG:
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 level = NGX_LOG_ERR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
456 rc = NGX_HTTP_NOT_FOUND;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
457 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
458
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
459 case NGX_EACCES:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
460
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
461 level = NGX_LOG_ERR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
462 rc = NGX_HTTP_FORBIDDEN;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
463 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
464
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
465 default:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
466
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467 level = NGX_LOG_CRIT;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
468 rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
469 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
470 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
471
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
472 if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
473 ngx_log_error(level, log, of.err,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
474 "%s \"%s\" failed", of.failed, path.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
475 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478 }
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 if (!of.is_file) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
481
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
482 if (ngx_close_file(of.fd) == NGX_FILE_ERROR) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
484 ngx_close_file_n " \"%s\" failed", path.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
485 }
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 return NGX_DECLINED;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
488 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
489
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
490 r->root_tested = !r->error_page;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
491 r->allow_ranges = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
492
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
493 start = -1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 r->headers_out.content_length_n = of.size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 mp4 = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496 b = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
498 if (r->args.len) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
499
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
500 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
501
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
502 /*
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
503 * A Flash player may send start value with a lot of digits
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
504 * after dot so strtod() is used instead of atofp(). NaNs and
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
505 * infinities become negative numbers after (int) conversion.
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
506 */
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
507
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
508 ngx_set_errno(0);
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
509 start = (int) (strtod((char *) value.data, NULL) * 1000);
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
510
67a4654ba7d9 Using strtod() instead of atofp() to support a lot of digits after dot in
Igor Sysoev <igor@sysoev.ru>
parents: 4155
diff changeset
511 if (ngx_errno == 0 && start >= 0) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
512 r->allow_ranges = 0;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
513
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
514 mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
515 if (mp4 == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
516 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 mp4->file.fd = of.fd;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
520 mp4->file.name = path;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521 mp4->file.log = r->connection->log;;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
522 mp4->end = of.size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 mp4->start = (ngx_uint_t) start;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
524 mp4->request = r;
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 switch (ngx_http_mp4_process(mp4)) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 case NGX_DECLINED:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 if (mp4->buffer) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
530 ngx_pfree(r->pool, mp4->buffer);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
533 ngx_pfree(r->pool, mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
534 mp4 = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
535
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
536 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 case NGX_OK:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539 r->headers_out.content_length_n = mp4->content_length;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540 break;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
542 default: /* NGX_ERROR */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 if (mp4->buffer) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
544 ngx_pfree(r->pool, mp4->buffer);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
545 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
547 ngx_pfree(r->pool, mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
548
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
551 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
552 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
553 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
554
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
555 log->action = "sending mp4 to client";
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
556
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 if (clcf->directio <= of.size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560 * DIRECTIO is set on transfer only
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 * to allow kernel to cache "moov" atom
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
562 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
563
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
564 if (ngx_directio_on(of.fd) == NGX_FILE_ERROR) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
565 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
566 ngx_directio_on_n " \"%s\" failed", path.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
567 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
568
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
569 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
570
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
571 if (mp4) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
572 mp4->file.directio = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
573 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
574 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
575
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
576 r->headers_out.status = NGX_HTTP_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
577 r->headers_out.last_modified_time = of.mtime;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
578
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
579 if (ngx_http_set_content_type(r) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
580 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
581 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
582
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
583 if (mp4 == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
584 b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
585 if (b == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
586 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
587 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
588
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
589 b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
590 if (b->file == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
591 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
592 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
593 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
594
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
595 rc = ngx_http_send_header(r);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
596
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
597 if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
598 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
599 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
600
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
601 if (mp4) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
602 return ngx_http_output_filter(r, mp4->out);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
603 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
604
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
605 b->file_pos = 0;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
606 b->file_last = of.size;
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 b->in_file = b->file_last ? 1 : 0;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
609 b->last_buf = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
610 b->last_in_chain = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
611
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
612 b->file->fd = of.fd;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
613 b->file->name = path;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
614 b->file->log = log;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
615 b->file->directio = of.is_directio;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
616
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
617 out.buf = b;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
618 out.next = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
619
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
620 return ngx_http_output_filter(r, &out);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
621 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
622
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
623
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
624 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
625 ngx_http_mp4_process(ngx_http_mp4_file_t *mp4)
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 off_t start_offset, adjustment;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
628 ngx_int_t rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
629 ngx_uint_t i, j;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
630 ngx_chain_t **prev;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
631 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
632 ngx_http_mp4_conf_t *conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
633
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
634 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
635 "mp4 start:%ui", mp4->start);
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 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
638
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
639 mp4->buffer_size = conf->buffer_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
640
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
641 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
642 if (rc != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
643 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
644 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
645
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
646 if (mp4->trak.nelts == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
647 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
648 "no mp4 trak atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
649 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
650 return NGX_ERROR;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
653 if (mp4->mdat_atom.buf == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
654 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
655 "no mp4 mdat atom was found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
656 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
657 return NGX_ERROR;
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 prev = &mp4->out;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
661
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
662 if (mp4->ftyp_atom.buf) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 *prev = &mp4->ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 prev = &mp4->ftyp_atom.next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
665 }
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 *prev = &mp4->moov_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668 prev = &mp4->moov_atom.next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
670 if (mp4->mvhd_atom.buf) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
671 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
672 *prev = &mp4->mvhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673 prev = &mp4->mvhd_atom.next;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
676 start_offset = mp4->end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
677 trak = mp4->trak.elts;
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 for (i = 0; i < mp4->trak.nelts; i++) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
681 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
682 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
683 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
684
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
685 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
686 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
687 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
688
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
689 ngx_http_mp4_update_ctts_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
690
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
691 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
692 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
693 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
694
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
695 ngx_http_mp4_update_stsz_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
696
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
697 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
698 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
699 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
700 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
701
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
702 } else {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
703 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
704 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
705 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
706 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
707
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
708 ngx_http_mp4_update_stbl_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
709 ngx_http_mp4_update_minf_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
710 trak[i].size += trak[i].mdhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
711 trak[i].size += trak[i].hdlr_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
712 ngx_http_mp4_update_mdia_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
713 trak[i].size += trak[i].tkhd_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
714 ngx_http_mp4_update_trak_atom(mp4, &trak[i]);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
715
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
716 mp4->moov_size += trak[i].size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
717
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
718 if (start_offset > trak[i].start_offset) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
719 start_offset = trak[i].start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
720 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
721
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
722 *prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
723 prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM].next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
724
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
725 for (j = 0; j < NGX_HTTP_MP4_LAST_ATOM + 1; j++) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
726 if (trak[i].out[j].buf) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
727 *prev = &trak[i].out[j];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
728 prev = &trak[i].out[j].next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
729 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
730 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
731 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
732
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
733 mp4->moov_size += 8;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
734
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
735 ngx_mp4_set_32value(mp4->moov_atom_header, mp4->moov_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
736 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
737 mp4->content_length += mp4->moov_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
738
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
739 *prev = &mp4->mdat_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
740
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
741 adjustment = mp4->ftyp_size + mp4->moov_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
742 + ngx_http_mp4_update_mdat_atom(mp4, start_offset)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
743 - start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
745 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746 "mp4 adjustment:%D", adjustment);
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 for (i = 0; i < mp4->trak.nelts; i++) {
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
749 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
750 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
751 } else {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
752 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
753 }
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754 }
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 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
759
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
760 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
761 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
762 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
763 } ngx_mp4_atom_header_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
764
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
765 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
766 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
767 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
768 u_char size64[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
769 } ngx_mp4_atom_header64_t;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
772 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
773 ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
774 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
775 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
776 off_t end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
777 size_t atom_header_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
778 u_char *atom_header, *atom_name;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
779 uint64_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
780 ngx_int_t rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
781 ngx_uint_t n;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
782
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
783 end = mp4->offset + atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
784
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
785 while (mp4->offset < end) {
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 if (mp4->buffer_pos + sizeof(uint32_t) > mp4->buffer_end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
788 if (ngx_http_mp4_read(mp4) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
789 return NGX_ERROR;
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 }
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 atom_header = mp4->buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
794 atom_size = ngx_mp4_get_32value(atom_header);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
795 atom_header_size = sizeof(ngx_mp4_atom_header_t);
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 (atom_size == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
798 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
799 "mp4 atom end");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
800 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
801 }
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 (atom_size < sizeof(ngx_mp4_atom_header_t)) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
804
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
805 if (atom_size == 1) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
806
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
807 if (mp4->buffer_pos + sizeof(ngx_mp4_atom_header64_t)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
808 > mp4->buffer_end)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
809 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
810 if (ngx_http_mp4_read(mp4) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
811 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
812 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
813
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
814 atom_header = mp4->buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
815 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
816
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
817 /* 64-bit atom size */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
818 atom_size = ngx_mp4_get_64value(atom_header + 8);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
819 atom_header_size = sizeof(ngx_mp4_atom_header64_t);
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 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
822 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
823 "\"%s\" mp4 atom is too small:%uL",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
824 mp4->file.name.data, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
825 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
826 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
827 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
828
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
829 if (mp4->buffer_pos + sizeof(ngx_mp4_atom_header_t) > mp4->buffer_end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
830 if (ngx_http_mp4_read(mp4) != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
831 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
832 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
833
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
834 atom_header = mp4->buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
835 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
836
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
837 atom_name = atom_header + sizeof(uint32_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
838
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
839 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
840 "mp4 atom: %*s @%O:%uL",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
841 4, atom_name, mp4->offset, atom_size);
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 (n = 0; atom[n].name; n++) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
844
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
845 if (ngx_strncmp(atom_name, atom[n].name, 4) == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
846
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
847 ngx_mp4_atom_next(mp4, atom_header_size);
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 rc = atom[n].handler(mp4, atom_size - atom_header_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
850 if (rc != NGX_OK) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
851 return rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
852 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
853
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
854 goto next;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
855 }
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
858 ngx_mp4_atom_next(mp4, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
859
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
860 next:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
861 continue;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
862 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
863
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
864 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
865 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
866
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
867
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
868 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
869 ngx_http_mp4_read(ngx_http_mp4_file_t *mp4)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
870 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
871 ngx_int_t n;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
872
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
873 if (mp4->offset + (off_t) mp4->buffer_size > mp4->end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
874 mp4->buffer_size = (size_t) (mp4->end - mp4->offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
875 }
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 if (mp4->buffer == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
878 mp4->buffer = ngx_palloc(mp4->request->pool, mp4->buffer_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
879 if (mp4->buffer == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
880 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
881 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
882
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
883 mp4->buffer_start = mp4->buffer;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
884 mp4->buffer_end = mp4->buffer + mp4->buffer_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
885 }
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 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
888 mp4->offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
889
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
890 if (n == NGX_ERROR) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
891 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
892 }
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 if (n == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
895 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
896 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
897
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
898 mp4->buffer_pos = mp4->buffer_start;
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 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
901 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
902
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
903
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
904 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
905 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
906 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
907 u_char *ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
908 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
909 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
910
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
911 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
912
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
913 if (atom_data_size > 1024) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
914 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
915 "\"%s\" mp4 ftyp atom is too large:%uL",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
916 mp4->file.name.data, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
917 return NGX_ERROR;
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_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
921
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
922 ftyp_atom = ngx_palloc(mp4->request->pool, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
923 if (ftyp_atom == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
924 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
925 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
926
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
927 ngx_mp4_set_32value(ftyp_atom, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
928 ngx_mp4_set_atom_name(ftyp_atom, 'f', 't', 'y', 'p');
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 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
931 * only moov atom content is guaranteed to be in mp4->buffer
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
932 * during sending response, so ftyp atom content should be copied
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
933 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
934 ngx_memcpy(ftyp_atom + sizeof(ngx_mp4_atom_header_t),
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
935 ngx_mp4_atom_data(mp4), (size_t) atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
936
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
937 atom = &mp4->ftyp_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
938 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
939 atom->pos = ftyp_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
940 atom->last = ftyp_atom + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
941
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
942 mp4->ftyp_atom.buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
943 mp4->ftyp_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
944 mp4->content_length = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
945
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
946 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
947
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
948 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
949 }
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 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
953 * 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
954 * will be set to this buffer part after moov atom processing.
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 #define NGX_HTTP_MP4_MOOV_BUFFER_EXCESS (4 * 1024)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
957
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
958 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
959 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
960 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
961 ngx_int_t rc;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
962 ngx_uint_t no_mdat;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
963 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
964 ngx_http_mp4_conf_t *conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
965
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
966 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
967
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
968 no_mdat = (mp4->mdat_atom.buf == NULL);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
969
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
970 if (no_mdat && mp4->start == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
971 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
972 * send original file if moov atom resides before
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
973 * mdat atom and client requests integral file
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 return NGX_DECLINED;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
978 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
979
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
980 if (atom_data_size > mp4->buffer_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
981
4089
e27670e1ab70 mp4_max_moov_size directive has been renamed to mp4_max_buffer_size.
Igor Sysoev <igor@sysoev.ru>
parents: 4088
diff changeset
982 if (atom_data_size > conf->max_buffer_size) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
983 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
984 "\"%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
985 "you may want to increase mp4_max_buffer_size",
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
986 mp4->file.name.data, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
987 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
988 }
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 ngx_pfree(mp4->request->pool, mp4->buffer);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
991 mp4->buffer = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
992 mp4->buffer_pos = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
993 mp4->buffer_end = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
994
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
995 mp4->buffer_size = (size_t) atom_data_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
996 + NGX_HTTP_MP4_MOOV_BUFFER_EXCESS * no_mdat;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
999 mp4->trak.elts = &mp4->traks;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1000 mp4->trak.size = sizeof(ngx_http_mp4_trak_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1001 mp4->trak.nalloc = 2;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1002 mp4->trak.pool = mp4->request->pool;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1003
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1004 atom = &mp4->moov_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1005 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1006 atom->pos = mp4->moov_atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1007 atom->last = mp4->moov_atom_header + 8;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1008
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1009 mp4->moov_atom.buf = &mp4->moov_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1010
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1011 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
1012
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1013 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
1014
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1015 if (no_mdat) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1016 mp4->buffer_start = mp4->buffer_pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1017 mp4->buffer_size = NGX_HTTP_MP4_MOOV_BUFFER_EXCESS;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1018
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1019 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1020 /* skip atoms after moov atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1021 mp4->offset = mp4->end;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1024 return rc;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1027
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1028 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1029 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
1030 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1031 ngx_buf_t *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1032
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1033 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
1034
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1035 data = &mp4->mdat_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1036 data->file = &mp4->file;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1037 data->in_file = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1038 data->last_buf = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1039 data->last_in_chain = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1040 data->file_last = mp4->offset + atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1041
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1042 mp4->mdat_atom.buf = &mp4->mdat_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1043 mp4->mdat_atom.next = &mp4->mdat_data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1044 mp4->mdat_data.buf = data;
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 if (mp4->trak.nelts) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1047 /* skip atoms after mdat atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1048 mp4->offset = mp4->end;
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 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1051 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1052 }
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 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1055 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1056
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1057
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1058 static size_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1059 ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4, off_t start_offset)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1060 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1061 off_t atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1062 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1063 uint32_t atom_header_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1064 uint64_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1065 ngx_buf_t *atom;
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 atom_data_size = mp4->mdat_data.buf->file_last - start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1068 mp4->mdat_data.buf->file_pos = start_offset;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1069
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
1070 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
1071 "mdat new offset @%O:%O", start_offset, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1072
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1073 atom_header = mp4->mdat_atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1074
4155
d9636bf3f159 Fix of building on platforms with 32-bit off_t. (closed #23)
Igor Sysoev <igor@sysoev.ru>
parents: 4112
diff changeset
1075 if ((uint64_t) atom_data_size > 0xffffffff) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1076 atom_size = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1077 atom_header_size = sizeof(ngx_mp4_atom_header64_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1078 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
1079 sizeof(ngx_mp4_atom_header64_t) + atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1080 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1081 atom_size = sizeof(ngx_mp4_atom_header_t) + atom_data_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1082 atom_header_size = sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1083 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1084
4282
71cdac0b9ea6 Fix of "Content-Length" header of MP4 response if start argument was used.
Igor Sysoev <igor@sysoev.ru>
parents: 4189
diff changeset
1085 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
1086
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1087 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1088 ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'a', 't');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1089
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1090 atom = &mp4->mdat_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1091 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1092 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1093 atom->last = atom_header + atom_header_size;
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 return atom_header_size;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1099 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1100 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1101 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1102 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1103 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1104 u_char creation_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1105 u_char modification_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1106 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1107 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1108 u_char rate[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1109 u_char volume[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1110 u_char reserved[10];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1111 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1112 u_char preview_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1113 u_char preview_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1114 u_char poster_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1115 u_char selection_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1116 u_char selection_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1117 u_char current_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1118 u_char next_track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1119 } ngx_mp4_mvhd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1120
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1121 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1122 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1123 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1124 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1125 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1126 u_char creation_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1127 u_char modification_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1128 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1129 u_char duration[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1130 u_char rate[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1131 u_char volume[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1132 u_char reserved[10];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1133 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1134 u_char preview_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1135 u_char preview_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1136 u_char poster_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1137 u_char selection_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1138 u_char selection_duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1139 u_char current_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1140 u_char next_track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1141 } ngx_mp4_mvhd64_atom_t;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1144 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1145 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
1146 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1147 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1148 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1149 uint32_t timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1150 uint64_t duration;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1151 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1152 ngx_mp4_mvhd_atom_t *mvhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1153 ngx_mp4_mvhd64_atom_t *mvhd64_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1154
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1155 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
1156
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1157 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1158 mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1159 mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1160 ngx_mp4_set_atom_name(atom_header, 'm', 'v', 'h', 'd');
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 if (mvhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1163 /* version 0: 32-bit duration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1164 timescale = ngx_mp4_get_32value(mvhd_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1165 duration = ngx_mp4_get_32value(mvhd_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1166
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1167 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1168 /* version 1: 64-bit duration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1169 timescale = ngx_mp4_get_32value(mvhd64_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1170 duration = ngx_mp4_get_64value(mvhd64_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1171 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1172
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1173 mp4->timescale = timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1174
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1175 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1176 "mvhd timescale:%uD, duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1177 timescale, duration, (double) duration / timescale);
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 duration -= (uint64_t) mp4->start * timescale / 1000;
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1182 "mvhd new duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1183 duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1184
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1185 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
1186 ngx_mp4_set_32value(mvhd_atom->size, atom_size);
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 if (mvhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1189 ngx_mp4_set_32value(mvhd_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1190
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1191 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1192 ngx_mp4_set_64value(mvhd64_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1193 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1194
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1195 atom = &mp4->mvhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1196 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1197 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1198 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1199
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1200 mp4->mvhd_atom.buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1201
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1202 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1203
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1204 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1205 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1206
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 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1209 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
1210 {
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1211 u_char *atom_header, *atom_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1212 off_t atom_file_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1213 ngx_int_t rc;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1214 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1215 ngx_http_mp4_trak_t *trak;
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 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
1218
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1219 trak = ngx_array_push(&mp4->trak);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1220 if (trak == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1221 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1222 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1223
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1224 ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1225
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1226 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1227 ngx_mp4_set_atom_name(atom_header, 't', 'r', 'a', 'k');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1228
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1229 atom = &trak->trak_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1230 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1231 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1232 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1233
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1234 trak->out[NGX_HTTP_MP4_TRAK_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1235
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1236 atom_end = mp4->buffer_pos + atom_data_size;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1237 atom_file_end = mp4->offset + atom_data_size;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1238
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1239 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
1240
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1241 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
1242 "mp4 trak atom: %i", rc);
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1243
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1244 if (rc == NGX_DECLINED) {
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1245 /* skip this trak */
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1246 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
1247 mp4->trak.nelts--;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1248 mp4->buffer_pos = atom_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1249 mp4->offset = atom_file_end;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1250 return NGX_OK;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1251 }
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1252
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1253 return rc;
4085
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1257 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1258 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
1259 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1260 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1261 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1262
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1263 trak->size += sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1264 atom = &trak->trak_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1265 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1266 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1267
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1268
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1269 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1270 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
1271 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1272 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1273 "\"%s\" mp4 compressed moov atom (cmov) is not supported",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1274 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1275
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1276 return NGX_ERROR;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1279
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1280 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1281 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1282 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1283 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1284 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1285 u_char creation_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1286 u_char modification_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1287 u_char track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1288 u_char reserved1[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1289 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1290 u_char reserved2[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1291 u_char layer[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1292 u_char group[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1293 u_char volume[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1294 u_char reverved3[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1295 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1296 u_char width[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1297 u_char heigth[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1298 } ngx_mp4_tkhd_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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1301 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1302 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1303 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1304 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1305 u_char creation_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1306 u_char modification_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1307 u_char track_id[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1308 u_char reserved1[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1309 u_char duration[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1310 u_char reserved2[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1311 u_char layer[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1312 u_char group[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1313 u_char volume[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1314 u_char reverved3[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1315 u_char matrix[36];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1316 u_char width[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1317 u_char heigth[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1318 } ngx_mp4_tkhd64_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1319
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1320
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1321 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1322 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
1323 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1324 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1325 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1326 uint64_t duration;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1327 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1328 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1329 ngx_mp4_tkhd_atom_t *tkhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1330 ngx_mp4_tkhd64_atom_t *tkhd64_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1331
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1332 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
1333
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1334 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1335 tkhd_atom = (ngx_mp4_tkhd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1336 tkhd64_atom = (ngx_mp4_tkhd64_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1337 ngx_mp4_set_atom_name(tkhd_atom, 't', 'k', 'h', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1338
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1339 if (tkhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1340 /* version 0: 32-bit duration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1341 duration = ngx_mp4_get_32value(tkhd_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 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1344 /* version 1: 64-bit duration */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1345 duration = ngx_mp4_get_64value(tkhd64_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1346 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1347
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1348 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1349 "tkhd duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1350 duration, (double) duration / mp4->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1351
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1352 duration -= (uint64_t) mp4->start * mp4->timescale / 1000;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1353
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1354 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1355 "tkhd new duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1356 duration, (double) duration / mp4->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1357
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1358 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
1359
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1360 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1361 trak->tkhd_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1362
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1363 ngx_mp4_set_32value(tkhd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1364
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1365 if (tkhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1366 ngx_mp4_set_32value(tkhd_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1367
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1368 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1369 ngx_mp4_set_64value(tkhd64_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1370 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1371
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1372 atom = &trak->tkhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1373 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1374 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1375 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1376
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1377 trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf = atom;
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 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1380
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1381 return NGX_OK;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1384
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1385 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1386 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
1387 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1388 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1389 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1390 ngx_http_mp4_trak_t *trak;
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 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
1393
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1394 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1395 ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'i', 'a');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1396
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1397 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1398
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1399 atom = &trak->mdia_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1400 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1401 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1402 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1403
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1404 trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1405
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1406 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
1407 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1408
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1409
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1410 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1411 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
1412 ngx_http_mp4_trak_t *trak)
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 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1415
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1416 trak->size += sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1417 atom = &trak->mdia_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1418 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1419 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1420
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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1423 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1424 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1425 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1426 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1427 u_char creation_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1428 u_char modification_time[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1429 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1430 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1431 u_char language[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1432 u_char quality[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1433 } ngx_mp4_mdhd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1434
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1435 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1436 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1437 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1438 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1439 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1440 u_char creation_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1441 u_char modification_time[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1442 u_char timescale[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1443 u_char duration[8];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1444 u_char language[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1445 u_char quality[2];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1446 } ngx_mp4_mdhd64_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1447
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 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1450 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
1451 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1452 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1453 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1454 uint32_t timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1455 uint64_t duration;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1456 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1457 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1458 ngx_mp4_mdhd_atom_t *mdhd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1459 ngx_mp4_mdhd64_atom_t *mdhd64_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1460
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1461 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
1462
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1463 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1464 mdhd_atom = (ngx_mp4_mdhd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1465 mdhd64_atom = (ngx_mp4_mdhd64_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1466 ngx_mp4_set_atom_name(mdhd_atom, 'm', 'd', 'h', 'd');
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 if (mdhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1469 /* version 0: everything is 32-bit */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1470 timescale = ngx_mp4_get_32value(mdhd_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1471 duration = ngx_mp4_get_32value(mdhd_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1472
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1473 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1474 /* version 1: 64-bit duration and 32-bit timescale */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1475 timescale = ngx_mp4_get_32value(mdhd64_atom->timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1476 duration = ngx_mp4_get_64value(mdhd64_atom->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1477 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1478
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1479 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1480 "mdhd timescale:%uD, duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1481 timescale, duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1482
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1483 duration -= (uint64_t) mp4->start * timescale / 1000;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1484
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1485 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1486 "mdhd new duration:%uL, time:%.3fs",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1487 duration, (double) duration / timescale);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1488
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1489 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
1490
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1491 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1492 trak->mdhd_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1493 trak->timescale = timescale;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1494
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1495 ngx_mp4_set_32value(mdhd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1496
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1497 if (mdhd_atom->version[0] == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1498 ngx_mp4_set_32value(mdhd_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1499
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1500 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1501 ngx_mp4_set_64value(mdhd64_atom->duration, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1502 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1503
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1504 atom = &trak->mdhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1505 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1506 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1507 atom->last = atom_header + atom_size;
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 trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1510
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1511 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1512
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1513 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1514 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1515
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1516
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1517 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1518 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
1519 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1520 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1521 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1522 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1523 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1524
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1525 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
1526
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1527 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1528 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
1529 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1530 ngx_mp4_set_atom_name(atom_header, 'h', 'd', 'l', 'r');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1531
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1532 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1533
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1534 atom = &trak->hdlr_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1535 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1536 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1537 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1538
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1539 trak->hdlr_size = atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1540 trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1541
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1542 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1543
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1544 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1545 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1546
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1547
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1548 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1549 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
1550 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1551 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1552 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1553 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1554
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1555 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
1556
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1557 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1558 ngx_mp4_set_atom_name(atom_header, 'm', 'i', 'n', 'f');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1559
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1560 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1561
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1562 atom = &trak->minf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1563 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1564 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1565 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1566
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1567 trak->out[NGX_HTTP_MP4_MINF_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1568
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1569 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
1570 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1571
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1572
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1573 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1574 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
1575 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1576 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1577 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1578
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1579 trak->size += sizeof(ngx_mp4_atom_header_t)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1580 + trak->vmhd_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1581 + trak->smhd_size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1582 + trak->dinf_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1583 atom = &trak->minf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1584 ngx_mp4_set_32value(atom->pos, trak->size);
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1587
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1588 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1589 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
1590 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1591 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1592 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1593 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1594 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1595
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1596 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
1597
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1598 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1599 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
1600 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1601 ngx_mp4_set_atom_name(atom_header, 'v', 'm', 'h', 'd');
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 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1604
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1605 atom = &trak->vmhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1606 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1607 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1608 atom->last = atom_header + atom_size;
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 trak->vmhd_size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1611 trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1612
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1613 ngx_mp4_atom_next(mp4, atom_data_size);
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 return NGX_OK;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1618
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1619 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1620 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
1621 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1622 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1623 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1624 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1625 ngx_http_mp4_trak_t *trak;
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 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
1628
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1629 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1630 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
1631 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1632 ngx_mp4_set_atom_name(atom_header, 's', 'm', 'h', 'd');
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 = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1635
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1636 atom = &trak->smhd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1637 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1638 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1639 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1640
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1641 trak->vmhd_size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1642 trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1643
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1644 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1645
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1646 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1647 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1648
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1649
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1650 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1651 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
1652 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1653 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1654 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1655 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1656 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1657
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1658 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
1659
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1660 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1661 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
1662 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1663 ngx_mp4_set_atom_name(atom_header, 'd', 'i', 'n', 'f');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1664
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1665 trak = ngx_mp4_last_trak(mp4);
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 atom = &trak->dinf_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1668 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1669 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1670 atom->last = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1671
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1672 trak->dinf_size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1673 trak->out[NGX_HTTP_MP4_DINF_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1674
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1675 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1676
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1677 return NGX_OK;
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
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 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1682 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
1683 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1684 u_char *atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1685 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1686 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1687
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1688 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
1689
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1690 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1691 ngx_mp4_set_atom_name(atom_header, 's', 't', 'b', 'l');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1692
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1693 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1694
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1695 atom = &trak->stbl_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1696 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1697 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1698 atom->last = atom_header + sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1699
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1700 trak->out[NGX_HTTP_MP4_STBL_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1701
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1702 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
1703 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1704
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1705
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1706 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1707 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
1708 ngx_http_mp4_trak_t *trak)
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 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1711
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1712 trak->size += sizeof(ngx_mp4_atom_header_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1713 atom = &trak->stbl_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1714 ngx_mp4_set_32value(atom->pos, trak->size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1715 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1716
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1717
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1718 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1719 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1720 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1721 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1722 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1723 u_char entries[4];
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1724
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1725 u_char media_size[4];
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1726 u_char media_name[4];
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1727 } ngx_mp4_stsd_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1728
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1729
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1730 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1731 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
1732 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1733 u_char *atom_header, *atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1734 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1735 ngx_buf_t *atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1736 ngx_mp4_stsd_atom_t *stsd_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1737 ngx_http_mp4_trak_t *trak;
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 /* sample description atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1740
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1741 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
1742
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1743 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1744 stsd_atom = (ngx_mp4_stsd_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1745 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
1746 atom_table = atom_header + atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1747 ngx_mp4_set_32value(stsd_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1748 ngx_mp4_set_atom_name(stsd_atom, 's', 't', 's', 'd');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1749
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1750 if ((uint64_t) (sizeof(ngx_mp4_stsd_atom_t) - sizeof(ngx_mp4_atom_header_t))
4106
637912848b08 Style fix.
Igor Sysoev <igor@sysoev.ru>
parents: 4105
diff changeset
1751 > atom_data_size)
637912848b08 Style fix.
Igor Sysoev <igor@sysoev.ru>
parents: 4105
diff changeset
1752 {
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1753 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1754 "\"%s\" mp4 stsd atom too large",
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1755 mp4->file.name.data);
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1756 return NGX_ERROR;
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1757 }
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1758
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1759 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
1760 "stsd entries:%uD, media:%*s",
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1761 ngx_mp4_get_32value(stsd_atom->entries),
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1762 4, stsd_atom->media_name);
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1763
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1764 /* supported media format: "avc1" (H.264) and "mp4a" (MPEG-4/AAC) */
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1765
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1766 if (ngx_strncmp(stsd_atom->media_name, "avc1", 4) != 0
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1767 && ngx_strncmp(stsd_atom->media_name, "mp4a", 4) != 0)
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1768 {
4099
9ee6944590c0 Skipping traks with unsupported media formats.
Igor Sysoev <igor@sysoev.ru>
parents: 4098
diff changeset
1769 return NGX_DECLINED;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1770 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1771
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1772 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1773
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1774 atom = &trak->stsd_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1775 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1776 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1777 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1778
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1779 trak->out[NGX_HTTP_MP4_STSD_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1780 trak->size += atom_size;
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 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1783
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1784 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1785 }
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1788 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1789 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1790 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1791 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1792 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1793 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1794 } ngx_mp4_stts_atom_t;
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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1797 u_char count[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1798 u_char duration[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1799 } ngx_mp4_stts_entry_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1800
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1801
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1802 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1803 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
1804 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1805 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1806 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1807 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1808 ngx_mp4_stts_atom_t *stts_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1809 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1810
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1811 /* time-to-sample atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1812
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1813 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
1814
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1815 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1816 stts_atom = (ngx_mp4_stts_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1817 ngx_mp4_set_atom_name(stts_atom, 's', 't', 't', 's');
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 entries = ngx_mp4_get_32value(stts_atom->entries);
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 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
1822 "mp4 time-to-sample entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1823
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1824 atom_table = atom_header + sizeof(ngx_mp4_stts_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1825 atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t);
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 if ((uint64_t) (atom_end - stts_atom->version) > atom_data_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1828 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1829 "\"%s\" mp4 stts atom too large",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1830 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1831 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1832 }
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 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1835 trak->time_to_sample_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1836
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1837 atom = &trak->stts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1838 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1839 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1840 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1841
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1842 data = &trak->stts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1843 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1844 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1845 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1846
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1847 trak->out[NGX_HTTP_MP4_STTS_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1848 trak->out[NGX_HTTP_MP4_STTS_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1849
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1850 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1851
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1852 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1853 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1854
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1855
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1856 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1857 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
1858 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1859 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1860 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1861 uint32_t entries, count, duration;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1862 uint64_t start_time;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1863 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1864 ngx_uint_t start_sample;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1865 ngx_mp4_stts_atom_t *stts_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1866 ngx_mp4_stts_entry_t *entry, *end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1867
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1868 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1869 * mdia.minf.stbl.stts updating requires trak->timescale
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1870 * from mdia.mdhd atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1871 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1872
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1873 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1874 "mp4 stts atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1875
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1876 data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1877
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1878 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1879 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1880 "no mp4 stts atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1881 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1882 return NGX_ERROR;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1885 entries = trak->time_to_sample_entries;
4189
a12c558503f0 Fixing mp4 module seeking on 32-bit platforms.
Igor Sysoev <igor@sysoev.ru>
parents: 4156
diff changeset
1886 start_time = (uint64_t) mp4->start * trak->timescale / 1000;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1887
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1888 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
1889 "time-to-sample start_time:%uL", start_time);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1890
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1891 start_sample = 0;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1892 entry = (ngx_mp4_stts_entry_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1893 end = (ngx_mp4_stts_entry_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1894
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1895 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1896 count = ngx_mp4_get_32value(entry->count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1897 duration = ngx_mp4_get_32value(entry->duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1898
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1899 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1900 "count:%uD, duration:%uD", count, duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1901
4306
05f3174483de Fix of mp4 module seeking.
Igor Sysoev <igor@sysoev.ru>
parents: 4282
diff changeset
1902 if (start_time < (uint64_t) count * duration) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1903 start_sample += (ngx_uint_t) (start_time / duration);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1904 count -= start_sample;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1905 ngx_mp4_set_32value(entry->count, count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1906 goto found;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1909 start_sample += count;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1910 start_time -= count * duration;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1911 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1912 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1913 }
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 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
4094
c98b7e351332 Fix of error message.
Igor Sysoev <igor@sysoev.ru>
parents: 4093
diff changeset
1916 "start time is out mp4 stts samples in \"%s\"",
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1917 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1918
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1919 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1920
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1921 found:
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_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1924 "start_sample:%ui, new count:%uD", start_sample, count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1925
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1926 trak->start_sample = start_sample;
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 data->pos = (u_char *) entry;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1929 atom_size = sizeof(ngx_mp4_stts_atom_t) + (data->last - data->pos);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1930 trak->size += atom_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 atom = trak->out[NGX_HTTP_MP4_STTS_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1933 stts_atom = (ngx_mp4_stts_atom_t *) atom->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1934 ngx_mp4_set_32value(stts_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1935 ngx_mp4_set_32value(stts_atom->entries, entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1936
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1937 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1938 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1939
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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1942 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1943 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1944 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1945 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1946 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1947 } ngx_http_mp4_stss_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1948
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 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1951 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
1952 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1953 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1954 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1955 ngx_buf_t *atom, *data;
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 ngx_http_mp4_stss_atom_t *stss_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1958
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1959 /* sync samples atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1960
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1961 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
1962
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1963 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1964 stss_atom = (ngx_http_mp4_stss_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1965 ngx_mp4_set_atom_name(stss_atom, 's', 't', 's', 's');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1966
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1967 entries = ngx_mp4_get_32value(stss_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1968
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1969 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
1970 "sync sample entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1971
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1972 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1973 trak->sync_samples_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1974
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1975 atom_table = atom_header + sizeof(ngx_http_mp4_stss_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 atom = &trak->stss_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1978 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1979 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1980 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1981
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1982 atom_end = atom_table + entries * sizeof(uint32_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1983
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1984 if ((uint64_t) (atom_end - stss_atom->version) > atom_data_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1985 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1986 "\"%s\" mp4 stss atom too large", mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1987 return NGX_ERROR;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1990 data = &trak->stss_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1991 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1992 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1993 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1994
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1995 trak->out[NGX_HTTP_MP4_STSS_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1996 trak->out[NGX_HTTP_MP4_STSS_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1997
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1998 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1999
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2000 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2001 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2002
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2003
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2004 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2005 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
2006 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2007 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2008 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2009 uint32_t entries, sample, start_sample, *entry, *end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2010 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2011 ngx_http_mp4_stss_atom_t *stss_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2012
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2013 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2014 * mdia.minf.stbl.stss updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2015 * 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
2016 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2017 */
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_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2020 "mp4 stss atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2021
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2022 data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf;
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 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2025 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2026 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2027
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2028 /* sync samples starts from 1 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2029 start_sample = trak->start_sample + 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2030 entries = trak->sync_samples_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2031
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2032 entry = (uint32_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2033 end = (uint32_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2034
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2035 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2036 sample = ngx_mp4_get_32value(entry);
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2039 "start:%uD, sync:%uD", start_sample, sample);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2040
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2041 if (sample >= start_sample) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2042 goto found;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2043 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2044
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2045 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2046 entry++;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2049 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2050 "start sample is out of mp4 stss atom in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2051 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2052
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2053 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2054
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2055 found:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2056
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2057 data->pos = (u_char *) entry;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2058
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2059 start_sample = trak->start_sample;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2060
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2061 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2062 sample = ngx_mp4_get_32value(entry);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2063 sample -= start_sample;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2064 ngx_mp4_set_32value(entry, sample);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2065 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2066 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2067
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2068 atom_size = sizeof(ngx_http_mp4_stss_atom_t) + (data->last - data->pos);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2069 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2070
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2071 atom = trak->out[NGX_HTTP_MP4_STSS_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2072 stss_atom = (ngx_http_mp4_stss_atom_t *) atom->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2073
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2074 ngx_mp4_set_32value(stss_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2075 ngx_mp4_set_32value(stss_atom->entries, entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2076
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2077 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2078 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2079
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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2082 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2083 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2084 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2085 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2086 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2087 } ngx_mp4_ctts_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2088
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2089 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2090 u_char count[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2091 u_char offset[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2092 } ngx_mp4_ctts_entry_t;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2095 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2096 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
2097 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2098 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2099 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2100 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2101 ngx_mp4_ctts_atom_t *ctts_atom;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2104 /* composition offsets atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2105
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2106 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
2107
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2108 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2109 ctts_atom = (ngx_mp4_ctts_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2110 ngx_mp4_set_atom_name(ctts_atom, 'c', 't', 't', 's');
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 entries = ngx_mp4_get_32value(ctts_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2113
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2114 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
2115 "composition offset entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2116
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2117 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2118 trak->composition_offset_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2119
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2120 atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2121
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2122 atom = &trak->ctts_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2123 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2124 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2125 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2126
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2127 atom_end = atom_table + entries * sizeof(ngx_mp4_ctts_entry_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2128
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2129 if ((uint64_t) (atom_end - ctts_atom->version) > atom_data_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2130 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2131 "\"%s\" mp4 ctts atom too large", mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2132 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2133 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2134
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2135 data = &trak->ctts_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2136 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2137 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2138 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2139
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2140 trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2141 trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2142
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2143 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2144
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2145 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2146 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2147
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2148
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2149 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2150 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
2151 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2152 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2153 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2154 uint32_t entries, count, start_sample;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2155 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2156 ngx_mp4_ctts_atom_t *ctts_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2157 ngx_mp4_ctts_entry_t *entry, *end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2158
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2159 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2160 * mdia.minf.stbl.ctts updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2161 * 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
2162 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2163 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2164
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2165 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2166 "mp4 ctts atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2167
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2168 data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2169
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2170 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2171 return;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2172 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2173
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2174 /* sync samples starts from 1 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2175 start_sample = trak->start_sample + 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2176 entries = trak->composition_offset_entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2177 entry = (ngx_mp4_ctts_entry_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2178 end = (ngx_mp4_ctts_entry_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2179
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2180 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2181 count = ngx_mp4_get_32value(entry->count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2182
4088
8fe1da7b8386 bugfix of r4086: nginx could not be built without debug log.
Igor Sysoev <igor@sysoev.ru>
parents: 4087
diff changeset
2183 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2184 "start:%uD, count:%uD, offset:%uD",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2185 start_sample, count, ngx_mp4_get_32value(entry->offset));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2186
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2187 if (start_sample <= count) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2188 count -= (start_sample - 1);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2189 ngx_mp4_set_32value(entry->count, count);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2190 goto found;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2191 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2192
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2193 start_sample -= count;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2194 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2195 entry++;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2198 trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2199 trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2200
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2201 return;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2202
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2203 found:
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2204
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2205 data->pos = (u_char *) entry;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2206 atom_size = sizeof(ngx_mp4_ctts_atom_t) + (data->last - data->pos);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2207 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2208
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2209 atom = trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2210 ctts_atom = (ngx_mp4_ctts_atom_t *) atom->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2211
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2212 ngx_mp4_set_32value(ctts_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2213 ngx_mp4_set_32value(ctts_atom->entries, entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2214
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2215 return;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2216 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2217
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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2220 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2221 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2222 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2223 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2224 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2225 } ngx_mp4_stsc_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2226
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2227
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2228 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2229 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
2230 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2231 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2232 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2233 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2234 ngx_mp4_stsc_atom_t *stsc_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2235 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2236
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2237 /* sample-to-chunk atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2238
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2239 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
2240
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2241 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2242 stsc_atom = (ngx_mp4_stsc_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2243 ngx_mp4_set_atom_name(stsc_atom, 's', 't', 's', 'c');
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 entries = ngx_mp4_get_32value(stsc_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2246
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2247 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
2248 "sample-to-chunk entries:%uD", entries);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2249
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2250 atom_table = atom_header + sizeof(ngx_mp4_stsc_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2251 atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2252
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2253 if ((uint64_t) (atom_end - stsc_atom->version) > atom_data_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2254 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2255 "\"%s\" mp4 stsc atom too large",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2256 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2257 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2258 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2259
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2260 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2261 trak->sample_to_chunk_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2262
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2263 atom = &trak->stsc_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2264 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2265 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2266 atom->last = atom_table;
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 data = &trak->stsc_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2269 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2270 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2271 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2272
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2273 trak->out[NGX_HTTP_MP4_STSC_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2274 trak->out[NGX_HTTP_MP4_STSC_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2275
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2276 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2277
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2278 return NGX_OK;
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2281
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2282 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2283 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
2284 ngx_http_mp4_trak_t *trak)
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 size_t atom_size;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2287 uint32_t start_sample, entries, 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
2288 next_chunk, n;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2289 ngx_buf_t *atom, *data, *buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2290 ngx_mp4_stsc_atom_t *stsc_atom;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2291 ngx_mp4_stsc_entry_t *entry, *first, *end;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2292
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2293 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2294 * mdia.minf.stbl.stsc updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2295 * 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
2296 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2297 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2298
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2299 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2300 "mp4 stsc atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2301
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2302 data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2303
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2304 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2305 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2306 "no mp4 stsc atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2307 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2308 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2309 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2310
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2311 start_sample = (uint32_t) trak->start_sample;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2312 entries = trak->sample_to_chunk_entries - 1;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2313
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2314 entry = (ngx_mp4_stsc_entry_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2315 end = (ngx_mp4_stsc_entry_t *) data->last;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2316
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2317 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
2318 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
2319 id = ngx_mp4_get_32value(entry->id);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2320 entry++;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2321
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2322 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2323
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2324 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
2325
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2326 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, 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
2327 "start_sample:%uD, chunk:%uD, chunks:%uD, "
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2328 "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
2329 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
2330
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2331 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
2332
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2333 if (start_sample <= n) {
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2334 goto found;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2335 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2336
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2337 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
2338
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2339 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
2340 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
2341 id = ngx_mp4_get_32value(entry->id);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2342 entries--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2343 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2344 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2345
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2346 next_chunk = trak->chunks;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2347
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2348 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, 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
2349 "start_sample:%uD, chunk:%uD, chunks:%uD, samples:%uD",
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2350 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
2351
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2352 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
2353
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2354 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
2355 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
2356 "start time is out mp4 stsc chunks in \"%s\"",
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2357 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
2358 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
2359 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2360
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2361 found:
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2362
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2363 entries++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2364 entry--;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2365
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2366 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
2367 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
2368 "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
2369 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
2370 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
2371 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2372
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2373 trak->start_chunk = chunk - 1;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2374
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2375 trak->start_chunk += start_sample / samples;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2376 trak->chunk_samples = start_sample % samples;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2377
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2378 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, 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
2379 "start chunk:%ui, samples:%uD",
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2380 trak->start_chunk, trak->chunk_samples);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2381
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2382 data->pos = (u_char *) entry;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2383 atom_size = sizeof(ngx_mp4_stsc_atom_t) + (data->last - data->pos);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2384
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2385 if (trak->chunk_samples) {
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2386
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2387 first = &trak->stsc_chunk_entry;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2388 ngx_mp4_set_32value(first->chunk, 1);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2389 ngx_mp4_set_32value(first->samples, samples - trak->chunk_samples);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2390 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
2391
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2392 buf = &trak->stsc_chunk_buf;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2393 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
2394 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
2395 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
2396
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2397 trak->out[NGX_HTTP_MP4_STSC_CHUNK].buf = buf;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2398
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2399 ngx_mp4_set_32value(entry->chunk, 2);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2400
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2401 atom_size += 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
2402 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2403
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2404 while (++entry < end) {
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2405 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
2406 chunk -= trak->start_chunk;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2407 ngx_mp4_set_32value(entry->chunk, chunk);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2408 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2409
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2410 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2411
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2412 atom = trak->out[NGX_HTTP_MP4_STSC_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2413 stsc_atom = (ngx_mp4_stsc_atom_t *) atom->pos;
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 ngx_mp4_set_32value(stsc_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2416 ngx_mp4_set_32value(stsc_atom->entries, entries);
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 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2419 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2420
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 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2423 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2424 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2425 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2426 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2427 u_char uniform_size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2428 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2429 } ngx_mp4_stsz_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2430
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2431
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2432 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2433 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
2434 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2435 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2436 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2437 uint32_t entries, size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2438 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2439 ngx_mp4_stsz_atom_t *stsz_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2440 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2441
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2442 /* sample sizes atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2443
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2444 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
2445
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2446 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2447 stsz_atom = (ngx_mp4_stsz_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2448 ngx_mp4_set_atom_name(stsz_atom, 's', 't', 's', 'z');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2449
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2450 size = ngx_mp4_get_32value(stsz_atom->uniform_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2451 entries = ngx_mp4_get_32value(stsz_atom->entries);
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2454 "sample uniform size:%uD, entries:%uD", size, entries);
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 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2457 trak->sample_sizes_entries = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2458
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2459 atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2460
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2461 atom = &trak->stsz_atom_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2462 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2463 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2464 atom->last = atom_table;
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 trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2467
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2468 if (size == 0) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2469 atom_end = atom_table + entries * sizeof(uint32_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2470
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2471 if ((uint64_t) (atom_end - stsz_atom->version) > atom_data_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2472 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2473 "\"%s\" mp4 stsz atom too large",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2474 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2475 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2476 }
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 data = &trak->stsz_data_buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2479 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2480 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2481 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2482
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2483 trak->out[NGX_HTTP_MP4_STSZ_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2484
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2485 } else {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2486 /* 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
2487 /* TODO : chunk samples */
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2488 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
2489 ngx_mp4_set_32value(atom_header, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2490 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2491 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2492
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2493 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2494
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2495 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2496 }
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
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2499 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2500 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
2501 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2502 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2503 size_t atom_size;
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2504 uint32_t *pos, *end;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2505 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2506 ngx_mp4_stsz_atom_t *stsz_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2507
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 * mdia.minf.stbl.stsz updating requires trak->start_sample
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2510 * 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
2511 * atom which may reside after mdia.minf
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2515 "mp4 stsz atom update");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2516
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2517 data = trak->out[NGX_HTTP_MP4_STSZ_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2518
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2519 if (data) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2520 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
2521 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
2522
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2523 for (pos = end - trak->chunk_samples; pos < end; pos++) {
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2524 trak->chunk_samples_size += ngx_mp4_get_32value(pos);
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2525 }
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2526
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2527 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2528 "chunk samples sizes:%uL", trak->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
2529
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2530 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
2531 trak->size += atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2532
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2533 atom = trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2534 stsz_atom = (ngx_mp4_stsz_atom_t *) atom->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2535
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2536 ngx_mp4_set_32value(stsz_atom->size, atom_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2537 ngx_mp4_set_32value(stsz_atom->entries,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2538 trak->sample_sizes_entries - trak->start_sample);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2539 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2540 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2541
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2542
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2543 typedef struct {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2544 u_char size[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2545 u_char name[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2546 u_char version[1];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2547 u_char flags[3];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2548 u_char entries[4];
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2549 } ngx_mp4_stco_atom_t;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2550
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2551
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2552 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2553 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
2554 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2555 u_char *atom_header, *atom_table, *atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2556 uint32_t entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2557 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2558 ngx_mp4_stco_atom_t *stco_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2559 ngx_http_mp4_trak_t *trak;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2560
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2561 /* chunk offsets atom */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2562
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2563 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
2564
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2565 atom_header = ngx_mp4_atom_header(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2566 stco_atom = (ngx_mp4_stco_atom_t *) atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2567 ngx_mp4_set_atom_name(stco_atom, 's', 't', 'c', 'o');
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2568
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2569 entries = ngx_mp4_get_32value(stco_atom->entries);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2570
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2571 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
2572
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2573 atom_table = atom_header + sizeof(ngx_mp4_stco_atom_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2574 atom_end = atom_table + entries * sizeof(uint32_t);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2575
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2576 if ((uint64_t) (atom_end - stco_atom->version) > atom_data_size) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2577 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2578 "\"%s\" mp4 stco atom too large", mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2579 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2580 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2581
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2582 trak = ngx_mp4_last_trak(mp4);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2583 trak->chunks = entries;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2584
4107
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
2585 atom = &trak->stco_atom_buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2586 atom->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2587 atom->pos = atom_header;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2588 atom->last = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2589
4107
7705911c9d10 Fix of struct field name.
Igor Sysoev <igor@sysoev.ru>
parents: 4106
diff changeset
2590 data = &trak->stco_data_buf;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2591 data->temporary = 1;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2592 data->pos = atom_table;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2593 data->last = atom_end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2594
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2595 trak->out[NGX_HTTP_MP4_STCO_ATOM].buf = atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2596 trak->out[NGX_HTTP_MP4_STCO_DATA].buf = data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2597
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2598 ngx_mp4_atom_next(mp4, atom_data_size);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2599
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2600 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2601 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2602
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2603
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2604 static ngx_int_t
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2605 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
2606 ngx_http_mp4_trak_t *trak)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2607 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2608 size_t atom_size;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2609 ngx_buf_t *atom, *data;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2610 ngx_mp4_stco_atom_t *stco_atom;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2611
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 * mdia.minf.stbl.stco updating requires trak->start_chunk
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2614 * 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
2615 * atom which may reside after mdia.minf
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2616 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2617
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2618 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2619 "mp4 stco atom update");
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 data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2622
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2623 if (data == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2624 ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2625 "no mp4 stco atoms were found in \"%s\"",
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2626 mp4->file.name.data);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2627 return NGX_ERROR;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2628 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2629
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2630 data->pos += trak->start_chunk * sizeof(uint32_t);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2631 atom_size = sizeof(ngx_mp4_stco_atom_t) + (data->last - data->pos);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2632 trak->size += atom_size;
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 trak->start_offset = ngx_mp4_get_32value(data->pos);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2635 trak->start_offset += trak->chunk_samples_size;
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2636 ngx_mp4_set_32value(data->pos, trak->start_offset);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2637
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2638 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2639 "start chunk offset:%uD", trak->start_offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2640
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2641 atom = trak->out[NGX_HTTP_MP4_STCO_ATOM].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2642 stco_atom = (ngx_mp4_stco_atom_t *) atom->pos;
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 ngx_mp4_set_32value(stco_atom->size, atom_size);
4098
a3e07fab98a3 Fix of case when start sample does not reside on chunk boundary.
Igor Sysoev <igor@sysoev.ru>
parents: 4096
diff changeset
2645 ngx_mp4_set_32value(stco_atom->entries, trak->chunks - trak->start_chunk);
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2646
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2647 return NGX_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2648 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2649
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2650
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2651 static void
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2652 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
2653 ngx_http_mp4_trak_t *trak, int32_t adjustment)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2654 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2655 uint32_t offset, *entry, *end;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2656 ngx_buf_t *data;
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 /*
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2659 * moov.trak.mdia.minf.stbl.stco adjustment requires
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2660 * minimal start offset of all traks and new moov atom size
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2661 */
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2662
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2663 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2664 "mp4 stco atom adjustment");
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2665
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2666 data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2667 entry = (uint32_t *) data->pos;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2668 end = (uint32_t *) data->last;
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 while (entry < end) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2671 offset = ngx_mp4_get_32value(entry);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2672 offset += adjustment;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2673 ngx_mp4_set_32value(entry, offset);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2674 entry++;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2675 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2676 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2677
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2678
4112
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2679 typedef struct {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2680 u_char size[4];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2681 u_char name[4];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2682 u_char version[1];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2683 u_char flags[3];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2684 u_char entries[4];
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2685 } ngx_mp4_co64_atom_t;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2686
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2687
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2688 static ngx_int_t
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2689 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
2690 {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2691 u_char *atom_header, *atom_table, *atom_end;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2692 uint32_t entries;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2693 ngx_buf_t *atom, *data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2694 ngx_mp4_co64_atom_t *co64_atom;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2695 ngx_http_mp4_trak_t *trak;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2696
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2697 /* chunk offsets atom */
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2698
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2699 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
2700
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2701 atom_header = ngx_mp4_atom_header(mp4);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2702 co64_atom = (ngx_mp4_co64_atom_t *) atom_header;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2703 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
2704
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2705 entries = ngx_mp4_get_32value(co64_atom->entries);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2706
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2707 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
2708
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2709 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
2710 atom_end = atom_table + entries * sizeof(uint64_t);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2711
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2712 if ((uint64_t) (atom_end - co64_atom->version) > atom_data_size) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2713 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
2714 "\"%s\" mp4 co64 atom too large", mp4->file.name.data);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2715 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2716 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2717
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2718 trak = ngx_mp4_last_trak(mp4);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2719 trak->chunks = entries;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2720
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2721 atom = &trak->co64_atom_buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2722 atom->temporary = 1;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2723 atom->pos = atom_header;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2724 atom->last = atom_table;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2725
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2726 data = &trak->co64_data_buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2727 data->temporary = 1;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2728 data->pos = atom_table;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2729 data->last = atom_end;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2730
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2731 trak->out[NGX_HTTP_MP4_CO64_ATOM].buf = atom;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2732 trak->out[NGX_HTTP_MP4_CO64_DATA].buf = data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2733
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2734 ngx_mp4_atom_next(mp4, atom_data_size);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2735
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2736 return NGX_OK;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2737 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2738
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2739
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2740 static ngx_int_t
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2741 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
2742 ngx_http_mp4_trak_t *trak)
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2743 {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2744 size_t atom_size;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2745 ngx_buf_t *atom, *data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2746 ngx_mp4_co64_atom_t *co64_atom;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2747
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2748 /*
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2749 * mdia.minf.stbl.co64 updating requires trak->start_chunk
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2750 * 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
2751 * atom which may reside after mdia.minf
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2752 */
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2753
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2754 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
2755 "mp4 co64 atom update");
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2756
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2757 data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2758
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2759 if (data == NULL) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2760 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
2761 "no mp4 co64 atoms were found in \"%s\"",
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2762 mp4->file.name.data);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2763 return NGX_ERROR;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2764 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2765
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2766 data->pos += trak->start_chunk * sizeof(uint64_t);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2767 atom_size = sizeof(ngx_mp4_co64_atom_t) + (data->last - data->pos);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2768 trak->size += atom_size;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2769
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2770 trak->start_offset = ngx_mp4_get_64value(data->pos);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2771 trak->start_offset += trak->chunk_samples_size;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2772 ngx_mp4_set_64value(data->pos, trak->start_offset);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2773
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2774 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2775 "start chunk offset:%uL", trak->start_offset);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2776
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2777 atom = trak->out[NGX_HTTP_MP4_CO64_ATOM].buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2778 co64_atom = (ngx_mp4_co64_atom_t *) atom->pos;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2779
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2780 ngx_mp4_set_32value(co64_atom->size, atom_size);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2781 ngx_mp4_set_32value(co64_atom->entries, trak->chunks - trak->start_chunk);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2782
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2783 return NGX_OK;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2784 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2785
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2786
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2787 static void
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2788 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
2789 ngx_http_mp4_trak_t *trak, off_t adjustment)
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2790 {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2791 uint64_t offset, *entry, *end;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2792 ngx_buf_t *data;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2793
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2794 /*
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2795 * moov.trak.mdia.minf.stbl.co64 adjustment requires
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2796 * 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
2797 */
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2798
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2799 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
2800 "mp4 co64 atom adjustment");
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2801
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2802 data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2803 entry = (uint64_t *) data->pos;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2804 end = (uint64_t *) data->last;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2805
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2806 while (entry < end) {
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2807 offset = ngx_mp4_get_64value(entry);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2808 offset += adjustment;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2809 ngx_mp4_set_64value(entry, offset);
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2810 entry++;
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2811 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2812 }
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2813
bc0ca958c270 MP4 co64 atom support added.
Igor Sysoev <igor@sysoev.ru>
parents: 4107
diff changeset
2814
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2815 static char *
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2816 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
2817 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2818 ngx_http_core_loc_conf_t *clcf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2819
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2820 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
2821 clcf->handler = ngx_http_mp4_handler;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2822
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2823 return NGX_CONF_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2824 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2825
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2826
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2827 static void *
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2828 ngx_http_mp4_create_conf(ngx_conf_t *cf)
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2829 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2830 ngx_http_mp4_conf_t *conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2831
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2832 conf = ngx_palloc(cf->pool, sizeof(ngx_http_mp4_conf_t));
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2833 if (conf == NULL) {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2834 return NULL;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2835 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2836
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2837 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
2838 conf->max_buffer_size = NGX_CONF_UNSET_SIZE;
4085
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2839
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2840 return conf;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2841 }
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2842
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2843
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2844 static char *
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2845 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
2846 {
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2847 ngx_http_mp4_conf_t *prev = parent;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2848 ngx_http_mp4_conf_t *conf = child;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2849
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2850 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
2851 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
2852 10 * 1024 * 1024);
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2853
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2854 return NGX_CONF_OK;
6492c79e943a ngx_http_mp4_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2855 }