static mrl_t * set_network_stream(const char *uri, mrl_resource_t type) { mrl_t *mrl; mrl_resource_network_args_t *args; enna_log(ENNA_MSG_INFO, NULL, "Load Network Stream : %s", uri); args = calloc(1, sizeof(mrl_resource_network_args_t)); args->url = strdup(uri); if (type == MRL_RESOURCE_NETVDR) mrl = mrl_new(mp->players[mp->tv_type], type, args); else mrl = mrl_new(mp->players[mp->default_type], type, args); return mrl; }
static mrl_t * set_local_stream(const char *uri) { mrl_t *mrl; mrl_resource_local_args_t *args; args = calloc(1, sizeof(mrl_resource_local_args_t)); args->location = strdup(uri); mrl = mrl_new(mp->players[mp->default_type], MRL_RESOURCE_FILE, args); return mrl; }
static mrl_t * set_spotify_stream(const char *uri, mrl_resource_t type) { mrl_t *mrl; mrl_resource_local_args_t *args; args = calloc(1, sizeof(mrl_resource_cd_args_t)); args->location = strdup(uri); mrl = mrl_new(mp->players[mp->spotify_type], type, args); return mrl; }
static mrl_t * set_cdda_stream(const char *uri, mrl_resource_t type) { mrl_t *mrl; mrl_resource_cd_args_t *args; char device[16]; int track; args = calloc(1, sizeof(mrl_resource_cd_args_t)); sscanf(uri, "cdda://%d/%s", &track, device); args->device = strdup(device); args->track_start = track; args->track_end = track; mrl = mrl_new(mp->player, type, args); return mrl; }
static mrl_t * set_tv_stream(const char *device, const char *driver, mrl_resource_t type) { mrl_t *mrl; mrl_resource_tv_args_t *args; args = calloc(1, sizeof(mrl_resource_tv_args_t)); if (type == MRL_RESOURCE_VDR) { enna_log(ENNA_MSG_INFO, NULL, "VDR stream; device: '%s' driver: '%s'", device, driver); args->device = device ? strdup(device) : NULL; args->driver = driver ? strdup(driver) : NULL; } mrl = mrl_new(mp->players[mp->tv_type], type, args); return mrl; }
GF_Err LIBPLAYER_ConnectService(GF_InputService *plug, GF_ClientService *serv, const char *url) { LibPlayerIn *read = (LibPlayerIn *) plug->priv; #ifndef TEST_LIBPLAYER unsigned long prop; mrl_t *mrl = NULL; #endif printf("[LibPlayerIN]connecting\n"); if (!read || !serv || !url) return GF_BAD_PARAM; if (!strnicmp(url, "libplayer://", 12)) url+=12; if (!read->init) { read->init=1; /* libplayer init */ read->url = url; read->player_id = libplayer_id; #ifndef TEST_LIBPLAYER read->player = player_init(PLAYER_TYPE_DUMMY, PLAYER_AO_AUTO, PLAYER_VO_AUTO, PLAYER_MSG_INFO, read->player_id, on_libplayer_event); //~ read->width = 0; //~ read->height = 0; if (!read->player) { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Failed to instanciate libplayer instance %d\n", read->player_id)); gf_term_on_connect(serv, NULL, GF_REMOTE_SERVICE_ERROR); return GF_OK; } #endif libplayer_id++; GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[LibPlayerIN] Opening URL %s for Player instance %d\n", url, read->player_id)); //~ player_local_location_set(read->player, url); } #ifndef TEST_LIBPLAYER mrl = NULL; if (!strnicmp(url, "dvb://", 6)) { } else if (!strnicmp(url, "file://", 7) || !strstr(url, "://")) { mrl_resource_local_args_t *mrl_args; mrl_args = calloc(1, sizeof(mrl_resource_local_args_t)); if (!strnicmp(url, "file://", 7)) { mrl_args->location = strdup(url + 7); } else { mrl_args->location = strdup(url); } mrl = mrl_new (read->player, MRL_RESOURCE_FILE, mrl_args); } else { } if (!mrl) { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Failed to create MRL for url %s\n", url)); gf_term_on_connect(serv, NULL, GF_URL_ERROR); return GF_OK; } player_mrl_set(read->player, mrl); #endif read->state = 0; read->service = serv; /*ACK connection is OK*/ gf_term_on_connect(serv, NULL, GF_OK); /*setup LIBPLAYER object descriptor*/ { GF_ESD *esd; GF_ObjectDescriptor *od = (GF_ObjectDescriptor *) gf_odf_desc_new(GF_ODF_OD_TAG); od->objectDescriptorID = 1+read->player_id; esd = gf_odf_desc_esd_new(0); esd->ESID = 1+read->player_id; esd->slConfig->timestampResolution = 1000; esd->decoderConfig->streamType = GF_STREAM_PRIVATE_MEDIA; esd->decoderConfig->objectTypeIndication = GPAC_OTI_PRIVATE_MEDIA_LIBPLAYER; #ifndef TEST_LIBPLAYER esd->decoderConfig->decoderSpecificInfo->data = read; #endif gf_list_add(od->ESDescriptors, esd); gf_term_add_media(read->service, (GF_Descriptor*)od, 0); } return GF_OK; }
static mrl_t * set_dvd_stream(const char *uri, mrl_resource_t type) { mrl_t *mrl; mrl_resource_videodisc_args_t *args; char *meta; uint32_t prop = 0; unsigned int tmp = 0; int title = 0; char *device; enna_log(ENNA_MSG_INFO, NULL, "Load DVD Video : %s", uri); args = calloc(1, sizeof(mrl_resource_videodisc_args_t)); device = strstr(uri, "://"); if (device) args->device = strdup(device + 3); mrl = mrl_new(mp->players[mp->dvd_type], type, args); meta = mrl_get_metadata_dvd(mp->players[mp->dvd_type], mrl, (uint8_t *) &prop); if (meta) { enna_log(ENNA_MSG_INFO, NULL, "Meta DVD VolumeID: %s", meta); free(meta); } if (prop) { unsigned int i; enna_log(ENNA_MSG_INFO, NULL, "Meta DVD Titles: %i", prop); for (i = 1; i <= prop; i++) { uint32_t chapters, angles, length; chapters = mrl_get_metadata_dvd_title(mp->players[mp->dvd_type], mrl, i, MRL_METADATA_DVD_TITLE_CHAPTERS); angles = mrl_get_metadata_dvd_title(mp->players[mp->dvd_type], mrl, i, MRL_METADATA_DVD_TITLE_ANGLES); length = mrl_get_metadata_dvd_title(mp->players[mp->dvd_type], mrl, i, MRL_METADATA_DVD_TITLE_LENGTH); enna_log(ENNA_MSG_INFO, NULL, "Meta DVD Title %i (%.2f sec), " \ "Chapters: %i, Angles: %i", i, length / 1000.0, chapters, angles); if (length > tmp) { tmp = length; title = i; } } } args->title_start = title; return mrl; }
GF_Err LIBPLAYER_ConnectService(GF_InputService *plug, GF_ClientService *serv, const char *url) { LibPlayerIn *read = (LibPlayerIn *) plug->priv; #ifndef TEST_LIBPLAYER mrl_t *mrl = NULL; #endif GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Connecting\n")); if (!read || !serv || !url) return GF_BAD_PARAM; if (!strnicmp(url, "libplayer://", 12)) url+=12; if (!read->init) { read->init=1; /* libplayer init with default width/height */ read->width = 80; read->height = 20; read->url = url; read->player_id = libplayer_id; read->player_type = PLAYER_FILE; #ifndef TEST_LIBPLAYER read->player = player_init(PLAYER_TYPE_DUMMY, PLAYER_AO_AUTO, PLAYER_VO_AUTO, PLAYER_MSG_INFO, read->player_id, on_libplayer_event); if (!read->player) { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Failed to instanciate libplayer instance %d\n", read->player_id)); gf_service_connect_ack(serv, NULL, GF_REMOTE_SERVICE_ERROR); return GF_OK; } #endif libplayer_id++; GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[LibPlayerIN] Opening URL %s for Player instance %d\n", url, read->player_id)); } #ifndef TEST_LIBPLAYER mrl = NULL; // dvb if (!strnicmp(url, "dvb://", 6)) { read->player_type = PLAYER_DVB; mrl_resource_dvb_args_t *mrl_dvb_args; mrl_dvb_args = calloc(1, sizeof(mrl_resource_dvb_args_t)); char *frequency; // fetch frequency if (frequency = strchr(url+6, '@')) { char *enc, *pid; mrl_dvb_args->frequency = atoi(frequency+1); /* * video */ // video codec if (enc = strstr(url+6, "mpeg2")) { mrl_dvb_args->video_enc = PLAYER_VIDEO_MPEG2; } else if (enc = strstr(url+6, "h264")) { mrl_dvb_args->video_enc = PLAYER_VIDEO_H264; } else { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Unknown video encoding\n")); mrl_dvb_args->video_enc = PLAYER_VIDEO_UNKNOWN; } // video PID if (mrl_dvb_args->video_enc != PLAYER_VIDEO_UNKNOWN) { pid = strchr(enc, ':'); mrl_dvb_args->video_pid = atoi(pid+1); } /* * audio */ // audio codec if (enc = strstr(url+6, "mp2")) { mrl_dvb_args->audio_enc = PLAYER_AUDIO_MP2; } else if (enc = strstr(url+6, "ac3")) { mrl_dvb_args->audio_enc = PLAYER_AUDIO_AC3; } else { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Unknown audio encoding\n")); mrl_dvb_args->audio_enc = PLAYER_AUDIO_UNKNOWN; } // audio PID if (mrl_dvb_args->audio_enc != PLAYER_AUDIO_UNKNOWN) { pid = strchr(enc, ':'); mrl_dvb_args->audio_pid = atoi(pid+1); } if (mrl_dvb_args->video_enc == PLAYER_VIDEO_UNKNOWN && mrl_dvb_args->audio_enc == PLAYER_AUDIO_UNKNOWN) { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Unknown video and audio encoding\n")); free(mrl_dvb_args); return GF_BAD_PARAM; } } else { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN]�Unknown frequency\n")); free(mrl_dvb_args); return GF_BAD_PARAM; } // player instance 1 has not starter yet in dvb case <=> player instance 1 is not created yet if (start_dvb == 0) { mrl = mrl_new(read->player, MRL_RESOURCE_DVB, mrl_dvb_args); GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[LibPlayerIN] MRL created for DVB\n")); // player has already started, zapping case, make sure the player is not recreated } else { GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[LibPlayerIN] Starting DVB PES filtering\n")); player_dvb_pes_filter_start(read->player, mrl_dvb_args->video_enc, mrl_dvb_args->video_pid, mrl_dvb_args->audio_enc, mrl_dvb_args->audio_pid); } } else if (!strnicmp(url, "file://", 7) || !strstr(url, "://")) { mrl_resource_local_args_t *mrl_args; mrl_args = calloc(1, sizeof(mrl_resource_local_args_t)); if (!strnicmp(url, "file://", 7)) { mrl_args->location = strdup(url + 7); } else { mrl_args->location = strdup(url); } mrl = mrl_new (read->player, MRL_RESOURCE_FILE, mrl_args); } // only for DVB case to make sure player is only set once if (start_dvb == 0) { if (!mrl) { GF_LOG(GF_LOG_ERROR, GF_LOG_MODULE, ("[LibPlayerIN] Failed to create MRL for url %s\n", url)); gf_service_connect_ack(serv, NULL, GF_URL_ERROR); return GF_OK; } player_mrl_set(read->player, mrl); } #endif read->state = 0; read->service = serv; /*ACK connection is OK*/ gf_service_connect_ack(serv, NULL, GF_OK); /*setup LIBPLAYER object descriptor*/ { GF_ESD *esd; GF_ObjectDescriptor *od = (GF_ObjectDescriptor *) gf_odf_desc_new(GF_ODF_OD_TAG); od->objectDescriptorID = 1+read->player_id; esd = gf_odf_desc_esd_new(0); esd->ESID = 1+read->player_id; esd->slConfig->timestampResolution = 1000; esd->decoderConfig->streamType = GF_STREAM_PRIVATE_MEDIA; esd->decoderConfig->objectTypeIndication = GPAC_OTI_PRIVATE_MEDIA_LIBPLAYER; #ifndef TEST_LIBPLAYER esd->decoderConfig->decoderSpecificInfo->data = read; #endif gf_list_add(od->ESDescriptors, esd); gf_service_declare_media(read->service, (GF_Descriptor*)od, 0); } return GF_OK; }