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

📄 rtsp.c

📁 自己移植的linux下的流媒体播放器原代码,支持mms协议,支持ftp和http协议.
💻 C
📖 第 1 页 / 共 2 页
字号:
        s->cseq=answer_seq;      }    }    if (!strncmp(answer,"Server:",7)) {      char *buf = malloc(strlen(answer));      sscanf(answer,"Server: %s",buf);      if (s->server) free(s->server);      s->server=strdup(buf);      free(buf);    }    if (!strncmp(answer,"Session:",8)) {      char *buf = calloc(1, strlen(answer));      sscanf(answer,"Session: %s",buf);      if (s->session) {        if (strcmp(buf, s->session)) {          printf("rtsp: warning: setting NEW session: %s\n", buf);          free(s->session);          s->session=strdup(buf);        }      } else      {#ifdef LOG        printf("rtsp: setting session id to: %s\n", buf);#endif        s->session=strdup(buf);      }      free(buf);    }    *answer_ptr=answer;    answer_ptr++;  } while ((strlen(answer)!=0) && (++ans_count < MAX_FIELDS));    s->cseq++;    *answer_ptr=NULL;  rtsp_schedule_standard(s);      return code;}/* * send an ok message */int rtsp_send_ok(rtsp_t *s) {  char cseq[16];    rtsp_put(s, "RTSP/1.0 200 OK");  sprintf(cseq,"CSeq: %u", s->cseq);  rtsp_put(s, cseq);  rtsp_put(s, "");  return 0;}/* * implementation of must-have rtsp requests; functions return * server status code. */int rtsp_request_options(rtsp_t *s, const char *what) {  char *buf;  if (what) {    buf=strdup(what);  } else  {    buf=malloc(sizeof(char)*(strlen(s->host)+16));    sprintf(buf,"rtsp://%s:%i", s->host, s->port);  }  rtsp_send_request(s,"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(sizeof(char)*(strlen(s->host)+strlen(s->path)+16));    sprintf(buf,"rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request(s,"DESCRIBE",buf);  free(buf);    return rtsp_get_answers(s);}int rtsp_request_setup(rtsp_t *s, const char *what) {  rtsp_send_request(s,"SETUP",what);    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(sizeof(char)*(strlen(s->host)+strlen(s->path)+16));    sprintf(buf,"rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request(s,"SET_PARAMETER",buf);  free(buf);    return rtsp_get_answers(s);}int rtsp_request_play(rtsp_t *s, const char *what) {  char *buf;  if (what) {    buf=strdup(what);  } else  {    buf=malloc(sizeof(char)*(strlen(s->host)+strlen(s->path)+16));    sprintf(buf,"rtsp://%s:%i/%s", s->host, s->port, s->path);  }  rtsp_send_request(s,"PLAY",buf);  free(buf);    return rtsp_get_answers(s);}int rtsp_request_tearoff(rtsp_t *s, const char *what) {  rtsp_send_request(s,"TEAROFF",what);    return rtsp_get_answers(s);}/* * 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]=='_'))    {      char *rest=rtsp_get(s);      if (!rest)        return -1;            seq=-1;      do {        free(rest);        rest=rtsp_get(s);        if (!rest)          return -1;        if (!strncmp(rest,"Cseq:",5))          sscanf(rest,"Cseq: %u",&seq);      } while (strlen(rest)!=0);      free(rest);      if (seq<0) {#ifdef LOG        printf("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(sizeof(char)*16);      sprintf(rest,"CSeq: %u", seq);      rtsp_put(s, 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  printf("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=1;  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++;  //printf("path=%s\n", s->path);  //printf("param=%s\n", s->param ? s->param : "NULL");  s->s = fd;  if (s->s < 0) {    printf ("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) closesocket(s->s); /* TODO: send a TEAROFF */  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,':');      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, 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;  }  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 + -