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

📄 rtsp_testapp.c

📁 嵌入式系统中c程序实现了rtsp协议的基本内容
💻 C
📖 第 1 页 / 共 2 页
字号:
            if (isdigit(str[i])) {
              num[j++] = str[i];
              j %= 64; /* avoid illegal access */
            } else {
              num[j++] = '\0';
              player->rtp_server_port = strtol(num,&endptr,10);
              j = 0;
              state = REACH_TAG; /* get only first value */
            }
            break;
          case REACH_CLPORT:
            if (isdigit(str[i])) {
              num[j++] = str[i];
              j %= 64; /* avoid illegal access */
            } else {
              num[j++] = '\0';
              player->rtp_client_port = strtol(num,&endptr,10);
              j = 0;
              state = REACH_TAG; /* get only first value */
            }
            break;
          case REACH_SRVPORT:
            if (isdigit(str[i])) {
              num[j++] = str[i];
              j %= 64; /* avoid illegal access */
            } else {
              num[j++] = '\0';
              player->rtp_server_port = strtol(num,&endptr,10);
              j = 0;
              state = REACH_TAG; /* get only first value */
            }
            break;
          case REACH_TTL:
            if (isdigit(str[i])) {
              num[j++] = str[i];
              j %= 64; /* avoid illegal access */
            } else {
              num[j++] = '\0';
              player->rtp_ttl = strtol(num,&endptr,10);
              j = 0;
              state = REACH_TAG;
            }
            break;
          case REACH_DEST:
            if (isdigit(str[i]) ||
                str[i] == '.') {
              num[j++] = str[i];
              j %= 64; /* avoid illegal access */
            } else if(str[i] == ':'){
                num[j++] = '\0';
                /* convert IP string to NGuint */
             // inet_addr(num, &player->rtp_ip);
             player->rtp_ip = inet_addr(num);
              j = 0;
              state = REACH_CLPORT;
            }else{
              num[j++] = '\0';
              /* convert IP string to NGuint */
             player->rtp_ip = inet_addr(num);
              j = 0;
              state = REACH_TAG;
            }
            break;
          case REACH_SRC:
            if (isdigit(str[i]) ||
                str[i] == '.') {
              num[j++] = str[i];
              j %= 64; /* avoid illegal access */
            } else {
              num[j++] = '\0';
              /* convert IP string to NGuint */
             player->rtp_ip = inet_addr(num);
              j = 0;
              state = REACH_TAG;
            }
            break;
          case REACH_SSRC:
            break;
        }
        i++;
        /* process terminating NULL so the last tag is correctly detected */
        if (str[i-1]=='\0')
          break;
      }
}



 static int rtsp (char *server)
{
  
  int ret;
  /*char * temp;*/
  rtsp_command_t cmd;
  rtsp_decode_t *decode;
  session_desc_t *sdp=NULL;
  media_desc_t *media;
  sdp_decode_info_t *sdpdecode;
  rtsp_session_t *session;
  int dummy;
  char transport_buf[200];

  memset(&cmd, 0, sizeof(rtsp_command_t));
  

  rtsp_client = (rtsp_client_t*)rtsp_create_client(server, &ret);

  if (rtsp_client == NULL) {
    Rtsp_Printf("No client created - error %d\n", ret);
    return (1);
  }

  if (rtsp_send_describe(rtsp_client, &cmd, &decode) != RTSP_RESPONSE_GOOD) {
    Rtsp_Printf("Describe response not good\n");
    free_decode_response(decode);
    free_rtsp_client(rtsp_client);
    return(1);
  }
  sdpdecode = set_sdp_decode_from_memory(decode->body);
  if (sdpdecode == NULL) {
    Rtsp_Printf("Couldn't get sdp decode\n");
    free_decode_response(decode);
    free_rtsp_client(rtsp_client);
    return(1);
  }

  if (sdp_decode(sdpdecode, &sdp, &dummy) != 0) {
    Rtsp_Printf("Couldn't decode sdp\n");
    free_decode_response(decode);
    free_rtsp_client(rtsp_client);
    return (1);
  }

 Rtsp_Free(sdpdecode,__LINE__,__FILE__);

    convert_relative_urls_to_absolute (sdp, server);

  free_decode_response(decode);
  decode = NULL;
  sprintf(transport_buf,transport_str,6000,6001);
   cmd.transport = transport_buf;
#if 0  
#if 1
  cmd.transport = "RTP/AVP;unicast;client_port=4588-4589";
#else
  cmd.transport = "RTP/AVP/TCP;unicast"/*interleaved=0-1"*/;
#endif
#endif
   
  media = sdp->media;
  dummy = rtsp_send_setup(rtsp_client,
			  media->control_string,
			  &cmd,
			  &session,
			  &decode, 0);

  if (dummy != RTSP_RESPONSE_GOOD) {
/*    Rtsp_Printf("Response to setup is %d\n", dummy);
*/
    sdp_free_session_desc(sdp);
    free_decode_response(decode);
    free_rtsp_client(rtsp_client);
    return (1);
  }
  
  rtsp_client->session=strdup(session->session);
  
  player=Rtsp_Malloc(sizeof(player_t),__LINE__,__FILE__);
  memset(player, 0, sizeof(player_t));
    if(player==NULL)
        return FALSE;
  media = (sdp->media)->next;
    parse_transport_str( decode->transport ); 
  
  while(media!=NULL)
  {
    free_decode_response(decode);  
    sprintf(transport_buf,transport_str,player->rtp_client_port,player->rtp_client_port  +  1);
    cmd.transport = transport_buf;
    dummy = rtsp_send_setup(rtsp_client,
			  media->control_string,
			  &cmd,
			  &session,
			  &decode, 1);

  if (dummy != RTSP_RESPONSE_GOOD) {
    Rtsp_Printf("Response to setup is %d\n", dummy);
    sdp_free_session_desc(sdp);
    free_decode_response(decode);
    free_rtsp_client(rtsp_client);
    return (1);
  }
  
 

  
  

  media = media->next;
  }
  

  parse_transport_str( decode->transport ); 

  sdp_free_session_desc(sdp);
  free_decode_response(decode);
  cmd.transport = NULL;
  player->state=SETUP;

  return (0);
}  

static int RPLAY (void)
{
  rtsp_command_t cmd;
  rtsp_decode_t *decode;

  int dummy;
  char ipaddr[40];
  if(player->state & PAUSE)
  {
    memset(&cmd, 0, sizeof(rtsp_command_t));
      cmd.transport = NULL;
  
  cmd.range = "npt=0.0-30.0";
  dummy = rtsp_send_aggregate_play(rtsp_client,rtsp_client->url, &cmd, &decode);
  /*dummy = rtsp_send_play(session, &cmd, &decode);*/
  if (dummy != RTSP_RESPONSE_GOOD) {
    printf("response to play is %d\n", dummy);
  } 
  free_decode_response(decode);
    player->state=PLAY;
    
    }
    else
    {
  memset(&cmd, 0, sizeof(rtsp_command_t));
      cmd.transport = NULL;
  
  cmd.range = "npt=0.0-30.0";
  dummy = rtsp_send_aggregate_play(rtsp_client,rtsp_client->url, &cmd, &decode);
  /*dummy = rtsp_send_play(session, &cmd, &decode);*/
  if (dummy != RTSP_RESPONSE_GOOD) {
    printf("response to play is %d\n", dummy);
  } 
  free_decode_response(decode);
	
	player->state=PLAY;
}
  return TRUE;
}


static int  RPAUSE (void)

{
  rtsp_command_t cmd;
  rtsp_decode_t *decode;

  int dummy;
  memset(&cmd, 0, sizeof(rtsp_command_t));
      cmd.transport = NULL;
  
  /*cmd.range = "npt=0-10.12390";*/
 dummy = rtsp_send_aggregate_pause(rtsp_client,rtsp_client->url, &cmd, &decode);
 // dummy = rtsp_send_play(session, &cmd, &decode);
  if (dummy != RTSP_RESPONSE_GOOD) {
    printf("response to play is %d\n", dummy);
    return FALSE;
  } 
  free_decode_response(decode);
  player->state =PAUSE ;
  
  			/*stop the video*/
  return TRUE;
}


static int  RSTOP (void)

{
  rtsp_decode_t *decode;

  int dummy;  
  dummy = rtsp_send_aggregate_teardown(rtsp_client,rtsp_client->url, NULL, &decode);
/*  printf("Teardown response %d\n", dummy);
*/
  free_decode_response(decode);
  free_rtsp_client(rtsp_client);
  rtsp_client=NULL;
  
  if(player->state && (PLAY|PAUSE))
  {
    
 // IPTV_Stop();
  
    }
    player->state=0;
 // Rtsp_Free(player);
  return TRUE;
}




void  test_rtsp_main(void)
{
	static char* server="rtsp://192.168.1.15:8554/robot.mpg";
	rtsp(server);

	RPLAY();
	RPAUSE();
	RSTOP();	 
}




⌨️ 快捷键说明

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