void CPlayerMedia::rtp_init (bool do_tcp) 
{
  rtp_stream_params_t rsp;
  connect_desc_t *cptr;
  double bw;

  if (m_rtp_session == NULL) {
    m_rtp_session_from_outside = false;
    rtp_default_params(&rsp);

    if (find_rtcp_bandwidth_from_media(m_media_info, &bw) < 0) {
      bw = 5000.0;
    } 
    rsp.rtcp_bandwidth = bw;
    cptr = get_connect_desc_from_media(m_media_info);
  
    rsp.rtp_addr = m_source_addr == NULL ? cptr->conn_addr : m_source_addr;
    rsp.rtp_rx_port = m_our_port;
    rsp.rtp_tx_port = m_server_port;
    rsp.rtp_ttl = cptr == NULL ? 1 : cptr->ttl;
    rsp.rtp_callback = c_recv_callback;
    if (do_tcp) {
      rsp.dont_init_sockets = 1;
      rsp.rtcp_send_packet = c_rtcp_send_packet;
    } else {
      // udp.  See if we have a seperate rtcp field
      if (m_media_info->rtcp_connect.used) {
	rsp.rtcp_rx_port = m_media_info->rtcp_port;
	rsp.rtcp_addr = m_media_info->rtcp_connect.conn_addr;
	rsp.rtcp_ttl = m_media_info->rtcp_connect.ttl;
      }
      if (config.get_config_string(CONFIG_MULTICAST_RX_IF) != NULL) {
	struct in_addr if_addr;
	if (getIpAddressFromInterface(config.get_config_string(CONFIG_MULTICAST_RX_IF),
				      &if_addr) >= 0) {
	  rsp.physical_interface_addr = inet_ntoa(if_addr);
	}
      }
    }

    rsp.recv_userdata = this;
    m_rtp_session = rtp_init_stream(&rsp);

    rtp_set_option(m_rtp_session, RTP_OPT_WEAK_VALIDATION, FALSE);
    rtp_set_option(m_rtp_session, RTP_OPT_PROMISC, TRUE);
    if (strncasecmp(m_media_info->proto, "RTP/SVP", strlen("RTP/SVP")) == 0) {
      srtp_init();
    }
  } else {
    m_rtp_session_from_outside = true;
    rtp_set_rtp_callback(m_rtp_session, c_recv_callback, this);
  }
  m_rtp_inited = 1;

}
void CPlayerMedia::rtp_start (void)
{
  if (m_rtp_ssrc_set == TRUE) {
    rtp_set_my_ssrc(m_rtp_session, m_rtp_ssrc);
  } else {
    // For now - we'll set up not to wait for RTCP validation 
    // before indicating if rtp library should accept.
    rtp_set_option(m_rtp_session, RTP_OPT_WEAK_VALIDATION, FALSE);
    rtp_set_option(m_rtp_session, RTP_OPT_PROMISC, TRUE);
  }
  if (m_rtp_byte_stream != NULL) {
    //m_rtp_byte_stream->reset(); - gets called when pausing
    //    m_rtp_byte_stream->flush_rtp_packets();
  }
  m_rtp_buffering = 0;
}
Beispiel #3
0
rtp_session_t * init_rtp_session(uint32_t port, char *addr){
    rtp_session_t *rtp;
    char *mcast_if = NULL;
    double rtcp_bw = DEFAULT_RTCP_BW;
    int ttl = DEFAULT_TTL;
    struct module tmod;
    struct tx *tx_session;

    rtp = (rtp_session_t *) malloc(sizeof(rtp_session_t));
    if (rtp == NULL){
        error_msg("rtp_session: malloc error");
        return NULL;
    }

    rtp->port = port;
    rtp->addr = addr;

    module_init_default(&tmod);

    struct rtp *rtp_conn  = rtp_init_if(addr, mcast_if,
            0, port, ttl,
            rtcp_bw, 0, dummy_callback,
            (void *)NULL, 0);
    if (rtp_conn == NULL){
        error_msg("rtp_session: rtp_init error");
        return NULL;
    }

    rtp_set_option(rtp_conn, RTP_OPT_WEAK_VALIDATION, 1);
    rtp_set_sdes(rtp_conn, rtp_my_ssrc(rtp_conn), RTCP_SDES_TOOL, PACKAGE_STRING, strlen(PACKAGE_STRING));
    rtp_set_send_buf(rtp_conn, DEFAULT_SEND_BUFFER_SIZE);

    tx_session = tx_init_h264(&tmod, MTU, TX_MEDIA_VIDEO, NULL, NULL);
    if (tx_session == NULL){
        error_msg("rtp_session: tx_init error");
        return NULL;
    }

    rtp->rtp = rtp_conn;
    rtp->tx_session = tx_session;

    return rtp;
}
int
os_sound_start (call_t * ca, int port)
{
  int p, cond;
  int bits = 16;
  int stereo = 0;               /* 0 is mono */
  int rate = 8000;
  int blocksize = 512;

  if (ca->local_sendrecv == _SENDRECV || ca->local_sendrecv == _RECVONLY)
    {
      ca->fd = open (AUDIO_DEVICE, O_RDWR | O_NONBLOCK);
      if (ca->fd < 0)
        return -EWOULDBLOCK;
      fcntl (ca->fd, F_SETFL, fcntl (ca->fd, F_GETFL) & ~O_NONBLOCK);

      ioctl (ca->fd, SNDCTL_DSP_RESET, 0);

      p = bits;                 /* 16 bits */
      ioctl (ca->fd, SNDCTL_DSP_SAMPLESIZE, &p);

      p = stereo;               /* number of channels */
      ioctl (ca->fd, SNDCTL_DSP_CHANNELS, &p);

#ifdef USE_PCM
      p = AFMT_S16_NE;          /* choose LE or BE (endian) */
      ioctl (ca->fd, SNDCTL_DSP_SETFMT, &p);
#else
      if (ca->payload == 0)
        p = AFMT_MU_LAW;
      else if (ca->payload == 8)
        p = AFMT_A_LAW;
      else if (ca->payload == 110 || ca->payload == 111)
        p = AFMT_S16_NE;        /* choose LE or BE (endian) */
      ioctl (ca->fd, SNDCTL_DSP_SETFMT, &p);
#endif

      p = rate;                 /* rate in khz */
      ioctl (ca->fd, SNDCTL_DSP_SPEED, &p);

      ioctl (ca->fd, SNDCTL_DSP_GETBLKSIZE, &min_size);
      if (min_size > blocksize)
        {
          cond = 1;
          p = min_size / blocksize;
          while (cond)
            {
              int i = ioctl (ca->fd, SNDCTL_DSP_SUBDIVIDE, &p);

              /* fprintf(stderr, "SUB_DIVIDE said error=%i,errno=%i\n",i,errno); */
              if ((i == 0) || (p == 1))
                cond = 0;
              else
                p = p / 2;
            }
        }
      ioctl (ca->fd, SNDCTL_DSP_GETBLKSIZE, &min_size);
      if (min_size > blocksize)
        {
          fprintf (stderr, "dsp block size set to %i.", min_size);
          exit (0);
      } else
        {
          /* no need to access the card with less latency than needed */
          min_size = blocksize;
        }

      OSIP_TRACE (osip_trace
                  (__FILE__, __LINE__, OSIP_INFO2, NULL,
                   "blocksize = %i\n", min_size));
  } else
    {
      /* send a wav file! */
      ca->fd = open (ca->wav_file, O_RDONLY);
      if (ca->fd < 0)
        {
          OSIP_TRACE (osip_trace
                      (__FILE__, __LINE__, OSIP_INFO2, NULL,
                       "Could not open wav file: %s\n", ca->wav_file));
          return -1;
        }
    }


#ifdef SPEEX_SUPPORT
  {
    float vbr_qual;
    int value;
    int quality;

    ca->speex_enc = speex_encoder_init (&speex_nb_mode);        /* 8kHz */
    /* 16kHz speex_enc = speex_encoder_init(&speex_wb_mode);   */
    /* 32kHz speex_enc = speex_encoder_init(&speex_uwb_mode);  */
    ca->speex_dec = speex_decoder_init (&speex_nb_mode);
    value = 1;
    speex_decoder_ctl (ca->speex_dec, SPEEX_SET_ENH, &value);
    quality = 8;                /* 15kb */
    speex_encoder_ctl (ca->speex_enc, SPEEX_SET_QUALITY, &quality);
    /* ou bien le bit rate:
       value = 15000; // 15kb
       speex_encoder_ctl(ca->speex_enc, SPEEX_SET_BITRATE, &value);
     */
    /* silence suppression (VAD)
       value = 1; // 15kb
       speex_encoder_ctl(ca->speex_enc, SPEEX_SET_VAD, &value);
       Discontinuous transmission (DTX)
       value = 1; // 15kb
       speex_encoder_ctl(ca->speex_enc, SPEEX_SET_DTX, &value);

       Variable Bit Rate (VBR)
       value = 1; // 15kb
       speex_encoder_ctl(ca->speex_enc, SPEEX_SET_VBR, &value);
       vbr_qual = 5,0; // between 0 and 10
       speex_encoder_ctl(ca->speex_enc, SPEEX_SET_VBR_QUALITY, &vbr_qual);

       Average bit rate: (ABR)
       value = 15000; // 15kb
       speex_encoder_ctl(ca->speex_enc, SPEEX_SET_ABR, &value);
     */
    speex_encoder_ctl (ca->speex_enc, SPEEX_GET_FRAME_SIZE, &ca->speex_fsize);

    ca->speex_nb_packet = 1;
    speex_bits_init (&(ca->speex_bits));
    speex_bits_init (&(ca->dec_speex_bits));
  }
#endif

  if (ca->local_sendrecv == _SENDRECV)
    {
      OSIP_TRACE (osip_trace
                  (__FILE__, __LINE__, OSIP_INFO2, NULL,
                   "starting sendrecv session\n"));
  } else if (ca->local_sendrecv == _SENDONLY)
    {
      OSIP_TRACE (osip_trace
                  (__FILE__, __LINE__, OSIP_INFO2, NULL,
                   "starting sendonly session\n"));
  } else
    {
      OSIP_TRACE (osip_trace
                  (__FILE__, __LINE__, OSIP_INFO2, NULL,
                   "starting recvonly session\n"));
    }

  ca->rtp_session = rtp_init (ca->remote_sdp_audio_ip,
                              port,
                              ca->remote_sdp_audio_port,
                              16, 64000, rtp_event_handler, (void *) ca);

  if (ca->rtp_session)
    {
      const char *username = "******";    /* should be taken from the SDP */
      const char *telephone = "0033-MY-NUMBER";
      const char *app_name = "josua";
      uint32_t my_ssrc = rtp_my_ssrc (ca->rtp_session);

      /* set local participant info */
      rtp_set_sdes (ca->rtp_session, my_ssrc, RTCP_SDES_NAME,
                    username, strlen (username));
      rtp_set_sdes (ca->rtp_session, my_ssrc, RTCP_SDES_PHONE,
                    telephone, strlen (telephone));
      rtp_set_sdes (ca->rtp_session, my_ssrc, RTCP_SDES_TOOL,
                    app_name, strlen (app_name));

      /* Filter out local packets if requested */
      /* rtp_set_option(ca->rtp_session, RTP_OPT_FILTER_MY_PACKETS, filter_me); */
      rtp_set_option (ca->rtp_session, RTP_OPT_WEAK_VALIDATION, TRUE);

      ca->enable_audio = 1;
      ca->audio_thread = osip_thread_create (20000, os_sound_start_thread, ca);
  } else
    {
      fprintf (stderr, "Could not initialize session for %s port %d\n",
               ca->remote_sdp_audio_ip, ca->remote_sdp_audio_port);
    }

  return 0;
}