static bool init_connect(struct rtmp_stream *stream) { obs_service_t *service; obs_data_t *settings; if (stopping(stream)) pthread_join(stream->send_thread, NULL); free_packets(stream); service = obs_output_get_service(stream->output); if (!service) return false; os_atomic_set_bool(&stream->disconnected, false); stream->total_bytes_sent = 0; stream->dropped_frames = 0; stream->min_drop_dts_usec= 0; stream->min_priority = 0; settings = obs_output_get_settings(stream->output); dstr_copy(&stream->path, obs_service_get_url(service)); dstr_copy(&stream->key, obs_service_get_key(service)); dstr_copy(&stream->username, obs_service_get_username(service)); dstr_copy(&stream->password, obs_service_get_password(service)); dstr_depad(&stream->path); dstr_depad(&stream->key); stream->drop_threshold_usec = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD) * 1000; stream->max_shutdown_time_sec = (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC); obs_data_release(settings); return true; }
static bool init_connect(struct rtmp_stream *stream) { obs_service_t *service; obs_data_t *settings; const char *bind_ip; int64_t drop_p; int64_t drop_b; if (stopping(stream)) { pthread_join(stream->send_thread, NULL); } free_packets(stream); service = obs_output_get_service(stream->output); if (!service) return false; os_atomic_set_bool(&stream->disconnected, false); stream->total_bytes_sent = 0; stream->dropped_frames = 0; stream->min_priority = 0; settings = obs_output_get_settings(stream->output); dstr_copy(&stream->path, obs_service_get_url(service)); dstr_copy(&stream->key, obs_service_get_key(service)); dstr_copy(&stream->username, obs_service_get_username(service)); dstr_copy(&stream->password, obs_service_get_password(service)); dstr_depad(&stream->path); dstr_depad(&stream->key); drop_b = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD); drop_p = (int64_t)obs_data_get_int(settings, OPT_PFRAME_DROP_THRESHOLD); stream->max_shutdown_time_sec = (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC); if (drop_p < (drop_b + 200)) drop_p = drop_b + 200; stream->drop_threshold_usec = 1000 * drop_b; stream->pframe_drop_threshold_usec = 1000 * drop_p; bind_ip = obs_data_get_string(settings, OPT_BIND_IP); dstr_copy(&stream->bind_ip, bind_ip); stream->new_socket_loop = obs_data_get_bool(settings, OPT_NEWSOCKETLOOP_ENABLED); stream->low_latency_mode = obs_data_get_bool(settings, OPT_LOWLATENCY_ENABLED); obs_data_release(settings); return true; }
const char *get_font_path(const char *family, uint16_t size, const char *style, uint32_t flags, FT_Long *idx) { const char *best_path = NULL; double best_rating = 0.0; struct dstr face_and_style = {0}; struct dstr style_str = {0}; bool bold = !!(flags & OBS_FONT_BOLD); bool italic = !!(flags & OBS_FONT_ITALIC); if (!family || !*family) return NULL; if (style) { dstr_copy(&style_str, style); dstr_replace(&style_str, "Bold", ""); dstr_replace(&style_str, "Italic", ""); dstr_replace(&style_str, " ", " "); dstr_depad(&style_str); } dstr_copy(&face_and_style, family); if (!dstr_is_empty(&style_str)) { dstr_cat(&face_and_style, " "); dstr_cat_dstr(&face_and_style, &style_str); } for (size_t i = 0; i < font_list.num; i++) { struct font_path_info *info = font_list.array + i; double rating = (double)get_rating(info, &face_and_style); if (rating < info->face_len) continue; if (info->is_bitmap) { int best_diff = 1000; for (size_t j = 0; j < info->num_sizes; j++) { int diff = abs(info->sizes[j] - size); if (diff < best_diff) best_diff = diff; } rating /= (double)(best_diff + 1.0); } if (info->bold == bold) rating += 1.0; if (info->italic == italic) rating += 1.0; if (rating > best_rating) { best_path = info->path; *idx = info->index; best_rating = rating; } } dstr_free(&style_str); dstr_free(&face_and_style); return best_path; }
static void add_font_path(FT_Face face, FT_Long idx, const char *family_in, const char *style_in, const char *path) { struct dstr face_and_style = {0}; struct font_path_info info; if (!family_in || !path) return; dstr_copy(&face_and_style, family_in); if (face->style_name) { struct dstr style = {0}; dstr_copy(&style, style_in); dstr_replace(&style, "Bold", ""); dstr_replace(&style, "Italic", ""); dstr_replace(&style, " ", " "); dstr_depad(&style); if (!dstr_is_empty(&style)) { dstr_cat(&face_and_style, " "); dstr_cat_dstr(&face_and_style, &style); } dstr_free(&style); } info.face_and_style = face_and_style.array; info.full_len = face_and_style.len; info.face_len = strlen(family_in); info.is_bitmap = !!(face->face_flags & FT_FACE_FLAG_FIXED_SIZES); info.bold = !!(face->style_flags & FT_STYLE_FLAG_BOLD); info.italic = !!(face->style_flags & FT_STYLE_FLAG_ITALIC); info.index = idx; info.path = bstrdup(path); create_bitmap_sizes(&info, face); da_push_back(font_list, &info); /*blog(LOG_DEBUG, "name: %s\n\tstyle: %s\n\tpath: %s\n", family_in, style_in, path);*/ }
void obs_hotkeys_set_translations_s( struct obs_hotkeys_translations *translations, size_t size) { #define ADD_TRANSLATION(key_name, var_name) \ if (t.var_name) \ obs_set_key_translation(key_name, t.var_name); struct obs_hotkeys_translations t = {0}; struct dstr numpad = {0}; struct dstr mouse = {0}; struct dstr button = {0}; if (!translations) { return; } memcpy(&t, translations, (size < sizeof(t)) ? size : sizeof(t)); ADD_TRANSLATION(OBS_KEY_INSERT, insert); ADD_TRANSLATION(OBS_KEY_DELETE, del); ADD_TRANSLATION(OBS_KEY_HOME, home); ADD_TRANSLATION(OBS_KEY_END, end); ADD_TRANSLATION(OBS_KEY_PAGEUP, page_up); ADD_TRANSLATION(OBS_KEY_PAGEDOWN, page_down); ADD_TRANSLATION(OBS_KEY_NUMLOCK, num_lock); ADD_TRANSLATION(OBS_KEY_SCROLLLOCK, scroll_lock); ADD_TRANSLATION(OBS_KEY_CAPSLOCK, caps_lock); ADD_TRANSLATION(OBS_KEY_BACKSPACE, backspace); ADD_TRANSLATION(OBS_KEY_TAB, tab); ADD_TRANSLATION(OBS_KEY_PRINT, print); ADD_TRANSLATION(OBS_KEY_PAUSE, pause); ADD_TRANSLATION(OBS_KEY_SHIFT, shift); ADD_TRANSLATION(OBS_KEY_ALT, alt); ADD_TRANSLATION(OBS_KEY_CONTROL, control); ADD_TRANSLATION(OBS_KEY_META, meta); ADD_TRANSLATION(OBS_KEY_MENU, menu); ADD_TRANSLATION(OBS_KEY_SPACE, space); #ifdef __APPLE__ const char *numpad_str = t.apple_keypad_num; ADD_TRANSLATION(OBS_KEY_NUMSLASH, apple_keypad_divide); ADD_TRANSLATION(OBS_KEY_NUMASTERISK, apple_keypad_multiply); ADD_TRANSLATION(OBS_KEY_NUMMINUS, apple_keypad_minus); ADD_TRANSLATION(OBS_KEY_NUMPLUS, apple_keypad_plus); ADD_TRANSLATION(OBS_KEY_NUMPERIOD, apple_keypad_decimal); ADD_TRANSLATION(OBS_KEY_NUMEQUAL, apple_keypad_equal); #else const char *numpad_str = t.numpad_num; ADD_TRANSLATION(OBS_KEY_NUMSLASH, numpad_divide); ADD_TRANSLATION(OBS_KEY_NUMASTERISK, numpad_multiply); ADD_TRANSLATION(OBS_KEY_NUMMINUS, numpad_minus); ADD_TRANSLATION(OBS_KEY_NUMPLUS, numpad_plus); ADD_TRANSLATION(OBS_KEY_NUMPERIOD, numpad_decimal); #endif if (numpad_str) { dstr_copy(&numpad, numpad_str); dstr_depad(&numpad); if (dstr_find(&numpad, "%1") == NULL) { dstr_cat(&numpad, " %1"); } #define ADD_NUMPAD_NUM(idx) \ dstr_copy_dstr(&button, &numpad); \ dstr_replace(&button, "%1", #idx); \ obs_set_key_translation(OBS_KEY_NUM ## idx, button.array) ADD_NUMPAD_NUM(0); ADD_NUMPAD_NUM(1); ADD_NUMPAD_NUM(2); ADD_NUMPAD_NUM(3); ADD_NUMPAD_NUM(4); ADD_NUMPAD_NUM(5); ADD_NUMPAD_NUM(6); ADD_NUMPAD_NUM(7); ADD_NUMPAD_NUM(8); ADD_NUMPAD_NUM(9); } if (t.mouse_num) { dstr_copy(&mouse, t.mouse_num); dstr_depad(&mouse); if (dstr_find(&mouse, "%1") == NULL) { dstr_cat(&mouse, " %1"); } #define ADD_MOUSE_NUM(idx) \ dstr_copy_dstr(&button, &mouse); \ dstr_replace(&button, "%1", #idx); \ obs_set_key_translation(OBS_KEY_MOUSE ## idx, button.array) ADD_MOUSE_NUM(1); ADD_MOUSE_NUM(2); ADD_MOUSE_NUM(3); ADD_MOUSE_NUM(4); ADD_MOUSE_NUM(5); ADD_MOUSE_NUM(6); ADD_MOUSE_NUM(7); ADD_MOUSE_NUM(8); ADD_MOUSE_NUM(9); ADD_MOUSE_NUM(10); ADD_MOUSE_NUM(11); ADD_MOUSE_NUM(12); ADD_MOUSE_NUM(13); ADD_MOUSE_NUM(14); ADD_MOUSE_NUM(15); ADD_MOUSE_NUM(16); ADD_MOUSE_NUM(17); ADD_MOUSE_NUM(18); ADD_MOUSE_NUM(19); ADD_MOUSE_NUM(20); ADD_MOUSE_NUM(21); ADD_MOUSE_NUM(22); ADD_MOUSE_NUM(23); ADD_MOUSE_NUM(24); ADD_MOUSE_NUM(25); ADD_MOUSE_NUM(26); ADD_MOUSE_NUM(27); ADD_MOUSE_NUM(28); ADD_MOUSE_NUM(29); } dstr_free(&numpad); dstr_free(&mouse); dstr_free(&button); }