Skip to content

Commit

Permalink
Mp4: skip tracks shorter than seek position (ticket nginx#414).
Browse files Browse the repository at this point in the history
Mp4 module does not check movie and track durations when reading
file.  Instead it generates errors when track metadata is shorter
than seek position.  Now such tracks are skipped and movie duration
check is performed at file read stage.
  • Loading branch information
arut committed Jan 29, 2014
1 parent 870733e commit 88f9b41
Showing 1 changed file with 31 additions and 6 deletions.
37 changes: 31 additions & 6 deletions src/http/modules/ngx_http_mp4_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -1208,7 +1208,7 @@ ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
u_char *atom_header;
size_t atom_size;
uint32_t timescale;
uint64_t duration;
uint64_t duration, start_time;
ngx_buf_t *atom;
ngx_mp4_mvhd_atom_t *mvhd_atom;
ngx_mp4_mvhd64_atom_t *mvhd64_atom;
Expand Down Expand Up @@ -1251,7 +1251,16 @@ ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
"mvhd timescale:%uD, duration:%uL, time:%.3fs",
timescale, duration, (double) duration / timescale);

duration -= (uint64_t) mp4->start * timescale / 1000;
start_time = (uint64_t) mp4->start * timescale / 1000;

if (duration < start_time) {
ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0,
"\"%s\" mp4 start time exceeds file duration",
mp4->file.name.data);
return NGX_ERROR;
}

duration -= start_time;

ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
"mvhd new duration:%uL, time:%.3fs",
Expand Down Expand Up @@ -1398,7 +1407,7 @@ ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
{
u_char *atom_header;
size_t atom_size;
uint64_t duration;
uint64_t duration, start_time;
ngx_buf_t *atom;
ngx_http_mp4_trak_t *trak;
ngx_mp4_tkhd_atom_t *tkhd_atom;
Expand Down Expand Up @@ -1438,7 +1447,15 @@ ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
"tkhd duration:%uL, time:%.3fs",
duration, (double) duration / mp4->timescale);

duration -= (uint64_t) mp4->start * mp4->timescale / 1000;
start_time = (uint64_t) mp4->start * mp4->timescale / 1000;

if (duration < start_time) {
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
"tkhd duration is less than start time");
return NGX_DECLINED;
}

duration -= start_time;

ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
"tkhd new duration:%uL, time:%.3fs",
Expand Down Expand Up @@ -1541,7 +1558,7 @@ ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
u_char *atom_header;
size_t atom_size;
uint32_t timescale;
uint64_t duration;
uint64_t duration, start_time;
ngx_buf_t *atom;
ngx_http_mp4_trak_t *trak;
ngx_mp4_mdhd_atom_t *mdhd_atom;
Expand Down Expand Up @@ -1583,7 +1600,15 @@ ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size)
"mdhd timescale:%uD, duration:%uL, time:%.3fs",
timescale, duration, (double) duration / timescale);

duration -= (uint64_t) mp4->start * timescale / 1000;
start_time = (uint64_t) mp4->start * timescale / 1000;

if (duration < start_time) {
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
"mdhd duration is less than start time");
return NGX_DECLINED;
}

duration -= start_time;

ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0,
"mdhd new duration:%uL, time:%.3fs",
Expand Down

0 comments on commit 88f9b41

Please sign in to comment.