aboutsummaryrefslogtreecommitdiffstats
path: root/bmusb-source.cpp
blob: 47ec09bd73c3a89f4831875ed2c9d2181e8c52a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdlib.h>
#include <obs.h>
#include <obs-module.h>
#include <bmusb/bmusb.h>

#include <stdio.h>

using bmusb::BMUSBCapture;
using bmusb::FrameAllocator;
using bmusb::VideoFormat;
using bmusb::AudioFormat;

struct bmusb_inst {
	obs_source_t *source;
	BMUSBCapture *capture;
	bool         initialized;
};

static const char *bmusb_getname(void *unused)
{
	UNUSED_PARAMETER(unused);
	return "Blackmagic USB3 source (bmusb)";
}

static void bmusb_destroy(void *data)
{
	struct bmusb_inst *rt = (bmusb_inst *) data;

	if (rt) {
		if (rt->initialized) {
			BMUSBCapture::stop_bm_thread();
			delete rt->capture;
		}

		bfree(rt);
	}
}

static void *bmusb_create(obs_data_t *settings, obs_source_t *source)
{
	struct bmusb_inst *rt = (bmusb_inst *) bzalloc(sizeof(struct bmusb_inst));
	rt->source = source;

	rt->capture = new BMUSBCapture(0); // @TODO select card
	rt->capture->set_pixel_format(bmusb::PixelFormat_8BitYCbCr);
	rt->capture->set_frame_callback(
		[rt](uint16_t timecode,
			FrameAllocator::Frame video_frame, size_t video_offset, VideoFormat video_format,
			FrameAllocator::Frame audio_frame, size_t audio_offset, AudioFormat audio_format
		) {
			printf("got fraem %d\n", timecode);
			UNUSED_PARAMETER(video_format);
			UNUSED_PARAMETER(audio_format);
			rt->capture->get_video_frame_allocator()->release_frame(video_frame);
			rt->capture->get_audio_frame_allocator()->release_frame(audio_frame);
		}
	);
	rt->capture->configure_card();
	BMUSBCapture::start_bm_thread();
	rt->capture->start_bm_capture();

	rt->initialized = true;

	UNUSED_PARAMETER(settings);
	UNUSED_PARAMETER(source);
	return rt;
}

struct obs_source_info bmusb_source_info = {
	.id           = "bmusb",
	.type         = OBS_SOURCE_TYPE_INPUT,
	.output_flags = OBS_SOURCE_ASYNC_VIDEO,
	.get_name     = bmusb_getname,
	.create       = bmusb_create,
	.destroy      = bmusb_destroy,
};

OBS_DECLARE_MODULE()

extern "C" bool obs_module_load(void)
{
	obs_register_source(&bmusb_source_info);
	return true;
}