mirror of
https://github.com/zotanmew/nginx-rtmp-module.git
synced 2024-05-20 18:01:08 +02:00
Merge pull request #178 from sergey-dryabzhinsky/add-par-to-sar
Fix DASH playlist generation - validation check pass
This commit is contained in:
commit
c47cb2370f
|
@ -247,6 +247,22 @@ ngx_rtmp_dash_rename_file(u_char *src, u_char *dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_uint_t
|
||||||
|
ngx_rtmp_dash_gcd(ngx_uint_t m, ngx_uint_t n)
|
||||||
|
{
|
||||||
|
/* greatest common divisor */
|
||||||
|
|
||||||
|
ngx_uint_t temp;
|
||||||
|
|
||||||
|
while (n) {
|
||||||
|
temp=n;
|
||||||
|
n=m % n;
|
||||||
|
m=temp;
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
{
|
{
|
||||||
|
@ -261,6 +277,7 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
ngx_uint_t update_period, update_period_msec;
|
ngx_uint_t update_period, update_period_msec;
|
||||||
ngx_uint_t buffer_time, buffer_time_msec;
|
ngx_uint_t buffer_time, buffer_time_msec;
|
||||||
ngx_uint_t presentation_delay, presentation_delay_msec;
|
ngx_uint_t presentation_delay, presentation_delay_msec;
|
||||||
|
ngx_uint_t gcd, par_x, par_y;
|
||||||
ngx_rtmp_dash_ctx_t *ctx;
|
ngx_rtmp_dash_ctx_t *ctx;
|
||||||
ngx_rtmp_codec_ctx_t *codec_ctx;
|
ngx_rtmp_codec_ctx_t *codec_ctx;
|
||||||
ngx_rtmp_dash_frag_t *f;
|
ngx_rtmp_dash_frag_t *f;
|
||||||
|
@ -312,10 +329,6 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
" xmlns:xsi=\"http://www.w3.org/2011/XMLSchema-instance\"\n" \
|
" xmlns:xsi=\"http://www.w3.org/2011/XMLSchema-instance\"\n" \
|
||||||
" xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\">\n"
|
" xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\">\n"
|
||||||
|
|
||||||
#define NGX_RTMP_DASH_MANIFEST_CLOCK \
|
|
||||||
" <UTCTiming schemeIdUri=\"urn:mpeg:dash:utc:%s:2014\"\n" \
|
|
||||||
" value=\"%V\" />\n" \
|
|
||||||
|
|
||||||
#define NGX_RTMP_DASH_MANIFEST_PERIOD \
|
#define NGX_RTMP_DASH_MANIFEST_PERIOD \
|
||||||
" <Period start=\"PT0S\" id=\"dash\">\n"
|
" <Period start=\"PT0S\" id=\"dash\">\n"
|
||||||
|
|
||||||
|
@ -323,11 +336,12 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
#define NGX_RTMP_DASH_MANIFEST_VIDEO \
|
#define NGX_RTMP_DASH_MANIFEST_VIDEO \
|
||||||
" <AdaptationSet\n" \
|
" <AdaptationSet\n" \
|
||||||
" id=\"1\"\n" \
|
" id=\"1\"\n" \
|
||||||
" segmentAlignment=\"true\"\n" \
|
|
||||||
" startWithSAP=\"1\"\n" \
|
" startWithSAP=\"1\"\n" \
|
||||||
|
" segmentAlignment=\"true\"\n" \
|
||||||
" maxWidth=\"%ui\"\n" \
|
" maxWidth=\"%ui\"\n" \
|
||||||
" maxHeight=\"%ui\"\n" \
|
" maxHeight=\"%ui\"\n" \
|
||||||
" maxFrameRate=\"%s\">\n" \
|
" maxFrameRate=\"%s\"\n" \
|
||||||
|
" par=\"%ui:%ui\">\n" \
|
||||||
" <Representation\n" \
|
" <Representation\n" \
|
||||||
" id=\"%V_H264\"\n" \
|
" id=\"%V_H264\"\n" \
|
||||||
" mimeType=\"video/mp4\"\n" \
|
" mimeType=\"video/mp4\"\n" \
|
||||||
|
@ -386,10 +400,19 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
" </AdaptationSet>\n"
|
" </AdaptationSet>\n"
|
||||||
|
|
||||||
|
|
||||||
|
#define NGX_RTMP_DASH_PERIOD_FOOTER \
|
||||||
|
" </Period>\n"
|
||||||
|
|
||||||
|
|
||||||
|
#define NGX_RTMP_DASH_MANIFEST_CLOCK \
|
||||||
|
" <UTCTiming schemeIdUri=\"urn:mpeg:dash:utc:%s:2014\"\n" \
|
||||||
|
" value=\"%V\" />\n"
|
||||||
|
|
||||||
|
|
||||||
#define NGX_RTMP_DASH_MANIFEST_FOOTER \
|
#define NGX_RTMP_DASH_MANIFEST_FOOTER \
|
||||||
" </Period>\n" \
|
|
||||||
"</MPD>\n"
|
"</MPD>\n"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Availability time must be equal stream start time
|
* Availability time must be equal stream start time
|
||||||
* Cos segments time counting from it
|
* Cos segments time counting from it
|
||||||
|
@ -471,28 +494,6 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
presentation_delay, presentation_delay_msec
|
presentation_delay, presentation_delay_msec
|
||||||
);
|
);
|
||||||
|
|
||||||
/* UTCTiming value */
|
|
||||||
switch (dacf->clock_compensation) {
|
|
||||||
case NGX_RTMP_DASH_CLOCK_COMPENSATION_NTP:
|
|
||||||
p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_CLOCK,
|
|
||||||
"ntp",
|
|
||||||
&dacf->clock_helper_uri
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
case NGX_RTMP_DASH_CLOCK_COMPENSATION_HTTP_HEAD:
|
|
||||||
p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_CLOCK,
|
|
||||||
"http-head",
|
|
||||||
&dacf->clock_helper_uri
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
case NGX_RTMP_DASH_CLOCK_COMPENSATION_HTTP_ISO:
|
|
||||||
p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_CLOCK,
|
|
||||||
"http-iso",
|
|
||||||
&dacf->clock_helper_uri
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_PERIOD);
|
p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_PERIOD);
|
||||||
|
|
||||||
n = ngx_write_fd(fd, buffer, p - buffer);
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
|
@ -527,10 +528,15 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
*ngx_sprintf(frame_rate, "%ui/%ui", frame_rate_num, frame_rate_denom) = 0;
|
*ngx_sprintf(frame_rate, "%ui/%ui", frame_rate_num, frame_rate_denom) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gcd = ngx_rtmp_dash_gcd(codec_ctx->width, codec_ctx->height);
|
||||||
|
par_x = codec_ctx->width / gcd;
|
||||||
|
par_y = codec_ctx->height / gcd;
|
||||||
|
|
||||||
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_VIDEO,
|
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_VIDEO,
|
||||||
codec_ctx->width,
|
codec_ctx->width,
|
||||||
codec_ctx->height,
|
codec_ctx->height,
|
||||||
frame_rate,
|
frame_rate,
|
||||||
|
par_x, par_y,
|
||||||
&ctx->name,
|
&ctx->name,
|
||||||
codec_ctx->avc_profile,
|
codec_ctx->avc_profile,
|
||||||
codec_ctx->avc_compat,
|
codec_ctx->avc_compat,
|
||||||
|
@ -574,6 +580,34 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
|
||||||
n = ngx_write_fd(fd, buffer, p - buffer);
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_PERIOD_FOOTER);
|
||||||
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
|
|
||||||
|
/* UTCTiming value */
|
||||||
|
switch (dacf->clock_compensation) {
|
||||||
|
case NGX_RTMP_DASH_CLOCK_COMPENSATION_NTP:
|
||||||
|
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_CLOCK,
|
||||||
|
"ntp",
|
||||||
|
&dacf->clock_helper_uri
|
||||||
|
);
|
||||||
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
|
break;
|
||||||
|
case NGX_RTMP_DASH_CLOCK_COMPENSATION_HTTP_HEAD:
|
||||||
|
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_CLOCK,
|
||||||
|
"http-head",
|
||||||
|
&dacf->clock_helper_uri
|
||||||
|
);
|
||||||
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
|
break;
|
||||||
|
case NGX_RTMP_DASH_CLOCK_COMPENSATION_HTTP_ISO:
|
||||||
|
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_CLOCK,
|
||||||
|
"http-iso",
|
||||||
|
&dacf->clock_helper_uri
|
||||||
|
);
|
||||||
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_FOOTER);
|
p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_FOOTER);
|
||||||
n = ngx_write_fd(fd, buffer, p - buffer);
|
n = ngx_write_fd(fd, buffer, p - buffer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue