Ignore:
Timestamp:
Mar 1, 2011 3:55:34 PM (13 years ago)
Author:
ming
Message:

Re #1182:

  • support for format modification after creating video port (currently for renderer with active role only).
  • support for format modification after opening SDL renderer.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/videoport.c

    r3420 r3431  
    1919#include <pjmedia/videoport.h> 
    2020#include <pjmedia/clock.h> 
     21#include <pjmedia/vid_codec.h> 
    2122#include <pj/log.h> 
    2223#include <pj/pool.h> 
     
    6465    pjmedia_frame       *enc_frm_buf, 
    6566                        *dec_frm_buf; 
     67    pj_size_t            enc_frm_buf_size, 
     68                         dec_frm_buf_size; 
    6669 
    6770    pj_mutex_t          *enc_frm_mutex, 
     
    183186 
    184187        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, &param, 
    188193                                           PJMEDIA_CLOCK_NO_HIGHEST_PRIO, 
    189194                                           &enc_clock_cb, vp, &vp->enc_clock); 
     
    193198 
    194199        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, &param, 
    198205                                           PJMEDIA_CLOCK_NO_HIGHEST_PRIO, 
    199206                                           &dec_clock_cb, vp, &vp->dec_clock); 
     
    237244        if (vp->dir & PJMEDIA_DIR_ENCODING) { 
    238245            vp->enc_frm_buf = PJ_POOL_ZALLOC_T(pool, pjmedia_frame); 
     246            vp->enc_frm_buf_size = vafp.framebytes; 
    239247            vp->enc_frm_buf->buf = pj_pool_alloc(pool, vafp.framebytes); 
    240248            vp->enc_frm_buf->size = vafp.framebytes; 
     
    249257        if (vp->dir & PJMEDIA_DIR_DECODING) { 
    250258            vp->dec_frm_buf = PJ_POOL_ZALLOC_T(pool, pjmedia_frame); 
     259            vp->dec_frm_buf_size = vafp.framebytes; 
    251260            vp->dec_frm_buf->buf = pj_pool_alloc(pool, vafp.framebytes); 
    252261            vp->dec_frm_buf->size = vafp.framebytes; 
     
    463472*/ 
    464473 
     474static 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 
    465530static void enc_clock_cb(const pj_timestamp *ts, void *user_data) 
    466531{ 
     
    478543        return; 
    479544 
     545    vp->enc_frm_buf->size = vp->enc_frm_buf_size; 
    480546    status = pjmedia_vid_dev_stream_get_frame(vp->strm, vp->enc_frm_buf); 
    481547    if (status != PJ_SUCCESS) 
     
    583649 
    584650                for (i = 0; i < ndrop; i++) { 
     651                    vp->dec_frm_buf->size = vp->dec_frm_buf_size; 
    585652                    status = pjmedia_port_get_frame(vp->client_port, 
    586653                                                    vp->dec_frm_buf); 
     
    589656                        return; 
    590657                    } 
     658 
     659                    status = detect_fmt_change(vp, vp->dec_frm_buf); 
     660                    if (status != PJ_SUCCESS) 
     661                        return; 
     662 
    591663                    pj_add_timestamp32(&vp->rend_clocksrc.timestamp, 
    592664                                       frame_ts); 
     
    596668    } 
    597669 
     670    vp->dec_frm_buf->size = vp->dec_frm_buf_size; 
    598671    status = pjmedia_port_get_frame(vp->client_port, vp->dec_frm_buf); 
    599672    if (status != PJ_SUCCESS) { 
     
    604677    pjmedia_clock_src_update(&vp->rend_clocksrc, NULL); 
    605678 
     679    status = detect_fmt_change(vp, vp->dec_frm_buf); 
     680    if (status != PJ_SUCCESS) 
     681        return; 
     682 
    606683    status = pjmedia_vid_dev_stream_put_frame(vp->strm, vp->dec_frm_buf); 
    607684} 
     
    623700 
    624701    if (vp->role==ROLE_ACTIVE) { 
    625         if (vp->client_port) 
     702        if (vp->client_port) 
    626703            return pjmedia_port_put_frame(vp->client_port, frame); 
    627704    } else { 
     
    642719 
    643720    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        } 
    646730    } else { 
    647731        pj_mutex_lock(vp->dec_frm_mutex); 
Note: See TracChangeset for help on using the changeset viewer.