Changeset 5050


Ignore:
Timestamp:
Apr 7, 2015 11:23:41 AM (5 years ago)
Author:
nanang
Message:

Close #1836: Added colorbar device with active role.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-videodev/colorbar_dev.c

    r4722 r5050  
    1818 */ 
    1919#include <pjmedia-videodev/videodev_imp.h> 
     20#include <pjmedia/clock.h> 
    2021#include <pj/assert.h> 
    2122#include <pj/log.h> 
     
    2829    PJMEDIA_VIDEO_DEV_HAS_CBAR_SRC != 0 
    2930     
    30  
    3131 
    3232#define THIS_FILE               "colorbar_dev.c" 
     
    3535#define DEFAULT_HEIGHT          288 //480 
    3636#define DEFAULT_FPS             25 
     37 
    3738 
    3839/* cbar_ device info */ 
     
    100101    pj_timestamp                     ts; 
    101102    unsigned                         ts_inc; 
     103 
     104    /* For active capturer only */ 
     105    pjmedia_clock                   *clock; 
     106    pj_uint8_t                      *clock_buf; 
    102107}; 
    103108 
     
    189194    unsigned i; 
    190195 
    191     cf->dev_count = 1; 
     196    cf->dev_count = 2; 
     197 
    192198    cf->dev_info = (struct cbar_dev_info*) 
    193199                   pj_pool_calloc(cf->pool, cf->dev_count, 
    194200                                  sizeof(struct cbar_dev_info)); 
    195201 
     202    /* Passive capturer */ 
    196203    ddi = &cf->dev_info[0]; 
    197204    pj_bzero(ddi, sizeof(*ddi)); 
     
    203210    ddi->info.dir = PJMEDIA_DIR_CAPTURE; 
    204211    ddi->info.has_callback = PJ_FALSE; 
     212 
     213    ddi->info.caps = PJMEDIA_VID_DEV_CAP_FORMAT; 
     214    ddi->info.fmt_cnt = sizeof(cbar_fmts)/sizeof(cbar_fmts[0]); 
     215    for (i = 0; i < ddi->info.fmt_cnt; i++) { 
     216        pjmedia_format *fmt = &ddi->info.fmt[i]; 
     217        pjmedia_format_init_video(fmt, cbar_fmts[i].fmt_id, 
     218                                  DEFAULT_WIDTH, DEFAULT_HEIGHT, 
     219                                  DEFAULT_FPS, 1); 
     220    } 
     221 
     222    /* Active capturer */ 
     223    ddi = &cf->dev_info[1]; 
     224    pj_bzero(ddi, sizeof(*ddi)); 
     225    pj_ansi_strncpy(ddi->info.name, "Colorbar-active", 
     226                    sizeof(ddi->info.name)); 
     227    ddi->info.driver[sizeof(ddi->info.driver)-1] = '\0'; 
     228    pj_ansi_strncpy(ddi->info.driver, "Colorbar", sizeof(ddi->info.driver)); 
     229    ddi->info.driver[sizeof(ddi->info.driver)-1] = '\0'; 
     230    ddi->info.dir = PJMEDIA_DIR_CAPTURE; 
     231    ddi->info.has_callback = PJ_TRUE; 
    205232 
    206233    ddi->info.caps = PJMEDIA_VID_DEV_CAP_FORMAT; 
     
    376403} 
    377404 
     405 
     406static void clock_cb(const pj_timestamp *ts, void *user_data) 
     407{ 
     408    struct cbar_stream *stream = (struct cbar_stream*)user_data; 
     409    pjmedia_frame f; 
     410    pj_status_t status; 
     411 
     412    PJ_UNUSED_ARG(ts); 
     413 
     414    pj_bzero(&f, sizeof(f)); 
     415    f.buf = stream->clock_buf; 
     416    f.size = stream->vafp.framebytes; 
     417    status = cbar_stream_get_frame(&stream->base, &f); 
     418    if (status == PJ_SUCCESS) { 
     419        (*stream->vid_cb.capture_cb)(&stream->base, stream->user_data, &f); 
     420    } 
     421} 
     422 
     423 
    378424/* API: create stream */ 
    379425static pj_status_t cbar_factory_create_stream( 
     
    439485    } 
    440486*/ 
     487 
     488    /* Active role? */ 
     489    if (param->cap_id == 1 && cb && cb->capture_cb) { 
     490        pjmedia_clock_param clock_param; 
     491        pj_status_t status; 
     492 
     493        /* Allocate buffer */ 
     494        strm->clock_buf = pj_pool_alloc(pool, strm->vafp.framebytes); 
     495 
     496        /* Create clock */ 
     497        pj_bzero(&clock_param, sizeof(clock_param)); 
     498        clock_param.usec_interval = PJMEDIA_PTIME(&vfd->fps); 
     499        clock_param.clock_rate = param->clock_rate; 
     500        status = pjmedia_clock_create2(pool, &clock_param, 
     501                                       PJMEDIA_CLOCK_NO_HIGHEST_PRIO, 
     502                                       &clock_cb, 
     503                                       strm, &strm->clock); 
     504        if (status != PJ_SUCCESS) { 
     505            pj_pool_release(pool); 
     506            return status; 
     507        } 
     508    } 
     509 
    441510    /* Done */ 
    442511    strm->base.op = &stream_op; 
     
    597666    struct cbar_stream *stream = (struct cbar_stream*)strm; 
    598667 
    599     PJ_UNUSED_ARG(stream); 
    600  
    601668    PJ_LOG(4, (THIS_FILE, "Starting cbar video stream")); 
     669 
     670    if (stream->clock) 
     671        return pjmedia_clock_start(stream->clock); 
    602672 
    603673    return PJ_SUCCESS; 
     
    609679    struct cbar_stream *stream = (struct cbar_stream*)strm; 
    610680 
    611     PJ_UNUSED_ARG(stream); 
    612  
    613681    PJ_LOG(4, (THIS_FILE, "Stopping cbar video stream")); 
     682 
     683    if (stream->clock) 
     684        return pjmedia_clock_stop(stream->clock); 
    614685 
    615686    return PJ_SUCCESS; 
     
    626697    cbar_stream_stop(strm); 
    627698 
     699    if (stream->clock) 
     700        pjmedia_clock_destroy(stream->clock); 
     701    stream->clock = NULL; 
     702 
    628703    pj_pool_release(stream->pool); 
    629704 
Note: See TracChangeset for help on using the changeset viewer.