int video_output_open(video_t *video, struct video_output_info *info) { struct video_output *out; if (!valid_video_params(info)) return VIDEO_OUTPUT_INVALIDPARAM; out = bzalloc(sizeof(struct video_output)); memcpy(&out->info, info, sizeof(struct video_output_info)); out->frame_time = (uint64_t)(1000000000.0 * (double)info->fps_den / (double)info->fps_num); out->initialized = false; if (pthread_mutex_init(&out->data_mutex, NULL) != 0) goto fail; if (pthread_mutex_init(&out->input_mutex, NULL) != 0) goto fail; if (event_init(&out->stop_event, EVENT_TYPE_MANUAL) != 0) goto fail; if (event_init(&out->update_event, EVENT_TYPE_AUTO) != 0) goto fail; if (pthread_create(&out->thread, NULL, video_thread, out) != 0) goto fail; out->initialized = true; *video = out; return VIDEO_OUTPUT_SUCCESS; fail: video_output_close(out); return VIDEO_OUTPUT_FAIL; }
int video_output_open(video_t **video, struct video_output_info *info) { struct video_output *out; pthread_mutexattr_t attr; if (!valid_video_params(info)) return VIDEO_OUTPUT_INVALIDPARAM; out = bzalloc(sizeof(struct video_output)); if (!out) goto fail; memcpy(&out->info, info, sizeof(struct video_output_info)); out->frame_time = (uint64_t)(1000000000.0 * (double)info->fps_den / (double)info->fps_num); out->initialized = false; if (pthread_mutexattr_init(&attr) != 0) goto fail; if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) goto fail; if (pthread_mutex_init(&out->data_mutex, &attr) != 0) goto fail; if (pthread_mutex_init(&out->input_mutex, &attr) != 0) goto fail; if (os_sem_init(&out->update_semaphore, 0) != 0) goto fail; if (pthread_create(&out->thread, NULL, video_thread, out) != 0) goto fail; init_cache(out); out->initialized = true; *video = out; return VIDEO_OUTPUT_SUCCESS; fail: video_output_close(out); return VIDEO_OUTPUT_FAIL; }