- Timestamp:
- Mar 1, 2011 3:55:34 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/videoport.c
r3420 r3431 19 19 #include <pjmedia/videoport.h> 20 20 #include <pjmedia/clock.h> 21 #include <pjmedia/vid_codec.h> 21 22 #include <pj/log.h> 22 23 #include <pj/pool.h> … … 64 65 pjmedia_frame *enc_frm_buf, 65 66 *dec_frm_buf; 67 pj_size_t enc_frm_buf_size, 68 dec_frm_buf_size; 66 69 67 70 pj_mutex_t *enc_frm_mutex, … … 183 186 184 187 if (vp->dir & PJMEDIA_DIR_ENCODING) { 185 status = pjmedia_clock_create2(pool, 186 PJMEDIA_PTIME(&vfd->fps), 187 prm->vidparam.clock_rate, 188 pjmedia_clock_param param; 189 190 param.usec_interval = PJMEDIA_PTIME(&vfd->fps); 191 param.clock_rate = prm->vidparam.clock_rate; 192 status = pjmedia_clock_create2(pool, ¶m, 188 193 PJMEDIA_CLOCK_NO_HIGHEST_PRIO, 189 194 &enc_clock_cb, vp, &vp->enc_clock); … … 193 198 194 199 if (vp->dir & PJMEDIA_DIR_DECODING) { 195 status = pjmedia_clock_create2(pool, 196 PJMEDIA_PTIME(&vfd->fps), 197 prm->vidparam.clock_rate, 200 pjmedia_clock_param param; 201 202 param.usec_interval = PJMEDIA_PTIME(&vfd->fps); 203 param.clock_rate = prm->vidparam.clock_rate; 204 status = pjmedia_clock_create2(pool, ¶m, 198 205 PJMEDIA_CLOCK_NO_HIGHEST_PRIO, 199 206 &dec_clock_cb, vp, &vp->dec_clock); … … 237 244 if (vp->dir & PJMEDIA_DIR_ENCODING) { 238 245 vp->enc_frm_buf = PJ_POOL_ZALLOC_T(pool, pjmedia_frame); 246 vp->enc_frm_buf_size = vafp.framebytes; 239 247 vp->enc_frm_buf->buf = pj_pool_alloc(pool, vafp.framebytes); 240 248 vp->enc_frm_buf->size = vafp.framebytes; … … 249 257 if (vp->dir & PJMEDIA_DIR_DECODING) { 250 258 vp->dec_frm_buf = PJ_POOL_ZALLOC_T(pool, pjmedia_frame); 259 vp->dec_frm_buf_size = vafp.framebytes; 251 260 vp->dec_frm_buf->buf = pj_pool_alloc(pool, vafp.framebytes); 252 261 vp->dec_frm_buf->size = vafp.framebytes; … … 463 472 */ 464 473 474 static pj_status_t detect_fmt_change(pjmedia_vid_port *vp, 475 pjmedia_frame *frame) 476 { 477 if (frame->bit_info & PJMEDIA_VID_CODEC_EVENT_FMT_CHANGED) { 478 const pjmedia_video_format_detail *vfd; 479 pjmedia_vid_event pevent; 480 pj_status_t status; 481 482 /* Retrieve the video format detail */ 483 vfd = pjmedia_format_get_video_format_detail( 484 &vp->client_port->info.fmt, PJ_TRUE); 485 if (!vfd) 486 return PJMEDIA_EVID_BADFORMAT; 487 pj_assert(vfd->fps.num); 488 489 status = pjmedia_vid_dev_stream_set_cap( 490 vp->strm, 491 PJMEDIA_VID_DEV_CAP_FORMAT, 492 &vp->client_port->info.fmt); 493 if (status != PJ_SUCCESS) { 494 PJ_LOG(3, (THIS_FILE, "failure in changing the format of the " 495 "video device")); 496 PJ_LOG(3, (THIS_FILE, "reverting to its original format: %s", 497 status != PJMEDIA_EVID_ERR ? "success" : 498 "failure")); 499 pjmedia_vid_port_stop(vp); 500 return status; 501 } 502 503 if (vp->stream_role == ROLE_PASSIVE) { 504 pjmedia_vid_param vid_param; 505 pjmedia_clock_param clock_param; 506 507 /** 508 * Initially, dec_frm_buf was allocated the biggest 509 * supported size, so we do not need to re-allocate 510 * the buffer here. 511 */ 512 /* Adjust the clock */ 513 pjmedia_vid_dev_stream_get_param(vp->strm, &vid_param); 514 clock_param.usec_interval = PJMEDIA_PTIME(&vfd->fps); 515 clock_param.clock_rate = vid_param.clock_rate; 516 pjmedia_clock_modify(vp->dec_clock, &clock_param); 517 } 518 519 /* Notify application of the format change. */ 520 pevent.event_type = PJMEDIA_EVENT_FMT_CHANGED; 521 pj_memcpy(&pevent.event_desc.fmt_change.new_format, 522 &vp->client_port->info.fmt, sizeof(pjmedia_format)); 523 if (vp->strm_cb.on_event_cb) 524 (*vp->strm_cb.on_event_cb)(vp->strm, vp->strm_cb_data, &pevent); 525 } 526 527 return PJ_SUCCESS; 528 } 529 465 530 static void enc_clock_cb(const pj_timestamp *ts, void *user_data) 466 531 { … … 478 543 return; 479 544 545 vp->enc_frm_buf->size = vp->enc_frm_buf_size; 480 546 status = pjmedia_vid_dev_stream_get_frame(vp->strm, vp->enc_frm_buf); 481 547 if (status != PJ_SUCCESS) … … 583 649 584 650 for (i = 0; i < ndrop; i++) { 651 vp->dec_frm_buf->size = vp->dec_frm_buf_size; 585 652 status = pjmedia_port_get_frame(vp->client_port, 586 653 vp->dec_frm_buf); … … 589 656 return; 590 657 } 658 659 status = detect_fmt_change(vp, vp->dec_frm_buf); 660 if (status != PJ_SUCCESS) 661 return; 662 591 663 pj_add_timestamp32(&vp->rend_clocksrc.timestamp, 592 664 frame_ts); … … 596 668 } 597 669 670 vp->dec_frm_buf->size = vp->dec_frm_buf_size; 598 671 status = pjmedia_port_get_frame(vp->client_port, vp->dec_frm_buf); 599 672 if (status != PJ_SUCCESS) { … … 604 677 pjmedia_clock_src_update(&vp->rend_clocksrc, NULL); 605 678 679 status = detect_fmt_change(vp, vp->dec_frm_buf); 680 if (status != PJ_SUCCESS) 681 return; 682 606 683 status = pjmedia_vid_dev_stream_put_frame(vp->strm, vp->dec_frm_buf); 607 684 } … … 623 700 624 701 if (vp->role==ROLE_ACTIVE) { 625 702 if (vp->client_port) 626 703 return pjmedia_port_put_frame(vp->client_port, frame); 627 704 } else { … … 642 719 643 720 if (vp->role==ROLE_ACTIVE) { 644 if (vp->client_port) 645 return pjmedia_port_get_frame(vp->client_port, frame); 721 if (vp->client_port) { 722 pj_status_t status; 723 724 status = pjmedia_port_get_frame(vp->client_port, frame); 725 if (status != PJ_SUCCESS) 726 return status; 727 728 return detect_fmt_change(vp, frame); 729 } 646 730 } else { 647 731 pj_mutex_lock(vp->dec_frm_mutex);
Note: See TracChangeset
for help on using the changeset viewer.