static ngx_int_t ngx_http_vod_hls_handle_index_playlist( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { hls_encryption_params_t encryption_params; ngx_str_t segments_base_url = ngx_null_string; ngx_str_t base_url = ngx_null_string; vod_status_t rc; u_char iv[AES_BLOCK_SIZE]; if (submodule_context->conf->hls.absolute_index_urls) { ngx_http_vod_get_base_url(submodule_context->r, &submodule_context->conf->https_header_name, NULL, 0, &submodule_context->r->uri, &base_url); ngx_http_vod_get_base_url( submodule_context->r, &submodule_context->conf->https_header_name, &submodule_context->conf->segments_base_url, submodule_context->conf->segments_base_url_has_scheme, &submodule_context->r->uri, &segments_base_url); } ngx_http_vod_hls_init_encryption_params(&encryption_params, submodule_context, iv); rc = m3u8_builder_build_index_playlist( &submodule_context->request_context, &submodule_context->conf->hls.m3u8_config, &base_url, &segments_base_url, &submodule_context->request_params, &encryption_params, &submodule_context->conf->segmenter, &submodule_context->media_set, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_index_playlist: m3u8_builder_build_index_playlist failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = m3u8_content_type; content_type->len = sizeof(m3u8_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_hls_handle_master_playlist( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { ngx_str_t base_url = ngx_null_string; vod_status_t rc; if (submodule_context->conf->hls.absolute_master_urls) { ngx_http_vod_get_base_url(submodule_context->r, &submodule_context->conf->https_header_name, NULL, 0, &empty_string, &base_url); } rc = m3u8_builder_build_master_playlist( &submodule_context->request_context, &submodule_context->conf->hls.m3u8_config, &base_url, &submodule_context->media_set, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_master_playlist: m3u8_builder_build_master_playlist failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = m3u8_content_type; content_type->len = sizeof(m3u8_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_dash_handle_manifest( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { ngx_str_t base_url = ngx_null_string; vod_status_t rc; ngx_str_t file_uri; if (submodule_context->conf->dash.absolute_manifest_urls) { if (submodule_context->conf->dash.mpd_config.manifest_format == FORMAT_SEGMENT_LIST) { file_uri.data = NULL; file_uri.len = 0; } else { file_uri = submodule_context->r->uri; } ngx_http_vod_get_base_url(submodule_context->r, &submodule_context->conf->https_header_name, NULL, 0, &file_uri, &base_url); } if (submodule_context->conf->drm_enabled) { rc = edash_packager_build_mpd( &submodule_context->request_context, &submodule_context->conf->dash.mpd_config, &base_url, &submodule_context->media_set, response); } else { rc = dash_packager_build_mpd( &submodule_context->request_context, &submodule_context->conf->dash.mpd_config, &base_url, &submodule_context->media_set, 0, NULL, NULL, response); } if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_dash_handle_manifest: (e)dash_packager_build_mpd failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = mpd_content_type; content_type->len = sizeof(mpd_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_hls_handle_index_playlist( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { ngx_str_t segments_base_url = ngx_null_string; ngx_str_t base_url = ngx_null_string; vod_status_t rc; if (submodule_context->conf->hls.absolute_index_urls) { ngx_http_vod_get_base_url(submodule_context->r, &submodule_context->conf->https_header_name, NULL, 0, &submodule_context->r->uri, &base_url); ngx_http_vod_get_base_url( submodule_context->r, &submodule_context->conf->https_header_name, &submodule_context->conf->segments_base_url, submodule_context->conf->segments_base_url_has_scheme, &submodule_context->r->uri, &segments_base_url); } rc = m3u8_builder_build_index_playlist( &submodule_context->request_context, &submodule_context->conf->hls.m3u8_config, &base_url, &segments_base_url, submodule_context->request_params.uses_multi_uri && submodule_context->request_params.required_files != 0xffffffff, submodule_context->conf->secret_key.len != 0, &submodule_context->conf->segmenter, &submodule_context->mpeg_metadata, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_index_playlist: m3u8_builder_build_index_playlist failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = m3u8_content_type; content_type->len = sizeof(m3u8_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_hls_handle_iframe_playlist( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { ngx_http_vod_loc_conf_t* conf = submodule_context->conf; ngx_str_t base_url = ngx_null_string; vod_status_t rc; if (conf->hls.encryption_method != HLS_ENC_NONE) { ngx_log_error(NGX_LOG_ERR, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_iframe_playlist: iframes playlist not supported with encryption"); return NGX_HTTP_BAD_REQUEST; } if (submodule_context->media_set.audio_filtering_needed) { ngx_log_error(NGX_LOG_ERR, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_iframe_playlist: iframes playlist not supported with audio filtering"); return NGX_HTTP_BAD_REQUEST; } if (conf->hls.absolute_iframe_urls) { rc = ngx_http_vod_get_base_url(submodule_context->r, conf->base_url, &submodule_context->r->uri, &base_url); if (rc != NGX_OK) { return rc; } } rc = m3u8_builder_build_iframe_playlist( &submodule_context->request_context, &conf->hls.m3u8_config, &conf->hls.muxer_config, &base_url, &submodule_context->request_params, &submodule_context->media_set, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_iframe_playlist: m3u8_builder_build_iframe_playlist failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = m3u8_content_type; content_type->len = sizeof(m3u8_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_hls_handle_iframe_playlist( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { mpeg_stream_metadata_t* cur_stream; ngx_str_t base_url = ngx_null_string; vod_status_t rc; for (cur_stream = submodule_context->mpeg_metadata.first_stream; cur_stream < submodule_context->mpeg_metadata.last_stream; cur_stream++) { if (cur_stream->media_info.media_type == MEDIA_TYPE_AUDIO && cur_stream->media_info.speed_nom != cur_stream->media_info.speed_denom) { ngx_log_error(NGX_LOG_ERR, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_iframe_playlist: iframes playlist not supported with audio speed change"); return NGX_HTTP_BAD_REQUEST; } } if (submodule_context->conf->hls.absolute_iframe_urls) { ngx_http_vod_get_base_url(submodule_context->r, &submodule_context->conf->https_header_name, NULL, 0, &submodule_context->r->uri, &base_url); } rc = m3u8_builder_build_iframe_playlist( &submodule_context->request_context, &submodule_context->conf->hls.m3u8_config, &base_url, submodule_context->request_params.uses_multi_uri && submodule_context->request_params.required_files != 0xffffffff, &submodule_context->conf->segmenter, &submodule_context->mpeg_metadata, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_iframe_playlist: m3u8_builder_build_iframe_playlist failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = m3u8_content_type; content_type->len = sizeof(m3u8_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_hds_handle_manifest( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { ngx_http_vod_loc_conf_t* conf = submodule_context->conf; ngx_str_t base_url = ngx_null_string; vod_status_t rc; if (conf->hds.absolute_manifest_urls) { rc = ngx_http_vod_get_base_url(submodule_context->r, conf->base_url, &submodule_context->r->uri, &base_url); if (rc != NGX_OK) { return rc; } } rc = hds_packager_build_manifest( &submodule_context->request_context, &conf->hds.manifest_config, &base_url, &submodule_context->r->uri, &submodule_context->media_set, conf->drm_enabled, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hds_handle_manifest: hds_packager_build_manifest failed %i", rc); return ngx_http_vod_status_to_ngx_error(submodule_context->r, rc); } content_type->data = f4m_content_type; content_type->len = sizeof(f4m_content_type) - 1; return NGX_OK; }
static ngx_int_t ngx_http_vod_hls_handle_index_playlist( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { ngx_http_vod_loc_conf_t* conf = submodule_context->conf; hls_encryption_params_t encryption_params; ngx_str_t segments_base_url = ngx_null_string; ngx_str_t base_url = ngx_null_string; vod_status_t rc; u_char iv[AES_BLOCK_SIZE]; if (conf->hls.absolute_index_urls) { rc = ngx_http_vod_get_base_url(submodule_context->r, conf->base_url, &submodule_context->r->uri, &base_url); if (rc != NGX_OK) { return rc; } if (conf->segments_base_url != NULL) { rc = ngx_http_vod_get_base_url( submodule_context->r, conf->segments_base_url, &submodule_context->r->uri, &segments_base_url); if (rc != NGX_OK) { return rc; } } else { segments_base_url = base_url; } } ngx_http_vod_hls_init_encryption_params(&encryption_params, submodule_context, iv); if (encryption_params.type != HLS_ENC_NONE) { if (conf->hls.encryption_key_uri != NULL) { if (ngx_http_complex_value( submodule_context->r, conf->hls.encryption_key_uri, &encryption_params.key_uri) != NGX_OK) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_index_playlist: ngx_http_complex_value failed"); return NGX_ERROR; } } else { encryption_params.key_uri.len = 0; } } rc = m3u8_builder_build_index_playlist( &submodule_context->request_context, &conf->hls.m3u8_config, &base_url, &segments_base_url, &submodule_context->request_params, &encryption_params, &submodule_context->media_set, response); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hls_handle_index_playlist: m3u8_builder_build_index_playlist failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } content_type->data = m3u8_content_type; content_type->len = sizeof(m3u8_content_type) - 1; return NGX_OK; }