static const char * rtmp_init_subtitles(media_pipe_t *mp, struct play_video_subtitle_list *list) { play_video_subtitle_t *pvs; char track[20]; int i = 0, s; const char *lang, *ret = NULL; int best_subtitle_score = 0; mp_add_track_off(mp->mp_prop_subtitle_tracks, "off"); LIST_FOREACH(pvs, list, pvs_link) { i++; if(pvs->pvs_language) { s = i18n_subtitle_score(pvs->pvs_language); if(s > best_subtitle_score) { ret = pvs->pvs_url; best_subtitle_score = s; } lang = isolang_iso2lang(pvs->pvs_language); } else { snprintf(track, sizeof(track), "Track #%d", i); lang = track; } mp_add_track(mp->mp_prop_subtitle_tracks, lang, pvs->pvs_url); }
void mp_reset(media_pipe_t *mp) { cancellable_reset(mp->mp_cancellable); prop_set(mp->mp_prop_io, "bitrate", PROP_SET_VOID); prop_set(mp->mp_prop_io, "bitrateValid", PROP_SET_VOID); prop_destroy_childs(mp->mp_prop_audio_tracks); prop_destroy_childs(mp->mp_prop_subtitle_tracks); prop_set_void(mp->mp_prop_audio_track_current); mp_add_track_off(mp->mp_prop_subtitle_tracks, "sub:off"); prop_set_string(mp->mp_prop_subtitle_track_current, "sub:off"); }
void mp_reset(media_pipe_t *mp) { mp_unhold(mp, MP_HOLD_PRE_BUFFERING | MP_HOLD_STREAM | MP_HOLD_SYNC); cancellable_reset(mp->mp_cancellable); prop_set(mp->mp_prop_io, "bitrate", PROP_SET_VOID); prop_set(mp->mp_prop_io, "bitrateValid", PROP_SET_VOID); prop_t *p = prop_create(mp->mp_prop_io, "infoNodes"); prop_destroy_childs(p); prop_destroy_childs(mp->mp_prop_audio_tracks); prop_destroy_childs(mp->mp_prop_subtitle_tracks); prop_set_void(mp->mp_prop_audio_track_current); mp_add_track_off(mp->mp_prop_subtitle_tracks, "sub:off"); prop_set_string(mp->mp_prop_subtitle_track_current, "sub:off"); }
media_pipe_t * mp_create(const char *name, int flags) { media_pipe_t *mp; prop_t *p; mp = calloc(1, sizeof(media_pipe_t)); mp->mp_cancellable = cancellable_create(); mp->mp_vol_ui = 1.0f; mp->mp_satisfied = -1; mp->mp_epoch = 1; mp->mp_mb_pool = pool_create("packet headers", sizeof(media_buf_t), POOL_ZERO_MEM); mp->mp_flags = flags; hts_mutex_lock(&media_mutex); LIST_INSERT_HEAD(&media_pipelines, mp, mp_global_link); num_media_pipelines++; hts_mutex_unlock(&media_mutex); TAILQ_INIT(&mp->mp_eq); atomic_set(&mp->mp_refcount, 1); mp->mp_buffer_limit = 1 * 1024 * 1024; mp->mp_name = name; hts_mutex_init(&mp->mp_mutex); hts_mutex_init(&mp->mp_clock_mutex); hts_mutex_init(&mp->mp_overlay_mutex); TAILQ_INIT(&mp->mp_overlay_queue); TAILQ_INIT(&mp->mp_spu_queue); hts_cond_init(&mp->mp_backpressure, &mp->mp_mutex); mp->mp_prop_root = prop_create(media_prop_sources, NULL); mp->mp_prop_metadata = prop_create(mp->mp_prop_root, "metadata"); mp->mp_prop_primary = prop_create(mp->mp_prop_root, "primary"); mp->mp_prop_io = prop_create(mp->mp_prop_root, "io"); mp->mp_prop_notifications = prop_create(mp->mp_prop_root, "notifications"); mp->mp_prop_url = prop_create(mp->mp_prop_root, "url"); mp->mp_setting_root = prop_create(mp->mp_prop_root, "settings"); //-------------------------------------------------- // Video mp->mp_prop_video = prop_create(mp->mp_prop_root, "video"); mp->mp_setting_video_root = prop_create(mp->mp_prop_video, "settings"); mq_init(&mp->mp_video, mp->mp_prop_video, &mp->mp_mutex, mp); //-------------------------------------------------- // Audio mp->mp_prop_audio = prop_create(mp->mp_prop_root, "audio"); mp->mp_setting_audio_root = prop_create(mp->mp_prop_audio, "settings"); mq_init(&mp->mp_audio, mp->mp_prop_audio, &mp->mp_mutex, mp); mp->mp_prop_audio_track_current = prop_create(mp->mp_prop_audio, "current"); mp->mp_prop_audio_track_current_manual = prop_create(mp->mp_prop_audio, "manual"); mp->mp_prop_audio_tracks = prop_create(mp->mp_prop_metadata, "audiostreams"); prop_linkselected_create(mp->mp_prop_audio_tracks, mp->mp_prop_audio, "active", NULL); prop_set_string(mp->mp_prop_audio_track_current, "audio:off"); mp_track_mgr_init(mp, &mp->mp_audio_track_mgr, mp->mp_prop_audio_tracks, MEDIA_TRACK_MANAGER_AUDIO, mp->mp_prop_audio_track_current, prop_create(mp->mp_prop_audio, "sorted")); //-------------------------------------------------- // Subtitles p = prop_create(mp->mp_prop_root, "subtitle"); mp->mp_setting_subtitle_root = prop_create(p, "settings"); mp->mp_prop_subtitle_track_current = prop_create(p, "current"); mp->mp_prop_subtitle_track_current_manual = prop_create(p, "manual"); mp->mp_prop_subtitle_tracks = prop_create(mp->mp_prop_metadata, "subtitlestreams"); prop_linkselected_create(mp->mp_prop_subtitle_tracks, p, "active", NULL); prop_set_string(mp->mp_prop_subtitle_track_current, "sub:off"); mp_add_track_off(mp->mp_prop_subtitle_tracks, "sub:off"); mp_track_mgr_init(mp, &mp->mp_subtitle_track_mgr, mp->mp_prop_subtitle_tracks, MEDIA_TRACK_MANAGER_SUBTITLES, mp->mp_prop_subtitle_track_current, prop_create(p, "sorted")); //-------------------------------------------------- // Buffer p = prop_create(mp->mp_prop_root, "buffer"); mp->mp_prop_buffer_current = prop_create(p, "current"); prop_set_int(mp->mp_prop_buffer_current, 0); mp->mp_prop_buffer_limit = prop_create(p, "limit"); prop_set_int(mp->mp_prop_buffer_limit, mp->mp_buffer_limit); mp->mp_prop_buffer_delay = prop_create(p, "delay"); // mp->mp_prop_playstatus = prop_create(mp->mp_prop_root, "playstatus"); mp->mp_prop_pausereason = prop_create(mp->mp_prop_root, "pausereason"); mp->mp_prop_currenttime = prop_create(mp->mp_prop_root, "currenttime"); mp->mp_prop_fps = prop_create(mp->mp_prop_root, "fps"); prop_set_float_clipping_range(mp->mp_prop_currenttime, 0, 10e6); mp->mp_prop_avdelta = prop_create(mp->mp_prop_root, "avdelta"); prop_set_float(mp->mp_prop_avdelta, 0); mp->mp_prop_svdelta = prop_create(mp->mp_prop_root, "svdelta"); prop_set_float(mp->mp_prop_svdelta, 0); mp->mp_prop_shuffle = prop_create(mp->mp_prop_root, "shuffle"); prop_set_int(mp->mp_prop_shuffle, 0); mp->mp_prop_repeat = prop_create(mp->mp_prop_root, "repeat"); prop_set_int(mp->mp_prop_repeat, 0); mp->mp_prop_avdiff = prop_create(mp->mp_prop_root, "avdiff"); mp->mp_prop_avdiff_error= prop_create(mp->mp_prop_root, "avdiffError"); mp->mp_prop_canSkipBackward = prop_create(mp->mp_prop_root, "canSkipBackward"); mp->mp_prop_canSkipForward = prop_create(mp->mp_prop_root, "canSkipForward"); mp->mp_prop_canSeek = prop_create(mp->mp_prop_root, "canSeek"); mp->mp_prop_canPause = prop_create(mp->mp_prop_root, "canPause"); mp->mp_prop_canEject = prop_create(mp->mp_prop_root, "canEject"); mp->mp_prop_canShuffle = prop_create(mp->mp_prop_root, "canShuffle"); mp->mp_prop_canRepeat = prop_create(mp->mp_prop_root, "canRepeat"); prop_set_int(prop_create(mp->mp_prop_root, "canStop"), 1); mp->mp_prop_ctrl = prop_create(mp->mp_prop_root, "ctrl"); mp->mp_prop_model = prop_create(mp->mp_prop_root, "model"); mp->mp_sub_currenttime = prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, PROP_TAG_CALLBACK, mp_seek_by_propchange, mp, PROP_TAG_LOCKMGR, mp_lockmgr, PROP_TAG_MUTEX, mp, PROP_TAG_ROOT, mp->mp_prop_currenttime, NULL); mp->mp_sub_eventsink = prop_subscribe(0, PROP_TAG_NAME("media", "eventSink"), PROP_TAG_CALLBACK_EVENT, media_eventsink, mp, PROP_TAG_LOCKMGR, mp_lockmgr, PROP_TAG_MUTEX, mp, PROP_TAG_NAMED_ROOT, mp->mp_prop_root, "media", NULL); if(media_pipe_init_extra != NULL) media_pipe_init_extra(mp); return mp; }