static inline void init_cache(struct video_output *video) { if (video->info.cache_size > MAX_CACHE_SIZE) video->info.cache_size = MAX_CACHE_SIZE; for (size_t i = 0; i < video->info.cache_size; i++) { struct video_frame *frame; frame = (struct video_frame*)&video->cache[i]; video_frame_init(frame, video->info.format, video->info.width, video->info.height); } video->available_frames = video->info.cache_size; }
void source_frame_init(struct source_frame *frame, enum video_format format, uint32_t width, uint32_t height) { struct video_frame vid_frame; if (!frame) return; video_frame_init(&vid_frame, format, width, height); frame->format = format; frame->width = width; frame->height = height; for (size_t i = 0; i < MAX_AV_PLANES; i++) { frame->data[i] = vid_frame.data[i]; frame->linesize[i] = vid_frame.linesize[i]; } }
static inline bool video_input_init(struct video_input *input, struct video_output *video) { if (input->conversion.width != video->info.width || input->conversion.height != video->info.height || input->conversion.format != video->info.format) { struct video_scale_info from = { .format = video->info.format, .width = video->info.width, .height = video->info.height, }; int ret = video_scaler_create(&input->scaler, &input->conversion, &from, VIDEO_SCALE_FAST_BILINEAR); if (ret != VIDEO_SCALER_SUCCESS) { if (ret == VIDEO_SCALER_BAD_CONVERSION) blog(LOG_ERROR, "video_input_init: Bad " "scale conversion type"); else blog(LOG_ERROR, "video_input_init: Failed to " "create scaler"); return false; } for (size_t i = 0; i < MAX_CONVERT_BUFFERS; i++) video_frame_init(&input->frame[i], input->conversion.format, input->conversion.width, input->conversion.height); } return true; } bool video_output_connect(video_t video, const struct video_scale_info *conversion, void (*callback)(void *param, const struct video_data *frame), void *param) { bool success = false; if (!video || !callback) return false; pthread_mutex_lock(&video->input_mutex); if (video_get_input_idx(video, callback, param) == DARRAY_INVALID) { struct video_input input; memset(&input, 0, sizeof(input)); input.callback = callback; input.param = param; if (conversion) { input.conversion = *conversion; } else { input.conversion.format = video->info.format; input.conversion.width = video->info.width; input.conversion.height = video->info.height; } if (input.conversion.width == 0) input.conversion.width = video->info.width; if (input.conversion.height == 0) input.conversion.height = video->info.height; success = video_input_init(&input, video); if (success) da_push_back(video->inputs, &input); } pthread_mutex_unlock(&video->input_mutex); return success; }