improved mp4 brands

This commit is contained in:
Roman Arutyunyan 2013-12-01 10:28:21 +04:00
parent 51c80e2179
commit 9e634ae882
3 changed files with 32 additions and 30 deletions

View file

@ -489,8 +489,7 @@ ngx_rtmp_dash_write_init_segments(ngx_rtmp_session_t *s)
b.end = b.start + sizeof(buffer); b.end = b.start + sizeof(buffer);
b.pos = b.last = b.start; b.pos = b.last = b.start;
ngx_rtmp_mp4_write_ftyp(&b, NGX_RTMP_MP4_FILETYPE_INIT, ngx_rtmp_mp4_write_ftyp(&b);
NGX_RTMP_MP4_VIDEO_TRACK);
ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_VIDEO_TRACK); ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_VIDEO_TRACK);
rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start)); rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start));
@ -516,8 +515,7 @@ ngx_rtmp_dash_write_init_segments(ngx_rtmp_session_t *s)
b.pos = b.last = b.start; b.pos = b.last = b.start;
ngx_rtmp_mp4_write_ftyp(&b, NGX_RTMP_MP4_FILETYPE_INIT, ngx_rtmp_mp4_write_ftyp(&b);
NGX_RTMP_MP4_AUDIO_TRACK);
ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_AUDIO_TRACK); ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_AUDIO_TRACK);
rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start)); rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start));
@ -559,9 +557,7 @@ ngx_rtmp_dash_close_fragment(ngx_rtmp_session_t *s, ngx_rtmp_dash_track_t *t)
b.end = buffer + sizeof(buffer); b.end = buffer + sizeof(buffer);
b.pos = b.last = b.start; b.pos = b.last = b.start;
ngx_rtmp_mp4_write_ftyp(&b, NGX_RTMP_MP4_FILETYPE_SEG, t->type == 'v' ? ngx_rtmp_mp4_write_styp(&b);
NGX_RTMP_MP4_VIDEO_TRACK :
NGX_RTMP_MP4_AUDIO_TRACK);
pos = b.last; pos = b.last;
b.last += 44; /* leave room for sidx */ b.last += 44; /* leave room for sidx */

View file

@ -183,40 +183,46 @@ ngx_rtmp_mp4_write_matrix(ngx_buf_t *buf, uint32_t a, uint32_t b, uint32_t c,
ngx_int_t ngx_int_t
ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b, ngx_rtmp_mp4_file_type_t ftype, ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b)
ngx_rtmp_mp4_track_type_t ttype)
{ {
u_char *pos; u_char *pos;
switch (ftype) { pos = ngx_rtmp_mp4_start_box(b, "ftyp");
case NGX_RTMP_MP4_FILETYPE_INIT: /* major brand */
ngx_rtmp_mp4_box(b, "iso6");
pos = ngx_rtmp_mp4_start_box(b, "ftyp"); /* minor version */
ngx_rtmp_mp4_field_32(b, 1);
ngx_rtmp_mp4_box(b, "iso5"); /* compatible brands */
ngx_rtmp_mp4_field_32(b, 1); ngx_rtmp_mp4_box(b, "isom");
ngx_rtmp_mp4_box(b, "iso6");
ngx_rtmp_mp4_box(b, "dash");
if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) { ngx_rtmp_mp4_update_box_size(b, pos);
ngx_rtmp_mp4_box(b, "avc1");
}
ngx_rtmp_mp4_box(b, "iso5"); return NGX_OK;
ngx_rtmp_mp4_box(b, "dash"); }
break;
default: /* NGX_RTMP_MP4_FILETYPE_SEG */ ngx_int_t
ngx_rtmp_mp4_write_styp(ngx_buf_t *b)
{
u_char *pos;
pos = ngx_rtmp_mp4_start_box(b, "styp"); pos = ngx_rtmp_mp4_start_box(b, "styp");
ngx_rtmp_mp4_box(b, "msdh"); /* major brand */
ngx_rtmp_mp4_field_32(b, 0); ngx_rtmp_mp4_box(b, "iso6");
ngx_rtmp_mp4_box(b, "msdh");
ngx_rtmp_mp4_box(b, "msix");
break; /* minor version */
} ngx_rtmp_mp4_field_32(b, 1);
/* compatible brands */
ngx_rtmp_mp4_box(b, "isom");
ngx_rtmp_mp4_box(b, "iso6");
ngx_rtmp_mp4_box(b, "dash");
ngx_rtmp_mp4_update_box_size(b, pos); ngx_rtmp_mp4_update_box_size(b, pos);

View file

@ -36,8 +36,8 @@ typedef enum {
} ngx_rtmp_mp4_track_type_t; } ngx_rtmp_mp4_track_type_t;
ngx_int_t ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b, ngx_rtmp_mp4_file_type_t ftype, ngx_int_t ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b);
ngx_rtmp_mp4_track_type_t ttype); ngx_int_t ngx_rtmp_mp4_write_styp(ngx_buf_t *b);
ngx_int_t ngx_rtmp_mp4_write_moov(ngx_rtmp_session_t *s, ngx_buf_t *b, ngx_int_t ngx_rtmp_mp4_write_moov(ngx_rtmp_session_t *s, ngx_buf_t *b,
ngx_rtmp_mp4_track_type_t ttype); ngx_rtmp_mp4_track_type_t ttype);
ngx_int_t ngx_rtmp_mp4_write_moof(ngx_buf_t *b, uint32_t earliest_pres_time, ngx_int_t ngx_rtmp_mp4_write_moof(ngx_buf_t *b, uint32_t earliest_pres_time,