rtmp-stream.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890
  1. /******************************************************************************
  2. Copyright (C) 2014 by Hugh Bailey <[email protected]>
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. ******************************************************************************/
  14. #include "rtmp-stream.h"
  15. #include "rtmp-av1.h"
  16. #include "rtmp-hevc.h"
  17. #include <obs-avc.h>
  18. #include <obs-hevc.h>
  19. #ifdef _WIN32
  20. #include <util/windows/win-version.h>
  21. #endif
  22. #ifndef SEC_TO_NSEC
  23. #define SEC_TO_NSEC 1000000000ULL
  24. #endif
  25. #ifndef MSEC_TO_USEC
  26. #define MSEC_TO_USEC 1000ULL
  27. #endif
  28. #ifndef MSEC_TO_NSEC
  29. #define MSEC_TO_NSEC 1000000ULL
  30. #endif
  31. /* dynamic bitrate coefficients */
  32. #define DBR_INC_TIMER (4ULL * SEC_TO_NSEC)
  33. #define DBR_TRIGGER_USEC (200ULL * MSEC_TO_USEC)
  34. #define MIN_ESTIMATE_DURATION_MS 1000
  35. #define MAX_ESTIMATE_DURATION_MS 2000
  36. static const char *rtmp_stream_getname(void *unused)
  37. {
  38. UNUSED_PARAMETER(unused);
  39. return obs_module_text("RTMPStream");
  40. }
  41. static void log_rtmp(int level, const char *format, va_list args)
  42. {
  43. if (level > RTMP_LOGWARNING)
  44. return;
  45. blogva(LOG_INFO, format, args);
  46. }
  47. static inline size_t num_buffered_packets(struct rtmp_stream *stream);
  48. static inline void free_packets(struct rtmp_stream *stream)
  49. {
  50. size_t num_packets;
  51. pthread_mutex_lock(&stream->packets_mutex);
  52. num_packets = num_buffered_packets(stream);
  53. if (num_packets)
  54. info("Freeing %d remaining packets", (int)num_packets);
  55. while (stream->packets.size) {
  56. struct encoder_packet packet;
  57. circlebuf_pop_front(&stream->packets, &packet, sizeof(packet));
  58. obs_encoder_packet_release(&packet);
  59. }
  60. pthread_mutex_unlock(&stream->packets_mutex);
  61. }
  62. static inline bool stopping(struct rtmp_stream *stream)
  63. {
  64. return os_event_try(stream->stop_event) != EAGAIN;
  65. }
  66. static inline bool connecting(struct rtmp_stream *stream)
  67. {
  68. return os_atomic_load_bool(&stream->connecting);
  69. }
  70. static inline bool active(struct rtmp_stream *stream)
  71. {
  72. return os_atomic_load_bool(&stream->active);
  73. }
  74. static inline bool disconnected(struct rtmp_stream *stream)
  75. {
  76. return os_atomic_load_bool(&stream->disconnected);
  77. }
  78. static inline bool silently_reconnecting(struct rtmp_stream *stream)
  79. {
  80. return os_atomic_load_bool(&stream->silent_reconnect);
  81. }
  82. static void rtmp_stream_destroy(void *data)
  83. {
  84. struct rtmp_stream *stream = data;
  85. if (stopping(stream) && !connecting(stream)) {
  86. pthread_join(stream->send_thread, NULL);
  87. } else if (connecting(stream) || active(stream)) {
  88. if (stream->connecting)
  89. pthread_join(stream->connect_thread, NULL);
  90. stream->stop_ts = 0;
  91. os_event_signal(stream->stop_event);
  92. if (active(stream)) {
  93. os_sem_post(stream->send_sem);
  94. obs_output_end_data_capture(stream->output);
  95. pthread_join(stream->send_thread, NULL);
  96. }
  97. }
  98. RTMP_TLS_Free(&stream->rtmp);
  99. free_packets(stream);
  100. dstr_free(&stream->path);
  101. dstr_free(&stream->key);
  102. dstr_free(&stream->username);
  103. dstr_free(&stream->password);
  104. dstr_free(&stream->encoder_name);
  105. dstr_free(&stream->bind_ip);
  106. os_event_destroy(stream->stop_event);
  107. os_sem_destroy(stream->send_sem);
  108. pthread_mutex_destroy(&stream->packets_mutex);
  109. circlebuf_free(&stream->packets);
  110. #ifdef TEST_FRAMEDROPS
  111. circlebuf_free(&stream->droptest_info);
  112. #endif
  113. circlebuf_free(&stream->dbr_frames);
  114. pthread_mutex_destroy(&stream->dbr_mutex);
  115. os_event_destroy(stream->buffer_space_available_event);
  116. os_event_destroy(stream->buffer_has_data_event);
  117. os_event_destroy(stream->socket_available_event);
  118. os_event_destroy(stream->send_thread_signaled_exit);
  119. pthread_mutex_destroy(&stream->write_buf_mutex);
  120. if (stream->write_buf)
  121. bfree(stream->write_buf);
  122. bfree(stream);
  123. }
  124. static void *rtmp_stream_create(obs_data_t *settings, obs_output_t *output)
  125. {
  126. struct rtmp_stream *stream = bzalloc(sizeof(struct rtmp_stream));
  127. stream->output = output;
  128. pthread_mutex_init_value(&stream->packets_mutex);
  129. RTMP_LogSetCallback(log_rtmp);
  130. RTMP_LogSetLevel(RTMP_LOGWARNING);
  131. if (pthread_mutex_init(&stream->packets_mutex, NULL) != 0)
  132. goto fail;
  133. if (os_event_init(&stream->stop_event, OS_EVENT_TYPE_MANUAL) != 0)
  134. goto fail;
  135. if (pthread_mutex_init(&stream->write_buf_mutex, NULL) != 0) {
  136. warn("Failed to initialize write buffer mutex");
  137. goto fail;
  138. }
  139. if (pthread_mutex_init(&stream->dbr_mutex, NULL) != 0) {
  140. warn("Failed to initialize dbr mutex");
  141. goto fail;
  142. }
  143. if (os_event_init(&stream->buffer_space_available_event,
  144. OS_EVENT_TYPE_AUTO) != 0) {
  145. warn("Failed to initialize write buffer event");
  146. goto fail;
  147. }
  148. if (os_event_init(&stream->buffer_has_data_event, OS_EVENT_TYPE_AUTO) !=
  149. 0) {
  150. warn("Failed to initialize data buffer event");
  151. goto fail;
  152. }
  153. if (os_event_init(&stream->socket_available_event,
  154. OS_EVENT_TYPE_AUTO) != 0) {
  155. warn("Failed to initialize socket buffer event");
  156. goto fail;
  157. }
  158. if (os_event_init(&stream->send_thread_signaled_exit,
  159. OS_EVENT_TYPE_MANUAL) != 0) {
  160. warn("Failed to initialize socket exit event");
  161. goto fail;
  162. }
  163. UNUSED_PARAMETER(settings);
  164. return stream;
  165. fail:
  166. rtmp_stream_destroy(stream);
  167. return NULL;
  168. }
  169. static void rtmp_stream_stop(void *data, uint64_t ts)
  170. {
  171. struct rtmp_stream *stream = data;
  172. if (stopping(stream) && ts != 0)
  173. return;
  174. if (connecting(stream))
  175. pthread_join(stream->connect_thread, NULL);
  176. stream->stop_ts = ts / 1000ULL;
  177. if (ts)
  178. stream->shutdown_timeout_ts =
  179. ts +
  180. (uint64_t)stream->max_shutdown_time_sec * 1000000000ULL;
  181. if (active(stream)) {
  182. os_event_signal(stream->stop_event);
  183. if (stream->stop_ts == 0)
  184. os_sem_post(stream->send_sem);
  185. } else {
  186. obs_output_signal_stop(stream->output, OBS_OUTPUT_SUCCESS);
  187. }
  188. }
  189. static inline void set_rtmp_str(AVal *val, const char *str)
  190. {
  191. bool valid = (str && *str);
  192. val->av_val = valid ? (char *)str : NULL;
  193. val->av_len = valid ? (int)strlen(str) : 0;
  194. }
  195. static inline void set_rtmp_dstr(AVal *val, struct dstr *str)
  196. {
  197. bool valid = !dstr_is_empty(str);
  198. val->av_val = valid ? str->array : NULL;
  199. val->av_len = valid ? (int)str->len : 0;
  200. }
  201. static inline bool get_next_packet(struct rtmp_stream *stream,
  202. struct encoder_packet *packet)
  203. {
  204. bool new_packet = false;
  205. pthread_mutex_lock(&stream->packets_mutex);
  206. if (stream->packets.size) {
  207. circlebuf_pop_front(&stream->packets, packet,
  208. sizeof(struct encoder_packet));
  209. new_packet = true;
  210. }
  211. pthread_mutex_unlock(&stream->packets_mutex);
  212. return new_packet;
  213. }
  214. static inline void peek_next_packet(struct rtmp_stream *stream,
  215. struct encoder_packet *packet)
  216. {
  217. pthread_mutex_lock(&stream->packets_mutex);
  218. circlebuf_peek_front(&stream->packets, packet,
  219. sizeof(struct encoder_packet));
  220. pthread_mutex_unlock(&stream->packets_mutex);
  221. }
  222. static void reinsert_packet_at_front(struct rtmp_stream *stream,
  223. struct encoder_packet *packet)
  224. {
  225. pthread_mutex_lock(&stream->packets_mutex);
  226. circlebuf_push_front(&stream->packets, packet,
  227. sizeof(struct encoder_packet));
  228. pthread_mutex_unlock(&stream->packets_mutex);
  229. os_sem_post(stream->send_sem);
  230. }
  231. #define RTMP_PACKET_TYPE_RECONNECT 0x20
  232. static bool process_recv_data(struct rtmp_stream *stream, size_t size)
  233. {
  234. UNUSED_PARAMETER(size);
  235. RTMP *rtmp = &stream->rtmp;
  236. RTMPPacket packet = {0};
  237. if (!RTMP_ReadPacket(rtmp, &packet)) {
  238. #ifdef _WIN32
  239. int error = WSAGetLastError();
  240. #else
  241. int error = errno;
  242. #endif
  243. do_log(LOG_ERROR, "RTMP_ReadPacket error: %d", error);
  244. return false;
  245. }
  246. if (packet.m_body) {
  247. if (packet.m_packetType == RTMP_PACKET_TYPE_RECONNECT) {
  248. os_atomic_set_bool(&stream->silent_reconnect, true);
  249. }
  250. RTMPPacket_Free(&packet);
  251. }
  252. return true;
  253. }
  254. #ifdef TEST_FRAMEDROPS
  255. static void droptest_cap_data_rate(struct rtmp_stream *stream, size_t size)
  256. {
  257. uint64_t ts = os_gettime_ns();
  258. struct droptest_info info;
  259. #if defined(_WIN32) && defined(TEST_FRAMEDROPS_WITH_BITRATE_SHORTCUTS)
  260. uint64_t check_elapsed = ts - stream->droptest_last_key_check;
  261. if (check_elapsed > (200ULL * MSEC_TO_NSEC)) {
  262. size_t bitrate = 0;
  263. stream->droptest_last_key_check = ts;
  264. if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000) {
  265. stream->droptest_max = 0;
  266. } else if (GetAsyncKeyState(VK_NUMPAD1) & 0x8000) {
  267. bitrate = 1000;
  268. } else if (GetAsyncKeyState(VK_NUMPAD2) & 0x8000) {
  269. bitrate = 2000;
  270. } else if (GetAsyncKeyState(VK_NUMPAD3) & 0x8000) {
  271. bitrate = 3000;
  272. } else if (GetAsyncKeyState(VK_NUMPAD4) & 0x8000) {
  273. bitrate = 4000;
  274. } else if (GetAsyncKeyState(VK_NUMPAD5) & 0x8000) {
  275. bitrate = 5000;
  276. } else if (GetAsyncKeyState(VK_NUMPAD6) & 0x8000) {
  277. bitrate = 6000;
  278. } else if (GetAsyncKeyState(VK_NUMPAD7) & 0x8000) {
  279. bitrate = 7000;
  280. } else if (GetAsyncKeyState(VK_NUMPAD8) & 0x8000) {
  281. bitrate = 8000;
  282. } else if (GetAsyncKeyState(VK_NUMPAD9) & 0x8000) {
  283. bitrate = 9000;
  284. }
  285. if (bitrate) {
  286. stream->droptest_max = (bitrate * 1000 / 8);
  287. }
  288. }
  289. if (!stream->droptest_max) {
  290. return;
  291. }
  292. #else
  293. if (!stream->droptest_max) {
  294. stream->droptest_max = DROPTEST_MAX_BYTES;
  295. }
  296. #endif
  297. info.ts = ts;
  298. info.size = size;
  299. circlebuf_push_back(&stream->droptest_info, &info, sizeof(info));
  300. stream->droptest_size += size;
  301. if (stream->droptest_info.size) {
  302. circlebuf_peek_front(&stream->droptest_info, &info,
  303. sizeof(info));
  304. if (stream->droptest_size > stream->droptest_max) {
  305. uint64_t elapsed = ts - info.ts;
  306. if (elapsed < 1000000000ULL) {
  307. elapsed = 1000000000ULL - elapsed;
  308. os_sleepto_ns(ts + elapsed);
  309. }
  310. while (stream->droptest_size > stream->droptest_max) {
  311. circlebuf_pop_front(&stream->droptest_info,
  312. &info, sizeof(info));
  313. stream->droptest_size -= info.size;
  314. }
  315. }
  316. }
  317. }
  318. #endif
  319. static int socket_queue_data(RTMPSockBuf *sb, const char *data, int len,
  320. void *arg)
  321. {
  322. UNUSED_PARAMETER(sb);
  323. struct rtmp_stream *stream = arg;
  324. retry_send:
  325. if (!RTMP_IsConnected(&stream->rtmp))
  326. return 0;
  327. pthread_mutex_lock(&stream->write_buf_mutex);
  328. if (stream->write_buf_len + len > stream->write_buf_size) {
  329. pthread_mutex_unlock(&stream->write_buf_mutex);
  330. if (os_event_wait(stream->buffer_space_available_event)) {
  331. return 0;
  332. }
  333. goto retry_send;
  334. }
  335. memcpy(stream->write_buf + stream->write_buf_len, data, len);
  336. stream->write_buf_len += len;
  337. pthread_mutex_unlock(&stream->write_buf_mutex);
  338. os_event_signal(stream->buffer_has_data_event);
  339. return len;
  340. }
  341. static int handle_socket_read(struct rtmp_stream *stream)
  342. {
  343. int ret = 0;
  344. int recv_size = 0;
  345. if (!stream->new_socket_loop) {
  346. #ifdef _WIN32
  347. ret = ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONREAD,
  348. (u_long *)&recv_size);
  349. #else
  350. ret = ioctl(stream->rtmp.m_sb.sb_socket, FIONREAD, &recv_size);
  351. #endif
  352. if (ret >= 0 && recv_size > 0) {
  353. if (!process_recv_data(stream, (size_t)recv_size))
  354. return -1;
  355. }
  356. }
  357. return 0;
  358. }
  359. static int send_packet(struct rtmp_stream *stream,
  360. struct encoder_packet *packet, bool is_header,
  361. size_t idx)
  362. {
  363. uint8_t *data;
  364. size_t size;
  365. int ret = 0;
  366. assert(idx < RTMP_MAX_STREAMS);
  367. if (handle_socket_read(stream))
  368. return -1;
  369. if (idx > 0) {
  370. flv_additional_packet_mux(
  371. packet, is_header ? 0 : stream->start_dts_offset, &data,
  372. &size, is_header, idx);
  373. } else {
  374. flv_packet_mux(packet, is_header ? 0 : stream->start_dts_offset,
  375. &data, &size, is_header);
  376. }
  377. #ifdef TEST_FRAMEDROPS
  378. droptest_cap_data_rate(stream, size);
  379. #endif
  380. ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, 0);
  381. bfree(data);
  382. if (is_header)
  383. bfree(packet->data);
  384. else
  385. obs_encoder_packet_release(packet);
  386. stream->total_bytes_sent += size;
  387. return ret;
  388. }
  389. static int send_packet_ex(struct rtmp_stream *stream,
  390. struct encoder_packet *packet, bool is_header,
  391. bool is_footer)
  392. {
  393. uint8_t *data;
  394. size_t size = 0;
  395. int ret = 0;
  396. if (handle_socket_read(stream))
  397. return -1;
  398. if (is_header) {
  399. flv_packet_start(packet, stream->video_codec,
  400. stream->start_dts_offset, &data, &size);
  401. } else if (is_footer) {
  402. flv_packet_end(packet, stream->video_codec,
  403. stream->start_dts_offset, &data, &size);
  404. } else {
  405. flv_packet_frames(packet, stream->video_codec,
  406. stream->start_dts_offset, &data, &size);
  407. }
  408. #ifdef TEST_FRAMEDROPS
  409. droptest_cap_data_rate(stream, size);
  410. #endif
  411. ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, 0);
  412. bfree(data);
  413. if (is_header || is_footer) // manually created packets
  414. bfree(packet->data);
  415. else
  416. obs_encoder_packet_release(packet);
  417. stream->total_bytes_sent += size;
  418. return ret;
  419. }
  420. static inline bool send_headers(struct rtmp_stream *stream);
  421. static inline bool send_footers(struct rtmp_stream *stream);
  422. static inline bool can_shutdown_stream(struct rtmp_stream *stream,
  423. struct encoder_packet *packet)
  424. {
  425. uint64_t cur_time = os_gettime_ns();
  426. bool timeout = cur_time >= stream->shutdown_timeout_ts;
  427. if (timeout)
  428. info("Stream shutdown timeout reached (%d second(s))",
  429. stream->max_shutdown_time_sec);
  430. return timeout || packet->sys_dts_usec >= (int64_t)stream->stop_ts;
  431. }
  432. static void set_output_error(struct rtmp_stream *stream)
  433. {
  434. const char *msg = NULL;
  435. #ifdef _WIN32
  436. switch (stream->rtmp.last_error_code) {
  437. case WSAETIMEDOUT:
  438. msg = obs_module_text("ConnectionTimedOut");
  439. break;
  440. case WSAEACCES:
  441. msg = obs_module_text("PermissionDenied");
  442. break;
  443. case WSAECONNABORTED:
  444. msg = obs_module_text("ConnectionAborted");
  445. break;
  446. case WSAECONNRESET:
  447. msg = obs_module_text("ConnectionReset");
  448. break;
  449. case WSAHOST_NOT_FOUND:
  450. msg = obs_module_text("HostNotFound");
  451. break;
  452. case WSANO_DATA:
  453. msg = obs_module_text("NoData");
  454. break;
  455. case WSAEADDRNOTAVAIL:
  456. msg = obs_module_text("AddressNotAvailable");
  457. break;
  458. }
  459. #else
  460. switch (stream->rtmp.last_error_code) {
  461. case ETIMEDOUT:
  462. msg = obs_module_text("ConnectionTimedOut");
  463. break;
  464. case EACCES:
  465. msg = obs_module_text("PermissionDenied");
  466. break;
  467. case ECONNABORTED:
  468. msg = obs_module_text("ConnectionAborted");
  469. break;
  470. case ECONNRESET:
  471. msg = obs_module_text("ConnectionReset");
  472. break;
  473. case HOST_NOT_FOUND:
  474. msg = obs_module_text("HostNotFound");
  475. break;
  476. case NO_DATA:
  477. msg = obs_module_text("NoData");
  478. break;
  479. case EADDRNOTAVAIL:
  480. msg = obs_module_text("AddressNotAvailable");
  481. break;
  482. }
  483. #endif
  484. // non platform-specific errors
  485. if (!msg) {
  486. switch (stream->rtmp.last_error_code) {
  487. case -0x2700:
  488. msg = obs_module_text("SSLCertVerifyFailed");
  489. break;
  490. case -0x7680:
  491. msg = "Failed to load root certificates for a secure TLS connection."
  492. #if defined(__linux__)
  493. " Check you have an up to date root certificate bundle in /etc/ssl/certs."
  494. #endif
  495. ;
  496. break;
  497. }
  498. }
  499. if (msg)
  500. obs_output_set_last_error(stream->output, msg);
  501. }
  502. static void dbr_add_frame(struct rtmp_stream *stream, struct dbr_frame *back)
  503. {
  504. struct dbr_frame front;
  505. uint64_t dur;
  506. circlebuf_push_back(&stream->dbr_frames, back, sizeof(*back));
  507. circlebuf_peek_front(&stream->dbr_frames, &front, sizeof(front));
  508. stream->dbr_data_size += back->size;
  509. dur = (back->send_end - front.send_beg) / 1000000;
  510. if (dur >= MAX_ESTIMATE_DURATION_MS) {
  511. stream->dbr_data_size -= front.size;
  512. circlebuf_pop_front(&stream->dbr_frames, NULL, sizeof(front));
  513. }
  514. stream->dbr_est_bitrate =
  515. (dur >= MIN_ESTIMATE_DURATION_MS)
  516. ? (long)(stream->dbr_data_size * 1000 / dur)
  517. : 0;
  518. stream->dbr_est_bitrate *= 8;
  519. stream->dbr_est_bitrate /= 1000;
  520. if (stream->dbr_est_bitrate) {
  521. stream->dbr_est_bitrate -= stream->audio_bitrate;
  522. if (stream->dbr_est_bitrate < 50)
  523. stream->dbr_est_bitrate = 50;
  524. }
  525. }
  526. static void dbr_set_bitrate(struct rtmp_stream *stream);
  527. static bool rtmp_stream_start(void *data);
  528. #ifdef _WIN32
  529. #define socklen_t int
  530. #endif
  531. static void log_sndbuf_size(struct rtmp_stream *stream)
  532. {
  533. int cur_sendbuf_size;
  534. socklen_t int_size = sizeof(int);
  535. if (!getsockopt(stream->rtmp.m_sb.sb_socket, SOL_SOCKET, SO_SNDBUF,
  536. (char *)&cur_sendbuf_size, &int_size)) {
  537. info("Socket send buffer is %d bytes", cur_sendbuf_size);
  538. }
  539. }
  540. static void *send_thread(void *data)
  541. {
  542. struct rtmp_stream *stream = data;
  543. os_set_thread_name("rtmp-stream: send_thread");
  544. #if defined(_WIN32)
  545. log_sndbuf_size(stream);
  546. #endif
  547. while (os_sem_wait(stream->send_sem) == 0) {
  548. struct encoder_packet packet;
  549. struct dbr_frame dbr_frame;
  550. if (stopping(stream) && stream->stop_ts == 0) {
  551. break;
  552. }
  553. if (!get_next_packet(stream, &packet))
  554. continue;
  555. if (stopping(stream)) {
  556. if (can_shutdown_stream(stream, &packet)) {
  557. obs_encoder_packet_release(&packet);
  558. break;
  559. }
  560. }
  561. if (!stream->sent_headers) {
  562. if (!send_headers(stream)) {
  563. os_atomic_set_bool(&stream->disconnected, true);
  564. break;
  565. }
  566. }
  567. /* silent reconnect signal received from server, reconnect on
  568. * next keyframe */
  569. if (silently_reconnecting(stream) &&
  570. packet.type == OBS_ENCODER_VIDEO && packet.keyframe) {
  571. reinsert_packet_at_front(stream, &packet);
  572. break;
  573. }
  574. if (stream->dbr_enabled) {
  575. dbr_frame.send_beg = os_gettime_ns();
  576. dbr_frame.size = packet.size;
  577. }
  578. int sent;
  579. if (packet.type == OBS_ENCODER_VIDEO &&
  580. stream->video_codec != CODEC_H264) {
  581. sent = send_packet_ex(stream, &packet, false, false);
  582. } else {
  583. sent = send_packet(stream, &packet, false,
  584. packet.track_idx);
  585. }
  586. if (sent < 0) {
  587. os_atomic_set_bool(&stream->disconnected, true);
  588. break;
  589. }
  590. if (stream->dbr_enabled) {
  591. dbr_frame.send_end = os_gettime_ns();
  592. pthread_mutex_lock(&stream->dbr_mutex);
  593. dbr_add_frame(stream, &dbr_frame);
  594. pthread_mutex_unlock(&stream->dbr_mutex);
  595. }
  596. }
  597. bool encode_error = os_atomic_load_bool(&stream->encode_error);
  598. if (disconnected(stream)) {
  599. info("Disconnected from %s", stream->path.array);
  600. } else if (encode_error) {
  601. info("Encoder error, disconnecting");
  602. send_footers(stream); // Y2023 spec
  603. } else if (silently_reconnecting(stream)) {
  604. info("Silent reconnect signal received from server");
  605. } else {
  606. info("User stopped the stream");
  607. send_footers(stream); // Y2023 spec
  608. }
  609. #if defined(_WIN32)
  610. log_sndbuf_size(stream);
  611. #endif
  612. if (stream->new_socket_loop) {
  613. os_event_signal(stream->send_thread_signaled_exit);
  614. os_event_signal(stream->buffer_has_data_event);
  615. pthread_join(stream->socket_thread, NULL);
  616. stream->socket_thread_active = false;
  617. stream->rtmp.m_bCustomSend = false;
  618. }
  619. set_output_error(stream);
  620. if (silently_reconnecting(stream)) {
  621. /* manually close the socket to prevent librtmp from sending
  622. * unpublish / deletestream messages when we call RTMP_Close,
  623. * since we want to re-use this stream when we reconnect */
  624. RTMPSockBuf_Close(&stream->rtmp.m_sb);
  625. stream->rtmp.m_sb.sb_socket = -1;
  626. }
  627. RTMP_Close(&stream->rtmp);
  628. /* reset bitrate on stop */
  629. if (stream->dbr_enabled) {
  630. if (stream->dbr_cur_bitrate != stream->dbr_orig_bitrate) {
  631. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  632. dbr_set_bitrate(stream);
  633. }
  634. }
  635. if (!stopping(stream)) {
  636. pthread_detach(stream->send_thread);
  637. if (!silently_reconnecting(stream))
  638. obs_output_signal_stop(stream->output,
  639. OBS_OUTPUT_DISCONNECTED);
  640. } else if (encode_error) {
  641. obs_output_signal_stop(stream->output, OBS_OUTPUT_ENCODE_ERROR);
  642. } else {
  643. obs_output_end_data_capture(stream->output);
  644. }
  645. if (!silently_reconnecting(stream)) {
  646. free_packets(stream);
  647. os_event_reset(stream->stop_event);
  648. os_atomic_set_bool(&stream->active, false);
  649. }
  650. stream->sent_headers = false;
  651. /* reset bitrate on stop */
  652. if (stream->dbr_enabled) {
  653. if (stream->dbr_cur_bitrate != stream->dbr_orig_bitrate) {
  654. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  655. dbr_set_bitrate(stream);
  656. }
  657. }
  658. if (silently_reconnecting(stream)) {
  659. rtmp_stream_start(stream);
  660. }
  661. return NULL;
  662. }
  663. static bool send_additional_meta_data(struct rtmp_stream *stream)
  664. {
  665. uint8_t *meta_data;
  666. size_t meta_data_size;
  667. bool success = true;
  668. flv_additional_meta_data(stream->output, &meta_data, &meta_data_size);
  669. success = RTMP_Write(&stream->rtmp, (char *)meta_data,
  670. (int)meta_data_size, 0) >= 0;
  671. bfree(meta_data);
  672. return success;
  673. }
  674. static bool send_meta_data(struct rtmp_stream *stream)
  675. {
  676. uint8_t *meta_data;
  677. size_t meta_data_size;
  678. bool success = true;
  679. flv_meta_data(stream->output, &meta_data, &meta_data_size, false);
  680. success = RTMP_Write(&stream->rtmp, (char *)meta_data,
  681. (int)meta_data_size, 0) >= 0;
  682. bfree(meta_data);
  683. return success;
  684. }
  685. static bool send_audio_header(struct rtmp_stream *stream, size_t idx,
  686. bool *next)
  687. {
  688. obs_output_t *context = stream->output;
  689. obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, idx);
  690. uint8_t *header;
  691. struct encoder_packet packet = {.type = OBS_ENCODER_AUDIO,
  692. .timebase_den = 1};
  693. if (!aencoder) {
  694. *next = false;
  695. return true;
  696. }
  697. if (!obs_encoder_get_extra_data(aencoder, &header, &packet.size))
  698. return false;
  699. packet.data = bmemdup(header, packet.size);
  700. return send_packet(stream, &packet, true, idx) >= 0;
  701. }
  702. static bool send_video_header(struct rtmp_stream *stream)
  703. {
  704. obs_output_t *context = stream->output;
  705. obs_encoder_t *vencoder = obs_output_get_video_encoder(context);
  706. uint8_t *header;
  707. size_t size;
  708. struct encoder_packet packet = {
  709. .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true};
  710. if (!obs_encoder_get_extra_data(vencoder, &header, &size))
  711. return false;
  712. switch (stream->video_codec) {
  713. case CODEC_H264:
  714. packet.size = obs_parse_avc_header(&packet.data, header, size);
  715. return send_packet(stream, &packet, true, 0) >= 0;
  716. #ifdef ENABLE_HEVC
  717. case CODEC_HEVC:
  718. packet.size = obs_parse_hevc_header(&packet.data, header, size);
  719. return send_packet_ex(stream, &packet, true, 0) >= 0;
  720. #endif
  721. case CODEC_AV1:
  722. packet.size = obs_parse_av1_header(&packet.data, header, size);
  723. return send_packet_ex(stream, &packet, true, 0) >= 0;
  724. }
  725. return false;
  726. }
  727. static bool send_video_metadata(struct rtmp_stream *stream)
  728. {
  729. if (handle_socket_read(stream))
  730. return -1;
  731. // Y2023 spec
  732. if (stream->video_codec != CODEC_H264) {
  733. uint8_t *data;
  734. size_t size;
  735. video_t *video = obs_get_video();
  736. const struct video_output_info *info =
  737. video_output_get_info(video);
  738. enum video_format format = info->format;
  739. enum video_colorspace colorspace = info->colorspace;
  740. int bits_per_raw_sample;
  741. switch (format) {
  742. case VIDEO_FORMAT_I010:
  743. case VIDEO_FORMAT_P010:
  744. case VIDEO_FORMAT_I210:
  745. bits_per_raw_sample = 10;
  746. break;
  747. case VIDEO_FORMAT_I412:
  748. case VIDEO_FORMAT_YA2L:
  749. bits_per_raw_sample = 12;
  750. break;
  751. default:
  752. bits_per_raw_sample = 8;
  753. }
  754. int pri = 0, trc = 0, spc = 0;
  755. switch (colorspace) {
  756. case VIDEO_CS_601:
  757. pri = OBSCOL_PRI_SMPTE170M;
  758. trc = OBSCOL_PRI_SMPTE170M;
  759. spc = OBSCOL_PRI_SMPTE170M;
  760. break;
  761. case VIDEO_CS_DEFAULT:
  762. case VIDEO_CS_709:
  763. pri = OBSCOL_PRI_BT709;
  764. trc = OBSCOL_PRI_BT709;
  765. spc = OBSCOL_PRI_BT709;
  766. break;
  767. case VIDEO_CS_SRGB:
  768. pri = OBSCOL_PRI_BT709;
  769. trc = OBSCOL_TRC_IEC61966_2_1;
  770. spc = OBSCOL_PRI_BT709;
  771. break;
  772. case VIDEO_CS_2100_PQ:
  773. pri = OBSCOL_PRI_BT2020;
  774. trc = OBSCOL_TRC_SMPTE2084;
  775. spc = OBSCOL_SPC_BT2020_NCL;
  776. break;
  777. case VIDEO_CS_2100_HLG:
  778. pri = OBSCOL_PRI_BT2020;
  779. trc = OBSCOL_TRC_ARIB_STD_B67;
  780. spc = OBSCOL_SPC_BT2020_NCL;
  781. }
  782. int max_luminance = 0;
  783. if (trc == OBSCOL_TRC_ARIB_STD_B67)
  784. max_luminance = 1000;
  785. else if (trc == OBSCOL_TRC_SMPTE2084)
  786. max_luminance =
  787. (int)obs_get_video_hdr_nominal_peak_level();
  788. flv_packet_metadata(stream->video_codec, &data, &size,
  789. bits_per_raw_sample, pri, trc, spc, 0,
  790. max_luminance);
  791. int ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, 0);
  792. bfree(data);
  793. stream->total_bytes_sent += size;
  794. return ret >= 0;
  795. }
  796. // legacy
  797. return true;
  798. }
  799. static bool send_video_footer(struct rtmp_stream *stream)
  800. {
  801. struct encoder_packet packet = {.type = OBS_ENCODER_VIDEO,
  802. .timebase_den = 1,
  803. .keyframe = false};
  804. packet.size = 0;
  805. return send_packet_ex(stream, &packet, 0, true) >= 0;
  806. }
  807. static inline bool send_headers(struct rtmp_stream *stream)
  808. {
  809. stream->sent_headers = true;
  810. size_t i = 0;
  811. bool next = true;
  812. if (!send_audio_header(stream, i++, &next))
  813. return false;
  814. if (!send_video_header(stream))
  815. return false;
  816. // send metadata only if HDR
  817. video_t *video = obs_get_video();
  818. const struct video_output_info *info = video_output_get_info(video);
  819. enum video_colorspace colorspace = info->colorspace;
  820. if (colorspace == VIDEO_CS_2100_PQ || colorspace == VIDEO_CS_2100_HLG)
  821. if (!send_video_metadata(stream)) // Y2023 spec
  822. return false;
  823. while (next) {
  824. if (!send_audio_header(stream, i++, &next))
  825. return false;
  826. }
  827. return true;
  828. }
  829. static inline bool send_footers(struct rtmp_stream *stream)
  830. {
  831. if (stream->video_codec == CODEC_H264)
  832. return false;
  833. // Y2023 spec
  834. return send_video_footer(stream);
  835. }
  836. static inline bool reset_semaphore(struct rtmp_stream *stream)
  837. {
  838. os_sem_destroy(stream->send_sem);
  839. return os_sem_init(&stream->send_sem, 0) == 0;
  840. }
  841. static int init_send(struct rtmp_stream *stream)
  842. {
  843. int ret;
  844. obs_output_t *context = stream->output;
  845. if (!silently_reconnecting(stream))
  846. reset_semaphore(stream);
  847. ret = pthread_create(&stream->send_thread, NULL, send_thread, stream);
  848. if (ret != 0) {
  849. RTMP_Close(&stream->rtmp);
  850. warn("Failed to create send thread");
  851. return OBS_OUTPUT_ERROR;
  852. }
  853. if (stream->new_socket_loop) {
  854. int one = 1;
  855. #ifdef _WIN32
  856. if (ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONBIO, &one)) {
  857. stream->rtmp.last_error_code = WSAGetLastError();
  858. #else
  859. if (ioctl(stream->rtmp.m_sb.sb_socket, FIONBIO, &one)) {
  860. stream->rtmp.last_error_code = errno;
  861. #endif
  862. warn("Failed to set non-blocking socket");
  863. return OBS_OUTPUT_ERROR;
  864. }
  865. os_event_reset(stream->send_thread_signaled_exit);
  866. info("New socket loop enabled by user");
  867. if (stream->low_latency_mode)
  868. info("Low latency mode enabled by user");
  869. if (stream->write_buf)
  870. bfree(stream->write_buf);
  871. int total_bitrate = 0;
  872. obs_encoder_t *vencoder = obs_output_get_video_encoder(context);
  873. if (vencoder) {
  874. obs_data_t *params = obs_encoder_get_settings(vencoder);
  875. if (params) {
  876. int bitrate =
  877. obs_data_get_int(params, "bitrate");
  878. if (!bitrate) {
  879. warn("Video encoder didn't return a "
  880. "valid bitrate, new network "
  881. "code may function poorly. "
  882. "Low latency mode disabled.");
  883. stream->low_latency_mode = false;
  884. bitrate = 10000;
  885. }
  886. total_bitrate += bitrate;
  887. obs_data_release(params);
  888. }
  889. }
  890. obs_encoder_t *aencoder =
  891. obs_output_get_audio_encoder(context, 0);
  892. if (aencoder) {
  893. obs_data_t *params = obs_encoder_get_settings(aencoder);
  894. if (params) {
  895. int bitrate =
  896. obs_data_get_int(params, "bitrate");
  897. if (!bitrate)
  898. bitrate = 160;
  899. total_bitrate += bitrate;
  900. obs_data_release(params);
  901. }
  902. }
  903. // to bytes/sec
  904. int ideal_buffer_size = total_bitrate * 128;
  905. if (ideal_buffer_size < 131072)
  906. ideal_buffer_size = 131072;
  907. stream->write_buf_size = ideal_buffer_size;
  908. stream->write_buf = bmalloc(ideal_buffer_size);
  909. #ifdef _WIN32
  910. ret = pthread_create(&stream->socket_thread, NULL,
  911. socket_thread_windows, stream);
  912. #else
  913. warn("New socket loop not supported on this platform");
  914. return OBS_OUTPUT_ERROR;
  915. #endif
  916. if (ret != 0) {
  917. RTMP_Close(&stream->rtmp);
  918. warn("Failed to create socket thread");
  919. return OBS_OUTPUT_ERROR;
  920. }
  921. stream->socket_thread_active = true;
  922. stream->rtmp.m_bCustomSend = true;
  923. stream->rtmp.m_customSendFunc = socket_queue_data;
  924. stream->rtmp.m_customSendParam = stream;
  925. }
  926. os_atomic_set_bool(&stream->active, true);
  927. if (!send_meta_data(stream)) {
  928. warn("Disconnected while attempting to send metadata");
  929. set_output_error(stream);
  930. return OBS_OUTPUT_DISCONNECTED;
  931. }
  932. obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, 1);
  933. if (aencoder && !send_additional_meta_data(stream)) {
  934. warn("Disconnected while attempting to send additional "
  935. "metadata");
  936. return OBS_OUTPUT_DISCONNECTED;
  937. }
  938. if (obs_output_get_audio_encoder(context, 2) != NULL) {
  939. warn("Additional audio streams not supported");
  940. return OBS_OUTPUT_DISCONNECTED;
  941. }
  942. if (!silently_reconnecting(stream))
  943. obs_output_begin_data_capture(stream->output, 0);
  944. return OBS_OUTPUT_SUCCESS;
  945. }
  946. #ifdef _WIN32
  947. static void win32_log_interface_type(struct rtmp_stream *stream)
  948. {
  949. RTMP *rtmp = &stream->rtmp;
  950. MIB_IPFORWARDROW route;
  951. uint32_t dest_addr, source_addr;
  952. char hostname[256];
  953. HOSTENT *h;
  954. if (rtmp->Link.hostname.av_len >= sizeof(hostname) - 1)
  955. return;
  956. strncpy(hostname, rtmp->Link.hostname.av_val, sizeof(hostname));
  957. hostname[rtmp->Link.hostname.av_len] = 0;
  958. h = gethostbyname(hostname);
  959. if (!h)
  960. return;
  961. dest_addr = *(uint32_t *)h->h_addr_list[0];
  962. if (rtmp->m_bindIP.addrLen == 0)
  963. source_addr = 0;
  964. else if (rtmp->m_bindIP.addr.ss_family == AF_INET)
  965. source_addr = (*(struct sockaddr_in *)&rtmp->m_bindIP.addr)
  966. .sin_addr.S_un.S_addr;
  967. else
  968. return;
  969. if (!GetBestRoute(dest_addr, source_addr, &route)) {
  970. MIB_IF_ROW2 row;
  971. memset(&row, 0, sizeof(row));
  972. row.InterfaceIndex = route.dwForwardIfIndex;
  973. if (!GetIfEntry2(&row)) {
  974. uint32_t rxSpeed = row.ReceiveLinkSpeed / 1000000;
  975. uint32_t txSpeed = row.TransmitLinkSpeed / 1000000;
  976. char *type;
  977. struct dstr other = {0};
  978. switch (row.PhysicalMediumType) {
  979. case NdisPhysicalMedium802_3:
  980. type = "ethernet";
  981. break;
  982. case NdisPhysicalMediumWirelessLan:
  983. case NdisPhysicalMediumNative802_11:
  984. type = "802.11";
  985. break;
  986. default:
  987. dstr_printf(&other, "type %d",
  988. (int)row.PhysicalMediumType);
  989. type = other.array;
  990. break;
  991. }
  992. char *desc;
  993. os_wcs_to_utf8_ptr(row.Description, 0, &desc);
  994. info("Interface: %s (%s, %lu↓/%lu↑ mbps)", desc, type,
  995. rxSpeed, txSpeed);
  996. bfree(desc);
  997. if (row.InErrors || row.OutErrors) {
  998. warn("Interface has non-zero error counters (%" PRIu64
  999. "/%" PRIu64 " errors, %" PRIu64 "/%" PRIu64
  1000. " discards)",
  1001. row.InErrors, row.OutErrors,
  1002. row.InDiscards, row.OutDiscards);
  1003. }
  1004. dstr_free(&other);
  1005. }
  1006. }
  1007. }
  1008. #endif
  1009. static void add_connect_data(char **penc, char *pend)
  1010. {
  1011. const AVal val = AVC("supportsGoAway");
  1012. *penc = AMF_EncodeNamedBoolean(*penc, pend, &val, true);
  1013. }
  1014. static int try_connect(struct rtmp_stream *stream)
  1015. {
  1016. if (dstr_is_empty(&stream->path)) {
  1017. warn("URL is empty");
  1018. return OBS_OUTPUT_BAD_PATH;
  1019. }
  1020. info("Connecting to RTMP URL %s...", stream->path.array);
  1021. // free any existing RTMP TLS context
  1022. RTMP_TLS_Free(&stream->rtmp);
  1023. RTMP_Init(&stream->rtmp);
  1024. if (!RTMP_SetupURL(&stream->rtmp, stream->path.array))
  1025. return OBS_OUTPUT_BAD_PATH;
  1026. RTMP_EnableWrite(&stream->rtmp);
  1027. dstr_copy(&stream->encoder_name, "FMLE/3.0 (compatible; FMSc/1.0)");
  1028. set_rtmp_dstr(&stream->rtmp.Link.pubUser, &stream->username);
  1029. set_rtmp_dstr(&stream->rtmp.Link.pubPasswd, &stream->password);
  1030. set_rtmp_dstr(&stream->rtmp.Link.flashVer, &stream->encoder_name);
  1031. stream->rtmp.Link.swfUrl = stream->rtmp.Link.tcUrl;
  1032. stream->rtmp.Link.customConnectEncode = add_connect_data;
  1033. if (dstr_is_empty(&stream->bind_ip) ||
  1034. dstr_cmp(&stream->bind_ip, "default") == 0) {
  1035. memset(&stream->rtmp.m_bindIP, 0,
  1036. sizeof(stream->rtmp.m_bindIP));
  1037. } else {
  1038. bool success = netif_str_to_addr(&stream->rtmp.m_bindIP.addr,
  1039. &stream->rtmp.m_bindIP.addrLen,
  1040. stream->bind_ip.array);
  1041. if (success) {
  1042. int len = stream->rtmp.m_bindIP.addrLen;
  1043. bool ipv6 = len == sizeof(struct sockaddr_in6);
  1044. info("Binding to IPv%d", ipv6 ? 6 : 4);
  1045. }
  1046. }
  1047. RTMP_AddStream(&stream->rtmp, stream->key.array);
  1048. stream->rtmp.m_outChunkSize = 4096;
  1049. stream->rtmp.m_bSendChunkSizeInfo = true;
  1050. stream->rtmp.m_bUseNagle = true;
  1051. #ifdef _WIN32
  1052. win32_log_interface_type(stream);
  1053. #endif
  1054. if (!RTMP_Connect(&stream->rtmp, NULL)) {
  1055. set_output_error(stream);
  1056. return OBS_OUTPUT_CONNECT_FAILED;
  1057. }
  1058. if (!RTMP_ConnectStream(&stream->rtmp, 0))
  1059. return OBS_OUTPUT_INVALID_STREAM;
  1060. info("Connection to %s successful", stream->path.array);
  1061. return init_send(stream);
  1062. }
  1063. static bool init_connect(struct rtmp_stream *stream)
  1064. {
  1065. obs_service_t *service;
  1066. obs_data_t *settings;
  1067. const char *bind_ip;
  1068. int64_t drop_p;
  1069. int64_t drop_b;
  1070. uint32_t caps;
  1071. if (stopping(stream)) {
  1072. pthread_join(stream->send_thread, NULL);
  1073. }
  1074. free_packets(stream);
  1075. service = obs_output_get_service(stream->output);
  1076. if (!service)
  1077. return false;
  1078. os_atomic_set_bool(&stream->disconnected, false);
  1079. os_atomic_set_bool(&stream->encode_error, false);
  1080. stream->total_bytes_sent = 0;
  1081. stream->dropped_frames = 0;
  1082. stream->min_priority = 0;
  1083. stream->got_first_video = false;
  1084. settings = obs_output_get_settings(stream->output);
  1085. dstr_copy(&stream->path,
  1086. obs_service_get_connect_info(
  1087. service, OBS_SERVICE_CONNECT_INFO_SERVER_URL));
  1088. dstr_copy(&stream->key,
  1089. obs_service_get_connect_info(
  1090. service, OBS_SERVICE_CONNECT_INFO_STREAM_KEY));
  1091. dstr_copy(&stream->username,
  1092. obs_service_get_connect_info(
  1093. service, OBS_SERVICE_CONNECT_INFO_USERNAME));
  1094. dstr_copy(&stream->password,
  1095. obs_service_get_connect_info(
  1096. service, OBS_SERVICE_CONNECT_INFO_PASSWORD));
  1097. dstr_depad(&stream->path);
  1098. dstr_depad(&stream->key);
  1099. drop_b = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD);
  1100. drop_p = (int64_t)obs_data_get_int(settings, OPT_PFRAME_DROP_THRESHOLD);
  1101. stream->max_shutdown_time_sec =
  1102. (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC);
  1103. obs_encoder_t *venc = obs_output_get_video_encoder(stream->output);
  1104. obs_encoder_t *aenc = obs_output_get_audio_encoder(stream->output, 0);
  1105. obs_data_t *vsettings = obs_encoder_get_settings(venc);
  1106. obs_data_t *asettings = obs_encoder_get_settings(aenc);
  1107. const char *codec = obs_encoder_get_codec(venc);
  1108. stream->video_codec = to_video_type(codec);
  1109. circlebuf_free(&stream->dbr_frames);
  1110. stream->audio_bitrate = (long)obs_data_get_int(asettings, "bitrate");
  1111. stream->dbr_data_size = 0;
  1112. stream->dbr_orig_bitrate = (long)obs_data_get_int(vsettings, "bitrate");
  1113. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  1114. stream->dbr_est_bitrate = 0;
  1115. stream->dbr_inc_bitrate = stream->dbr_orig_bitrate / 10;
  1116. stream->dbr_inc_timeout = 0;
  1117. stream->dbr_enabled = obs_data_get_bool(settings, OPT_DYN_BITRATE);
  1118. caps = obs_encoder_get_caps(venc);
  1119. if ((caps & OBS_ENCODER_CAP_DYN_BITRATE) == 0) {
  1120. stream->dbr_enabled = false;
  1121. }
  1122. if (obs_output_get_delay(stream->output) != 0) {
  1123. stream->dbr_enabled = false;
  1124. }
  1125. if (stream->dbr_enabled) {
  1126. info("Dynamic bitrate enabled. Dropped frames begone!");
  1127. }
  1128. obs_data_release(vsettings);
  1129. obs_data_release(asettings);
  1130. if (drop_p < (drop_b + 200))
  1131. drop_p = drop_b + 200;
  1132. stream->drop_threshold_usec = 1000 * drop_b;
  1133. stream->pframe_drop_threshold_usec = 1000 * drop_p;
  1134. bind_ip = obs_data_get_string(settings, OPT_BIND_IP);
  1135. dstr_copy(&stream->bind_ip, bind_ip);
  1136. #ifdef _WIN32
  1137. stream->new_socket_loop =
  1138. obs_data_get_bool(settings, OPT_NEWSOCKETLOOP_ENABLED);
  1139. stream->low_latency_mode =
  1140. obs_data_get_bool(settings, OPT_LOWLATENCY_ENABLED);
  1141. // ugly hack for now, can be removed once new loop is reworked
  1142. if (stream->new_socket_loop &&
  1143. !strncmp(stream->path.array, "rtmps://", 8)) {
  1144. warn("Disabling network optimizations, not compatible with RTMPS");
  1145. stream->new_socket_loop = false;
  1146. }
  1147. #else
  1148. stream->new_socket_loop = false;
  1149. stream->low_latency_mode = false;
  1150. #endif
  1151. obs_data_release(settings);
  1152. return true;
  1153. }
  1154. static void *connect_thread(void *data)
  1155. {
  1156. struct rtmp_stream *stream = data;
  1157. int ret;
  1158. os_set_thread_name("rtmp-stream: connect_thread");
  1159. if (!silently_reconnecting(stream)) {
  1160. if (!init_connect(stream)) {
  1161. obs_output_signal_stop(stream->output,
  1162. OBS_OUTPUT_BAD_PATH);
  1163. os_atomic_set_bool(&stream->silent_reconnect, false);
  1164. return NULL;
  1165. }
  1166. } else {
  1167. struct encoder_packet packet;
  1168. peek_next_packet(stream, &packet);
  1169. stream->start_dts_offset = get_ms_time(&packet, packet.dts);
  1170. }
  1171. // HDR streaming disabled for AV1 and HEVC
  1172. if (stream->video_codec != CODEC_H264) {
  1173. video_t *video = obs_get_video();
  1174. const struct video_output_info *info =
  1175. video_output_get_info(video);
  1176. if (info->colorspace == VIDEO_CS_2100_HLG ||
  1177. info->colorspace == VIDEO_CS_2100_PQ) {
  1178. obs_output_signal_stop(stream->output,
  1179. OBS_OUTPUT_HDR_DISABLED);
  1180. return NULL;
  1181. }
  1182. }
  1183. ret = try_connect(stream);
  1184. if (ret != OBS_OUTPUT_SUCCESS) {
  1185. obs_output_signal_stop(stream->output, ret);
  1186. info("Connection to %s failed: %d", stream->path.array, ret);
  1187. }
  1188. if (!stopping(stream))
  1189. pthread_detach(stream->connect_thread);
  1190. os_atomic_set_bool(&stream->silent_reconnect, false);
  1191. os_atomic_set_bool(&stream->connecting, false);
  1192. return NULL;
  1193. }
  1194. static bool rtmp_stream_start(void *data)
  1195. {
  1196. struct rtmp_stream *stream = data;
  1197. if (!silently_reconnecting(stream)) {
  1198. if (!obs_output_can_begin_data_capture(stream->output, 0))
  1199. return false;
  1200. if (!obs_output_initialize_encoders(stream->output, 0))
  1201. return false;
  1202. }
  1203. os_atomic_set_bool(&stream->connecting, true);
  1204. return pthread_create(&stream->connect_thread, NULL, connect_thread,
  1205. stream) == 0;
  1206. }
  1207. static inline bool add_packet(struct rtmp_stream *stream,
  1208. struct encoder_packet *packet)
  1209. {
  1210. circlebuf_push_back(&stream->packets, packet,
  1211. sizeof(struct encoder_packet));
  1212. return true;
  1213. }
  1214. static inline size_t num_buffered_packets(struct rtmp_stream *stream)
  1215. {
  1216. return stream->packets.size / sizeof(struct encoder_packet);
  1217. }
  1218. static void drop_frames(struct rtmp_stream *stream, const char *name,
  1219. int highest_priority, bool pframes)
  1220. {
  1221. UNUSED_PARAMETER(pframes);
  1222. struct circlebuf new_buf = {0};
  1223. int num_frames_dropped = 0;
  1224. #ifdef _DEBUG
  1225. int start_packets = (int)num_buffered_packets(stream);
  1226. #else
  1227. UNUSED_PARAMETER(name);
  1228. #endif
  1229. circlebuf_reserve(&new_buf, sizeof(struct encoder_packet) * 8);
  1230. while (stream->packets.size) {
  1231. struct encoder_packet packet;
  1232. circlebuf_pop_front(&stream->packets, &packet, sizeof(packet));
  1233. /* do not drop audio data or video keyframes */
  1234. if (packet.type == OBS_ENCODER_AUDIO ||
  1235. packet.drop_priority >= highest_priority) {
  1236. circlebuf_push_back(&new_buf, &packet, sizeof(packet));
  1237. } else {
  1238. num_frames_dropped++;
  1239. obs_encoder_packet_release(&packet);
  1240. }
  1241. }
  1242. circlebuf_free(&stream->packets);
  1243. stream->packets = new_buf;
  1244. if (stream->min_priority < highest_priority)
  1245. stream->min_priority = highest_priority;
  1246. if (!num_frames_dropped)
  1247. return;
  1248. stream->dropped_frames += num_frames_dropped;
  1249. #ifdef _DEBUG
  1250. debug("Dropped %s, prev packet count: %d, new packet count: %d", name,
  1251. start_packets, (int)num_buffered_packets(stream));
  1252. #endif
  1253. }
  1254. static bool find_first_video_packet(struct rtmp_stream *stream,
  1255. struct encoder_packet *first)
  1256. {
  1257. size_t count = stream->packets.size / sizeof(*first);
  1258. for (size_t i = 0; i < count; i++) {
  1259. struct encoder_packet *cur =
  1260. circlebuf_data(&stream->packets, i * sizeof(*first));
  1261. if (cur->type == OBS_ENCODER_VIDEO && !cur->keyframe) {
  1262. *first = *cur;
  1263. return true;
  1264. }
  1265. }
  1266. return false;
  1267. }
  1268. static bool dbr_bitrate_lowered(struct rtmp_stream *stream)
  1269. {
  1270. long prev_bitrate = stream->dbr_prev_bitrate;
  1271. long est_bitrate = 0;
  1272. long new_bitrate;
  1273. if (stream->dbr_est_bitrate &&
  1274. stream->dbr_est_bitrate < stream->dbr_cur_bitrate) {
  1275. stream->dbr_data_size = 0;
  1276. circlebuf_pop_front(&stream->dbr_frames, NULL,
  1277. stream->dbr_frames.size);
  1278. est_bitrate = stream->dbr_est_bitrate / 100 * 100;
  1279. if (est_bitrate < 50) {
  1280. est_bitrate = 50;
  1281. }
  1282. }
  1283. #if 0
  1284. if (prev_bitrate && est_bitrate) {
  1285. if (prev_bitrate < est_bitrate) {
  1286. blog(LOG_INFO, "going back to prev bitrate: "
  1287. "prev_bitrate (%d) < est_bitrate (%d)",
  1288. prev_bitrate,
  1289. est_bitrate);
  1290. new_bitrate = prev_bitrate;
  1291. } else {
  1292. new_bitrate = est_bitrate;
  1293. }
  1294. new_bitrate = est_bitrate;
  1295. } else if (prev_bitrate) {
  1296. new_bitrate = prev_bitrate;
  1297. info("going back to prev bitrate");
  1298. } else if (est_bitrate) {
  1299. new_bitrate = est_bitrate;
  1300. } else {
  1301. return false;
  1302. }
  1303. #else
  1304. if (est_bitrate) {
  1305. new_bitrate = est_bitrate;
  1306. } else if (prev_bitrate) {
  1307. new_bitrate = prev_bitrate;
  1308. info("going back to prev bitrate");
  1309. } else {
  1310. return false;
  1311. }
  1312. if (new_bitrate == stream->dbr_cur_bitrate) {
  1313. return false;
  1314. }
  1315. #endif
  1316. stream->dbr_prev_bitrate = 0;
  1317. stream->dbr_cur_bitrate = new_bitrate;
  1318. stream->dbr_inc_timeout = os_gettime_ns() + DBR_INC_TIMER;
  1319. info("bitrate decreased to: %ld", stream->dbr_cur_bitrate);
  1320. return true;
  1321. }
  1322. static void dbr_set_bitrate(struct rtmp_stream *stream)
  1323. {
  1324. obs_encoder_t *vencoder = obs_output_get_video_encoder(stream->output);
  1325. obs_data_t *settings = obs_encoder_get_settings(vencoder);
  1326. obs_data_set_int(settings, "bitrate", stream->dbr_cur_bitrate);
  1327. obs_encoder_update(vencoder, settings);
  1328. obs_data_release(settings);
  1329. }
  1330. static void dbr_inc_bitrate(struct rtmp_stream *stream)
  1331. {
  1332. stream->dbr_prev_bitrate = stream->dbr_cur_bitrate;
  1333. stream->dbr_cur_bitrate += stream->dbr_inc_bitrate;
  1334. if (stream->dbr_cur_bitrate >= stream->dbr_orig_bitrate) {
  1335. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  1336. info("bitrate increased to: %ld, done",
  1337. stream->dbr_cur_bitrate);
  1338. } else if (stream->dbr_cur_bitrate < stream->dbr_orig_bitrate) {
  1339. stream->dbr_inc_timeout = os_gettime_ns() + DBR_INC_TIMER;
  1340. info("bitrate increased to: %ld, waiting",
  1341. stream->dbr_cur_bitrate);
  1342. }
  1343. }
  1344. static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes)
  1345. {
  1346. struct encoder_packet first;
  1347. int64_t buffer_duration_usec;
  1348. size_t num_packets = num_buffered_packets(stream);
  1349. const char *name = pframes ? "p-frames" : "b-frames";
  1350. int priority = pframes ? OBS_NAL_PRIORITY_HIGHEST
  1351. : OBS_NAL_PRIORITY_HIGH;
  1352. int64_t drop_threshold = pframes ? stream->pframe_drop_threshold_usec
  1353. : stream->drop_threshold_usec;
  1354. if (!pframes && stream->dbr_enabled) {
  1355. if (stream->dbr_inc_timeout) {
  1356. uint64_t t = os_gettime_ns();
  1357. if (t >= stream->dbr_inc_timeout) {
  1358. stream->dbr_inc_timeout = 0;
  1359. dbr_inc_bitrate(stream);
  1360. dbr_set_bitrate(stream);
  1361. }
  1362. }
  1363. }
  1364. if (num_packets < 5) {
  1365. if (!pframes)
  1366. stream->congestion = 0.0f;
  1367. return;
  1368. }
  1369. if (!find_first_video_packet(stream, &first))
  1370. return;
  1371. /* if the amount of time stored in the buffered packets waiting to be
  1372. * sent is higher than threshold, drop frames */
  1373. buffer_duration_usec = stream->last_dts_usec - first.dts_usec;
  1374. if (!pframes) {
  1375. stream->congestion =
  1376. (float)buffer_duration_usec / (float)drop_threshold;
  1377. }
  1378. /* alternatively, drop only pframes:
  1379. * (!pframes && stream->dbr_enabled)
  1380. * but let's test without dropping frames
  1381. * at all first */
  1382. if (stream->dbr_enabled) {
  1383. bool bitrate_changed = false;
  1384. if (pframes) {
  1385. return;
  1386. }
  1387. if ((uint64_t)buffer_duration_usec >= DBR_TRIGGER_USEC) {
  1388. pthread_mutex_lock(&stream->dbr_mutex);
  1389. bitrate_changed = dbr_bitrate_lowered(stream);
  1390. pthread_mutex_unlock(&stream->dbr_mutex);
  1391. }
  1392. if (bitrate_changed) {
  1393. debug("buffer_duration_msec: %" PRId64,
  1394. buffer_duration_usec / 1000);
  1395. dbr_set_bitrate(stream);
  1396. }
  1397. return;
  1398. }
  1399. if (buffer_duration_usec > drop_threshold) {
  1400. debug("buffer_duration_usec: %" PRId64, buffer_duration_usec);
  1401. drop_frames(stream, name, priority, pframes);
  1402. }
  1403. }
  1404. static bool add_video_packet(struct rtmp_stream *stream,
  1405. struct encoder_packet *packet)
  1406. {
  1407. if (!silently_reconnecting(stream)) {
  1408. check_to_drop_frames(stream, false);
  1409. check_to_drop_frames(stream, true);
  1410. }
  1411. /* if currently dropping frames, drop packets until it reaches the
  1412. * desired priority */
  1413. if (packet->drop_priority < stream->min_priority) {
  1414. stream->dropped_frames++;
  1415. return false;
  1416. } else {
  1417. stream->min_priority = 0;
  1418. }
  1419. stream->last_dts_usec = packet->dts_usec;
  1420. return add_packet(stream, packet);
  1421. }
  1422. static void rtmp_stream_data(void *data, struct encoder_packet *packet)
  1423. {
  1424. struct rtmp_stream *stream = data;
  1425. struct encoder_packet new_packet;
  1426. bool added_packet = false;
  1427. if (disconnected(stream) || !active(stream))
  1428. return;
  1429. /* encoder fail */
  1430. if (!packet) {
  1431. os_atomic_set_bool(&stream->encode_error, true);
  1432. os_sem_post(stream->send_sem);
  1433. return;
  1434. }
  1435. if (packet->type == OBS_ENCODER_VIDEO) {
  1436. if (!stream->got_first_video) {
  1437. stream->start_dts_offset =
  1438. get_ms_time(packet, packet->dts);
  1439. stream->got_first_video = true;
  1440. }
  1441. switch (stream->video_codec) {
  1442. case CODEC_H264:
  1443. obs_parse_avc_packet(&new_packet, packet);
  1444. break;
  1445. #ifdef ENABLE_HEVC
  1446. case CODEC_HEVC:
  1447. obs_parse_hevc_packet(&new_packet, packet);
  1448. break;
  1449. #endif
  1450. case CODEC_AV1:
  1451. obs_parse_av1_packet(&new_packet, packet);
  1452. break;
  1453. }
  1454. } else {
  1455. obs_encoder_packet_ref(&new_packet, packet);
  1456. }
  1457. pthread_mutex_lock(&stream->packets_mutex);
  1458. if (!disconnected(stream)) {
  1459. added_packet = (packet->type == OBS_ENCODER_VIDEO)
  1460. ? add_video_packet(stream, &new_packet)
  1461. : add_packet(stream, &new_packet);
  1462. }
  1463. pthread_mutex_unlock(&stream->packets_mutex);
  1464. if (added_packet)
  1465. os_sem_post(stream->send_sem);
  1466. else
  1467. obs_encoder_packet_release(&new_packet);
  1468. }
  1469. static void rtmp_stream_defaults(obs_data_t *defaults)
  1470. {
  1471. obs_data_set_default_int(defaults, OPT_DROP_THRESHOLD, 700);
  1472. obs_data_set_default_int(defaults, OPT_PFRAME_DROP_THRESHOLD, 900);
  1473. obs_data_set_default_int(defaults, OPT_MAX_SHUTDOWN_TIME_SEC, 30);
  1474. obs_data_set_default_string(defaults, OPT_BIND_IP, "default");
  1475. #ifdef _WIN32
  1476. obs_data_set_default_bool(defaults, OPT_NEWSOCKETLOOP_ENABLED, false);
  1477. obs_data_set_default_bool(defaults, OPT_LOWLATENCY_ENABLED, false);
  1478. #endif
  1479. }
  1480. static obs_properties_t *rtmp_stream_properties(void *unused)
  1481. {
  1482. UNUSED_PARAMETER(unused);
  1483. obs_properties_t *props = obs_properties_create();
  1484. struct netif_saddr_data addrs = {0};
  1485. obs_property_t *p;
  1486. p = obs_properties_add_int(props, OPT_DROP_THRESHOLD,
  1487. obs_module_text("RTMPStream.DropThreshold"),
  1488. 200, 10000, 100);
  1489. obs_property_int_set_suffix(p, " ms");
  1490. p = obs_properties_add_list(props, OPT_BIND_IP,
  1491. obs_module_text("RTMPStream.BindIP"),
  1492. OBS_COMBO_TYPE_LIST,
  1493. OBS_COMBO_FORMAT_STRING);
  1494. obs_property_list_add_string(p, obs_module_text("Default"), "default");
  1495. netif_get_addrs(&addrs);
  1496. for (size_t i = 0; i < addrs.addrs.num; i++) {
  1497. struct netif_saddr_item item = addrs.addrs.array[i];
  1498. obs_property_list_add_string(p, item.name, item.addr);
  1499. }
  1500. netif_saddr_data_free(&addrs);
  1501. #ifdef _WIN32
  1502. obs_properties_add_bool(props, OPT_NEWSOCKETLOOP_ENABLED,
  1503. obs_module_text("RTMPStream.NewSocketLoop"));
  1504. obs_properties_add_bool(props, OPT_LOWLATENCY_ENABLED,
  1505. obs_module_text("RTMPStream.LowLatencyMode"));
  1506. #endif
  1507. return props;
  1508. }
  1509. static uint64_t rtmp_stream_total_bytes_sent(void *data)
  1510. {
  1511. struct rtmp_stream *stream = data;
  1512. return stream->total_bytes_sent;
  1513. }
  1514. static int rtmp_stream_dropped_frames(void *data)
  1515. {
  1516. struct rtmp_stream *stream = data;
  1517. return stream->dropped_frames;
  1518. }
  1519. static float rtmp_stream_congestion(void *data)
  1520. {
  1521. struct rtmp_stream *stream = data;
  1522. if (stream->new_socket_loop)
  1523. return (float)stream->write_buf_len /
  1524. (float)stream->write_buf_size;
  1525. else
  1526. return stream->min_priority > 0 ? 1.0f : stream->congestion;
  1527. }
  1528. static int rtmp_stream_connect_time(void *data)
  1529. {
  1530. struct rtmp_stream *stream = data;
  1531. return stream->rtmp.connect_time_ms;
  1532. }
  1533. struct obs_output_info rtmp_output_info = {
  1534. .id = "rtmp_output",
  1535. .flags = OBS_OUTPUT_AV | OBS_OUTPUT_ENCODED | OBS_OUTPUT_SERVICE |
  1536. OBS_OUTPUT_MULTI_TRACK,
  1537. #ifdef NO_CRYPTO
  1538. .protocols = "RTMP",
  1539. #else
  1540. .protocols = "RTMP;RTMPS",
  1541. #endif
  1542. #ifdef ENABLE_HEVC
  1543. .encoded_video_codecs = "h264;hevc;av1",
  1544. #else
  1545. .encoded_video_codecs = "h264;av1",
  1546. #endif
  1547. .encoded_audio_codecs = "aac",
  1548. .get_name = rtmp_stream_getname,
  1549. .create = rtmp_stream_create,
  1550. .destroy = rtmp_stream_destroy,
  1551. .start = rtmp_stream_start,
  1552. .stop = rtmp_stream_stop,
  1553. .encoded_packet = rtmp_stream_data,
  1554. .get_defaults = rtmp_stream_defaults,
  1555. .get_properties = rtmp_stream_properties,
  1556. .get_total_bytes = rtmp_stream_total_bytes_sent,
  1557. .get_congestion = rtmp_stream_congestion,
  1558. .get_connect_time_ms = rtmp_stream_connect_time,
  1559. .get_dropped_frames = rtmp_stream_dropped_frames,
  1560. };