12 #define NGX_HTTP_MP4_TRAK_ATOM 0
13 #define NGX_HTTP_MP4_TKHD_ATOM 1
14 #define NGX_HTTP_MP4_MDIA_ATOM 2
15 #define NGX_HTTP_MP4_MDHD_ATOM 3
16 #define NGX_HTTP_MP4_HDLR_ATOM 4
17 #define NGX_HTTP_MP4_MINF_ATOM 5
18 #define NGX_HTTP_MP4_VMHD_ATOM 6
19 #define NGX_HTTP_MP4_SMHD_ATOM 7
20 #define NGX_HTTP_MP4_DINF_ATOM 8
21 #define NGX_HTTP_MP4_STBL_ATOM 9
22 #define NGX_HTTP_MP4_STSD_ATOM 10
23 #define NGX_HTTP_MP4_STTS_ATOM 11
24 #define NGX_HTTP_MP4_STTS_DATA 12
25 #define NGX_HTTP_MP4_STSS_ATOM 13
26 #define NGX_HTTP_MP4_STSS_DATA 14
27 #define NGX_HTTP_MP4_CTTS_ATOM 15
28 #define NGX_HTTP_MP4_CTTS_DATA 16
29 #define NGX_HTTP_MP4_STSC_ATOM 17
30 #define NGX_HTTP_MP4_STSC_CHUNK 18
31 #define NGX_HTTP_MP4_STSC_DATA 19
32 #define NGX_HTTP_MP4_STSZ_ATOM 20
33 #define NGX_HTTP_MP4_STSZ_DATA 21
34 #define NGX_HTTP_MP4_STCO_ATOM 22
35 #define NGX_HTTP_MP4_STCO_DATA 23
36 #define NGX_HTTP_MP4_CO64_ATOM 24
37 #define NGX_HTTP_MP4_CO64_DATA 25
39 #define NGX_HTTP_MP4_LAST_ATOM NGX_HTTP_MP4_CO64_DATA
145 u_char moov_atom_header[8];
146 u_char mdat_atom_header[16];
153 uint64_t atom_data_size);
157 #define ngx_mp4_atom_header(mp4) (mp4->buffer_pos - 8)
158 #define ngx_mp4_atom_data(mp4) mp4->buffer_pos
159 #define ngx_mp4_atom_data_size(t) (uint64_t) (sizeof(t) - 8)
160 #define ngx_mp4_atom_next(mp4, n) mp4->buffer_pos += n; mp4->offset += n
163 #define ngx_mp4_set_atom_name(p, n1, n2, n3, n4) \
164 ((u_char *) (p))[4] = n1; \
165 ((u_char *) (p))[5] = n2; \
166 ((u_char *) (p))[6] = n3; \
167 ((u_char *) (p))[7] = n4
169 #define ngx_mp4_get_32value(p) \
170 ( ((uint32_t) ((u_char *) (p))[0] << 24) \
171 + ( ((u_char *) (p))[1] << 16) \
172 + ( ((u_char *) (p))[2] << 8) \
173 + ( ((u_char *) (p))[3]) )
175 #define ngx_mp4_set_32value(p, n) \
176 ((u_char *) (p))[0] = (u_char) ((n) >> 24); \
177 ((u_char *) (p))[1] = (u_char) ((n) >> 16); \
178 ((u_char *) (p))[2] = (u_char) ((n) >> 8); \
179 ((u_char *) (p))[3] = (u_char) (n)
181 #define ngx_mp4_get_64value(p) \
182 ( ((uint64_t) ((u_char *) (p))[0] << 56) \
183 + ((uint64_t) ((u_char *) (p))[1] << 48) \
184 + ((uint64_t) ((u_char *) (p))[2] << 40) \
185 + ((uint64_t) ((u_char *) (p))[3] << 32) \
186 + ((uint64_t) ((u_char *) (p))[4] << 24) \
187 + ( ((u_char *) (p))[5] << 16) \
188 + ( ((u_char *) (p))[6] << 8) \
189 + ( ((u_char *) (p))[7]) )
191 #define ngx_mp4_set_64value(p, n) \
192 ((u_char *) (p))[0] = (u_char) ((uint64_t) (n) >> 56); \
193 ((u_char *) (p))[1] = (u_char) ((uint64_t) (n) >> 48); \
194 ((u_char *) (p))[2] = (u_char) ((uint64_t) (n) >> 40); \
195 ((u_char *) (p))[3] = (u_char) ((uint64_t) (n) >> 32); \
196 ((u_char *) (p))[4] = (u_char) ( (n) >> 24); \
197 ((u_char *) (p))[5] = (u_char) ( (n) >> 16); \
198 ((u_char *) (p))[6] = (u_char) ( (n) >> 8); \
199 ((u_char *) (p))[7] = (u_char) (n)
201 #define ngx_mp4_last_trak(mp4) \
202 &((ngx_http_mp4_trak_t *) mp4->trak.elts)[mp4->trak.nelts - 1]
210 uint64_t atom_data_size);
212 uint64_t atom_data_size);
214 uint64_t atom_data_size);
218 uint64_t atom_data_size);
220 uint64_t atom_data_size);
224 uint64_t atom_data_size);
226 uint64_t atom_data_size);
228 uint64_t atom_data_size);
232 uint64_t atom_data_size);
234 uint64_t atom_data_size);
236 uint64_t atom_data_size);
240 uint64_t atom_data_size);
242 uint64_t atom_data_size);
244 uint64_t atom_data_size);
246 uint64_t atom_data_size);
250 uint64_t atom_data_size);
252 uint64_t atom_data_size);
256 uint64_t atom_data_size);
260 uint64_t atom_data_size);
264 uint64_t atom_data_size);
268 uint64_t atom_data_size);
272 uint64_t atom_data_size);
278 uint64_t atom_data_size);
284 static void *ngx_http_mp4_create_conf(
ngx_conf_t *cf);
285 static char *ngx_http_mp4_merge_conf(
ngx_conf_t *cf,
void *parent,
void *child);
324 ngx_http_mp4_create_conf,
325 ngx_http_mp4_merge_conf
331 &ngx_http_mp4_module_ctx,
332 ngx_http_mp4_commands,
346 {
"ftyp", ngx_http_mp4_read_ftyp_atom },
347 {
"moov", ngx_http_mp4_read_moov_atom },
348 {
"mdat", ngx_http_mp4_read_mdat_atom },
353 {
"mvhd", ngx_http_mp4_read_mvhd_atom },
354 {
"trak", ngx_http_mp4_read_trak_atom },
355 {
"cmov", ngx_http_mp4_read_cmov_atom },
360 {
"tkhd", ngx_http_mp4_read_tkhd_atom },
361 {
"mdia", ngx_http_mp4_read_mdia_atom },
366 {
"mdhd", ngx_http_mp4_read_mdhd_atom },
367 {
"hdlr", ngx_http_mp4_read_hdlr_atom },
368 {
"minf", ngx_http_mp4_read_minf_atom },
373 {
"vmhd", ngx_http_mp4_read_vmhd_atom },
374 {
"smhd", ngx_http_mp4_read_smhd_atom },
375 {
"dinf", ngx_http_mp4_read_dinf_atom },
376 {
"stbl", ngx_http_mp4_read_stbl_atom },
381 {
"stsd", ngx_http_mp4_read_stsd_atom },
382 {
"stts", ngx_http_mp4_read_stts_atom },
383 {
"stss", ngx_http_mp4_read_stss_atom },
384 {
"ctts", ngx_http_mp4_read_ctts_atom },
385 {
"stsc", ngx_http_mp4_read_stsc_atom },
386 {
"stsz", ngx_http_mp4_read_stsz_atom },
387 {
"stco", ngx_http_mp4_read_stco_atom },
388 {
"co64", ngx_http_mp4_read_co64_atom },
432 "http mp4 filename: \"%V\"", &path);
466 #if (NGX_HAVE_OPENAT)
519 start = (int) (strtod((
char *) value.
data, NULL) * 1000);
536 switch (ngx_http_mp4_process(mp4)) {
565 log->
action =
"sending mp4 to client";
604 if (b->
file == NULL) {
641 off_t start_offset, adjustment;
649 "mp4 start:%ui", mp4->
start);
655 rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_atoms, mp4->
end);
662 "no mp4 trak atoms were found in \"%s\"",
669 "no mp4 mdat atom was found in \"%s\"",
690 start_offset = mp4->
end;
695 if (ngx_http_mp4_update_stts_atom(mp4, &trak[i]) !=
NGX_OK) {
699 if (ngx_http_mp4_update_stss_atom(mp4, &trak[i]) !=
NGX_OK) {
703 ngx_http_mp4_update_ctts_atom(mp4, &trak[i]);
705 if (ngx_http_mp4_update_stsc_atom(mp4, &trak[i]) !=
NGX_OK) {
709 if (ngx_http_mp4_update_stsz_atom(mp4, &trak[i]) !=
NGX_OK) {
714 if (ngx_http_mp4_update_co64_atom(mp4, &trak[i]) !=
NGX_OK) {
719 if (ngx_http_mp4_update_stco_atom(mp4, &trak[i]) !=
NGX_OK) {
724 ngx_http_mp4_update_stbl_atom(mp4, &trak[i]);
725 ngx_http_mp4_update_minf_atom(mp4, &trak[i]);
728 ngx_http_mp4_update_mdia_atom(mp4, &trak[i]);
730 ngx_http_mp4_update_trak_atom(mp4, &trak[i]);
734 if (start_offset > trak[i].start_offset) {
742 if (trak[i].out[j].buf) {
743 *prev = &trak[
i].
out[j];
759 "start time is out mp4 mdat atom in \"%s\"",
765 + ngx_http_mp4_update_mdat_atom(mp4, start_offset)
769 "mp4 adjustment:%O", adjustment);
773 ngx_http_mp4_adjust_co64_atom(mp4, &trak[i], adjustment);
775 ngx_http_mp4_adjust_stco_atom(mp4, &trak[i], (int32_t) adjustment);
800 size_t atom_header_size;
801 u_char *atom_header, *atom_name;
806 end = mp4->
offset + atom_data_size;
808 while (mp4->
offset < end) {
810 if (ngx_http_mp4_read(mp4,
sizeof(uint32_t)) !=
NGX_OK) {
818 if (atom_size == 0) {
826 if (atom_size == 1) {
841 "\"%s\" mp4 atom is too small:%uL",
852 atom_name = atom_header +
sizeof(uint32_t);
855 "mp4 atom: %*s @%O:%uL",
856 4, atom_name, mp4->
offset, atom_size);
859 || mp4->
offset + (off_t) atom_size > end)
862 "\"%s\" mp4 atom too large:%uL",
867 for (n = 0; atom[n].
name; n++) {
869 if (
ngx_strncmp(atom_name, atom[n].name, 4) == 0) {
873 rc = atom[n].
handler(mp4, atom_size - atom_header_size);
897 if (mp4->
buffer_pos + size <= mp4->buffer_end) {
911 if (mp4->
buffer == NULL) {
913 if (mp4->
buffer == NULL) {
950 if (atom_data_size > 1024
954 "\"%s\" mp4 ftyp atom is too large:%uL",
962 if (ftyp_atom == NULL) {
978 atom->
pos = ftyp_atom;
979 atom->
last = ftyp_atom + atom_size;
995 #define NGX_HTTP_MP4_MOOV_BUFFER_EXCESS (4 * 1024)
1009 if (no_mdat && mp4->
start == 0) {
1023 "\"%s\" mp4 moov atom is too large:%uL, "
1024 "you may want to increase mp4_max_buffer_size",
1038 if (ngx_http_mp4_read(mp4, (
size_t) atom_data_size) !=
NGX_OK) {
1054 rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_moov_atoms, atom_data_size);
1110 off_t atom_data_size;
1111 u_char *atom_header;
1112 uint32_t atom_header_size;
1120 "mdat new offset @%O:%O", start_offset, atom_data_size);
1124 if ((uint64_t) atom_data_size > 0xffffffff) {
1141 atom->
pos = atom_header;
1142 atom->
last = atom_header + atom_header_size;
1144 return atom_header_size;
1153 u_char creation_time[4];
1154 u_char modification_time[4];
1155 u_char timescale[4];
1159 u_char reserved[10];
1161 u_char preview_time[4];
1162 u_char preview_duration[4];
1163 u_char poster_time[4];
1164 u_char selection_time[4];
1165 u_char selection_duration[4];
1166 u_char current_time[4];
1167 u_char next_track_id[4];
1175 u_char creation_time[8];
1176 u_char modification_time[8];
1177 u_char timescale[4];
1181 u_char reserved[10];
1183 u_char preview_time[4];
1184 u_char preview_duration[4];
1185 u_char poster_time[4];
1186 u_char selection_time[4];
1187 u_char selection_duration[4];
1188 u_char current_time[4];
1189 u_char next_track_id[4];
1196 u_char *atom_header;
1213 "\"%s\" mp4 mvhd atom too small", mp4->
file.
name.
data);
1217 if (mvhd_atom->
version[0] == 0) {
1227 "\"%s\" mp4 mvhd atom too small",
1239 "mvhd timescale:%uD, duration:%uL, time:%.3fs",
1240 timescale, duration, (
double) duration / timescale);
1242 duration -= (uint64_t) mp4->
start * timescale / 1000;
1245 "mvhd new duration:%uL, time:%.3fs",
1246 duration, (
double) duration / timescale);
1251 if (mvhd_atom->
version[0] == 0) {
1260 atom->
pos = atom_header;
1261 atom->
last = atom_header + atom_size;
1274 u_char *atom_header, *atom_end;
1275 off_t atom_file_end;
1294 atom->
pos = atom_header;
1300 atom_file_end = mp4->
offset + atom_data_size;
1302 rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_trak_atoms, atom_data_size);
1305 "mp4 trak atom: %i", rc);
1312 mp4->
offset = atom_file_end;
1336 "\"%s\" mp4 compressed moov atom (cmov) is not supported",
1348 u_char creation_time[4];
1349 u_char modification_time[4];
1351 u_char reserved1[4];
1353 u_char reserved2[8];
1357 u_char reverved3[2];
1368 u_char creation_time[8];
1369 u_char modification_time[8];
1371 u_char reserved1[4];
1373 u_char reserved2[8];
1377 u_char reverved3[2];
1387 u_char *atom_header;
1404 "\"%s\" mp4 tkhd atom too small", mp4->
file.
name.
data);
1408 if (tkhd_atom->
version[0] == 0) {
1417 "\"%s\" mp4 tkhd atom too small",
1426 "tkhd duration:%uL, time:%.3fs",
1427 duration, (
double) duration / mp4->
timescale);
1432 "tkhd new duration:%uL, time:%.3fs",
1433 duration, (
double) duration / mp4->
timescale);
1442 if (tkhd_atom->
version[0] == 0) {
1451 atom->
pos = atom_header;
1452 atom->
last = atom_header + atom_size;
1465 u_char *atom_header;
1478 atom->
pos = atom_header;
1483 return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_mdia_atoms, atom_data_size);
1504 u_char creation_time[4];
1505 u_char modification_time[4];
1506 u_char timescale[4];
1517 u_char creation_time[8];
1518 u_char modification_time[8];
1519 u_char timescale[4];
1529 u_char *atom_header;
1547 "\"%s\" mp4 mdhd atom too small", mp4->
file.
name.
data);
1551 if (mdhd_atom->
version[0] == 0) {
1561 "\"%s\" mp4 mdhd atom too small",
1571 "mdhd timescale:%uD, duration:%uL, time:%.3fs",
1572 timescale, duration, (
double) duration / timescale);
1574 duration -= (uint64_t) mp4->
start * timescale / 1000;
1577 "mdhd new duration:%uL, time:%.3fs",
1578 duration, (
double) duration / timescale);
1588 if (mdhd_atom->
version[0] == 0) {
1597 atom->
pos = atom_header;
1598 atom->
last = atom_header + atom_size;
1611 u_char *atom_header;
1627 atom->
pos = atom_header;
1628 atom->
last = atom_header + atom_size;
1642 u_char *atom_header;
1655 atom->
pos = atom_header;
1660 return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_minf_atoms, atom_data_size);
1682 u_char *atom_header;
1698 atom->
pos = atom_header;
1699 atom->
last = atom_header + atom_size;
1713 u_char *atom_header;
1729 atom->
pos = atom_header;
1730 atom->
last = atom_header + atom_size;
1744 u_char *atom_header;
1760 atom->
pos = atom_header;
1761 atom->
last = atom_header + atom_size;
1775 u_char *atom_header;
1788 atom->
pos = atom_header;
1793 return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_stbl_atoms, atom_data_size);
1816 u_char media_size[4];
1817 u_char media_name[4];
1824 u_char *atom_header, *atom_table;
1837 atom_table = atom_header + atom_size;
1843 "\"%s\" mp4 stsd atom too small", mp4->
file.
name.
data);
1848 "stsd entries:%uD, media:%*s",
1856 atom->
pos = atom_header;
1857 atom->
last = atom_table;
1860 trak->
size += atom_size;
1885 u_char *atom_header, *atom_table, *atom_end;
1901 "\"%s\" mp4 stts atom too small", mp4->
file.
name.
data);
1908 "mp4 time-to-sample entries:%uD", entries);
1914 "\"%s\" mp4 stts atom too small", mp4->
file.
name.
data);
1922 trak->time_to_sample_entries = entries;
1924 atom = &trak->stts_atom_buf;
1926 atom->
pos = atom_header;
1927 atom->
last = atom_table;
1929 data = &trak->stts_data_buf;
1931 data->
pos = atom_table;
1932 data->
last = atom_end;
1948 uint32_t entries, count, duration;
1949 uint64_t start_time;
1961 "mp4 stts atom update");
1967 "no mp4 stts atoms were found in \"%s\"",
1976 "time-to-sample start_time:%uL", start_time);
1982 while (entry < end) {
1987 "count:%uD, duration:%uD", count, duration);
1989 if (start_time < (uint64_t) count * duration) {
1990 start_sample += (
ngx_uint_t) (start_time / duration);
1991 count -= (uint32_t) (start_time / duration);
1996 start_sample += count;
1997 start_time -= count * duration;
2003 "start time is out mp4 stts samples in \"%s\"",
2011 "start_sample:%ui, new count:%uD", start_sample, count);
2015 data->
pos = (u_char *) entry;
2017 trak->
size += atom_size;
2040 u_char *atom_header, *atom_table, *atom_end;
2056 "\"%s\" mp4 stss atom too small", mp4->
file.
name.
data);
2063 "sync sample entries:%uD", entries);
2072 atom->pos = atom_header;
2073 atom->last = atom_table;
2076 + entries *
sizeof(uint32_t) > atom_data_size)
2079 "\"%s\" mp4 stss atom too small", mp4->
file.
name.
data);
2083 atom_end = atom_table + entries *
sizeof(uint32_t);
2087 data->pos = atom_table;
2088 data->last = atom_end;
2104 uint32_t entries, sample, start_sample, *entry, *end;
2115 "mp4 stss atom update");
2127 entry = (uint32_t *) data->
pos;
2128 end = (uint32_t *) data->
last;
2130 while (entry < end) {
2134 "start:%uD, sync:%uD", start_sample, sample);
2136 if (sample >= start_sample) {
2145 "start sample is out of mp4 stss atom in \"%s\"",
2152 data->
pos = (u_char *) entry;
2156 while (entry < end) {
2158 sample -= start_sample;
2164 trak->
size += atom_size;
2193 u_char *atom_header, *atom_table, *atom_end;
2209 "\"%s\" mp4 ctts atom too small", mp4->
file.
name.
data);
2216 "composition offset entries:%uD", entries);
2225 atom->pos = atom_header;
2226 atom->last = atom_table;
2232 "\"%s\" mp4 ctts atom too small", mp4->
file.
name.
data);
2240 data->pos = atom_table;
2241 data->last = atom_end;
2257 uint32_t entries, count, start_sample;
2269 "mp4 ctts atom update");
2283 while (entry < end) {
2287 "start:%uD, count:%uD, offset:%uD",
2290 if (start_sample <= count) {
2291 count -= (start_sample - 1);
2296 start_sample -= count;
2308 data->
pos = (u_char *) entry;
2310 trak->
size += atom_size;
2334 u_char *atom_header, *atom_table, *atom_end;
2350 "\"%s\" mp4 stsc atom too small", mp4->
file.
name.
data);
2357 "sample-to-chunk entries:%uD", entries);
2363 "\"%s\" mp4 stsc atom too small", mp4->
file.
name.
data);
2371 trak->sample_to_chunk_entries = entries;
2373 atom = &trak->stsc_atom_buf;
2375 atom->
pos = atom_header;
2376 atom->
last = atom_table;
2378 data = &trak->stsc_data_buf;
2380 data->
pos = atom_table;
2381 data->
last = atom_end;
2397 uint32_t start_sample, entries, chunk, samples, id,
2410 "mp4 stsc atom update");
2416 "no mp4 stsc atoms were found in \"%s\"",
2423 "zero number of entries in stsc atom in \"%s\"",
2439 while (entry < end) {
2444 "start_sample:%uD, chunk:%uD, chunks:%uD, "
2445 "samples:%uD, id:%uD",
2446 start_sample, chunk, next_chunk - chunk, samples,
id);
2448 n = (next_chunk - chunk) * samples;
2450 if (start_sample <= n) {
2463 next_chunk = trak->
chunks;
2466 "start_sample:%uD, chunk:%uD, chunks:%uD, samples:%uD",
2467 start_sample, chunk, next_chunk - chunk, samples);
2469 n = (next_chunk - chunk) * samples;
2471 if (start_sample > n) {
2473 "start time is out mp4 stsc chunks in \"%s\"",
2485 "zero number of samples in \"%s\"",
2496 "start chunk:%ui, samples:%uD",
2499 data->
pos = (u_char *) entry;
2519 buf->
pos = (u_char *) first;
2530 while (++entry < end) {
2536 trak->
size += atom_size;
2553 u_char uniform_size[4];
2561 u_char *atom_header, *atom_table, *atom_end;
2563 uint32_t entries, size;
2578 "\"%s\" mp4 stsz atom too small", mp4->
file.
name.
data);
2586 "sample uniform size:%uD, entries:%uD", size, entries);
2595 atom->pos = atom_header;
2596 atom->last = atom_table;
2602 + entries *
sizeof(uint32_t) > atom_data_size)
2605 "\"%s\" mp4 stsz atom too small",
2610 atom_end = atom_table + entries *
sizeof(uint32_t);
2614 data->pos = atom_table;
2615 data->last = atom_end;
2624 trak->
size += atom_size;
2638 uint32_t *pos, *end;
2649 "mp4 stsz atom update");
2656 "start time is out mp4 stsz samples in \"%s\"",
2662 end = (uint32_t *) data->
pos;
2672 trak->
size += atom_size;
2698 u_char *atom_header, *atom_table, *atom_end;
2714 "\"%s\" mp4 stco atom too small", mp4->
file.
name.
data);
2723 + entries *
sizeof(uint32_t) > atom_data_size)
2726 "\"%s\" mp4 stco atom too small", mp4->
file.
name.
data);
2731 atom_end = atom_table + entries *
sizeof(uint32_t);
2734 trak->chunks = entries;
2736 atom = &trak->stco_atom_buf;
2738 atom->
pos = atom_header;
2739 atom->
last = atom_table;
2741 data = &trak->stco_data_buf;
2743 data->
pos = atom_table;
2744 data->
last = atom_end;
2770 "mp4 stco atom update");
2776 "no mp4 stco atoms were found in \"%s\"",
2783 "start time is out mp4 stco chunks in \"%s\"",
2790 trak->
size += atom_size;
2813 uint32_t offset, *entry, *end;
2822 "mp4 stco atom adjustment");
2825 entry = (uint32_t *) data->
pos;
2826 end = (uint32_t *) data->
last;
2828 while (entry < end) {
2830 offset += adjustment;
2849 u_char *atom_header, *atom_table, *atom_end;
2865 "\"%s\" mp4 co64 atom too small", mp4->
file.
name.
data);
2874 + entries *
sizeof(uint64_t) > atom_data_size)
2877 "\"%s\" mp4 co64 atom too small", mp4->
file.
name.
data);
2882 atom_end = atom_table + entries *
sizeof(uint64_t);
2885 trak->chunks = entries;
2887 atom = &trak->co64_atom_buf;
2889 atom->
pos = atom_header;
2890 atom->
last = atom_table;
2892 data = &trak->co64_data_buf;
2894 data->
pos = atom_table;
2895 data->
last = atom_end;
2921 "mp4 co64 atom update");
2927 "no mp4 co64 atoms were found in \"%s\"",
2934 "start time is out mp4 co64 chunks in \"%s\"",
2941 trak->
size += atom_size;
2964 uint64_t offset, *entry, *end;
2973 "mp4 co64 atom adjustment");
2976 entry = (uint64_t *) data->
pos;
2977 end = (uint64_t *) data->
last;
2979 while (entry < end) {
2981 offset += adjustment;
2994 clcf->
handler = ngx_http_mp4_handler;
3018 ngx_http_mp4_merge_conf(
ngx_conf_t *cf,
void *parent,
void *child)