Changeset 3288:cc632cc556e7 in roaraudio


Ignore:
Timestamp:
02/01/10 16:40:13 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

beginning support for reading RTP streams

Location:
libroar
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libroar/Makefile

    r3272 r3288  
    1010OBJS=libroar.o config.o debug.o basic.o stream.o simple.o auth.o socket.o ctl.o buffer.o meta.o file.o acl.o cdrom.o pinentry.o sshaskpass.o $(VIO) stack.o slp.o nnode.o 
    1111 
    12 #DEFINES        = -DDEBUG 
     12DEFINES        = -DDEBUG 
    1313INCLUDE = -I../include -I../include/libroar 
    1414CFLAGS += -g -Wall -O2 $(DEFINES) $(INCLUDE) $(INCPATH) $(SHARED_CF) $(fPIC) 
  • libroar/vio_rtp.c

    r3287 r3288  
    109109 
    110110 calls->inst               = self; 
    111 // calls->read               = roar_vio_rtp_read; 
     111 calls->read               = roar_vio_rtp_read; 
    112112 calls->write              = roar_vio_rtp_write; 
    113113// calls->lseek              = roar_vio_rtp_lseek; 
     
    122122} 
    123123 
    124 ssize_t roar_vio_rtp_read    (struct roar_vio_calls * vio, void *buf, size_t count); 
     124ssize_t roar_vio_rtp_read    (struct roar_vio_calls * vio, void *buf, size_t count) { 
     125 struct roar_rtp_inst * self = vio->inst; 
     126 size_t len_need = self->mtu * 4 + sizeof(struct roar_rtp_header); // we hope to never get pkgs with size > 4*mtu 
     127 size_t len_have; 
     128 size_t have = 0; 
     129 ssize_t ret; 
     130 union { 
     131  void     * vp; 
     132  char     * cp; 
     133  uint16_t * u16; 
     134  uint32_t * u32; 
     135 } data; 
     136 size_t  dataoffset; 
     137 int     i; 
     138 
     139 ROAR_DBG("roar_vio_rtp_read(vio=%p, buf=%p, count=%llu) = ?", vio, buf, (long long unsigned)count); 
     140 
     141 if ( self->rx_decoded != NULL ) { 
     142  // handle this case and set to NULL if the buffer is empty 
     143  // set have; 
     144  // increment buf, decrement count 
     145 } 
     146 
     147 if ( count == 0 ) 
     148  return have; 
     149 
     150 if ( self->io == NULL ) { 
     151  if ( roar_buffer_new(&(self->io), len_need) == -1 ) 
     152   return have ? have : -1; 
     153 
     154  len_have = len_need; 
     155 } else { 
     156  if ( roar_buffer_get_len(self->io, &len_have) == -1 ) 
     157   return have ? have : -1; 
     158 
     159  if ( len_have < len_need ) { 
     160   if ( roar_buffer_set_len(self->io, len_need) == -1 ) { 
     161    if ( roar_buffer_free(self->io) == -1 ) 
     162     return have ? have : -1; 
     163 
     164    self->io = NULL; 
     165    if ( have != 0 ) { 
     166     return have; 
     167    } else { 
     168     return roar_vio_rtp_read(vio, buf, count); // restart ower self from the beginning with no buffer 
     169    } 
     170   } 
     171  } 
     172 } 
     173 
     174 if ( roar_buffer_get_data(self->io, &(data.vp)) == -1 ) 
     175  return have ? have : -1; 
     176 
     177 if ( (ret = roar_vio_read(self->vio, data.vp, len_need)) == -1 ) 
     178  return have ? have : -1; 
     179 
     180 if ( (data.cp[0] && 0x02) == 0x02 ) /* version check */ 
     181  return have ? have : -1; 
     182 
     183 self->header.csrc_count   = (data.cp[0] & 0xF0) >> 4; 
     184 self->header.payload_type = (data.cp[1] & 0xFE) >> 1; 
     185 
     186 // TODO: check old seqnum < new seqnum 
     187 self->header.seq_num      = data.u16[1]; 
     188 
     189 // TODO: check timestamp: 
     190 self->header.ts           = data.u32[1]; 
     191 
     192 self->header.ssrc         = data.u32[2]; 
     193 
     194 for (i = 0; i < self->header.csrc_count; i++) { 
     195  self->header.csrc[i]     = data.u32[3+i]; 
     196 } 
     197 
     198 dataoffset   = 3*4 + self->header.csrc_count*4; 
     199 
     200 ret     -= dataoffset; 
     201 data.vp += dataoffset; 
     202 
     203 if ( ret <= count ) { 
     204  memcpy(buf, data.vp, ret); 
     205  ROAR_DBG("roar_vio_rtp_read(vio=%p, buf=%p, count=?) = %llu", vio, buf, (long long unsigned)(have+ret)); 
     206  return have + ret; 
     207 } else { 
     208 } 
     209 
     210 ROAR_DBG("roar_vio_rtp_read(vio=%p, buf=%p, count=?) = -1", vio, buf); 
     211 return -1; 
     212} 
     213 
    125214ssize_t roar_vio_rtp_write   (struct roar_vio_calls * vio, void *buf, size_t count) { 
    126215 struct roar_rtp_inst * self = vio->inst; 
Note: See TracChangeset for help on using the changeset viewer.