static event_t * rtmp_playvideo(const char *url0, media_pipe_t *mp, int flags, int priority, char *errbuf, size_t errlen, const char *mimetype) { rtmp_t r = {0}; event_t *e; char *url = mystrdupa(url0); prop_set_string(mp->mp_prop_type, "video"); RTMP_LogSetLevel(RTMP_LOGINFO); r.r = RTMP_Alloc(); RTMP_Init(r.r); if(!RTMP_SetupURL(r.r, url)) { snprintf(errbuf, errlen, "Unable to setup RTMP-session"); rtmp_free(&r); return NULL; } if(!RTMP_Connect(r.r, NULL)) { snprintf(errbuf, errlen, "Unable to connect RTMP-session"); rtmp_free(&r); return NULL; } if(!RTMP_ConnectStream(r.r, 0)) { snprintf(errbuf, errlen, "Unable to connect RTMP-stream"); rtmp_free(&r); return NULL; } mp->mp_audio.mq_stream = 0; mp->mp_video.mq_stream = 0; mp_configure(mp, MP_PLAY_CAPS_PAUSE, MP_BUFFER_DEEP); mp->mp_max_realtime_delay = (r.r->Link.timeout - 1) * 1000000; mp_become_primary(mp); e = rtmp_loop(&r, mp, url, errbuf, errlen); mp_flush(mp, 0); mp_shutdown(mp); TRACE(TRACE_DEBUG, "RTMP", "End of stream"); rtmp_free(&r); return e; }
/* * Find a replacement for "replace". If we can't find a replacement, * return 1. If we do find a replacement, return 0. -1 on error. */ int rtmp_replace(struct rtmptab *replace) { struct interface *iface; struct gate *gate; struct rtmptab *rtmp, *found = NULL; LOG(log_info, logtype_atalkd, "rtmp_replace %u-%u", ntohs(replace->rt_firstnet), ntohs(replace->rt_lastnet)); for ( iface = interfaces; iface; iface = iface->i_next ) { if ((replace->rt_iface != iface) && ((iface->i_flags & IFACE_ISROUTER) == 0)) continue; for ( gate = iface->i_gate; gate; gate = gate->g_next ) { for ( rtmp = gate->g_rt; rtmp; rtmp = rtmp->rt_next ) { if ( rtmp->rt_firstnet == replace->rt_firstnet && rtmp->rt_lastnet == replace->rt_lastnet ) { if ( found == NULL || rtmp->rt_hops < found->rt_hops ) { found = rtmp; } break; } } } } if ( found != replace ) { if (rtmp_copyzones( found, replace ) < 0) return -1; rtmp_delinuse( replace ); rtmp_addinuse( found ); if ( replace->rt_state == RTMPTAB_BAD ) { rtmp_free( replace ); } return( 0 ); } else { if ( replace->rt_hops == RTMPHOPS_POISON ) { gateroute( RTMP_DEL, replace ); } return( 1 ); } }
static event_t * rtmp_playvideo(const char *url0, media_pipe_t *mp, char *errbuf, size_t errlen, video_queue_t *vq, struct vsource_list *vsl, const video_args_t *va0) { video_args_t va = *va0; rtmp_t r = {0}; event_t *e; char *url = mystrdupa(url0); mp_set_url(mp, va0->canonical_url, va0->parent_url, va0->parent_title); usage_event("Play video", 1, USAGE_SEG("format", "RTMP")); prop_set(mp->mp_prop_metadata, "format", PROP_SET_STRING, "RTMP"); prop_set(mp->mp_prop_root, "loading", PROP_SET_INT, 1); va.flags |= BACKEND_VIDEO_NO_FS_SCAN; rtmp_log_level = RTMP_LOGINFO; RTMP_LogSetLevel(rtmp_log_level); r.r = RTMP_Alloc(); RTMP_Init(r.r, mp->mp_cancellable); int64_t start = playinfo_get_restartpos(va.canonical_url, va.title, va.resume_mode); if(!RTMP_SetupURL(r.r, url)) { snprintf(errbuf, errlen, "Unable to setup RTMP-session"); rtmp_free(&r); return NULL; } r.r->Link.lFlags |= RTMP_LF_SWFV; if(!RTMP_Connect(r.r, NULL, errbuf, errlen, 5000)) { rtmp_free(&r); return NULL; } if(!RTMP_ConnectStream(r.r, 0)) { snprintf(errbuf, errlen, "Unable to connect RTMP-stream"); rtmp_free(&r); return NULL; } if(start) RTMP_SendSeek(r.r, start); r.mp = mp; mp->mp_audio.mq_stream = 0; mp->mp_video.mq_stream = 0; if(start > 0) { r.seekpos_video = start * 1000; r.seekpos_audio = start * 1000; mp->mp_seek_base = r.seekpos_video; mp->mp_video.mq_seektarget = r.seekpos_video; mp->mp_audio.mq_seektarget = r.seekpos_video; } else { mp->mp_video.mq_seektarget = AV_NOPTS_VALUE; mp->mp_audio.mq_seektarget = AV_NOPTS_VALUE; mp->mp_seek_base = 0; r.seekpos_audio = AV_NOPTS_VALUE; r.seekpos_video = AV_NOPTS_VALUE; } mp_configure(mp, MP_CAN_PAUSE, MP_BUFFER_DEEP, 0, "video"); mp->mp_max_realtime_delay = (r.r->Link.timeout - 1) * 1000000; mp_become_primary(mp); playinfo_register_play(va.canonical_url, 0); r.canonical_url = va.canonical_url; r.restartpos_last = -1; r.url = url; r.va = &va; r.is_loading = 1; e = rtmp_loop(&r, mp, url, errbuf, errlen); if(r.ss) sub_scanner_destroy(r.ss); if(r.total_duration) { int p = mp->mp_seek_base / (r.total_duration * 10); if(p >= video_settings.played_threshold) { TRACE(TRACE_DEBUG, "RTMP", "Playback reached %d%%, counting as played", p); playinfo_register_play(va.canonical_url, 1); playinfo_set_restartpos(va.canonical_url, -1, 0); } else { playinfo_set_restartpos(va.canonical_url, mp->mp_seek_base / 1000, 0); } } mp_shutdown(mp); TRACE(TRACE_DEBUG, "RTMP", "End of playback"); rtmp_free(&r); return e; }
static event_t * rtmp_playvideo(const char *url0, media_pipe_t *mp, char *errbuf, size_t errlen, video_queue_t *vq, struct vsource_list *vsl, const video_args_t *va0) { video_args_t va = *va0; rtmp_t r = {0}; event_t *e; char *url = mystrdupa(url0); va.flags |= BACKEND_VIDEO_NO_FS_SCAN; prop_set_string(mp->mp_prop_type, "video"); rtmp_log_level = RTMP_LOGINFO; RTMP_LogSetLevel(rtmp_log_level); r.r = RTMP_Alloc(); RTMP_Init(r.r); int64_t start = 0; if(va.flags & BACKEND_VIDEO_RESUME || (video_settings.resume_mode == VIDEO_RESUME_YES && !(va.flags & BACKEND_VIDEO_START_FROM_BEGINNING))) start = video_get_restartpos(va.canonical_url); if(!RTMP_SetupURL(r.r, url)) { snprintf(errbuf, errlen, "Unable to setup RTMP-session"); rtmp_free(&r); return NULL; } r.r->Link.lFlags |= RTMP_LF_SWFV; if(!RTMP_Connect(r.r, NULL)) { snprintf(errbuf, errlen, "Unable to connect RTMP-session"); rtmp_free(&r); return NULL; } if(!RTMP_ConnectStream(r.r, 0)) { snprintf(errbuf, errlen, "Unable to connect RTMP-stream"); rtmp_free(&r); return NULL; } if(start) RTMP_SendSeek(r.r, start); r.mp = mp; mp->mp_audio.mq_stream = 0; mp->mp_video.mq_stream = 0; if(start > 0) { r.seekpos_video = start * 1000; r.seekpos_audio = start * 1000; mp->mp_seek_base = r.seekpos_video; mp->mp_video.mq_seektarget = r.seekpos_video; mp->mp_audio.mq_seektarget = r.seekpos_video; } else { mp->mp_video.mq_seektarget = AV_NOPTS_VALUE; mp->mp_audio.mq_seektarget = AV_NOPTS_VALUE; mp->mp_seek_base = 0; r.seekpos_audio = AV_NOPTS_VALUE; r.seekpos_video = AV_NOPTS_VALUE; } mp_configure(mp, MP_PLAY_CAPS_PAUSE, MP_BUFFER_DEEP, 0); mp->mp_max_realtime_delay = (r.r->Link.timeout - 1) * 1000000; mp_become_primary(mp); metadb_register_play(va.canonical_url, 0, CONTENT_VIDEO); r.canonical_url = va.canonical_url; r.restartpos_last = -1; sub_scanner_t *ss = sub_scanner_create(url, mp->mp_prop_subtitle_tracks, &va, 0); e = rtmp_loop(&r, mp, url, errbuf, errlen); sub_scanner_destroy(ss); if(r.total_duration) { int p = mp->mp_seek_base / (r.total_duration * 10); if(p >= video_settings.played_threshold) { TRACE(TRACE_DEBUG, "RTMP", "Playback reached %d%%, counting as played", p); metadb_register_play(va.canonical_url, 1, CONTENT_VIDEO); metadb_set_video_restartpos(va.canonical_url, -1); } } mp_flush(mp, 0); mp_shutdown(mp); TRACE(TRACE_DEBUG, "RTMP", "End of stream"); rtmp_free(&r); return e; }
static event_t * rtmp_playvideo(const char *url0, media_pipe_t *mp, int flags, int priority, char *errbuf, size_t errlen, const char *mimetype, const char *canonical_url) { rtmp_t r = {0}; event_t *e; char *url = mystrdupa(url0); prop_set_string(mp->mp_prop_type, "video"); RTMP_LogSetLevel(RTMP_LOGINFO); r.r = RTMP_Alloc(); RTMP_Init(r.r); int64_t start = video_get_restartpos(canonical_url); if(!RTMP_SetupURL(r.r, url)) { snprintf(errbuf, errlen, "Unable to setup RTMP-session"); rtmp_free(&r); return NULL; } if(!RTMP_Connect(r.r, NULL)) { snprintf(errbuf, errlen, "Unable to connect RTMP-session"); rtmp_free(&r); return NULL; } if(!RTMP_ConnectStream(r.r, start)) { snprintf(errbuf, errlen, "Unable to connect RTMP-stream"); rtmp_free(&r); return NULL; } r.seek_origin = start; r.mp = mp; r.hold = 0; r.lost_focus = 0; r.epoch = 1; mp->mp_audio.mq_stream = 0; mp->mp_video.mq_stream = 0; if(start > 0) { r.seekpos = start * 1000; r.seekbase = r.seekpos; mp->mp_video.mq_seektarget = r.seekpos; mp->mp_audio.mq_seektarget = r.seekpos; } else { mp->mp_video.mq_seektarget = AV_NOPTS_VALUE; mp->mp_audio.mq_seektarget = AV_NOPTS_VALUE; r.seekbase = AV_NOPTS_VALUE; r.seekpos = AV_NOPTS_VALUE; } mp_configure(mp, MP_PLAY_CAPS_PAUSE, MP_BUFFER_DEEP); mp->mp_max_realtime_delay = (r.r->Link.timeout - 1) * 1000000; mp_become_primary(mp); metadb_register_play(canonical_url, 0, CONTENT_VIDEO); r.canonical_url = canonical_url; r.restartpos_last = -1; e = rtmp_loop(&r, mp, url, errbuf, errlen); if(r.total_duration) { int p = r.seekbase / (r.total_duration * 10); if(p >= video_settings.played_threshold) { TRACE(TRACE_DEBUG, "RTMP", "Playback reached %d%%, counting as played", p); metadb_register_play(canonical_url, 1, CONTENT_VIDEO); metadb_set_video_restartpos(canonical_url, -1); } } mp_flush(mp, 0); mp_shutdown(mp); TRACE(TRACE_DEBUG, "RTMP", "End of stream"); rtmp_free(&r); return e; }