obs-encoder.c 17.3 KB
Newer Older
1
/******************************************************************************
2
    Copyright (C) 2013-2014 by Hugh Bailey <obs.jim@gmail.com>
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/

#include "obs.h"
J
jp9000 已提交
19
#include "obs-internal.h"
20

21
struct obs_encoder_info *find_encoder(const char *id)
22 23
{
	for (size_t i = 0; i < obs->encoder_types.num; i++) {
J
jp9000 已提交
24
		struct obs_encoder_info *info = obs->encoder_types.array+i;
25 26 27 28 29 30 31 32

		if (strcmp(info->id, id) == 0)
			return info;
	}

	return NULL;
}

33
const char *obs_encoder_get_display_name(const char *id)
34
{
J
jp9000 已提交
35
	struct obs_encoder_info *ei = find_encoder(id);
36
	return ei ? ei->getname() : NULL;
37 38
}

39
static bool init_encoder(struct obs_encoder *encoder, const char *name,
40
		obs_data_t settings)
41
{
J
jp9000 已提交
42 43 44
	pthread_mutex_init_value(&encoder->callbacks_mutex);
	pthread_mutex_init_value(&encoder->outputs_mutex);

45 46
	if (!obs_context_data_init(&encoder->context, settings, name))
		return false;
47 48
	if (pthread_mutex_init(&encoder->callbacks_mutex, NULL) != 0)
		return false;
J
jp9000 已提交
49 50
	if (pthread_mutex_init(&encoder->outputs_mutex, NULL) != 0)
		return false;
51

J
jp9000 已提交
52
	if (encoder->info.defaults)
53
		encoder->info.defaults(encoder->context.settings);
54 55 56 57 58 59

	return true;
}

static struct obs_encoder *create_encoder(const char *id,
		enum obs_encoder_type type, const char *name,
60
		obs_data_t settings)
61 62
{
	struct obs_encoder *encoder;
J
jp9000 已提交
63
	struct obs_encoder_info *ei = find_encoder(id);
64
	bool success;
65

66
	if (!ei || ei->type != type)
67 68
		return NULL;

69
	encoder = bzalloc(sizeof(struct obs_encoder));
70
	encoder->info = *ei;
71

72 73
	success = init_encoder(encoder, name, settings);
	if (!success) {
74
		obs_encoder_destroy(encoder);
75
		encoder = NULL;
76 77
	}

78 79 80 81
	obs_context_data_insert(&encoder->context,
			&obs->data.encoders_mutex,
			&obs->data.first_encoder);

82
	blog(LOG_INFO, "encoder '%s' (%s) created", name, id);
83 84
	return encoder;
}
J
jp9000 已提交
85

86
obs_encoder_t obs_video_encoder_create(const char *id, const char *name,
87
		obs_data_t settings)
88
{
89 90
	if (!name || !id) return NULL;
	return create_encoder(id, OBS_ENCODER_VIDEO, name, settings);
91 92
}

93
obs_encoder_t obs_audio_encoder_create(const char *id, const char *name,
94
		obs_data_t settings)
95
{
96 97
	if (!name || !id) return NULL;
	return create_encoder(id, OBS_ENCODER_AUDIO, name, settings);
98 99 100 101 102 103 104 105
}

static void receive_video(void *param, struct video_data *frame);
static void receive_audio(void *param, struct audio_data *data);

static inline struct audio_convert_info *get_audio_info(
		struct obs_encoder *encoder, struct audio_convert_info *info)
{
106 107 108 109
	const struct audio_output_info *aoi;
	aoi = audio_output_getinfo(encoder->media);
	memset(info, 0, sizeof(struct audio_convert_info));

110
	if (encoder->info.audio_info)
111
		encoder->info.audio_info(encoder->context.data, info);
112

113 114 115 116 117 118 119 120
	if (info->format == AUDIO_FORMAT_UNKNOWN)
		info->format = aoi->format;
	if (!info->samples_per_sec)
		info->samples_per_sec = aoi->samples_per_sec;
	if (info->speakers == SPEAKERS_UNKNOWN)
		info->speakers = aoi->speakers;

	return info;
121 122 123 124 125 126
}

static inline struct video_scale_info *get_video_info(
		struct obs_encoder *encoder, struct video_scale_info *info)
{
	if (encoder->info.video_info)
127
		if (encoder->info.video_info(encoder->context.data, info))
128 129 130 131 132 133 134 135 136 137 138
			return info;

	return NULL;
}

static void add_connection(struct obs_encoder *encoder)
{
	struct audio_convert_info audio_info = {0};
	struct video_scale_info   video_info = {0};

	if (encoder->info.type == OBS_ENCODER_AUDIO) {
139 140
		get_audio_info(encoder, &audio_info);
		audio_output_connect(encoder->media, &audio_info, receive_audio,
141 142 143 144 145
				encoder);
	} else {
		struct video_scale_info *info = NULL;

		info = get_video_info(encoder, &video_info);
J
jp9000 已提交
146
		video_output_connect(encoder->media, info, receive_video,
147
				encoder);
148
	}
J
jp9000 已提交
149 150

	encoder->active = true;
151
}
152

153 154 155
static void remove_connection(struct obs_encoder *encoder)
{
	if (encoder->info.type == OBS_ENCODER_AUDIO)
J
jp9000 已提交
156
		audio_output_disconnect(encoder->media, receive_audio,
157 158
				encoder);
	else
J
jp9000 已提交
159
		video_output_disconnect(encoder->media, receive_video,
160
				encoder);
J
jp9000 已提交
161 162

	encoder->active = false;
163
}
J
jp9000 已提交
164

165 166 167 168 169 170 171 172 173
static inline void free_audio_buffers(struct obs_encoder *encoder)
{
	for (size_t i = 0; i < MAX_AV_PLANES; i++) {
		circlebuf_free(&encoder->audio_input_buffer[i]);
		bfree(encoder->audio_output_buffer[i]);
		encoder->audio_output_buffer[i] = NULL;
	}
}

J
jp9000 已提交
174
static void obs_encoder_actually_destroy(obs_encoder_t encoder)
175 176
{
	if (encoder) {
J
jp9000 已提交
177 178 179 180 181 182 183 184
		pthread_mutex_lock(&encoder->outputs_mutex);
		for (size_t i = 0; i < encoder->outputs.num; i++) {
			struct obs_output *output = encoder->outputs.array[i];
			obs_output_remove_encoder(output, encoder);
		}
		da_free(encoder->outputs);
		pthread_mutex_unlock(&encoder->outputs_mutex);

185 186
		blog(LOG_INFO, "encoder '%s' destroyed", encoder->context.name);

187 188
		free_audio_buffers(encoder);

189 190
		if (encoder->context.data)
			encoder->info.destroy(encoder->context.data);
191
		da_free(encoder->callbacks);
J
jp9000 已提交
192 193
		pthread_mutex_destroy(&encoder->callbacks_mutex);
		pthread_mutex_destroy(&encoder->outputs_mutex);
194
		obs_context_data_free(&encoder->context);
J
jp9000 已提交
195
		bfree(encoder);
196
	}
197 198
}

J
jp9000 已提交
199 200
/* does not actually destroy the encoder until all connections to it have been
 * removed. (full reference counting really would have been superfluous) */
201 202 203
void obs_encoder_destroy(obs_encoder_t encoder)
{
	if (encoder) {
J
jp9000 已提交
204
		bool destroy;
205

206
		obs_context_data_remove(&encoder->context);
207

J
jp9000 已提交
208 209 210 211 212 213 214 215
		pthread_mutex_lock(&encoder->callbacks_mutex);
		destroy = encoder->callbacks.num == 0;
		if (!destroy)
			encoder->destroy_on_stop = true;
		pthread_mutex_unlock(&encoder->callbacks_mutex);

		if (destroy)
			obs_encoder_actually_destroy(encoder);
216 217 218
	}
}

219
const char *obs_encoder_get_name(obs_encoder_t encoder)
J
jp9000 已提交
220 221 222 223
{
	return encoder ? encoder->context.name : NULL;
}

J
jp9000 已提交
224 225 226 227 228 229 230 231
static inline obs_data_t get_defaults(const struct obs_encoder_info *info)
{
	obs_data_t settings = obs_data_create();
	if (info->defaults)
		info->defaults(settings);
	return settings;
}

J
jp9000 已提交
232 233
obs_data_t obs_encoder_defaults(const char *id)
{
J
jp9000 已提交
234
	const struct obs_encoder_info *info = find_encoder(id);
J
jp9000 已提交
235
	return (info) ? get_defaults(info) : NULL;
J
jp9000 已提交
236 237
}

238
obs_properties_t obs_get_encoder_properties(const char *id)
J
jp9000 已提交
239
{
J
jp9000 已提交
240
	const struct obs_encoder_info *ei = find_encoder(id);
J
jp9000 已提交
241 242 243 244
	if (ei && ei->properties) {
		obs_data_t       defaults = get_defaults(ei);
		obs_properties_t properties;

245
		properties = ei->properties();
J
jp9000 已提交
246 247 248 249
		obs_properties_apply_settings(properties, defaults);
		obs_data_release(defaults);
		return properties;
	}
J
jp9000 已提交
250 251 252
	return NULL;
}

253
obs_properties_t obs_encoder_properties(obs_encoder_t encoder)
254
{
J
jp9000 已提交
255 256
	if (encoder && encoder->info.properties) {
		obs_properties_t props;
257
		props = encoder->info.properties();
258
		obs_properties_apply_settings(props, encoder->context.settings);
J
jp9000 已提交
259 260
		return props;
	}
261 262 263
	return NULL;
}

264
void obs_encoder_update(obs_encoder_t encoder, obs_data_t settings)
265
{
J
jp9000 已提交
266 267
	if (!encoder) return;

268 269 270 271 272
	obs_data_apply(encoder->context.settings, settings);

	if (encoder->info.update && encoder->context.data)
		encoder->info.update(encoder->context.data,
				encoder->context.settings);
273 274
}

J
jp9000 已提交
275 276
bool obs_encoder_get_extra_data(obs_encoder_t encoder, uint8_t **extra_data,
		size_t *size)
277
{
278 279 280
	if (encoder && encoder->info.extra_data && encoder->context.data)
		return encoder->info.extra_data(encoder->context.data,
				extra_data, size);
J
jp9000 已提交
281 282

	return false;
283 284
}

J
jp9000 已提交
285
obs_data_t obs_encoder_get_settings(obs_encoder_t encoder)
286
{
J
jp9000 已提交
287 288
	if (!encoder) return NULL;

289 290
	obs_data_addref(encoder->context.settings);
	return encoder->context.settings;
291 292
}

293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
static inline void reset_audio_buffers(struct obs_encoder *encoder)
{
	free_audio_buffers(encoder);

	for (size_t i = 0; i < encoder->planes; i++)
		encoder->audio_output_buffer[i] =
			bmalloc(encoder->framesize_bytes);
}

static void intitialize_audio_encoder(struct obs_encoder *encoder)
{
	struct audio_convert_info info;
	get_audio_info(encoder, &info);

	encoder->samplerate = info.samples_per_sec;
	encoder->planes     = get_audio_planes(info.format, info.speakers);
	encoder->blocksize  = get_audio_size(info.format, info.speakers, 1);
310
	encoder->framesize  = encoder->info.frame_size(encoder->context.data);
311 312 313 314 315

	encoder->framesize_bytes = encoder->blocksize * encoder->framesize;
	reset_audio_buffers(encoder);
}

J
jp9000 已提交
316 317 318 319 320 321 322
bool obs_encoder_initialize(obs_encoder_t encoder)
{
	if (!encoder) return false;

	if (encoder->active)
		return true;

323 324
	if (encoder->context.data)
		encoder->info.destroy(encoder->context.data);
325

326 327 328
	encoder->context.data = encoder->info.create(encoder->context.settings,
			encoder);
	if (!encoder->context.data)
329 330 331 332 333 334 335 336 337
		return false;

	encoder->paired_encoder  = NULL;
	encoder->start_ts        = 0;

	if (encoder->info.type == OBS_ENCODER_AUDIO)
		intitialize_audio_encoder(encoder);

	return true;
J
jp9000 已提交
338 339
}

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
static inline size_t get_callback_idx(
		struct obs_encoder *encoder,
		void (*new_packet)(void *param, struct encoder_packet *packet),
		void *param)
{
	for (size_t i = 0; i < encoder->callbacks.num; i++) {
		struct encoder_callback *cb = encoder->callbacks.array+i;

		if (cb->new_packet == new_packet && cb->param == param)
			return i;
	}

	return DARRAY_INVALID;
}

J
jp9000 已提交
355
void obs_encoder_start(obs_encoder_t encoder,
J
jp9000 已提交
356 357
		void (*new_packet)(void *param, struct encoder_packet *packet),
		void *param)
358
{
359 360 361
	struct encoder_callback cb = {false, new_packet, param};
	bool first   = false;

362
	if (!encoder || !new_packet || !encoder->context.data) return;
363 364 365 366 367

	pthread_mutex_lock(&encoder->callbacks_mutex);

	first = (encoder->callbacks.num == 0);

368 369 370
	size_t idx = get_callback_idx(encoder, new_packet, param);
	if (idx == DARRAY_INVALID)
		da_push_back(encoder->callbacks, &cb);
371 372 373 374 375 376 377

	pthread_mutex_unlock(&encoder->callbacks_mutex);

	if (first) {
		encoder->cur_pts = 0;
		add_connection(encoder);
	}
378 379
}

J
jp9000 已提交
380 381 382
void obs_encoder_stop(obs_encoder_t encoder,
		void (*new_packet)(void *param, struct encoder_packet *packet),
		void *param)
383
{
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	bool   last = false;
	size_t idx;

	if (!encoder) return;

	pthread_mutex_lock(&encoder->callbacks_mutex);

	idx = get_callback_idx(encoder, new_packet, param);
	if (idx != DARRAY_INVALID) {
		da_erase(encoder->callbacks, idx);
		last = (encoder->callbacks.num == 0);
	}

	pthread_mutex_unlock(&encoder->callbacks_mutex);

J
jp9000 已提交
399
	if (last) {
400
		remove_connection(encoder);
J
jp9000 已提交
401 402 403 404

		if (encoder->destroy_on_stop)
			obs_encoder_actually_destroy(encoder);
	}
405 406
}

407 408 409 410 411
const char *obs_encoder_get_codec(obs_encoder_t encoder)
{
	return encoder ? encoder->info.codec : NULL;
}

412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
void obs_encoder_set_video(obs_encoder_t encoder, video_t video)
{
	const struct video_output_info *voi;

	if (!video || !encoder || encoder->info.type != OBS_ENCODER_VIDEO)
		return;

	voi = video_output_getinfo(video);

	encoder->media        = video;
	encoder->timebase_num = voi->fps_den;
	encoder->timebase_den = voi->fps_num;
}

void obs_encoder_set_audio(obs_encoder_t encoder, audio_t audio)
{
	if (!audio || !encoder || encoder->info.type != OBS_ENCODER_AUDIO)
		return;

	encoder->media        = audio;
	encoder->timebase_num = 1;
	encoder->timebase_den = audio_output_samplerate(audio);
}

436 437 438
video_t obs_encoder_video(obs_encoder_t encoder)
{
	return (encoder && encoder->info.type == OBS_ENCODER_VIDEO) ?
J
jp9000 已提交
439
		encoder->media : NULL;
440 441 442 443 444
}

audio_t obs_encoder_audio(obs_encoder_t encoder)
{
	return (encoder && encoder->info.type == OBS_ENCODER_AUDIO) ?
J
jp9000 已提交
445
		encoder->media : NULL;
446 447
}

448 449 450 451 452
bool obs_encoder_active(obs_encoder_t encoder)
{
	return encoder ? encoder->active : false;
}

453 454 455 456
static inline bool get_sei(struct obs_encoder *encoder,
		uint8_t **sei, size_t *size)
{
	if (encoder->info.sei_data)
457
		return encoder->info.sei_data(encoder->context.data, sei, size);
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
	return false;
}

static void send_first_video_packet(struct obs_encoder *encoder,
		struct encoder_callback *cb, struct encoder_packet *packet)
{
	struct encoder_packet first_packet;
	DARRAY(uint8_t)       data;
	uint8_t               *sei;
	size_t                size;

	/* always wait for first keyframe */
	if (!packet->keyframe)
		return;

	da_init(data);

	if (!get_sei(encoder, &sei, &size)) {
		cb->new_packet(cb->param, packet);
		return;
	}

	da_push_back_array(data, sei, size);
	da_push_back_array(data, packet->data, packet->size);

	first_packet      = *packet;
	first_packet.data = data.array;
	first_packet.size = data.num;

	cb->new_packet(cb->param, &first_packet);
	cb->sent_first_packet = true;

	da_free(data);
}

static inline void send_packet(struct obs_encoder *encoder,
		struct encoder_callback *cb, struct encoder_packet *packet)
{
	/* include SEI in first video packet */
	if (encoder->info.type == OBS_ENCODER_VIDEO && !cb->sent_first_packet)
		send_first_video_packet(encoder, cb, packet);
	else
		cb->new_packet(cb->param, packet);
}

J
jp9000 已提交
503 504 505 506 507 508 509 510 511 512
static void full_stop(struct obs_encoder *encoder)
{
	if (encoder) {
		pthread_mutex_lock(&encoder->callbacks_mutex);
		da_free(encoder->callbacks);
		remove_connection(encoder);
		pthread_mutex_unlock(&encoder->callbacks_mutex);
	}
}

513
static inline void do_encode(struct obs_encoder *encoder,
514
		struct encoder_frame *frame)
515
{
516
	struct encoder_packet pkt = {0};
517 518 519
	bool received = false;
	bool success;

520 521
	pkt.timebase_num = encoder->timebase_num;
	pkt.timebase_den = encoder->timebase_den;
522

523 524
	success = encoder->info.encode(encoder->context.data, frame, &pkt,
			&received);
525 526 527
	if (!success) {
		full_stop(encoder);
		blog(LOG_ERROR, "Error encoding with encoder '%s'",
528
				encoder->context.name);
529 530 531 532
		return;
	}

	if (received) {
533 534 535 536
		/* we use system time here to ensure sync with other encoders,
		 * you do not want to use relative timestamps here */
		pkt.dts_usec = encoder->start_ts / 1000 + packet_dts_usec(&pkt);

537 538 539 540 541
		pthread_mutex_lock(&encoder->callbacks_mutex);

		for (size_t i = 0; i < encoder->callbacks.num; i++) {
			struct encoder_callback *cb;
			cb = encoder->callbacks.array+i;
542
			send_packet(encoder, cb, &pkt);
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
		}

		pthread_mutex_unlock(&encoder->callbacks_mutex);
	}
}

static void receive_video(void *param, struct video_data *frame)
{
	struct obs_encoder    *encoder  = param;
	struct encoder_frame  enc_frame;

	memset(&enc_frame, 0, sizeof(struct encoder_frame));

	for (size_t i = 0; i < MAX_AV_PLANES; i++) {
		enc_frame.data[i]     = frame->data[i];
		enc_frame.linesize[i] = frame->linesize[i];
	}

561 562 563
	if (!encoder->start_ts)
		encoder->start_ts = frame->timestamp;

564 565 566
	enc_frame.frames = 1;
	enc_frame.pts    = encoder->cur_pts;

567
	do_encode(encoder, &enc_frame);
568 569 570 571

	encoder->cur_pts += encoder->timebase_num;
}

572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
static bool buffer_audio(struct obs_encoder *encoder, struct audio_data *data)
{
	size_t samplerate = encoder->samplerate;
	size_t size = data->frames * encoder->blocksize;
	size_t offset_size = 0;

	if (encoder->paired_encoder && !encoder->start_ts) {
		uint64_t end_ts     = data->timestamp;
		uint64_t v_start_ts = encoder->paired_encoder->start_ts;

		/* no video yet, so don't start audio */
		if (!v_start_ts)
			return false;

		/* audio starting point still not synced with video starting
		 * point, so don't start audio */
		end_ts += (uint64_t)data->frames * 1000000000ULL / samplerate;
		if (end_ts <= v_start_ts)
			return false;

		/* ready to start audio, truncate if necessary */
		if (data->timestamp < v_start_ts) {
			uint64_t offset = v_start_ts - data->timestamp;
			offset = (int)(offset * samplerate / 1000000000);
			offset_size = (size_t)offset * encoder->blocksize;
		}

		encoder->start_ts = v_start_ts;
	}

	size -= offset_size;

	/* push in to the circular buffer */
	if (size)
		for (size_t i = 0; i < encoder->planes; i++)
			circlebuf_push_back(&encoder->audio_input_buffer[i],
					data->data[i] + offset_size, size);

	return true;
}

static void send_audio_data(struct obs_encoder *encoder)
614 615 616 617 618
{
	struct encoder_frame  enc_frame;

	memset(&enc_frame, 0, sizeof(struct encoder_frame));

619 620 621 622
	for (size_t i = 0; i < encoder->planes; i++) {
		circlebuf_pop_front(&encoder->audio_input_buffer[i],
				encoder->audio_output_buffer[i],
				encoder->framesize_bytes);
623

624 625
		enc_frame.data[i]     = encoder->audio_output_buffer[i];
		enc_frame.linesize[i] = (uint32_t)encoder->framesize_bytes;
626 627
	}

628
	enc_frame.frames = (uint32_t)encoder->framesize;
629 630
	enc_frame.pts    = encoder->cur_pts;

631 632 633 634 635 636 637 638 639 640 641
	do_encode(encoder, &enc_frame);

	encoder->cur_pts += encoder->framesize;
}

static void receive_audio(void *param, struct audio_data *data)
{
	struct obs_encoder *encoder = param;

	if (!buffer_audio(encoder, data))
		return;
642

643 644
	while (encoder->audio_input_buffer[0].size >= encoder->framesize_bytes)
		send_audio_data(encoder);
645
}
J
jp9000 已提交
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665

void obs_encoder_add_output(struct obs_encoder *encoder,
		struct obs_output *output)
{
	if (!encoder) return;

	pthread_mutex_lock(&encoder->outputs_mutex);
	da_push_back(encoder->outputs, &output);
	pthread_mutex_unlock(&encoder->outputs_mutex);
}

void obs_encoder_remove_output(struct obs_encoder *encoder,
		struct obs_output *output)
{
	if (!encoder) return;

	pthread_mutex_lock(&encoder->outputs_mutex);
	da_erase_item(encoder->outputs, &output);
	pthread_mutex_unlock(&encoder->outputs_mutex);
}
666 667 668 669 670 671 672 673 674 675 676 677 678

void obs_duplicate_encoder_packet(struct encoder_packet *dst,
		const struct encoder_packet *src)
{
	*dst = *src;
	dst->data = bmemdup(src->data, src->size);
}

void obs_free_encoder_packet(struct encoder_packet *packet)
{
	bfree(packet->data);
	memset(packet, 0, sizeof(struct encoder_packet));
}