static u_char* hds_calculate_output_offsets_and_write_afra_entries( hds_muxer_state_t* state, uint32_t initial_value, uint32_t afra_entries_base, u_char* p) { hds_muxer_stream_state_t* selected_stream; hds_muxer_stream_state_t* cur_stream; uint32_t cur_offset = initial_value; for (;;) { // choose a stream selected_stream = hds_muxer_choose_stream(state); if (selected_stream == NULL) { break; } // video key frames start with the codec info if (selected_stream->media_type == MEDIA_TYPE_VIDEO && selected_stream->cur_frame->key_frame) { p = hds_write_afra_atom_entry(p, rescale_time(selected_stream->next_frame_dts, selected_stream->timescale, HDS_TIMESCALE), cur_offset + afra_entries_base); cur_offset += state->codec_config_size; } // skip the tag size cur_offset += tag_size_by_media_type[selected_stream->media_type]; // set the offset (points to the beginning of the actual data) *selected_stream->cur_frame_output_offset = cur_offset; selected_stream->cur_frame_output_offset++; // move to the end of the frame cur_offset += selected_stream->cur_frame->size; cur_offset += sizeof(uint32_t); // move to the next frame selected_stream->next_frame_time_offset += selected_stream->cur_frame->duration; selected_stream->next_frame_dts = rescale_time(selected_stream->next_frame_time_offset, selected_stream->timescale, HDS_TIMESCALE); selected_stream->cur_frame++; } // reset the state for (cur_stream = state->first_stream; cur_stream < state->last_stream; cur_stream++) { cur_stream->cur_frame = cur_stream->first_frame; cur_stream->cur_frame_output_offset = cur_stream->first_frame_output_offset; cur_stream->next_frame_time_offset = cur_stream->first_frame_time_offset; cur_stream->next_frame_dts = rescale_time(cur_stream->next_frame_time_offset, cur_stream->timescale, HDS_TIMESCALE); } return p; }
static vod_status_t hds_calculate_output_offsets_and_write_afra_entries( hds_muxer_state_t* state, uint32_t initial_value, uint32_t afra_entries_base, u_char** p) { hds_muxer_stream_state_t* selected_stream; hds_muxer_stream_state_t* cur_stream; uint32_t cur_offset = initial_value; vod_status_t rc; for (;;) { // choose a stream rc = hds_muxer_choose_stream(state, &selected_stream); if (rc != VOD_OK) { if (rc == VOD_NOT_FOUND) { break; // done } return rc; } // video key frames start with the codec info if (selected_stream->cur_frame->key_frame && selected_stream->media_type == MEDIA_TYPE_VIDEO && p != NULL) { *p = hds_write_afra_atom_entry( *p, selected_stream->next_frame_dts + selected_stream->clip_start_time, cur_offset + afra_entries_base); cur_offset += state->codec_config_size; } // skip the tag size cur_offset += tag_size_by_media_type[selected_stream->media_type]; // set the offset (points to the beginning of the actual data) *selected_stream->cur_frame_output_offset = cur_offset; selected_stream->cur_frame_output_offset++; // move to the end of the frame cur_offset += selected_stream->cur_frame->size; cur_offset += sizeof(uint32_t); // move to the next frame selected_stream->next_frame_time_offset += selected_stream->cur_frame->duration; selected_stream->next_frame_dts = rescale_time(selected_stream->next_frame_time_offset, selected_stream->timescale, HDS_TIMESCALE); selected_stream->cur_frame++; } // reset the state if (state->clips_end > state->clips_start + 1) { state->cur_clip = state->clips_start; rc = hds_muxer_reinit_tracks(state); if (rc != VOD_OK) { vod_log_error(VOD_LOG_ERR, state->request_context->log, 0, "hds_calculate_output_offsets_and_write_afra_entries: unexpected - hds_muxer_reinit_tracks failed %i", rc); return rc; } for (cur_stream = state->first_stream; cur_stream < state->last_stream; cur_stream++) { cur_stream->cur_frame_output_offset = cur_stream->first_frame_output_offset; } } else { for (cur_stream = state->first_stream; cur_stream < state->last_stream; cur_stream++) { cur_stream->cur_frame = cur_stream->first_frame; cur_stream->cur_frame_output_offset = cur_stream->first_frame_output_offset; cur_stream->next_frame_time_offset = cur_stream->first_frame_time_offset; cur_stream->next_frame_dts = rescale_time(cur_stream->next_frame_time_offset, cur_stream->timescale, HDS_TIMESCALE); } } return VOD_OK; }