/** Update source flags depending on the settings */ static void v4l2_update_source_flags(struct v4l2_data *data, obs_data_t *settings) { uint32_t flags = obs_source_get_flags(data->source); flags = (obs_data_get_bool(settings, "buffering")) ? flags & ~OBS_SOURCE_FLAG_UNBUFFERED : flags | OBS_SOURCE_FLAG_UNBUFFERED; obs_source_set_flags(data->source, flags); }
static void decklink_enable_buffering(DeckLink *decklink, bool enabled) { obs_source_t *source = decklink->GetSource(); uint32_t flags = obs_source_get_flags(source); if (enabled) flags &= ~OBS_SOURCE_FLAG_UNBUFFERED; else flags |= OBS_SOURCE_FLAG_UNBUFFERED; obs_source_set_flags(source, flags); }
void OBSAdvAudioCtrl::downmixMonoChanged(bool checked) { uint32_t flags = obs_source_get_flags(source); bool forceMonoActive = (flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0; if (forceMonoActive != checked) { if (checked) flags |= OBS_SOURCE_FLAG_FORCE_MONO; else flags &= ~OBS_SOURCE_FLAG_FORCE_MONO; obs_source_set_flags(source, flags); } }
/** * Initialize the v4l2 device * * This function: * - tries to open the device * - sets pixelformat and requested resolution * - sets the requested framerate * - maps the buffers * - starts the capture thread */ static void v4l2_init(struct v4l2_data *data) { uint32_t input_caps; int fps_num, fps_denom; blog(LOG_INFO, "Start capture from %s", data->device_id); data->dev = v4l2_open(data->device_id, O_RDWR | O_NONBLOCK); if (data->dev == -1) { blog(LOG_ERROR, "Unable to open device"); goto fail; } /* set input */ if (v4l2_set_input(data->dev, &data->input) < 0) { blog(LOG_ERROR, "Unable to set input %d", data->input); goto fail; } blog(LOG_INFO, "Input: %d", data->input); if (v4l2_get_input_caps(data->dev, -1, &input_caps) < 0) { blog(LOG_ERROR, "Unable to get input capabilities"); goto fail; } /* set video standard if supported */ if (input_caps & V4L2_IN_CAP_STD) { if (v4l2_set_standard(data->dev, &data->standard) < 0) { blog(LOG_ERROR, "Unable to set video standard"); goto fail; } data->resolution = -1; data->framerate = -1; } /* set dv timing if supported */ #ifdef __FreeBSD__ if (input_caps & V4L2_IN_CAP_CUSTOM_TIMINGS) { #else if (input_caps & V4L2_IN_CAP_DV_TIMINGS) { #endif if (v4l2_set_dv_timing(data->dev, &data->dv_timing) < 0) { blog(LOG_ERROR, "Unable to set dv timing"); goto fail; } data->resolution = -1; data->framerate = -1; } /* set pixel format and resolution */ if (v4l2_set_format(data->dev, &data->resolution, &data->pixfmt, &data->linesize) < 0) { blog(LOG_ERROR, "Unable to set format"); goto fail; } if (v4l2_to_obs_video_format(data->pixfmt) == VIDEO_FORMAT_NONE) { blog(LOG_ERROR, "Selected video format not supported"); goto fail; } v4l2_unpack_tuple(&data->width, &data->height, data->resolution); blog(LOG_INFO, "Resolution: %dx%d", data->width, data->height); blog(LOG_INFO, "Pixelformat: %s", V4L2_FOURCC_STR(data->pixfmt)); blog(LOG_INFO, "Linesize: %d Bytes", data->linesize); /* set framerate */ if (v4l2_set_framerate(data->dev, &data->framerate) < 0) { blog(LOG_ERROR, "Unable to set framerate"); goto fail; } v4l2_unpack_tuple(&fps_num, &fps_denom, data->framerate); blog(LOG_INFO, "Framerate: %.2f fps", (float) fps_denom / fps_num); /* map buffers */ if (v4l2_create_mmap(data->dev, &data->buffers) < 0) { blog(LOG_ERROR, "Failed to map buffers"); goto fail; } /* start the capture thread */ if (os_event_init(&data->event, OS_EVENT_TYPE_MANUAL) != 0) goto fail; if (pthread_create(&data->thread, NULL, v4l2_thread, data) != 0) goto fail; return; fail: blog(LOG_ERROR, "Initialization failed"); v4l2_terminate(data); } /** Update source flags depending on the settings */ static void v4l2_update_source_flags(struct v4l2_data *data, obs_data_t *settings) { uint32_t flags = obs_source_get_flags(data->source); flags = (obs_data_get_bool(settings, "buffering")) ? flags & ~OBS_SOURCE_FLAG_UNBUFFERED : flags | OBS_SOURCE_FLAG_UNBUFFERED; obs_source_set_flags(data->source, flags); }