static int mp_file_set(const char *uri, const char *label) { mrl_t *mrl = NULL; player_type_t player_type = mp->default_type; enna_log(ENNA_MSG_INFO, NULL, "Try to load : %s , %s", uri, label); /* try network streams */ if (!strncmp(uri, URI_TYPE_FTP, strlen(URI_TYPE_FTP))) mrl = set_network_stream(uri, MRL_RESOURCE_FTP); else if (!strncmp(uri, URI_TYPE_HTTP, strlen(URI_TYPE_HTTP))) mrl = set_network_stream(uri, MRL_RESOURCE_HTTP); else if (!strncmp(uri, URI_TYPE_MMS, strlen(URI_TYPE_MMS))) mrl = set_network_stream(uri, MRL_RESOURCE_MMS); else if (!strncmp(uri, URI_TYPE_NETVDR, strlen(URI_TYPE_NETVDR))) { mrl = set_network_stream(uri, MRL_RESOURCE_NETVDR); player_type = mp->tv_type; } else if (!strncmp(uri, URI_TYPE_RTP, strlen(URI_TYPE_RTP))) mrl = set_network_stream(uri, MRL_RESOURCE_RTP); else if (!strncmp(uri, URI_TYPE_RTSP, strlen(URI_TYPE_RTSP))) mrl = set_network_stream(uri, MRL_RESOURCE_RTSP); else if (!strncmp(uri, URI_TYPE_SMB, strlen(URI_TYPE_SMB))) mrl = set_network_stream(uri, MRL_RESOURCE_SMB); else if (!strncmp(uri, URI_TYPE_TCP, strlen(URI_TYPE_TCP))) mrl = set_network_stream(uri, MRL_RESOURCE_TCP); else if (!strncmp(uri, URI_TYPE_UDP, strlen(URI_TYPE_UDP))) mrl = set_network_stream(uri, MRL_RESOURCE_UDP); else if (!strncmp(uri, URI_TYPE_UNSV, strlen(URI_TYPE_UNSV))) mrl = set_network_stream(uri, MRL_RESOURCE_UNSV); /* Try DVD video */ else if (!strncmp(uri, URI_TYPE_DVD, strlen(URI_TYPE_DVD))) { mrl = set_dvd_stream(uri, MRL_RESOURCE_DVD); player_type = mp->dvd_type; } else if (!strncmp(uri, URI_TYPE_DVDNAV, strlen(URI_TYPE_DVDNAV))) { mrl = set_dvd_stream(uri, MRL_RESOURCE_DVDNAV); player_type = mp->dvd_type; } /* Try TV */ else if (!strncmp(uri, URI_TYPE_VDR, strlen(URI_TYPE_VDR))) { char *device = NULL; char *driver = strstr(uri, "#"); size_t device_len = strlen(uri) - strlen(URI_TYPE_VDR); if (driver) { device_len -= strlen(driver); driver++; device = malloc(device_len); strncpy(device, uri + strlen(URI_TYPE_VDR), device_len); } else if (device_len) device = strdup(uri + strlen(URI_TYPE_VDR)); mrl = set_tv_stream(device, driver, MRL_RESOURCE_VDR); player_type = mp->tv_type; } /* Try CD Audio */ else if (!strncmp(uri, URI_TYPE_CDDA, strlen(URI_TYPE_CDDA))) { mrl = set_cdda_stream(uri, MRL_RESOURCE_CDDA); } /* Try Spotify stream */ else if (!strncmp(uri, URI_TYPE_SPOTIFY, strlen(URI_TYPE_SPOTIFY))) { mrl = set_spotify_stream(uri, MRL_RESOURCE_FILE); player_type = mp->spotify_type; } /* default is local files */ if (!mrl) { printf("MRL is NULL try local file\n"); const char *it; it = strrchr(uri, '.'); if (it && !strcmp(it, ".iso")) /* consider ISO file as DVD */ { mrl = set_dvd_stream(uri, MRL_RESOURCE_DVDNAV); player_type = mp->dvd_type; } else { mrl = set_local_stream(uri); } } if (!mrl) { printf("MRL is NULL\n"); return 1; } ENNA_FREE(mp->uri); mp->uri = strdup(uri); ENNA_FREE(mp->label); mp->label = label ? strdup(label) : NULL; mp->audio_delay = AUDIO_DELAY_DEFAULT; mp->subtitle_delay = SUB_DELAY_DEFAULT; /* Initialization of subtitles variables */ init_sub_align(); init_sub_pos(); init_sub_scale(); init_framedrop(); init_sub_visibility(); mp->player_type = player_type; mp->player = mp->players[player_type]; player_mrl_set(mp->player, mrl); if (mp->subtitle_alignment != SUB_ALIGNMENT_DEFAULT) player_subtitle_set_alignment(mp->player, mp->subtitle_alignment); if (mp->subtitle_position != SUB_POSITION_DEFAULT) player_subtitle_set_position(mp->player, mp->subtitle_position); if (mp->subtitle_scale != SUB_SCALE_DEFAULT) player_subtitle_scale(mp->player, mp->subtitle_scale, 1); player_subtitle_set_visibility(mp->player, mp->subtitle_visibility); if (mp->framedrop != FRAMEDROP_DEFAULT) player_set_framedrop(mp->player, mp->framedrop); return 0; }
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; }
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; }