⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 media_utils.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    sdp_decode_info_free(sdp_info);    return (-1);  }  int err;  if (sdp->control_string != NULL) {    // An on demand file... Just use the URL...    err = create_media_for_streaming_ondemand(psptr,					      sdp->control_string,					      errmsg,					      errlen,					      cc_vft);    sdp_free_session_desc(sdp);    sdp_decode_info_free(sdp_info);    return (err);  }  sdp_decode_info_free(sdp_info);  return (create_media_for_streaming_broadcast(psptr,					       name, 					       sdp,					       errmsg,					       errlen,					       have_audio_driver,					       cc_vft));}static int create_media_from_sdp_file(CPlayerSession *psptr, 				      const char *name, 				      char *errmsg,				      uint32_t errlen,				      int have_audio_driver,				      control_callback_vft_t *cc_vft){  sdp_decode_info_t *sdp_info;  sdp_info = set_sdp_decode_from_filename(name);  return (create_from_sdp(psptr, 			  name, 			  errmsg, 			  errlen, 			  sdp_info, 			  have_audio_driver, 			  cc_vft));}static int create_media_for_http (CPlayerSession *psptr,				  const char *name,				  char *errmsg,				  uint32_t errlen,				  control_callback_vft_t *cc_vft){  http_client_t *http_client;  int ret;  http_resp_t *http_resp;  http_resp = NULL;  http_client = http_init_connection(name);  if (http_client == NULL) {    snprintf(errmsg, errlen, "Can't create http client");    return -1;  }   ret = http_get(http_client, NULL, &http_resp);  if (ret > 0) {    sdp_decode_info_t *sdp_info;    int have_audio_driver = do_we_have_audio();    sdp_info = set_sdp_decode_from_memory(http_resp->body);    ret = create_from_sdp(psptr, 			  name, 			  errmsg, 			  errlen, 			  sdp_info, 			  have_audio_driver,			  cc_vft);  } else {    ret = -1;  }  http_resp_free(http_resp);  http_free_connection(http_client);  return (ret);}#ifndef _WIN32static session_desc_t *find_sdp_for_program (const char *cm, 					     const char *loc,					     char *errmsg, 					     uint32_t errlen,					     uint64_t prog){  char buffer[1024];  http_client_t *http_client;  http_resp_t *http_resp;  sdp_decode_info_t *sdp_info;  session_desc_t *sdp, *ptr, *sdp_ret;  int translated;  int ret, ix;  snprintf(buffer, sizeof(buffer), "http://%s/%s", cm, loc);    http_resp = NULL;  http_client = http_init_connection(buffer);  if (http_client == NULL) {    snprintf(errmsg, errlen, "Cannot create http client with %s\n", 	     cm);    return NULL;  }  ret = http_get(http_client, NULL, &http_resp);    sdp_ret = NULL;  if (ret > 0) {    sdp_info = set_sdp_decode_from_memory(http_resp->body);    if ((sdp_decode(sdp_info, &sdp, &translated) == 0) &&	(translated > 0)) {      for (ix = 0; ix < translated && sdp_ret == NULL; ix++) {	if (sdp->session_id == prog) {	  sdp_ret = sdp;	  sdp = sdp->next;	  sdp_ret->next = NULL;	} else {	  ptr = sdp->next;	  sdp->next = NULL;	  sdp_free_session_desc(sdp);	  sdp = ptr;	}      }      sdp_decode_info_free(sdp_info);      if (sdp != NULL) sdp_free_session_desc(sdp);          }   }  http_resp_free(http_resp);  http_free_connection(http_client);  return sdp_ret;}static int create_media_for_iptv (CPlayerSession *psptr,				  const char *name,				  char *errmsg,				  uint32_t errlen,				  int have_audio_driver,				  control_callback_vft_t *cc_vft){  char *slash, *cm;  uint64_t prog;  session_desc_t *sdp;  name += strlen("iptv://");  slash = strchr(name, '/');  if (slash == NULL || slash == name) {    snprintf(errmsg, errlen, "Invalid iptv content manager");    return -1;  }  cm = (char *)malloc(slash - name + 1);  memcpy(cm, name, slash - name);  cm[slash - name] = '\0';  slash++;  if (sscanf(slash, "%llu", &prog) != 1) {    snprintf(errmsg, errlen, "Invalid iptv program");    return -1;  }    // check on-demand first  sdp = find_sdp_for_program(cm, "iptvfiles/guide.sdf",			     errmsg, errlen, prog);  if (sdp == NULL) {    sdp = find_sdp_for_program(cm, "servlet/OdPublish", 			       errmsg, errlen, prog);  }  free(cm);  if (sdp == NULL) {    return -1;  }  int err;  if (sdp->control_string != NULL) {    // An on demand file... Just use the URL...    err = create_media_for_streaming_ondemand(psptr,					      sdp->control_string,					      errmsg,					      errlen,					      cc_vft);    sdp_free_session_desc(sdp);    return (err);  }  return (create_media_for_streaming_broadcast(psptr,					       name, 					       sdp,					       errmsg,					       errlen,					       have_audio_driver,					       cc_vft));}  #endif/* * parse_name_for_session - look at the name, determine what routine to  * call to set up the session.  This should be redone with plugins at * some point. */#define ADV_SPACE(a) {while (isspace(*(a)) && (*(a) != '\0'))(a)++;}int parse_name_for_session (CPlayerSession *psptr,			    const char *name,			    char *errmsg,			    uint32_t errlen,			    control_callback_vft_t *cc_vft){  int err;  ADV_SPACE(name);  if (strncmp(name, "rtsp://", strlen("rtsp://")) == 0) {        err = create_media_for_streaming_ondemand(psptr, 					      name, 					      errmsg, 					      errlen,					      cc_vft);    return (err);  }  if (strncmp(name, "http://", strlen("http://")) == 0) {    err = create_media_for_http(psptr, name, errmsg, errlen, cc_vft);    return (err);  }      int have_audio_driver;  have_audio_driver = do_we_have_audio();#ifndef _WIN32  if (strncmp(name, "iptv://", strlen("iptv://")) == 0) {    err = create_media_for_iptv(psptr, 				name, 				errmsg, 				errlen, 				have_audio_driver, 				cc_vft);    return err;  }#endif#ifndef _WIN32  if (strncmp(name, "mpeg2t://", strlen("mpeg2t://")) == 0) {    err = create_mpeg2t_session(psptr, name, NULL, errmsg, errlen, 				have_audio_driver, cc_vft);    return (err);  }  struct stat statbuf;  if (stat(name, &statbuf) != 0) {    snprintf(errmsg, errlen, "File \'%s\' not found", name);    return (-1);  }  if (!S_ISREG(statbuf.st_mode)) {    snprintf(errmsg, errlen, "File \'%s\' is not a file", name);    return (-1);  }#else  OFSTRUCT ReOpenBuff;  if (OpenFile(name, &ReOpenBuff,OF_READ) == HFILE_ERROR) {    snprintf(errmsg, errlen, "File %s not found", name);    return (-1);  }#endif  err = -1;  const char *suffix = strrchr(name, '.');  if (suffix == NULL) {    snprintf(errmsg, errlen, "No useable suffix on file %s", name);    return err;  }  if (strcasecmp(suffix, ".sdp") == 0) {    err = create_media_from_sdp_file(psptr, 				     name, 				     errmsg, 				     errlen, 				     have_audio_driver,				     cc_vft);  } else if ((strcasecmp(suffix, ".mov") == 0) ||	     ((config.get_config_value(CONFIG_USE_OLD_MP4_LIB) != 0) &&	      (strcasecmp(suffix, ".mp4") == 0))){    err = create_media_for_qtime_file(psptr, 				      name, 				      errmsg, 				      errlen,				      have_audio_driver);  } else if (strcasecmp(suffix, ".mp4") == 0) {    err = create_media_for_mp4_file(psptr, 				    name, 				    errmsg, 				    errlen,				    have_audio_driver,				    cc_vft);  } else if (strcasecmp(suffix, ".avi") == 0) {    err = create_media_for_avi_file(psptr, 				    name, 				    errmsg, 				    errlen, 				    have_audio_driver,				    cc_vft);  } else if (strcasecmp(suffix, ".mpeg") == 0 ||	     strcasecmp(suffix, ".mpg") == 0) {    err = create_media_for_mpeg_file(psptr, name, errmsg, 				     errlen, have_audio_driver, cc_vft);  } else {    // raw files    if (have_audio_driver) {      err = audio_codec_check_for_raw_file(psptr, name);    }    if (err < 0) {      err = video_codec_check_for_raw_file(psptr, name);    }  }    if (err >= 0) {    const char *temp;    temp = psptr->get_session_desc(0);    if (temp == NULL) {      psptr->set_session_desc(0, name);    }  }  return (err);}int check_name_for_network (const char *name, 			    int &isOnDemand, 			    int &isRtpOverRtsp){  sdp_decode_info_t *sdp_info;  session_desc_t *sdp;  int translated;  http_resp_t *http_resp;  int do_sdp = 0;  http_resp = NULL;  isOnDemand = 0;  isRtpOverRtsp = 0;  sdp_info = NULL;  if (strncmp(name, "mpeg2t://", strlen("mpeg2t://")) == 0) {    return 1;  }  if (strncmp(name, "iptv://", strlen("iptv://")) == 0) {    // more later to handle the on demand/streaming case    return 1;  }  if (strncmp(name, "rtsp://", strlen("rtsp://")) == 0) {    isOnDemand = 1;    isRtpOverRtsp = config.get_config_value(CONFIG_USE_RTP_OVER_RTSP);    return 1;  }  // handle http, .sdp case  if (strncmp(name, "http://", strlen("http://")) == 0) {    http_client_t *http_client;    int ret;    http_client = http_init_connection(name);    if (http_client == NULL) {      return -1;    }     ret = http_get(http_client, NULL, &http_resp);    if (ret > 0) {      sdp_decode_info_t *sdp_info;      sdp_info = set_sdp_decode_from_memory(http_resp->body);      do_sdp = 1;      http_free_connection(http_client);    } else return -1;    do_sdp = 1;  } else {    const char *suffix = strrchr(name, '.');    if (suffix == NULL) {      return -1;    }    if (strcasecmp(suffix, ".sdp") == 0) {      sdp_info = set_sdp_decode_from_filename(name);      do_sdp = 1;    } else       return 0;  }  if (do_sdp != 0) {    if ((sdp_decode(sdp_info, &sdp, &translated) != 0) ||	translated != 1){      sdp_decode_info_free(sdp_info);      return (-1);    }    if (sdp->control_string != NULL) {      isOnDemand = 1;      isRtpOverRtsp = config.get_config_value(CONFIG_USE_RTP_OVER_RTSP);    }    sdp_free_session_desc(sdp);    if (http_resp != NULL)      http_resp_free(http_resp);    sdp_decode_info_free(sdp_info);    return 1;  }  return 0;}/* end file media_utils.cpp */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -