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

📄 rtsp.c

📁 mplayer播放器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
  if (what) {    buf=strdup(what);  } else  {    buf=malloc(strlen(s->host)+16);    sprintf(buf,"rtsp://%s:%i", s->host, s->port);  }  rtsp_send_request(s,RTSP_METHOD_OPTIONS,buf);  free(buf);  return rtsp_get_answers(s);}int rtsp_request_describe(rtsp_t *s, const char *what) {  char *buf;  if (what) {    buf=strdup(what);  } else  {    buf=malloc(strlen(s->host)+strlen(s->path)+16);    sprintf(buf,"rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request(s,RTSP_METHOD_DESCRIBE,buf);  free(buf);    return rtsp_get_answers(s);}int rtsp_request_setup(rtsp_t *s, const char *what, char *control) {  char *buf = NULL;  if (what)    buf = strdup (what);  else  {    int len = strlen (s->host) + strlen (s->path) + 16;    if (control)      len += strlen (control) + 1;        buf = malloc (len);    sprintf (buf, "rtsp://%s:%i/%s%s%s", s->host, s->port, s->path,             control ? "/" : "", control ? control : "");  }    rtsp_send_request (s, RTSP_METHOD_SETUP, buf);  free (buf);  return rtsp_get_answers (s);}int rtsp_request_setparameter(rtsp_t *s, const char *what) {  char *buf;  if (what) {    buf=strdup(what);  } else  {    buf=malloc(strlen(s->host)+strlen(s->path)+16);    sprintf(buf,"rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request(s,RTSP_METHOD_SET_PARAMETER,buf);  free(buf);    return rtsp_get_answers(s);}int rtsp_request_play(rtsp_t *s, const char *what) {  char *buf;  int ret;    if (what) {    buf=strdup(what);  } else  {    buf=malloc(strlen(s->host)+strlen(s->path)+16);    sprintf(buf,"rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request(s,RTSP_METHOD_PLAY,buf);  free(buf);    ret = rtsp_get_answers (s);  if (ret == RTSP_STATUS_OK)    s->server_state = RTSP_PLAYING;  return ret;}int rtsp_request_teardown(rtsp_t *s, const char *what) {  char *buf;    if (what)    buf = strdup (what);  else  {    buf =      malloc (strlen (s->host) + strlen (s->path) + 16);    sprintf (buf, "rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request (s, RTSP_METHOD_TEARDOWN, buf);  free (buf);  /* after teardown we're done with RTSP streaming, no need to get answer as     reading more will only result to garbage and buffer overflow */  return RTSP_STATUS_OK;}/* * read opaque data from stream */int rtsp_read_data(rtsp_t *s, char *buffer, unsigned int size) {  int i,seq;  if (size>=4) {    i=read_stream(s->s, buffer, 4);    if (i<4) return i;    if (((buffer[0]=='S')&&(buffer[1]=='E')&&(buffer[2]=='T')&&(buffer[3]=='_')) ||        ((buffer[0]=='O')&&(buffer[1]=='P')&&(buffer[2]=='T')&&(buffer[3]=='I'))) // OPTIONS    {      char *rest=rtsp_get(s);      if (!rest)        return -1;            seq=-1;      do {        free(rest);        rest=rtsp_get(s);        if (!rest)          return -1;        if (!strncasecmp(rest,"CSeq:",5))          sscanf(rest,"%*s %u",&seq);      } while (strlen(rest)!=0);      free(rest);      if (seq<0) {#ifdef LOG        mp_msg(MSGT_OPEN, MSGL_WARN, "rtsp: warning: CSeq not recognized!\n");#endif        seq=1;      }      /* let's make the server happy */      rtsp_put(s, "RTSP/1.0 451 Parameter Not Understood");      rest=malloc(17);      sprintf(rest,"CSeq: %u", seq);      rtsp_put(s, rest);      free(rest);      rtsp_put(s, "");      i=read_stream(s->s, buffer, size);    } else    {      i=read_stream(s->s, buffer+4, size-4);      i+=4;    }  } else    i=read_stream(s->s, buffer, size);#ifdef LOG  mp_msg(MSGT_OPEN, MSGL_INFO, "librtsp: << %d of %d bytes\n", i, size);#endif  return i;}/* * connect to a rtsp server *///rtsp_t *rtsp_connect(const char *mrl, const char *user_agent) {rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *user_agent) {  rtsp_t *s=malloc(sizeof(rtsp_t));  int i;    for (i=0; i<MAX_FIELDS; i++) {    s->answers[i]=NULL;    s->scheduled[i]=NULL;  }  s->server=NULL;  s->server_state=0;  s->server_caps=0;    s->cseq=0;  s->session=NULL;    if (user_agent)    s->user_agent=strdup(user_agent);  else    s->user_agent=strdup("User-Agent: RealMedia Player Version 6.0.9.1235 (linux-2.0-libc6-i386-gcc2.95)");  s->mrl = strdup(mrl);  s->host = strdup(host);  s->port = port;  s->path = strdup(path);  while (*path == '/')    path++;  if ((s->param = strchr(s->path, '?')) != NULL)    s->param++;  //mp_msg(MSGT_OPEN, MSGL_INFO, "path=%s\n", s->path);  //mp_msg(MSGT_OPEN, MSGL_INFO, "param=%s\n", s->param ? s->param : "NULL");  s->s = fd;  if (s->s < 0) {    mp_msg(MSGT_OPEN, MSGL_ERR, "rtsp: failed to connect to '%s'\n", s->host);    rtsp_close(s);    return NULL;  }  s->server_state=RTSP_CONNECTED;  /* now let's send an options request. */  rtsp_schedule_field(s, "CSeq: 1");  rtsp_schedule_field(s, s->user_agent);  rtsp_schedule_field(s, "ClientChallenge: 9e26d33f2984236010ef6253fb1887f7");  rtsp_schedule_field(s, "PlayerStarttime: [28/03/2003:22:50:23 00:00]");  rtsp_schedule_field(s, "CompanyID: KnKV4M4I/B2FjJ1TToLycw==");  rtsp_schedule_field(s, "GUID: 00000000-0000-0000-0000-000000000000");  rtsp_schedule_field(s, "RegionData: 0");  rtsp_schedule_field(s, "ClientID: Linux_2.4_6.0.9.1235_play32_RN01_EN_586");  /*rtsp_schedule_field(s, "Pragma: initiate-session");*/  rtsp_request_options(s, NULL);  return s;}/* * closes an rtsp connection  */void rtsp_close(rtsp_t *s) {  if (s->server_state)  {    if (s->server_state == RTSP_PLAYING)      rtsp_request_teardown (s, NULL);    closesocket (s->s);  }  if (s->path) free(s->path);  if (s->host) free(s->host);  if (s->mrl) free(s->mrl);  if (s->session) free(s->session);  if (s->user_agent) free(s->user_agent);  rtsp_free_answers(s);  rtsp_unschedule_all(s);  free(s);  }/* * search in answers for tags. returns a pointer to the content * after the first matched tag. returns NULL if no match found. */char *rtsp_search_answers(rtsp_t *s, const char *tag) {  char **answer;  char *ptr;    if (!s->answers) return NULL;  answer=s->answers;  while (*answer) {    if (!strncasecmp(*answer,tag,strlen(tag))) {      ptr=strchr(*answer,':');      if (!ptr) return NULL;      ptr++;      while(*ptr==' ') ptr++;      return ptr;    }    answer++;  }  return NULL;}/* * session id management */void rtsp_set_session(rtsp_t *s, const char *id) {  if (s->session) free(s->session);  s->session=strdup(id);}char *rtsp_get_session(rtsp_t *s) {  return s->session;}char *rtsp_get_mrl(rtsp_t *s) {  return s->mrl;}char *rtsp_get_param(rtsp_t *s, const char *p) {  int len;  char *param;  if (!s->param)    return NULL;  if (!p)    return strdup(s->param);  len = strlen(p);  param = s->param;  while (param && *param) {    char *nparam = strchr(param, '&');    if (strncmp(param, p, len) == 0 && param[len] == '=') {      param += len + 1;      len = nparam ? nparam - param : strlen(param);      nparam = malloc(len + 1);      memcpy(nparam, param, len);      nparam[len] = 0;      return nparam;    }    param = nparam ? nparam + 1 : NULL;  }  return NULL;}  /* * schedules a field for transmission */void rtsp_schedule_field(rtsp_t *s, const char *string) {  int i=0;    if (!string) return;  while(s->scheduled[i]) {    i++;  }  s->scheduled[i]=strdup(string);}/* * removes the first scheduled field which prefix matches string.  */void rtsp_unschedule_field(rtsp_t *s, const char *string) {  char **ptr=s->scheduled;    if (!string) return;  while(*ptr) {    if (!strncmp(*ptr, string, strlen(string)))      break;    else      ptr++;  }  if (*ptr) free(*ptr);  ptr++;  do {    *(ptr-1)=*ptr;  } while(*ptr);}/* * unschedule all fields */void rtsp_unschedule_all(rtsp_t *s) {  char **ptr;    if (!s->scheduled) return;  ptr=s->scheduled;  while (*ptr) {    free(*ptr);    *ptr=NULL;    ptr++;  }}/* * free answers */void rtsp_free_answers(rtsp_t *s) {  char **answer;    if (!s->answers) return;  answer=s->answers;  while (*answer) {    free(*answer);    *answer=NULL;    answer++;  }}

⌨️ 快捷键说明

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