static ngx_int_t ngx_http_vod_dash_handle_init_segment( ngx_http_vod_submodule_context_t* submodule_context, ngx_str_t* response, ngx_str_t* content_type) { vod_status_t rc; if (submodule_context->conf->drm_enabled) { rc = edash_packager_build_init_mp4( &submodule_context->request_context, &submodule_context->media_set, submodule_context->conf->drm_clear_lead_segment_count > 0, ngx_http_vod_submodule_size_only(submodule_context), response); } else { rc = dash_packager_build_init_mp4( &submodule_context->request_context, &submodule_context->media_set, ngx_http_vod_submodule_size_only(submodule_context), 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_init_segment: (e)dash_packager_build_init_mp4 failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } if (submodule_context->media_set.track_count[MEDIA_TYPE_VIDEO] != 0) { content_type->data = mp4_video_content_type; content_type->len = sizeof(mp4_video_content_type) - 1; } else { content_type->data = mp4_audio_content_type; content_type->len = sizeof(mp4_audio_content_type) - 1; } return NGX_OK; }
static ngx_int_t ngx_http_vod_hds_init_frame_processor( ngx_http_vod_submodule_context_t* submodule_context, segment_writer_t* segment_writer, ngx_http_vod_frame_processor_t* frame_processor, void** frame_processor_state, ngx_str_t* output_buffer, size_t* response_size, ngx_str_t* content_type) { hds_muxer_state_t* state; hds_encryption_params_t encryption_params; vod_status_t rc; drm_info_t* drm_info; if (submodule_context->conf->drm_enabled) { drm_info = submodule_context->media_set.sequences[0].drm_info; encryption_params.type = HDS_ENC_SELECTIVE; encryption_params.key = drm_info->key; encryption_params.iv = submodule_context->media_set.sequences[0].encryption_key; } else { encryption_params.type = HDS_ENC_NONE; } rc = hds_muxer_init_fragment( &submodule_context->request_context, &submodule_context->conf->hds.fragment_config, &encryption_params, submodule_context->request_params.segment_index, &submodule_context->media_set, segment_writer->write_tail, segment_writer->context, ngx_http_vod_submodule_size_only(submodule_context), output_buffer, response_size, &state); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hds_init_frame_processor: hds_muxer_init_fragment failed %i", rc); return ngx_http_vod_status_to_ngx_error(submodule_context->r, rc); } *frame_processor = (ngx_http_vod_frame_processor_t)hds_muxer_process_frames; *frame_processor_state = state; // set the 'Content-type' header content_type->len = sizeof(f4f_content_type) - 1; content_type->data = (u_char *)f4f_content_type; return NGX_OK; }
static ngx_int_t ngx_http_vod_hds_init_frame_processor( ngx_http_vod_submodule_context_t* submodule_context, segment_writer_t* segment_writer, ngx_http_vod_frame_processor_t* frame_processor, void** frame_processor_state, ngx_str_t* output_buffer, size_t* response_size, ngx_str_t* content_type) { hds_muxer_state_t* state; vod_status_t rc; rc = hds_muxer_init_fragment( &submodule_context->request_context, &submodule_context->conf->hds.fragment_config, submodule_context->request_params.segment_index, submodule_context->media_set.sequences, segment_writer->write_tail, segment_writer->context, ngx_http_vod_submodule_size_only(submodule_context), output_buffer, response_size, &state); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_hds_init_frame_processor: hds_muxer_init_fragment failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } *frame_processor = (ngx_http_vod_frame_processor_t)hds_muxer_process_frames; *frame_processor_state = state; // set the 'Content-type' header content_type->len = sizeof(f4f_content_type) - 1; content_type->data = (u_char *)f4f_content_type; return NGX_OK; }
static ngx_int_t ngx_http_vod_mss_init_frame_processor( ngx_http_vod_submodule_context_t* submodule_context, read_cache_state_t* read_cache_state, segment_writer_t* segment_writer, ngx_http_vod_frame_processor_t* frame_processor, void** frame_processor_state, ngx_str_t* output_buffer, size_t* response_size, ngx_str_t* content_type) { fragment_writer_state_t* state; segment_writer_t drm_writer; vod_status_t rc; bool_t size_only = ngx_http_vod_submodule_size_only(submodule_context); if (submodule_context->conf->drm_enabled) { rc = mss_playready_get_fragment_writer( &drm_writer, &submodule_context->request_context, submodule_context->mpeg_metadata.first_stream, submodule_context->request_params.segment_index, segment_writer, submodule_context->cur_suburi->file_key, // iv size_only, output_buffer, response_size); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_mss_init_frame_processor: mss_playready_get_fragment_writer failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } segment_writer = &drm_writer; } else { rc = mss_packager_build_fragment_header( &submodule_context->request_context, submodule_context->mpeg_metadata.first_stream, submodule_context->request_params.segment_index, 0, NULL, NULL, size_only, output_buffer, response_size); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_mss_init_frame_processor: mss_packager_build_fragment_header failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } } if (!size_only || *response_size == 0) { rc = mp4_builder_frame_writer_init( &submodule_context->request_context, submodule_context->mpeg_metadata.first_stream, read_cache_state, segment_writer->write_tail, segment_writer->context, &state); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_mss_init_frame_processor: mp4_builder_frame_writer_init failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } *frame_processor = (ngx_http_vod_frame_processor_t)mp4_builder_frame_writer_process; *frame_processor_state = state; } // set the 'Content-type' header if (submodule_context->mpeg_metadata.stream_count[MEDIA_TYPE_VIDEO]) { content_type->len = sizeof(mp4_video_content_type) - 1; content_type->data = mp4_video_content_type; } else { content_type->len = sizeof(mp4_audio_content_type) - 1; content_type->data = mp4_audio_content_type; } return NGX_OK; }
static ngx_int_t ngx_http_vod_dash_init_frame_processor( ngx_http_vod_submodule_context_t* submodule_context, read_cache_state_t* read_cache_state, segment_writer_t* segment_writer, ngx_http_vod_frame_processor_t* frame_processor, void** frame_processor_state, ngx_str_t* output_buffer, size_t* response_size, ngx_str_t* content_type) { dash_fragment_header_extensions_t header_extensions; fragment_writer_state_t* state; segment_writer_t edash_writer; vod_status_t rc; bool_t size_only = ngx_http_vod_submodule_size_only(submodule_context); if (submodule_context->conf->drm_enabled && submodule_context->request_params.segment_index >= submodule_context->conf->drm_clear_lead_segment_count) { // encyrpted fragment rc = edash_packager_get_fragment_writer( &edash_writer, &submodule_context->request_context, &submodule_context->media_set, submodule_context->request_params.segment_index, segment_writer, submodule_context->media_set.sequences[0].encryption_key, // iv size_only, output_buffer, response_size); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_dash_init_frame_processor: edash_packager_get_fragment_writer failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } segment_writer = &edash_writer; } else { // unencrypted ngx_memzero(&header_extensions, sizeof(header_extensions)); rc = dash_packager_build_fragment_header( &submodule_context->request_context, &submodule_context->media_set, submodule_context->request_params.segment_index, submodule_context->conf->drm_enabled ? 2 : 0, // sample description index &header_extensions, size_only, output_buffer, response_size); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_dash_init_frame_processor: dash_packager_build_fragment_header failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } } // initialize the frame processor if (!size_only || *response_size == 0) { rc = mp4_builder_frame_writer_init( &submodule_context->request_context, submodule_context->media_set.sequences, read_cache_state, segment_writer->write_tail, segment_writer->context, &state); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_dash_init_frame_processor: mp4_builder_frame_writer_init failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } *frame_processor = (ngx_http_vod_frame_processor_t)mp4_builder_frame_writer_process; *frame_processor_state = state; } // set the 'Content-type' header if (submodule_context->media_set.track_count[MEDIA_TYPE_VIDEO] != 0) { content_type->len = sizeof(mp4_video_content_type) - 1; content_type->data = (u_char *)mp4_video_content_type; } else { content_type->len = sizeof(mp4_audio_content_type) - 1; content_type->data = (u_char *)mp4_audio_content_type; } return NGX_OK; }
static ngx_int_t ngx_http_vod_mss_init_frame_processor( ngx_http_vod_submodule_context_t* submodule_context, segment_writer_t* segment_writer, ngx_http_vod_frame_processor_t* frame_processor, void** frame_processor_state, ngx_str_t* output_buffer, size_t* response_size, ngx_str_t* content_type) { fragment_writer_state_t* state; segment_writer_t drm_writer; vod_status_t rc; bool_t reuse_buffers = FALSE; bool_t size_only = ngx_http_vod_submodule_size_only(submodule_context); if (submodule_context->conf->drm_enabled) { rc = mss_playready_get_fragment_writer( &drm_writer, &submodule_context->request_context, &submodule_context->media_set, submodule_context->request_params.segment_index, segment_writer, submodule_context->media_set.sequences[0].encryption_key, // iv size_only, output_buffer, response_size); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_mss_init_frame_processor: mss_playready_get_fragment_writer failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } if (drm_writer.write_tail != NULL) { segment_writer = &drm_writer; reuse_buffers = TRUE; // mp4_encrypt allocates new buffers } } else { rc = mss_packager_build_fragment_header( &submodule_context->request_context, &submodule_context->media_set, submodule_context->request_params.segment_index, 0, NULL, NULL, size_only, output_buffer, response_size); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_mss_init_frame_processor: mss_packager_build_fragment_header failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } } if (!size_only || *response_size == 0) { rc = mp4_builder_frame_writer_init( &submodule_context->request_context, submodule_context->media_set.sequences, segment_writer->write_tail, segment_writer->context, reuse_buffers, &state); if (rc != VOD_OK) { ngx_log_debug1(NGX_LOG_DEBUG_HTTP, submodule_context->request_context.log, 0, "ngx_http_vod_mss_init_frame_processor: mp4_builder_frame_writer_init failed %i", rc); return ngx_http_vod_status_to_ngx_error(rc); } *frame_processor = (ngx_http_vod_frame_processor_t)mp4_builder_frame_writer_process; *frame_processor_state = state; } // set the 'Content-type' header if (submodule_context->media_set.track_count[MEDIA_TYPE_VIDEO]) { content_type->len = sizeof(mp4_video_content_type) - 1; content_type->data = mp4_video_content_type; } else { content_type->len = sizeof(mp4_audio_content_type) - 1; content_type->data = mp4_audio_content_type; } return NGX_OK; }