diff --git a/dash/ngx_rtmp_dash_module.c b/dash/ngx_rtmp_dash_module.c
index 4fcb59a..03374bf 100644
--- a/dash/ngx_rtmp_dash_module.c
+++ b/dash/ngx_rtmp_dash_module.c
@@ -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
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 buffer_time, buffer_time_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_codec_ctx_t *codec_ctx;
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" \
" xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\">\n"
-#define NGX_RTMP_DASH_MANIFEST_CLOCK \
- " \n" \
-
#define NGX_RTMP_DASH_MANIFEST_PERIOD \
" \n"
@@ -323,11 +336,12 @@ ngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)
#define NGX_RTMP_DASH_MANIFEST_VIDEO \
" \n" \
+ " maxFrameRate=\"%s\"\n" \
+ " par=\"%ui:%ui\">\n" \
" \n"
+#define NGX_RTMP_DASH_PERIOD_FOOTER \
+ " \n"
+
+
+#define NGX_RTMP_DASH_MANIFEST_CLOCK \
+ " \n"
+
+
#define NGX_RTMP_DASH_MANIFEST_FOOTER \
- " \n" \
"\n"
+
/**
* Availability time must be equal stream start time
* 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
);
- /* 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);
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;
}
+ 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,
codec_ctx->width,
codec_ctx->height,
frame_rate,
+ par_x, par_y,
&ctx->name,
codec_ctx->avc_profile,
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);
}
+ 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);
n = ngx_write_fd(fd, buffer, p - buffer);