Changeset 3275:8786fd84f600 in roaraudio for libroar/vio_rtp.c
- Timestamp:
- 02/01/10 11:31:03 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vio_rtp.c
r3274 r3275 67 67 68 68 ssize_t roar_vio_rtp_read (struct roar_vio_calls * vio, void *buf, size_t count); 69 ssize_t roar_vio_rtp_write (struct roar_vio_calls * vio, void *buf, size_t count); 69 ssize_t roar_vio_rtp_write (struct roar_vio_calls * vio, void *buf, size_t count) { 70 struct roar_rtp_inst * self = vio->inst; 71 size_t len_need = count + sizeof(struct roar_rtp_header); // this is a bit more than we need 72 // we ignore this at the moment 73 size_t len_have; 74 union { 75 void * vp; 76 char * cp; 77 uint16_t * u16; 78 uint32_t * u32; 79 } data; 80 size_t dataoffset; 81 ssize_t ret; 82 int i; 83 84 if ( self->tx == NULL ) { 85 if ( roar_buffer_new(&(self->tx), len_need) == -1 ) 86 return -1; 87 88 len_have = len_need; 89 } else { 90 if ( roar_buffer_get_len(self->tx, &len_have) == -1 ) 91 return -1; 92 93 if ( len_have < len_need ) { 94 if ( roar_buffer_set_len(self->tx, len_need) == -1 ) { 95 if ( roar_buffer_free(self->tx) == -1 ) 96 return -1; 97 98 self->tx = NULL; 99 return roar_vio_rtp_write(vio, buf, count); // restart ower self from the beginning with no buffer 100 } 101 } 102 } 103 104 if ( roar_buffer_get_data(self->tx, &(data.vp)) == -1 ) 105 return -1; 106 107 memset(data.vp, 0, len_need); 108 109 data.cp[0] = 2; 110 data.cp[0] |= self->header.csrc_count << 4; 111 data.cp[1] |= self->header.payload_type << 1; 112 113 data.u16[1] = self->header.seq_num; 114 115 data.u32[1] = self->header.ts; 116 data.u32[2] = self->header.ssrc; 117 118 for (i = 0; i < self->header.csrc_count; i++) { 119 data.u32[3+i] = self->header.csrc[i]; 120 } 121 122 dataoffset = 3*4 + self->header.csrc_count*4; 123 124 memcpy(data.vp + dataoffset, buf, count); 125 126 if ( (ret = roar_vio_write(self->vio, data.vp, count+dataoffset)) == -1 ) 127 return -1; 128 129 return ret - dataoffset; 130 } 131 70 132 off_t roar_vio_rtp_lseek (struct roar_vio_calls * vio, off_t offset, int whence); 71 133 … … 108 170 ret = roar_vio_close(self->vio); 109 171 172 if ( self->tx != NULL ) 173 if ( roar_buffer_free(self->tx) == -1 ) 174 ret = -1; 175 110 176 roar_mm_free(self); 111 177
Note: See TracChangeset
for help on using the changeset viewer.