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, &data, &size);
  400. } else if (is_footer) {
  401. flv_packet_end(packet, stream->video_codec, &data, &size);
  402. } else {
  403. flv_packet_frames(packet, stream->video_codec,
  404. stream->start_dts_offset, &data, &size);
  405. }
  406. #ifdef TEST_FRAMEDROPS
  407. droptest_cap_data_rate(stream, size);
  408. #endif
  409. ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, 0);
  410. bfree(data);
  411. if (is_header || is_footer) // manually created packets
  412. bfree(packet->data);
  413. else
  414. obs_encoder_packet_release(packet);
  415. stream->total_bytes_sent += size;
  416. return ret;
  417. }
  418. static inline bool send_headers(struct rtmp_stream *stream);
  419. static inline bool send_footers(struct rtmp_stream *stream);
  420. static inline bool can_shutdown_stream(struct rtmp_stream *stream,
  421. struct encoder_packet *packet)
  422. {
  423. uint64_t cur_time = os_gettime_ns();
  424. bool timeout = cur_time >= stream->shutdown_timeout_ts;
  425. if (timeout)
  426. info("Stream shutdown timeout reached (%d second(s))",
  427. stream->max_shutdown_time_sec);
  428. return timeout || packet->sys_dts_usec >= (int64_t)stream->stop_ts;
  429. }
  430. static void set_output_error(struct rtmp_stream *stream)
  431. {
  432. const char *msg = NULL;
  433. #ifdef _WIN32
  434. switch (stream->rtmp.last_error_code) {
  435. case WSAETIMEDOUT:
  436. msg = obs_module_text("ConnectionTimedOut");
  437. break;
  438. case WSAEACCES:
  439. msg = obs_module_text("PermissionDenied");
  440. break;
  441. case WSAECONNABORTED:
  442. msg = obs_module_text("ConnectionAborted");
  443. break;
  444. case WSAECONNRESET:
  445. msg = obs_module_text("ConnectionReset");
  446. break;
  447. case WSAHOST_NOT_FOUND:
  448. msg = obs_module_text("HostNotFound");
  449. break;
  450. case WSANO_DATA:
  451. msg = obs_module_text("NoData");
  452. break;
  453. case WSAEADDRNOTAVAIL:
  454. msg = obs_module_text("AddressNotAvailable");
  455. break;
  456. }
  457. #else
  458. switch (stream->rtmp.last_error_code) {
  459. case ETIMEDOUT:
  460. msg = obs_module_text("ConnectionTimedOut");
  461. break;
  462. case EACCES:
  463. msg = obs_module_text("PermissionDenied");
  464. break;
  465. case ECONNABORTED:
  466. msg = obs_module_text("ConnectionAborted");
  467. break;
  468. case ECONNRESET:
  469. msg = obs_module_text("ConnectionReset");
  470. break;
  471. case HOST_NOT_FOUND:
  472. msg = obs_module_text("HostNotFound");
  473. break;
  474. case NO_DATA:
  475. msg = obs_module_text("NoData");
  476. break;
  477. case EADDRNOTAVAIL:
  478. msg = obs_module_text("AddressNotAvailable");
  479. break;
  480. }
  481. #endif
  482. // non platform-specific errors
  483. if (!msg) {
  484. switch (stream->rtmp.last_error_code) {
  485. case -0x2700:
  486. msg = obs_module_text("SSLCertVerifyFailed");
  487. break;
  488. case -0x7680:
  489. msg = "Failed to load root certificates for a secure TLS connection."
  490. #if defined(__linux__)
  491. " Check you have an up to date root certificate bundle in /etc/ssl/certs."
  492. #endif
  493. ;
  494. break;
  495. }
  496. }
  497. if (msg)
  498. obs_output_set_last_error(stream->output, msg);
  499. }
  500. static void dbr_add_frame(struct rtmp_stream *stream, struct dbr_frame *back)
  501. {
  502. struct dbr_frame front;
  503. uint64_t dur;
  504. circlebuf_push_back(&stream->dbr_frames, back, sizeof(*back));
  505. circlebuf_peek_front(&stream->dbr_frames, &front, sizeof(front));
  506. stream->dbr_data_size += back->size;
  507. dur = (back->send_end - front.send_beg) / 1000000;
  508. if (dur >= MAX_ESTIMATE_DURATION_MS) {
  509. stream->dbr_data_size -= front.size;
  510. circlebuf_pop_front(&stream->dbr_frames, NULL, sizeof(front));
  511. }
  512. stream->dbr_est_bitrate =
  513. (dur >= MIN_ESTIMATE_DURATION_MS)
  514. ? (long)(stream->dbr_data_size * 1000 / dur)
  515. : 0;
  516. stream->dbr_est_bitrate *= 8;
  517. stream->dbr_est_bitrate /= 1000;
  518. if (stream->dbr_est_bitrate) {
  519. stream->dbr_est_bitrate -= stream->audio_bitrate;
  520. if (stream->dbr_est_bitrate < 50)
  521. stream->dbr_est_bitrate = 50;
  522. }
  523. }
  524. static void dbr_set_bitrate(struct rtmp_stream *stream);
  525. static bool rtmp_stream_start(void *data);
  526. #ifdef _WIN32
  527. #define socklen_t int
  528. #endif
  529. static void log_sndbuf_size(struct rtmp_stream *stream)
  530. {
  531. int cur_sendbuf_size;
  532. socklen_t int_size = sizeof(int);
  533. if (!getsockopt(stream->rtmp.m_sb.sb_socket, SOL_SOCKET, SO_SNDBUF,
  534. (char *)&cur_sendbuf_size, &int_size)) {
  535. info("Socket send buffer is %d bytes", cur_sendbuf_size);
  536. }
  537. }
  538. static void *send_thread(void *data)
  539. {
  540. struct rtmp_stream *stream = data;
  541. os_set_thread_name("rtmp-stream: send_thread");
  542. #if defined(_WIN32)
  543. log_sndbuf_size(stream);
  544. #endif
  545. while (os_sem_wait(stream->send_sem) == 0) {
  546. struct encoder_packet packet;
  547. struct dbr_frame dbr_frame;
  548. if (stopping(stream) && stream->stop_ts == 0) {
  549. break;
  550. }
  551. if (!get_next_packet(stream, &packet))
  552. continue;
  553. if (stopping(stream)) {
  554. if (can_shutdown_stream(stream, &packet)) {
  555. obs_encoder_packet_release(&packet);
  556. break;
  557. }
  558. }
  559. if (!stream->sent_headers) {
  560. if (!send_headers(stream)) {
  561. os_atomic_set_bool(&stream->disconnected, true);
  562. break;
  563. }
  564. }
  565. /* silent reconnect signal received from server, reconnect on
  566. * next keyframe */
  567. if (silently_reconnecting(stream) &&
  568. packet.type == OBS_ENCODER_VIDEO && packet.keyframe) {
  569. reinsert_packet_at_front(stream, &packet);
  570. break;
  571. }
  572. if (stream->dbr_enabled) {
  573. dbr_frame.send_beg = os_gettime_ns();
  574. dbr_frame.size = packet.size;
  575. }
  576. int sent;
  577. if (packet.type == OBS_ENCODER_VIDEO &&
  578. stream->video_codec != CODEC_H264) {
  579. sent = send_packet_ex(stream, &packet, false, false);
  580. } else {
  581. sent = send_packet(stream, &packet, false,
  582. packet.track_idx);
  583. }
  584. if (sent < 0) {
  585. os_atomic_set_bool(&stream->disconnected, true);
  586. break;
  587. }
  588. if (stream->dbr_enabled) {
  589. dbr_frame.send_end = os_gettime_ns();
  590. pthread_mutex_lock(&stream->dbr_mutex);
  591. dbr_add_frame(stream, &dbr_frame);
  592. pthread_mutex_unlock(&stream->dbr_mutex);
  593. }
  594. }
  595. bool encode_error = os_atomic_load_bool(&stream->encode_error);
  596. if (disconnected(stream)) {
  597. info("Disconnected from %s", stream->path.array);
  598. } else if (encode_error) {
  599. info("Encoder error, disconnecting");
  600. send_footers(stream); // Y2023 spec
  601. } else if (silently_reconnecting(stream)) {
  602. info("Silent reconnect signal received from server");
  603. } else {
  604. info("User stopped the stream");
  605. send_footers(stream); // Y2023 spec
  606. }
  607. #if defined(_WIN32)
  608. log_sndbuf_size(stream);
  609. #endif
  610. if (stream->new_socket_loop) {
  611. os_event_signal(stream->send_thread_signaled_exit);
  612. os_event_signal(stream->buffer_has_data_event);
  613. pthread_join(stream->socket_thread, NULL);
  614. stream->socket_thread_active = false;
  615. stream->rtmp.m_bCustomSend = false;
  616. }
  617. set_output_error(stream);
  618. if (silently_reconnecting(stream)) {
  619. /* manually close the socket to prevent librtmp from sending
  620. * unpublish / deletestream messages when we call RTMP_Close,
  621. * since we want to re-use this stream when we reconnect */
  622. RTMPSockBuf_Close(&stream->rtmp.m_sb);
  623. stream->rtmp.m_sb.sb_socket = -1;
  624. }
  625. RTMP_Close(&stream->rtmp);
  626. /* reset bitrate on stop */
  627. if (stream->dbr_enabled) {
  628. if (stream->dbr_cur_bitrate != stream->dbr_orig_bitrate) {
  629. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  630. dbr_set_bitrate(stream);
  631. }
  632. }
  633. if (!stopping(stream)) {
  634. pthread_detach(stream->send_thread);
  635. if (!silently_reconnecting(stream))
  636. obs_output_signal_stop(stream->output,
  637. OBS_OUTPUT_DISCONNECTED);
  638. } else if (encode_error) {
  639. obs_output_signal_stop(stream->output, OBS_OUTPUT_ENCODE_ERROR);
  640. } else {
  641. obs_output_end_data_capture(stream->output);
  642. }
  643. if (!silently_reconnecting(stream)) {
  644. free_packets(stream);
  645. os_event_reset(stream->stop_event);
  646. os_atomic_set_bool(&stream->active, false);
  647. }
  648. stream->sent_headers = false;
  649. /* reset bitrate on stop */
  650. if (stream->dbr_enabled) {
  651. if (stream->dbr_cur_bitrate != stream->dbr_orig_bitrate) {
  652. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  653. dbr_set_bitrate(stream);
  654. }
  655. }
  656. if (silently_reconnecting(stream)) {
  657. rtmp_stream_start(stream);
  658. }
  659. return NULL;
  660. }
  661. static bool send_additional_meta_data(struct rtmp_stream *stream)
  662. {
  663. uint8_t *meta_data;
  664. size_t meta_data_size;
  665. bool success = true;
  666. flv_additional_meta_data(stream->output, &meta_data, &meta_data_size);
  667. success = RTMP_Write(&stream->rtmp, (char *)meta_data,
  668. (int)meta_data_size, 0) >= 0;
  669. bfree(meta_data);
  670. return success;
  671. }
  672. static bool send_meta_data(struct rtmp_stream *stream)
  673. {
  674. uint8_t *meta_data;
  675. size_t meta_data_size;
  676. bool success = true;
  677. flv_meta_data(stream->output, &meta_data, &meta_data_size, false);
  678. success = RTMP_Write(&stream->rtmp, (char *)meta_data,
  679. (int)meta_data_size, 0) >= 0;
  680. bfree(meta_data);
  681. return success;
  682. }
  683. static bool send_audio_header(struct rtmp_stream *stream, size_t idx,
  684. bool *next)
  685. {
  686. obs_output_t *context = stream->output;
  687. obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, idx);
  688. uint8_t *header;
  689. struct encoder_packet packet = {.type = OBS_ENCODER_AUDIO,
  690. .timebase_den = 1};
  691. if (!aencoder) {
  692. *next = false;
  693. return true;
  694. }
  695. if (!obs_encoder_get_extra_data(aencoder, &header, &packet.size))
  696. return false;
  697. packet.data = bmemdup(header, packet.size);
  698. return send_packet(stream, &packet, true, idx) >= 0;
  699. }
  700. static bool send_video_header(struct rtmp_stream *stream)
  701. {
  702. obs_output_t *context = stream->output;
  703. obs_encoder_t *vencoder = obs_output_get_video_encoder(context);
  704. uint8_t *header;
  705. size_t size;
  706. struct encoder_packet packet = {
  707. .type = OBS_ENCODER_VIDEO, .timebase_den = 1, .keyframe = true};
  708. if (!obs_encoder_get_extra_data(vencoder, &header, &size))
  709. return false;
  710. switch (stream->video_codec) {
  711. case CODEC_H264:
  712. packet.size = obs_parse_avc_header(&packet.data, header, size);
  713. return send_packet(stream, &packet, true, 0) >= 0;
  714. #ifdef ENABLE_HEVC
  715. case CODEC_HEVC:
  716. packet.size = obs_parse_hevc_header(&packet.data, header, size);
  717. return send_packet_ex(stream, &packet, true, 0) >= 0;
  718. #endif
  719. case CODEC_AV1:
  720. packet.size = obs_parse_av1_header(&packet.data, header, size);
  721. return send_packet_ex(stream, &packet, true, 0) >= 0;
  722. }
  723. return false;
  724. }
  725. static bool send_video_metadata(struct rtmp_stream *stream)
  726. {
  727. if (handle_socket_read(stream))
  728. return -1;
  729. // Y2023 spec
  730. if (stream->video_codec != CODEC_H264) {
  731. uint8_t *data;
  732. size_t size;
  733. video_t *video = obs_get_video();
  734. const struct video_output_info *info =
  735. video_output_get_info(video);
  736. enum video_format format = info->format;
  737. enum video_colorspace colorspace = info->colorspace;
  738. int bits_per_raw_sample;
  739. switch (format) {
  740. case VIDEO_FORMAT_I010:
  741. case VIDEO_FORMAT_P010:
  742. case VIDEO_FORMAT_I210:
  743. bits_per_raw_sample = 10;
  744. break;
  745. case VIDEO_FORMAT_I412:
  746. case VIDEO_FORMAT_YA2L:
  747. bits_per_raw_sample = 12;
  748. break;
  749. default:
  750. bits_per_raw_sample = 8;
  751. }
  752. int pri = 0, trc = 0, spc = 0;
  753. switch (colorspace) {
  754. case VIDEO_CS_601:
  755. pri = OBSCOL_PRI_SMPTE170M;
  756. trc = OBSCOL_PRI_SMPTE170M;
  757. spc = OBSCOL_PRI_SMPTE170M;
  758. break;
  759. case VIDEO_CS_DEFAULT:
  760. case VIDEO_CS_709:
  761. pri = OBSCOL_PRI_BT709;
  762. trc = OBSCOL_PRI_BT709;
  763. spc = OBSCOL_PRI_BT709;
  764. break;
  765. case VIDEO_CS_SRGB:
  766. pri = OBSCOL_PRI_BT709;
  767. trc = OBSCOL_TRC_IEC61966_2_1;
  768. spc = OBSCOL_PRI_BT709;
  769. break;
  770. case VIDEO_CS_2100_PQ:
  771. pri = OBSCOL_PRI_BT2020;
  772. trc = OBSCOL_TRC_SMPTE2084;
  773. spc = OBSCOL_SPC_BT2020_NCL;
  774. break;
  775. case VIDEO_CS_2100_HLG:
  776. pri = OBSCOL_PRI_BT2020;
  777. trc = OBSCOL_TRC_ARIB_STD_B67;
  778. spc = OBSCOL_SPC_BT2020_NCL;
  779. }
  780. int max_luminance = 0;
  781. if (trc == OBSCOL_TRC_ARIB_STD_B67)
  782. max_luminance = 1000;
  783. else if (trc == OBSCOL_TRC_SMPTE2084)
  784. max_luminance =
  785. (int)obs_get_video_hdr_nominal_peak_level();
  786. flv_packet_metadata(stream->video_codec, &data, &size,
  787. bits_per_raw_sample, pri, trc, spc, 0,
  788. max_luminance);
  789. int ret = RTMP_Write(&stream->rtmp, (char *)data, (int)size, 0);
  790. bfree(data);
  791. stream->total_bytes_sent += size;
  792. return ret >= 0;
  793. }
  794. // legacy
  795. return true;
  796. }
  797. static bool send_video_footer(struct rtmp_stream *stream)
  798. {
  799. struct encoder_packet packet = {.type = OBS_ENCODER_VIDEO,
  800. .timebase_den = 1,
  801. .keyframe = false};
  802. packet.size = 0;
  803. return send_packet_ex(stream, &packet, 0, true) >= 0;
  804. }
  805. static inline bool send_headers(struct rtmp_stream *stream)
  806. {
  807. stream->sent_headers = true;
  808. size_t i = 0;
  809. bool next = true;
  810. if (!send_audio_header(stream, i++, &next))
  811. return false;
  812. if (!send_video_header(stream))
  813. return false;
  814. // send metadata only if HDR
  815. video_t *video = obs_get_video();
  816. const struct video_output_info *info = video_output_get_info(video);
  817. enum video_colorspace colorspace = info->colorspace;
  818. if (colorspace == VIDEO_CS_2100_PQ || colorspace == VIDEO_CS_2100_HLG)
  819. if (!send_video_metadata(stream)) // Y2023 spec
  820. return false;
  821. while (next) {
  822. if (!send_audio_header(stream, i++, &next))
  823. return false;
  824. }
  825. return true;
  826. }
  827. static inline bool send_footers(struct rtmp_stream *stream)
  828. {
  829. if (stream->video_codec == CODEC_H264)
  830. return false;
  831. // Y2023 spec
  832. return send_video_footer(stream);
  833. }
  834. static inline bool reset_semaphore(struct rtmp_stream *stream)
  835. {
  836. os_sem_destroy(stream->send_sem);
  837. return os_sem_init(&stream->send_sem, 0) == 0;
  838. }
  839. static int init_send(struct rtmp_stream *stream)
  840. {
  841. int ret;
  842. obs_output_t *context = stream->output;
  843. if (!silently_reconnecting(stream))
  844. reset_semaphore(stream);
  845. ret = pthread_create(&stream->send_thread, NULL, send_thread, stream);
  846. if (ret != 0) {
  847. RTMP_Close(&stream->rtmp);
  848. warn("Failed to create send thread");
  849. return OBS_OUTPUT_ERROR;
  850. }
  851. if (stream->new_socket_loop) {
  852. int one = 1;
  853. #ifdef _WIN32
  854. if (ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONBIO, &one)) {
  855. stream->rtmp.last_error_code = WSAGetLastError();
  856. #else
  857. if (ioctl(stream->rtmp.m_sb.sb_socket, FIONBIO, &one)) {
  858. stream->rtmp.last_error_code = errno;
  859. #endif
  860. warn("Failed to set non-blocking socket");
  861. return OBS_OUTPUT_ERROR;
  862. }
  863. os_event_reset(stream->send_thread_signaled_exit);
  864. info("New socket loop enabled by user");
  865. if (stream->low_latency_mode)
  866. info("Low latency mode enabled by user");
  867. if (stream->write_buf)
  868. bfree(stream->write_buf);
  869. int total_bitrate = 0;
  870. obs_encoder_t *vencoder = obs_output_get_video_encoder(context);
  871. if (vencoder) {
  872. obs_data_t *params = obs_encoder_get_settings(vencoder);
  873. if (params) {
  874. int bitrate =
  875. obs_data_get_int(params, "bitrate");
  876. if (!bitrate) {
  877. warn("Video encoder didn't return a "
  878. "valid bitrate, new network "
  879. "code may function poorly. "
  880. "Low latency mode disabled.");
  881. stream->low_latency_mode = false;
  882. bitrate = 10000;
  883. }
  884. total_bitrate += bitrate;
  885. obs_data_release(params);
  886. }
  887. }
  888. obs_encoder_t *aencoder =
  889. obs_output_get_audio_encoder(context, 0);
  890. if (aencoder) {
  891. obs_data_t *params = obs_encoder_get_settings(aencoder);
  892. if (params) {
  893. int bitrate =
  894. obs_data_get_int(params, "bitrate");
  895. if (!bitrate)
  896. bitrate = 160;
  897. total_bitrate += bitrate;
  898. obs_data_release(params);
  899. }
  900. }
  901. // to bytes/sec
  902. int ideal_buffer_size = total_bitrate * 128;
  903. if (ideal_buffer_size < 131072)
  904. ideal_buffer_size = 131072;
  905. stream->write_buf_size = ideal_buffer_size;
  906. stream->write_buf = bmalloc(ideal_buffer_size);
  907. #ifdef _WIN32
  908. ret = pthread_create(&stream->socket_thread, NULL,
  909. socket_thread_windows, stream);
  910. #else
  911. warn("New socket loop not supported on this platform");
  912. return OBS_OUTPUT_ERROR;
  913. #endif
  914. if (ret != 0) {
  915. RTMP_Close(&stream->rtmp);
  916. warn("Failed to create socket thread");
  917. return OBS_OUTPUT_ERROR;
  918. }
  919. stream->socket_thread_active = true;
  920. stream->rtmp.m_bCustomSend = true;
  921. stream->rtmp.m_customSendFunc = socket_queue_data;
  922. stream->rtmp.m_customSendParam = stream;
  923. }
  924. os_atomic_set_bool(&stream->active, true);
  925. if (!send_meta_data(stream)) {
  926. warn("Disconnected while attempting to send metadata");
  927. set_output_error(stream);
  928. return OBS_OUTPUT_DISCONNECTED;
  929. }
  930. obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, 1);
  931. if (aencoder && !send_additional_meta_data(stream)) {
  932. warn("Disconnected while attempting to send additional "
  933. "metadata");
  934. return OBS_OUTPUT_DISCONNECTED;
  935. }
  936. if (obs_output_get_audio_encoder(context, 2) != NULL) {
  937. warn("Additional audio streams not supported");
  938. return OBS_OUTPUT_DISCONNECTED;
  939. }
  940. if (!silently_reconnecting(stream))
  941. obs_output_begin_data_capture(stream->output, 0);
  942. return OBS_OUTPUT_SUCCESS;
  943. }
  944. #ifdef _WIN32
  945. static void win32_log_interface_type(struct rtmp_stream *stream)
  946. {
  947. RTMP *rtmp = &stream->rtmp;
  948. MIB_IPFORWARDROW route;
  949. uint32_t dest_addr, source_addr;
  950. char hostname[256];
  951. HOSTENT *h;
  952. if (rtmp->Link.hostname.av_len >= sizeof(hostname) - 1)
  953. return;
  954. strncpy(hostname, rtmp->Link.hostname.av_val, sizeof(hostname));
  955. hostname[rtmp->Link.hostname.av_len] = 0;
  956. h = gethostbyname(hostname);
  957. if (!h)
  958. return;
  959. dest_addr = *(uint32_t *)h->h_addr_list[0];
  960. if (rtmp->m_bindIP.addrLen == 0)
  961. source_addr = 0;
  962. else if (rtmp->m_bindIP.addr.ss_family == AF_INET)
  963. source_addr = (*(struct sockaddr_in *)&rtmp->m_bindIP.addr)
  964. .sin_addr.S_un.S_addr;
  965. else
  966. return;
  967. if (!GetBestRoute(dest_addr, source_addr, &route)) {
  968. MIB_IF_ROW2 row;
  969. memset(&row, 0, sizeof(row));
  970. row.InterfaceIndex = route.dwForwardIfIndex;
  971. if (!GetIfEntry2(&row)) {
  972. uint32_t rxSpeed = row.ReceiveLinkSpeed / 1000000;
  973. uint32_t txSpeed = row.TransmitLinkSpeed / 1000000;
  974. char *type;
  975. struct dstr other = {0};
  976. switch (row.PhysicalMediumType) {
  977. case NdisPhysicalMedium802_3:
  978. type = "ethernet";
  979. break;
  980. case NdisPhysicalMediumWirelessLan:
  981. case NdisPhysicalMediumNative802_11:
  982. type = "802.11";
  983. break;
  984. default:
  985. dstr_printf(&other, "type %d",
  986. (int)row.PhysicalMediumType);
  987. type = other.array;
  988. break;
  989. }
  990. char *desc;
  991. os_wcs_to_utf8_ptr(row.Description, 0, &desc);
  992. info("Interface: %s (%s, %lu↓/%lu↑ mbps)", desc, type,
  993. rxSpeed, txSpeed);
  994. bfree(desc);
  995. if (row.InErrors || row.OutErrors) {
  996. warn("Interface has non-zero error counters (%" PRIu64
  997. "/%" PRIu64 " errors, %" PRIu64 "/%" PRIu64
  998. " discards)",
  999. row.InErrors, row.OutErrors,
  1000. row.InDiscards, row.OutDiscards);
  1001. }
  1002. dstr_free(&other);
  1003. }
  1004. }
  1005. }
  1006. #endif
  1007. static void add_connect_data(char **penc, char *pend)
  1008. {
  1009. const AVal val = AVC("supportsGoAway");
  1010. *penc = AMF_EncodeNamedBoolean(*penc, pend, &val, true);
  1011. }
  1012. static int try_connect(struct rtmp_stream *stream)
  1013. {
  1014. if (dstr_is_empty(&stream->path)) {
  1015. warn("URL is empty");
  1016. return OBS_OUTPUT_BAD_PATH;
  1017. }
  1018. info("Connecting to RTMP URL %s...", stream->path.array);
  1019. // free any existing RTMP TLS context
  1020. RTMP_TLS_Free(&stream->rtmp);
  1021. RTMP_Init(&stream->rtmp);
  1022. if (!RTMP_SetupURL(&stream->rtmp, stream->path.array))
  1023. return OBS_OUTPUT_BAD_PATH;
  1024. RTMP_EnableWrite(&stream->rtmp);
  1025. dstr_copy(&stream->encoder_name, "FMLE/3.0 (compatible; FMSc/1.0)");
  1026. set_rtmp_dstr(&stream->rtmp.Link.pubUser, &stream->username);
  1027. set_rtmp_dstr(&stream->rtmp.Link.pubPasswd, &stream->password);
  1028. set_rtmp_dstr(&stream->rtmp.Link.flashVer, &stream->encoder_name);
  1029. stream->rtmp.Link.swfUrl = stream->rtmp.Link.tcUrl;
  1030. stream->rtmp.Link.customConnectEncode = add_connect_data;
  1031. if (dstr_is_empty(&stream->bind_ip) ||
  1032. dstr_cmp(&stream->bind_ip, "default") == 0) {
  1033. memset(&stream->rtmp.m_bindIP, 0,
  1034. sizeof(stream->rtmp.m_bindIP));
  1035. } else {
  1036. bool success = netif_str_to_addr(&stream->rtmp.m_bindIP.addr,
  1037. &stream->rtmp.m_bindIP.addrLen,
  1038. stream->bind_ip.array);
  1039. if (success) {
  1040. int len = stream->rtmp.m_bindIP.addrLen;
  1041. bool ipv6 = len == sizeof(struct sockaddr_in6);
  1042. info("Binding to IPv%d", ipv6 ? 6 : 4);
  1043. }
  1044. }
  1045. RTMP_AddStream(&stream->rtmp, stream->key.array);
  1046. stream->rtmp.m_outChunkSize = 4096;
  1047. stream->rtmp.m_bSendChunkSizeInfo = true;
  1048. stream->rtmp.m_bUseNagle = true;
  1049. #ifdef _WIN32
  1050. win32_log_interface_type(stream);
  1051. #endif
  1052. if (!RTMP_Connect(&stream->rtmp, NULL)) {
  1053. set_output_error(stream);
  1054. return OBS_OUTPUT_CONNECT_FAILED;
  1055. }
  1056. if (!RTMP_ConnectStream(&stream->rtmp, 0))
  1057. return OBS_OUTPUT_INVALID_STREAM;
  1058. info("Connection to %s successful", stream->path.array);
  1059. return init_send(stream);
  1060. }
  1061. static bool init_connect(struct rtmp_stream *stream)
  1062. {
  1063. obs_service_t *service;
  1064. obs_data_t *settings;
  1065. const char *bind_ip;
  1066. int64_t drop_p;
  1067. int64_t drop_b;
  1068. uint32_t caps;
  1069. if (stopping(stream)) {
  1070. pthread_join(stream->send_thread, NULL);
  1071. }
  1072. free_packets(stream);
  1073. service = obs_output_get_service(stream->output);
  1074. if (!service)
  1075. return false;
  1076. os_atomic_set_bool(&stream->disconnected, false);
  1077. os_atomic_set_bool(&stream->encode_error, false);
  1078. stream->total_bytes_sent = 0;
  1079. stream->dropped_frames = 0;
  1080. stream->min_priority = 0;
  1081. stream->got_first_video = false;
  1082. settings = obs_output_get_settings(stream->output);
  1083. dstr_copy(&stream->path,
  1084. obs_service_get_connect_info(
  1085. service, OBS_SERVICE_CONNECT_INFO_SERVER_URL));
  1086. dstr_copy(&stream->key,
  1087. obs_service_get_connect_info(
  1088. service, OBS_SERVICE_CONNECT_INFO_STREAM_KEY));
  1089. dstr_copy(&stream->username,
  1090. obs_service_get_connect_info(
  1091. service, OBS_SERVICE_CONNECT_INFO_USERNAME));
  1092. dstr_copy(&stream->password,
  1093. obs_service_get_connect_info(
  1094. service, OBS_SERVICE_CONNECT_INFO_PASSWORD));
  1095. dstr_depad(&stream->path);
  1096. dstr_depad(&stream->key);
  1097. drop_b = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD);
  1098. drop_p = (int64_t)obs_data_get_int(settings, OPT_PFRAME_DROP_THRESHOLD);
  1099. stream->max_shutdown_time_sec =
  1100. (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC);
  1101. obs_encoder_t *venc = obs_output_get_video_encoder(stream->output);
  1102. obs_encoder_t *aenc = obs_output_get_audio_encoder(stream->output, 0);
  1103. obs_data_t *vsettings = obs_encoder_get_settings(venc);
  1104. obs_data_t *asettings = obs_encoder_get_settings(aenc);
  1105. const char *codec = obs_encoder_get_codec(venc);
  1106. stream->video_codec = to_video_type(codec);
  1107. circlebuf_free(&stream->dbr_frames);
  1108. stream->audio_bitrate = (long)obs_data_get_int(asettings, "bitrate");
  1109. stream->dbr_data_size = 0;
  1110. stream->dbr_orig_bitrate = (long)obs_data_get_int(vsettings, "bitrate");
  1111. stream->dbr_cur_bitrate = stream->dbr_orig_bitrate;
  1112. stream->dbr_est_bitrate = 0;
  1113. stream->dbr_inc_bitrate = stream->dbr_orig_bitrate / 10;
  1114. stream->dbr_inc_timeout = 0;
  1115. stream->dbr_enabled = obs_data_get_bool(settings, OPT_DYN_BITRATE);
  1116. caps = obs_encoder_get_caps(venc);
  1117. if ((caps & OBS_ENCODER_CAP_DYN_BITRATE) == 0) {
  1118. stream->dbr_enabled = false;
  1119. info("Dynamic bitrate disabled. "
  1120. "The encoder does not support on-the-fly bitrate reconfiguration.");
  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. };