Changeset 169 for pjproject/trunk/pjmedia/src/pjmedia/stream.c
- Timestamp:
- Feb 9, 2006 2:01:40 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia/stream.c
r164 r169 40 40 #define PJMEDIA_MAX_MTU 1500 41 41 42 struct jb_frame43 {44 unsigned size;45 void *buf;46 };47 48 #define pj_fifobuf_alloc(fifo,size) malloc(size)49 #define pj_fifobuf_unalloc(fifo,buf) free(buf)50 #define pj_fifobuf_free(fifo, buf) free(buf)51 42 52 43 … … 89 80 pjmedia_codec_mgr *codec_mgr; /**< Codec manager instance. */ 90 81 pjmedia_codec *codec; /**< Codec instance being used. */ 91 82 pj_size_t frame_size; /**< Size of encoded frame. */ 92 83 pj_mutex_t *jb_mutex; 93 pj _jitter_bufferjb; /**< Jitter buffer. */94 95 pj _sock_t rtp_sock; /**< RTP socket.*/96 pj_sock _t rtcp_sock; /**< RTCP socket.*/97 pj_sockaddr_in dst_addr; /**< Destination RTP address.*/84 pjmedia_jbuf *jb; /**< Jitter buffer. */ 85 86 pjmedia_sock_info skinfo; /**< Transport info. */ 87 pj_sockaddr_in rem_rtp_addr; /**< Remote RTP address. */ 88 pj_sockaddr_in rem_rtcp_addr; /**< Remote RTCP address. */ 98 89 99 90 pj_rtcp_session rtcp; /**< RTCP for incoming RTP. */ … … 118 109 pjmedia_channel *channel = user_data; 119 110 pjmedia_stream *stream = channel->stream; 120 struct jb_frame *jb_frame; 121 void *p; 122 pj_uint32_t extseq; 111 char frame_type; 123 112 pj_status_t status; 124 113 struct pjmedia_frame frame_in, frame_out; … … 134 123 135 124 /* Get frame from jitter buffer. */ 136 status = pj_jb_get(&stream->jb, &extseq, &p); 125 status = pjmedia_jbuf_get_frame(stream->jb, channel->out_pkt, 126 &frame_type); 137 127 138 128 /* Unlock jitter buffer mutex. */ 139 129 pj_mutex_unlock( stream->jb_mutex ); 140 130 141 jb_frame = p; 142 if (status != PJ_SUCCESS || jb_frame == NULL) { 131 if (status != PJ_SUCCESS || frame_type == PJMEDIA_JB_ZERO_FRAME || 132 frame_type == PJMEDIA_JB_MISSING_FRAME) 133 { 143 134 pj_memset(frame, 0, size); 144 135 return 0; 145 136 } 146 137 138 147 139 /* Decode */ 148 frame_in.buf = jb_frame->buf;149 frame_in.size = jb_frame->size;140 frame_in.buf = channel->out_pkt; 141 frame_in.size = stream->frame_size; 150 142 frame_in.type = PJMEDIA_FRAME_TYPE_AUDIO; /* ignored */ 151 143 frame_out.buf = channel->pcm_buf; … … 156 148 157 149 pj_memset(frame, 0, size); 158 pj_fifobuf_free (&channel->fifobuf, jb_frame);159 150 return 0; 160 151 } … … 168 159 169 160 pj_memcpy(frame, frame_out.buf, size); 170 pj_fifobuf_free (&channel->fifobuf, jb_frame);171 161 172 162 return 0; … … 239 229 /* Send. */ 240 230 sent = frame_out.size+sizeof(pj_rtp_hdr); 241 status = pj_sock_sendto(stream-> rtp_sock, channel->out_pkt, &sent, 0,242 &stream-> dst_addr, sizeof(stream->dst_addr));231 status = pj_sock_sendto(stream->skinfo.rtp_sock, channel->out_pkt, &sent, 0, 232 &stream->rem_rtp_addr, sizeof(stream->rem_rtp_addr)); 243 233 if (status != PJ_SUCCESS) 244 234 return status; … … 261 251 pjmedia_channel *channel = stream->dec; 262 252 253 263 254 while (!stream->quit_flag) { 264 pj_ssize_t len , size;255 pj_ssize_t len; 265 256 const pj_rtp_hdr *hdr; 266 257 const void *payload; 267 258 unsigned payloadlen; 268 259 int status; 269 struct jb_frame *jb_frame;270 260 271 261 /* Wait for packet. */ … … 274 264 275 265 PJ_FD_ZERO (&fds); 276 PJ_FD_SET (stream-> rtp_sock, &fds);266 PJ_FD_SET (stream->skinfo.rtp_sock, &fds); 277 267 timeout.sec = 0; 278 268 timeout.msec = 1; 279 269 280 270 /* Wait with timeout. */ 281 status = pj_sock_select(stream->rtp_sock, &fds, NULL, NULL, &timeout); 282 if (status != 1) 271 status = pj_sock_select(FD_SETSIZE, &fds, NULL, NULL, &timeout); 272 if (status < 0) { 273 char errmsg[PJ_ERR_MSG_SIZE]; 274 pj_strerror(pj_get_netos_error(), errmsg, sizeof(errmsg)); 275 TRACE_((THIS_FILE, "Jitter buffer select() error: %s", 276 errmsg)); 277 pj_thread_sleep(500); 278 continue; 279 } else if (status == 0) 283 280 continue; 284 281 285 282 /* Get packet from socket. */ 286 283 len = channel->in_pkt_size; 287 status = pj_sock_recv(stream->rtp_sock, channel->in_pkt, &len, 0); 284 status = pj_sock_recv(stream->skinfo.rtp_sock, 285 channel->in_pkt, &len, 0); 288 286 if (len < 1 || status != PJ_SUCCESS) { 289 287 if (pj_get_netos_error() == PJ_STATUS_FROM_OS(OSERR_ECONNRESET)) { … … 326 324 stream->stat.dec.bytes += len; 327 325 328 /* Copy to FIFO buffer. */329 size = payloadlen+sizeof(struct jb_frame);330 jb_frame = pj_fifobuf_alloc (&channel->fifobuf, size);331 if (jb_frame == NULL) {332 TRACE_((THIS_FILE, "Unable to allocate %d bytes FIFO buffer",333 size));334 continue;335 }336 337 /* Copy the payload */338 jb_frame->size = payloadlen;339 jb_frame->buf = ((char*)jb_frame) + sizeof(struct jb_frame);340 pj_memcpy (jb_frame->buf, payload, payloadlen);341 342 326 /* Put to jitter buffer. */ 343 327 pj_mutex_lock( stream->jb_mutex ); 344 status = pj _jb_put(&stream->jb, pj_ntohs(hdr->seq), jb_frame);328 status = pjmedia_jbuf_put_frame(stream->jb, payload, payloadlen, pj_ntohs(hdr->seq)); 345 329 pj_mutex_unlock( stream->jb_mutex ); 346 330 347 331 if (status != 0) { 348 pj_fifobuf_unalloc (&channel->fifobuf, jb_frame);349 350 332 TRACE_((THIS_FILE, 351 333 "Jitter buffer put() has returned error status %d", … … 486 468 stream->dir = info->dir; 487 469 stream->codec_mgr = pjmedia_endpt_get_codec_mgr(endpt); 470 stream->skinfo = info->sock_info; 471 stream->rem_rtp_addr = info->rem_addr; 472 473 PJ_TODO(INITIALIZE_RTCP_REMOTE_ADDRESS); 488 474 489 475 /* Create mutex to protect jitter buffer: */ … … 516 502 517 503 504 /* Get the frame size: */ 505 506 stream->frame_size = (codec_param.avg_bps / 8) * codec_param.ptime / 1000; 507 508 518 509 /* Init RTCP session: */ 519 510 … … 521 512 522 513 523 /* Initjitter buffer: */524 525 status = pj _jb_init(&stream->jb, pool,526 info->jb_min, info->jb_max, info->jb_maxcnt);514 /* Create jitter buffer: */ 515 516 status = pjmedia_jbuf_create(pool, stream->frame_size, 15, 100, 517 &stream->jb); 527 518 if (status != PJ_SUCCESS) 528 519 goto err_cleanup; … … 533 524 status = pj_thread_create(pool, "decode", 534 525 &jitter_buffer_thread, stream, 535 0, 0, &stream->thread);526 0, PJ_THREAD_SUSPENDED, &stream->thread); 536 527 if (status != PJ_SUCCESS) 537 528 goto err_cleanup; … … 553 544 goto err_cleanup; 554 545 546 /* Resume jitter buffer thread. */ 547 status = pj_thread_resume( stream->thread ); 548 if (status != PJ_SUCCESS) 549 goto err_cleanup; 555 550 556 551 /* Success! */
Note: See TracChangeset
for help on using the changeset viewer.