diff --git a/plugins/obs-outputs/flv-mux.c b/plugins/obs-outputs/flv-mux.c index 01e6caba6..0a85a7475 100644 --- a/plugins/obs-outputs/flv-mux.c +++ b/plugins/obs-outputs/flv-mux.c @@ -58,11 +58,11 @@ void write_file_info(FILE *file, int64_t duration_ms, int64_t size) fwrite(buf, 1, enc - buf, file); } -static bool build_flv_meta_data(obs_output_t *context, uint8_t **output, - size_t *size, size_t a_idx) +static void build_flv_meta_data(obs_output_t *context, uint8_t **output, + size_t *size) { obs_encoder_t *vencoder = obs_output_get_video_encoder(context); - obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, a_idx); + obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, 0); video_t *video = obs_encoder_video(vencoder); audio_t *audio = obs_encoder_audio(aencoder); char buf[4096]; @@ -70,31 +70,23 @@ static bool build_flv_meta_data(obs_output_t *context, uint8_t **output, char *end = enc + sizeof(buf); struct dstr encoder_name = {0}; - if (a_idx > 0 && !aencoder) - return false; - enc_str(&enc, end, "@setDataFrame"); enc_str(&enc, end, "onMetaData"); *enc++ = AMF_ECMA_ARRAY; - enc = AMF_EncodeInt32(enc, end, a_idx == 0 ? 20 : 15); + enc = AMF_EncodeInt32(enc, end, 20); enc_num_val(&enc, end, "duration", 0.0); enc_num_val(&enc, end, "fileSize", 0.0); - if (a_idx == 0) { - enc_num_val(&enc, end, "width", - (double)obs_encoder_get_width(vencoder)); - enc_num_val(&enc, end, "height", - (double)obs_encoder_get_height(vencoder)); + enc_num_val(&enc, end, "width", + (double)obs_encoder_get_width(vencoder)); + enc_num_val(&enc, end, "height", + (double)obs_encoder_get_height(vencoder)); - enc_num_val(&enc, end, "videocodecid", - VIDEODATA_AVCVIDEOPACKET); - enc_num_val(&enc, end, "videodatarate", - encoder_bitrate(vencoder)); - enc_num_val(&enc, end, "framerate", - video_output_get_frame_rate(video)); - } + enc_num_val(&enc, end, "videocodecid", VIDEODATA_AVCVIDEOPACKET); + enc_num_val(&enc, end, "videodatarate", encoder_bitrate(vencoder)); + enc_num_val(&enc, end, "framerate", video_output_get_frame_rate(video)); enc_num_val(&enc, end, "audiocodecid", AUDIODATA_AAC); enc_num_val(&enc, end, "audiodatarate", encoder_bitrate(aencoder)); @@ -133,11 +125,10 @@ static bool build_flv_meta_data(obs_output_t *context, uint8_t **output, *size = enc - buf; *output = bmemdup(buf, *size); - return true; } -bool flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size, - bool write_header, size_t audio_idx) +void flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size, + bool write_header) { struct array_output_data data; struct serializer s; @@ -146,12 +137,7 @@ bool flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size, uint32_t start_pos; array_output_serializer_init(&s, &data); - - if (!build_flv_meta_data(context, &meta_data, &meta_data_size, - audio_idx)) { - bfree(meta_data); - return false; - } + build_flv_meta_data(context, &meta_data, &meta_data_size); if (write_header) { s_write(&s, "FLV", 3); @@ -177,7 +163,6 @@ bool flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size, *size = data.bytes.num; bfree(meta_data); - return true; } #ifdef DEBUG_TIMESTAMPS @@ -373,7 +358,7 @@ static void flv_build_additional_meta_data(uint8_t **data, size_t *size) *size = out.bytes.num; } -bool flv_additional_meta_data(obs_output_t *context, uint8_t **data, +void flv_additional_meta_data(obs_output_t *context, uint8_t **data, size_t *size) { obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, 1); @@ -382,9 +367,6 @@ bool flv_additional_meta_data(obs_output_t *context, uint8_t **data, uint8_t *meta_data = NULL; size_t meta_data_size; - if (!aencoder) - return false; - flv_build_additional_meta_data(&meta_data, &meta_data_size); array_output_serializer_init(&s, &out); @@ -402,7 +384,6 @@ bool flv_additional_meta_data(obs_output_t *context, uint8_t **data, *data = out.bytes.array; *size = out.bytes.num; - return false; } static inline void s_u29(struct serializer *s, uint32_t val) diff --git a/plugins/obs-outputs/flv-mux.h b/plugins/obs-outputs/flv-mux.h index 3b76b8aba..c612f3882 100644 --- a/plugins/obs-outputs/flv-mux.h +++ b/plugins/obs-outputs/flv-mux.h @@ -28,9 +28,9 @@ static int32_t get_ms_time(struct encoder_packet *packet, int64_t val) extern void write_file_info(FILE *file, int64_t duration_ms, int64_t size); -extern bool flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size, - bool write_header, size_t audio_idx); -extern bool flv_additional_meta_data(obs_output_t *context, uint8_t **output, +extern void flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size, + bool write_header); +extern void flv_additional_meta_data(obs_output_t *context, uint8_t **output, size_t *size); extern void flv_packet_mux(struct encoder_packet *packet, int32_t dts_offset, uint8_t **output, size_t *size, bool is_header); diff --git a/plugins/obs-outputs/flv-output.c b/plugins/obs-outputs/flv-output.c index 243ce40c0..9e092bc78 100644 --- a/plugins/obs-outputs/flv-output.c +++ b/plugins/obs-outputs/flv-output.c @@ -106,7 +106,7 @@ static void write_meta_data(struct flv_output *stream) uint8_t *meta_data; size_t meta_data_size; - flv_meta_data(stream->output, &meta_data, &meta_data_size, true, 0); + flv_meta_data(stream->output, &meta_data, &meta_data_size, true); fwrite(meta_data, 1, meta_data_size, stream->file); bfree(meta_data); } diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index ed5814cf7..2f06ff222 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -423,7 +423,7 @@ static int send_packet(struct rtmp_stream *stream, } } - if (stream->using_metadata_multitrack && idx > 0) { + if (idx > 0) { flv_additional_packet_mux( packet, is_header ? 0 : stream->start_dts_offset, &data, &size, is_header, idx); @@ -436,11 +436,7 @@ static int send_packet(struct rtmp_stream *stream, droptest_cap_data_rate(stream, size); #endif - if (stream->using_metadata_multitrack) { - idx = 0; - } - - ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, (int)idx); + ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, 0); bfree(data); if (is_header) @@ -669,16 +665,13 @@ static void *send_thread(void *data) return NULL; } -static bool send_additional_meta_data(struct rtmp_stream *stream, size_t idx, - bool *next) +static bool send_additional_meta_data(struct rtmp_stream *stream) { uint8_t *meta_data; size_t meta_data_size; bool success = true; - *next = flv_additional_meta_data(stream->output, &meta_data, - &meta_data_size); - + flv_additional_meta_data(stream->output, &meta_data, &meta_data_size); success = RTMP_Write(&stream->rtmp, (char *)meta_data, (int)meta_data_size, 0) >= 0; bfree(meta_data); @@ -686,20 +679,16 @@ static bool send_additional_meta_data(struct rtmp_stream *stream, size_t idx, return success; } -static bool send_meta_data(struct rtmp_stream *stream, size_t idx, bool *next) +static bool send_meta_data(struct rtmp_stream *stream) { uint8_t *meta_data; size_t meta_data_size; bool success = true; - *next = flv_meta_data(stream->output, &meta_data, &meta_data_size, - false, idx); - - if (*next) { - success = RTMP_Write(&stream->rtmp, (char *)meta_data, - (int)meta_data_size, (int)idx) >= 0; - bfree(meta_data); - } + flv_meta_data(stream->output, &meta_data, &meta_data_size, false); + success = RTMP_Write(&stream->rtmp, (char *)meta_data, + (int)meta_data_size, 0) >= 0; + bfree(meta_data); return success; } @@ -789,7 +778,7 @@ static int init_send(struct rtmp_stream *stream) { int ret; size_t idx = 0; - bool next = true; + obs_output_t *context = stream->output; #if defined(_WIN32) adjust_sndbuf_size(stream, MIN_SENDBUF_SIZE); @@ -827,7 +816,6 @@ static int init_send(struct rtmp_stream *stream) bfree(stream->write_buf); int total_bitrate = 0; - obs_output_t *context = stream->output; obs_encoder_t *vencoder = obs_output_get_video_encoder(context); if (vencoder) { @@ -892,20 +880,25 @@ static int init_send(struct rtmp_stream *stream) } os_atomic_set_bool(&stream->active, true); - while (next) { - bool success = - (stream->using_metadata_multitrack && idx != 0) - ? send_additional_meta_data(stream, idx, &next) - : send_meta_data(stream, idx, &next); - idx++; - if (!success) { - warn("Disconnected while attempting to connect to " - "server."); - set_output_error(stream); - return OBS_OUTPUT_DISCONNECTED; - } + if (!send_meta_data(stream)) { + warn("Disconnected while attempting to send metadata"); + set_output_error(stream); + return OBS_OUTPUT_DISCONNECTED; } + + obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, 1); + if (aencoder && !send_additional_meta_data(stream)) { + warn("Disconnected while attempting to send additional " + "metadata"); + return OBS_OUTPUT_DISCONNECTED; + } + + if (obs_output_get_audio_encoder(context, 2) != NULL) { + warn("Additional audio streams not supported"); + return OBS_OUTPUT_DISCONNECTED; + } + obs_output_begin_data_capture(stream->output, 0); return OBS_OUTPUT_SUCCESS; @@ -1015,20 +1008,6 @@ static int try_connect(struct rtmp_stream *stream) RTMP_AddStream(&stream->rtmp, stream->key.array); - if (!stream->using_metadata_multitrack) { - for (size_t idx = 1;; idx++) { - obs_encoder_t *encoder = obs_output_get_audio_encoder( - stream->output, idx); - const char *encoder_name; - - if (!encoder) - break; - - encoder_name = obs_encoder_get_name(encoder); - RTMP_AddStream(&stream->rtmp, encoder_name); - } - } - stream->rtmp.m_outChunkSize = 4096; stream->rtmp.m_bSendChunkSizeInfo = true; stream->rtmp.m_bUseNagle = true; @@ -1087,8 +1066,6 @@ static bool init_connect(struct rtmp_stream *stream) drop_p = (int64_t)obs_data_get_int(settings, OPT_PFRAME_DROP_THRESHOLD); stream->max_shutdown_time_sec = (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC); - stream->using_metadata_multitrack = - obs_data_get_bool(settings, OPT_METADATA_MULTITRACK); obs_encoder_t *venc = obs_output_get_video_encoder(stream->output); obs_encoder_t *aenc = obs_output_get_audio_encoder(stream->output, 0); @@ -1488,7 +1465,6 @@ static void rtmp_stream_defaults(obs_data_t *defaults) obs_data_set_default_string(defaults, OPT_BIND_IP, "default"); obs_data_set_default_bool(defaults, OPT_NEWSOCKETLOOP_ENABLED, false); obs_data_set_default_bool(defaults, OPT_LOWLATENCY_ENABLED, false); - obs_data_set_default_bool(defaults, OPT_METADATA_MULTITRACK, true); } static obs_properties_t *rtmp_stream_properties(void *unused) diff --git a/plugins/obs-outputs/rtmp-stream.h b/plugins/obs-outputs/rtmp-stream.h index 7c3a9ed2c..a4494ba7f 100644 --- a/plugins/obs-outputs/rtmp-stream.h +++ b/plugins/obs-outputs/rtmp-stream.h @@ -59,7 +59,6 @@ struct rtmp_stream { pthread_mutex_t packets_mutex; struct circlebuf packets; bool sent_headers; - bool using_metadata_multitrack; bool got_first_video; int64_t start_dts_offset;