static obs_properties_t rtmp_stream_properties(const char *locale) { obs_properties_t props = obs_properties_create(locale); /* TODO: locale */ obs_properties_add_text(props, "path", "Stream URL", OBS_TEXT_DEFAULT); obs_properties_add_text(props, "key", "Stream Key", OBS_TEXT_PASSWORD); obs_properties_add_text(props, "username", "User Name", OBS_TEXT_DEFAULT); obs_properties_add_text(props, "password", "Password", OBS_TEXT_PASSWORD); return props; }
/** * Get the properties for the capture */ static obs_properties_t *xshm_properties(void *vptr) { XSHM_DATA(vptr); obs_properties_t *props = obs_properties_create(); obs_properties_add_list(props, "screen", obs_module_text("Screen"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); obs_properties_add_bool(props, "show_cursor", obs_module_text("CaptureCursor")); obs_property_t *advanced = obs_properties_add_bool(props, "advanced", obs_module_text("AdvancedSettings")); obs_property_t *server = obs_properties_add_text(props, "server", obs_module_text("XServer"), OBS_TEXT_DEFAULT); obs_property_set_modified_callback(advanced, xshm_toggle_advanced); obs_property_set_modified_callback(server, xshm_server_changed); /* trigger server callback to get screen count ... */ obs_data_t *settings = obs_source_get_settings(data->source); obs_property_modified(server, settings); obs_data_release(settings); return props; }
static obs_properties_t* python_source_properties(void* data) { UNUSED_PARAMETER(data); obs_properties_t* props = obs_properties_create(); obs_properties_add_text(props, "text",obs_module_text("Text"), OBS_TEXT_MULTILINE); return props; }
static obs_properties_t *flv_output_properties(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *props = obs_properties_create(); obs_properties_add_text(props, "path", obs_module_text("FLVOutput.FilePath"), OBS_TEXT_DEFAULT); return props; }
static obs_properties_t *rtmp_custom_properties(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *ppts = obs_properties_create(); obs_property_t *p; obs_properties_add_text(ppts, "server", "URL", OBS_TEXT_DEFAULT); obs_properties_add_text(ppts, "key", obs_module_text("StreamKey"), OBS_TEXT_PASSWORD); p = obs_properties_add_bool(ppts, "use_auth", obs_module_text("UseAuth")); obs_properties_add_text(ppts, "username", obs_module_text("Username"), OBS_TEXT_DEFAULT); obs_properties_add_text(ppts, "password", obs_module_text("Password"), OBS_TEXT_PASSWORD); obs_property_set_modified_callback(p, use_auth_modified); return ppts; }
obs_properties_t *obstudio_infowriter_properties(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *props = obs_properties_create(); obs_properties_add_path(props, setting_file, obs_module_text("Logfile"), OBS_PATH_FILE_SAVE, logfile_filter, NULL); obs_properties_add_text(props, setting_format, obs_module_text("Format"), OBS_TEXT_DEFAULT); return props; }
static obs_properties_t *ft2_source_properties(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *props = obs_properties_create(); //obs_property_t *prop; // TODO: // Scrolling. Can't think of a way to do it with the render // targets currently being broken. (0.4.2) // Better/pixel shader outline/drop shadow // Some way to pull text files from network, I dunno obs_properties_add_font(props, "font", obs_module_text("Font")); obs_properties_add_text(props, "text", obs_module_text("Text"), OBS_TEXT_MULTILINE); obs_properties_add_bool(props, "from_file", obs_module_text("ReadFromFile")); obs_properties_add_bool(props, "log_mode", obs_module_text("ChatLogMode")); obs_properties_add_path(props, "text_file", obs_module_text("TextFile"), OBS_PATH_FILE, obs_module_text("TextFileFilter"), NULL); obs_properties_add_color(props, "color1", obs_module_text("Color1")); obs_properties_add_color(props, "color2", obs_module_text("Color2")); obs_properties_add_bool(props, "outline", obs_module_text("Outline")); obs_properties_add_bool(props, "drop_shadow", obs_module_text("DropShadow")); obs_properties_add_int(props, "custom_width", obs_module_text("CustomWidth"), 0, 4096, 1); obs_properties_add_bool(props, "word_wrap", obs_module_text("WordWrap")); return props; }
static obs_properties_t *obs_x264_props(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *props = obs_properties_create(); obs_property_t *list; obs_property_t *p; obs_properties_add_int(props, "bitrate", TEXT_BITRATE, 50, 10000000, 1); p = obs_properties_add_bool(props, "use_bufsize", TEXT_CUSTOM_BUF); obs_property_set_modified_callback(p, use_bufsize_modified); obs_properties_add_int(props, "buffer_size", TEXT_BUF_SIZE, 0, 10000000, 1); obs_properties_add_int(props, "keyint_sec", TEXT_KEYINT_SEC, 0, 20, 1); p = obs_properties_add_bool(props, "cbr", TEXT_USE_CBR); obs_properties_add_int(props, "crf", TEXT_CRF, 0, 51, 1); obs_property_set_modified_callback(p, use_cbr_modified); list = obs_properties_add_list(props, "preset", TEXT_PRESET, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING); add_strings(list, x264_preset_names); list = obs_properties_add_list(props, "profile", TEXT_PROFILE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING); obs_property_list_add_string(list, TEXT_NONE, ""); obs_property_list_add_string(list, "baseline", "baseline"); obs_property_list_add_string(list, "main", "main"); obs_property_list_add_string(list, "high", "high"); list = obs_properties_add_list(props, "tune", TEXT_TUNE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING); obs_property_list_add_string(list, TEXT_NONE, ""); add_strings(list, x264_tune_names); obs_properties_add_bool(props, "vfr", TEXT_VFR); obs_properties_add_text(props, "x264opts", TEXT_X264_OPTS, OBS_TEXT_DEFAULT); return props; }
static obs_properties_t *qtwebkit_get_properties(void *) { obs_properties_t *props = obs_properties_create(); obs_property_t *prop = obs_properties_add_bool(props, "is_local_file", obs_module_text("LocalFile")); obs_property_set_modified_callback(prop, is_local_file_modified); obs_properties_add_path(props, "local_file", obs_module_text("LocalFile"), OBS_PATH_FILE, "*.*", nullptr); obs_properties_add_text(props, "url", obs_module_text("URL"), OBS_TEXT_DEFAULT); obs_properties_add_int(props, "width", obs_module_text("Width"), 1, 4096, 1); obs_properties_add_int(props, "height", obs_module_text("Height"), 1, 4096, 1); obs_properties_add_int(props, "fps", obs_module_text("FPS"), 1, 60, 1); obs_properties_add_path(props, "css_file", obs_module_text("CustomCSS"), OBS_PATH_FILE, "*.css", nullptr); obs_properties_add_button(props, "reload", obs_module_text("Reload"), reload_button_clicked); return props; }
static bool write_packet(struct ffmpeg_muxer *stream, struct encoder_packet *packet) { bool is_video = packet->type == OBS_ENCODER_VIDEO; size_t ret; struct ffm_packet_info info = { .pts = packet->pts, .dts = packet->dts, .size = (uint32_t)packet->size, .index = (int)packet->track_idx, .type = is_video ? FFM_PACKET_VIDEO : FFM_PACKET_AUDIO, .keyframe = packet->keyframe }; ret = os_process_pipe_write(stream->pipe, (const uint8_t*)&info, sizeof(info)); if (ret != sizeof(info)) { warn("os_process_pipe_write for info structure failed"); signal_failure(stream); return false; } ret = os_process_pipe_write(stream->pipe, packet->data, packet->size); if (ret != packet->size) { warn("os_process_pipe_write for packet data failed"); signal_failure(stream); return false; } return true; } static bool send_audio_headers(struct ffmpeg_muxer *stream, obs_encoder_t *aencoder, size_t idx) { struct encoder_packet packet = { .type = OBS_ENCODER_AUDIO, .timebase_den = 1, .track_idx = idx }; obs_encoder_get_extra_data(aencoder, &packet.data, &packet.size); return write_packet(stream, &packet); } static bool send_video_headers(struct ffmpeg_muxer *stream) { obs_encoder_t *vencoder = obs_output_get_video_encoder(stream->output); struct encoder_packet packet = { .type = OBS_ENCODER_VIDEO, .timebase_den = 1 }; obs_encoder_get_extra_data(vencoder, &packet.data, &packet.size); return write_packet(stream, &packet); } static bool send_headers(struct ffmpeg_muxer *stream) { obs_encoder_t *aencoder; size_t idx = 0; if (!send_video_headers(stream)) return false; do { aencoder = obs_output_get_audio_encoder(stream->output, idx); if (aencoder) { if (!send_audio_headers(stream, aencoder, idx)) { return false; } idx++; } } while (aencoder); return true; } static void ffmpeg_mux_data(void *data, struct encoder_packet *packet) { struct ffmpeg_muxer *stream = data; if (!stream->active) return; if (!stream->sent_headers) { if (!send_headers(stream)) return; stream->sent_headers = true; } write_packet(stream, packet); } static obs_properties_t *ffmpeg_mux_properties(void *unused) { UNUSED_PARAMETER(unused); obs_properties_t *props = obs_properties_create(); obs_properties_add_text(props, "path", obs_module_text("FilePath"), OBS_TEXT_DEFAULT); return props; }
static obs_properties_t *ffmpeg_source_getproperties(void *data) { struct dstr filter = {0}; UNUSED_PARAMETER(data); obs_properties_t *props = obs_properties_create(); obs_properties_set_flags(props, OBS_PROPERTIES_DEFER_UPDATE); obs_property_t *prop; // use this when obs allows non-readonly paths prop = obs_properties_add_bool(props, "is_local_file", obs_module_text("LocalFile")); obs_property_set_modified_callback(prop, is_local_file_modified); dstr_copy(&filter, obs_module_text("MediaFileFilter.AllMediaFiles")); dstr_cat(&filter, media_filter); dstr_cat(&filter, obs_module_text("MediaFileFilter.VideoFiles")); dstr_cat(&filter, video_filter); dstr_cat(&filter, obs_module_text("MediaFileFilter.AudioFiles")); dstr_cat(&filter, audio_filter); dstr_cat(&filter, obs_module_text("MediaFileFilter.AllFiles")); dstr_cat(&filter, " (*.*)"); obs_properties_add_path(props, "local_file", obs_module_text("LocalFile"), OBS_PATH_FILE, filter.array, NULL); dstr_free(&filter); obs_properties_add_bool(props, "looping", obs_module_text("Looping")); obs_properties_add_bool(props, "restart_on_activate", obs_module_text("RestartWhenActivated")); obs_properties_add_text(props, "input", obs_module_text("Input"), OBS_TEXT_DEFAULT); obs_properties_add_text(props, "input_format", obs_module_text("InputFormat"), OBS_TEXT_DEFAULT); obs_properties_add_bool(props, "hw_decode", obs_module_text("HardwareDecode")); obs_properties_add_bool(props, "clear_on_media_end", obs_module_text("ClearOnMediaEnd")); prop = obs_properties_add_bool(props, "advanced", obs_module_text("Advanced")); obs_property_set_modified_callback(prop, is_advanced_modified); obs_properties_add_bool(props, "force_scale", obs_module_text("ForceFormat")); prop = obs_properties_add_int(props, "audio_buffer_size", obs_module_text("AudioBufferSize"), 1, 9999, 1); obs_property_set_visible(prop, false); prop = obs_properties_add_int(props, "video_buffer_size", obs_module_text("VideoBufferSize"), 1, 9999, 1); obs_property_set_visible(prop, false); prop = obs_properties_add_list(props, "frame_drop", obs_module_text("FrameDropping"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); obs_property_list_add_int(prop, obs_module_text("DiscardNone"), AVDISCARD_NONE); obs_property_list_add_int(prop, obs_module_text("DiscardDefault"), AVDISCARD_DEFAULT); obs_property_list_add_int(prop, obs_module_text("DiscardNonRef"), AVDISCARD_NONREF); obs_property_list_add_int(prop, obs_module_text("DiscardBiDir"), AVDISCARD_BIDIR); #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(55, 67, 100) obs_property_list_add_int(prop, obs_module_text("DiscardNonIntra"), AVDISCARD_NONINTRA); #endif obs_property_list_add_int(prop, obs_module_text("DiscardNonKey"), AVDISCARD_NONKEY); obs_property_list_add_int(prop, obs_module_text("DiscardAll"), AVDISCARD_ALL); obs_property_set_visible(prop, false); return props; }
static obs_properties_t *ffmpeg_source_getproperties(void *data) { struct ffmpeg_source *s = data; struct dstr filter = {0}; struct dstr path = {0}; UNUSED_PARAMETER(data); obs_properties_t *props = obs_properties_create(); obs_properties_set_flags(props, OBS_PROPERTIES_DEFER_UPDATE); obs_property_t *prop; // use this when obs allows non-readonly paths prop = obs_properties_add_bool(props, "is_local_file", obs_module_text("LocalFile")); obs_property_set_modified_callback(prop, is_local_file_modified); dstr_copy(&filter, obs_module_text("MediaFileFilter.AllMediaFiles")); dstr_cat(&filter, media_filter); dstr_cat(&filter, obs_module_text("MediaFileFilter.VideoFiles")); dstr_cat(&filter, video_filter); dstr_cat(&filter, obs_module_text("MediaFileFilter.AudioFiles")); dstr_cat(&filter, audio_filter); dstr_cat(&filter, obs_module_text("MediaFileFilter.AllFiles")); dstr_cat(&filter, " (*.*)"); if (s && s->input && *s->input) { const char *slash; dstr_copy(&path, s->input); dstr_replace(&path, "\\", "/"); slash = strrchr(path.array, '/'); if (slash) dstr_resize(&path, slash - path.array + 1); } obs_properties_add_path(props, "local_file", obs_module_text("LocalFile"), OBS_PATH_FILE, filter.array, path.array); dstr_free(&filter); dstr_free(&path); prop = obs_properties_add_bool(props, "looping", obs_module_text("Looping")); obs_properties_add_bool(props, "restart_on_activate", obs_module_text("RestartWhenActivated")); obs_properties_add_text(props, "input", obs_module_text("Input"), OBS_TEXT_DEFAULT); obs_properties_add_text(props, "input_format", obs_module_text("InputFormat"), OBS_TEXT_DEFAULT); #ifndef __APPLE__ obs_properties_add_bool(props, "hw_decode", obs_module_text("HardwareDecode")); #endif obs_properties_add_bool(props, "clear_on_media_end", obs_module_text("ClearOnMediaEnd")); prop = obs_properties_add_bool(props, "close_when_inactive", obs_module_text("CloseFileWhenInactive")); obs_property_set_long_description(prop, obs_module_text("CloseFileWhenInactive.ToolTip")); prop = obs_properties_add_list(props, "color_range", obs_module_text("ColorRange"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); obs_property_list_add_int(prop, obs_module_text("ColorRange.Auto"), VIDEO_RANGE_DEFAULT); obs_property_list_add_int(prop, obs_module_text("ColorRange.Partial"), VIDEO_RANGE_PARTIAL); obs_property_list_add_int(prop, obs_module_text("ColorRange.Full"), VIDEO_RANGE_FULL); return props; }