/** * @brief finish segment * @param context segmenter context * @return 0 on success, negative error code on failure */ static int finish_segment(SegmenterContext *context) { AVFormatContext *output = context->output; size_t size; int ret; avio_flush(output->pb); size = avio_size(output->pb); avio_close(output->pb); context->max_bitrate = max(context->max_bitrate, size * 8 / context->segment_duration); context->avg_bitrate = (context->avg_bitrate * context->segment_index + (size * 8 / context->segment_duration)) / (context->segment_index + 1); if ((ret = set_segment_duration(context, context->segment_index, context->segment_duration))) { return ret; } context->segment_index++; context->segment_duration = 0; return 0; }
bool DashVideoSegmenter::init(size_t segmentDuration, size_t timeBase, size_t sampleDuration, size_t width, size_t height, size_t framerate) { uint8_t i2error; this->width = width; this->height = height; this->framerate = framerate; i2error = generate_context(&dashContext, VIDEO_TYPE); if (i2error != I2OK) { return false; } i2error = fill_video_context(&dashContext, width, height, framerate, timeBase, sampleDuration); if (i2error != I2OK) { return false; } set_segment_duration(segmentDuration, &dashContext); return true; }