obs_output_t *obs_output_create(const char *id, const char *name, obs_data_t *settings, obs_data_t *hotkey_data) { const struct obs_output_info *info = find_output(id); struct obs_output *output; int ret; output = bzalloc(sizeof(struct obs_output)); pthread_mutex_init_value(&output->interleaved_mutex); pthread_mutex_init_value(&output->delay_mutex); if (pthread_mutex_init(&output->interleaved_mutex, NULL) != 0) goto fail; if (pthread_mutex_init(&output->delay_mutex, NULL) != 0) goto fail; if (!init_output_handlers(output, name, settings, hotkey_data)) goto fail; if (!info) { blog(LOG_ERROR, "Output ID '%s' not found", id); output->info.id = bstrdup(id); output->owns_info_id = true; } else { output->info = *info; } output->video = obs_get_video(); output->audio = obs_get_audio(); if (output->info.get_defaults) output->info.get_defaults(output->context.settings); ret = os_event_init(&output->reconnect_stop_event, OS_EVENT_TYPE_MANUAL); if (ret < 0) goto fail; if (info) output->context.data = info->create(output->context.settings, output); if (!output->context.data) blog(LOG_ERROR, "Failed to create output '%s'!", name); output->reconnect_retry_sec = 2; output->reconnect_retry_max = 20; output->valid = true; output->control = bzalloc(sizeof(obs_weak_output_t)); output->control->output = output; obs_context_data_insert(&output->context, &obs->data.outputs_mutex, &obs->data.first_output); blog(LOG_INFO, "output '%s' (%s) created", name, id); return output; fail: obs_output_destroy(output); return NULL; }
void OBSBasicStatusBar::Activate() { if (!active) { refreshTimer = new QTimer(this); connect(refreshTimer, SIGNAL(timeout()), this, SLOT(UpdateStatusBar())); int skipped = video_output_get_skipped_frames(obs_get_video()); int total = video_output_get_total_frames(obs_get_video()); totalSeconds = 0; lastSkippedFrameCount = 0; startSkippedFrameCount = skipped; startTotalFrameCount = total; refreshTimer->start(1000); active = true; } }
void OBSBasicStatusBar::UpdateStatusBar() { UpdateBandwidth(); UpdateSessionTime(); UpdateDroppedFrames(); int skipped = video_output_get_skipped_frames(obs_get_video()); int total = video_output_get_total_frames(obs_get_video()); skipped -= startSkippedFrameCount; total -= startTotalFrameCount; int diff = skipped - lastSkippedFrameCount; double percentage = double(skipped) / double(total) * 100.0; if (diff && percentage >= 0.1f) showMessage(QTStr("HighResourceUsage"), 4000); lastSkippedFrameCount = skipped; }
static void add_video_encoder_params(struct ffmpeg_muxer *stream, struct dstr *cmd, obs_encoder_t *vencoder) { obs_data_t *settings = obs_encoder_get_settings(vencoder); int bitrate = (int)obs_data_get_int(settings, "bitrate"); video_t *video = obs_get_video(); const struct video_output_info *info = video_output_get_info(video); obs_data_release(settings); dstr_catf(cmd, "%s %d %d %d %d %d ", "h264", bitrate, obs_output_get_width(stream->output), obs_output_get_height(stream->output), (int)info->fps_num, (int)info->fps_den); }