Ignore:
Timestamp:
Feb 24, 2011 7:47:55 AM (10 years ago)
Author:
nanang
Message:

Re #1182:

  • Added video stream interface in vid_stream.h, the video stream will be able to handle different video formats in encoding and decoding direction.
  • Renamed video device stream class identifiers from 'pjmedia_vid_stream*' to 'pjmedia_vid_dev_stream*' as 'pjmedia_vid_stream' is used by video stream interface.
  • Added ffmpeg video capability to be able to parse SDP format param for H263 and also decide video format for encoding direction based on remote preference and local format-capability setting.
  • Added some new APIs in jitter buffer for handling video stream: pjmedia_jbuf_put_frame3(), pjmedia_jbuf_get_frame3(), pjmedia_jbuf_peek_frame(), and pjmedia_jbuf_remove_frame().
  • Moved pjmedia_stream_info_from_sdp() from session to stream
File:
1 edited

Legend:

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

    r3392 r3420  
    6868typedef struct ffmpeg_stream 
    6969{ 
    70     pjmedia_vid_stream           base; 
     70    pjmedia_vid_dev_stream       base; 
    7171    ffmpeg_factory              *factory; 
    7272    pj_pool_t                   *pool; 
     
    8181static unsigned    ffmpeg_factory_get_dev_count(pjmedia_vid_dev_factory *f); 
    8282static pj_status_t ffmpeg_factory_get_dev_info(pjmedia_vid_dev_factory *f, 
    83                                               unsigned index, 
    84                                               pjmedia_vid_dev_info *info); 
     83                                               unsigned index, 
     84                                               pjmedia_vid_dev_info *info); 
    8585static pj_status_t ffmpeg_factory_default_param(pj_pool_t *pool, 
    8686                                                pjmedia_vid_dev_factory *f, 
    8787                                                unsigned index, 
    8888                                                pjmedia_vid_param *param); 
    89 static pj_status_t ffmpeg_factory_create_stream(pjmedia_vid_dev_factory *f, 
    90                                                const pjmedia_vid_param *param, 
    91                                                const pjmedia_vid_cb *cb, 
    92                                                void *user_data, 
    93                                                pjmedia_vid_stream **p_vid_strm); 
    94  
    95 static pj_status_t ffmpeg_stream_get_param(pjmedia_vid_stream *strm, 
    96                                           pjmedia_vid_param *param); 
    97 static pj_status_t ffmpeg_stream_get_cap(pjmedia_vid_stream *strm, 
    98                                         pjmedia_vid_dev_cap cap, 
    99                                         void *value); 
    100 static pj_status_t ffmpeg_stream_set_cap(pjmedia_vid_stream *strm, 
    101                                         pjmedia_vid_dev_cap cap, 
    102                                         const void *value); 
    103 static pj_status_t ffmpeg_stream_start(pjmedia_vid_stream *strm); 
    104 static pj_status_t ffmpeg_stream_get_frame(pjmedia_vid_stream *s, 
     89static pj_status_t ffmpeg_factory_create_stream( 
     90                                        pjmedia_vid_dev_factory *f, 
     91                                        const pjmedia_vid_param *param, 
     92                                        const pjmedia_vid_cb *cb, 
     93                                        void *user_data, 
     94                                        pjmedia_vid_dev_stream **p_vid_strm); 
     95 
     96static pj_status_t ffmpeg_stream_get_param(pjmedia_vid_dev_stream *strm, 
     97                                           pjmedia_vid_param *param); 
     98static pj_status_t ffmpeg_stream_get_cap(pjmedia_vid_dev_stream *strm, 
     99                                         pjmedia_vid_dev_cap cap, 
     100                                         void *value); 
     101static pj_status_t ffmpeg_stream_set_cap(pjmedia_vid_dev_stream *strm, 
     102                                         pjmedia_vid_dev_cap cap, 
     103                                         const void *value); 
     104static pj_status_t ffmpeg_stream_start(pjmedia_vid_dev_stream *strm); 
     105static pj_status_t ffmpeg_stream_get_frame(pjmedia_vid_dev_stream *s, 
    105106                                           pjmedia_frame *frame); 
    106 static pj_status_t ffmpeg_stream_stop(pjmedia_vid_stream *strm); 
    107 static pj_status_t ffmpeg_stream_destroy(pjmedia_vid_stream *strm); 
     107static pj_status_t ffmpeg_stream_stop(pjmedia_vid_dev_stream *strm); 
     108static pj_status_t ffmpeg_stream_destroy(pjmedia_vid_dev_stream *strm); 
    108109 
    109110/* Operations */ 
     
    118119}; 
    119120 
    120 static pjmedia_vid_stream_op stream_op = 
     121static pjmedia_vid_dev_stream_op stream_op = 
    121122{ 
    122123    &ffmpeg_stream_get_param, 
     
    153154{ 
    154155    AVFormatParameters fp; 
    155     pjmedia_video_format_detail *fmt_detail; 
     156    pjmedia_video_format_detail *vfd; 
    156157    int err; 
    157158 
     
    160161                     PJ_EINVAL); 
    161162 
    162     fmt_detail = (pjmedia_video_format_detail*)param->fmt.detail; 
     163    vfd = pjmedia_format_get_video_format_detail(&param->fmt, PJ_TRUE); 
    163164 
    164165    /* Init ffmpeg format context */ 
     
    168169    pj_bzero(&fp, sizeof(fp)); 
    169170    fp.prealloced_context = 1; 
    170     fp.width = fmt_detail->size.w; 
    171     fp.height = fmt_detail->size.h; 
     171    fp.width = vfd->size.w; 
     172    fp.height = vfd->size.h; 
    172173    fp.pix_fmt = PIX_FMT_BGR24; 
    173     fp.time_base.num = param->frame_rate.denum; 
    174     fp.time_base.den = param->frame_rate.num; 
     174    fp.time_base.num = vfd->fps.denum; 
     175    fp.time_base.den = vfd->fps.num; 
    175176 
    176177    /* Open capture stream */ 
     
    289290/* API: get device info */ 
    290291static pj_status_t ffmpeg_factory_get_dev_info(pjmedia_vid_dev_factory *f, 
    291                                               unsigned index, 
    292                                               pjmedia_vid_dev_info *info) 
     292                                               unsigned index, 
     293                                               pjmedia_vid_dev_info *info) 
    293294{ 
    294295    ffmpeg_factory *ff = (ffmpeg_factory*)f; 
     
    309310    ffmpeg_factory *ff = (ffmpeg_factory*)f; 
    310311    ffmpeg_dev_info *info; 
    311     pjmedia_video_format_detail *fmt_detail; 
    312312 
    313313    PJ_ASSERT_RETURN(index < ff->dev_count, PJMEDIA_EVID_INVDEV); 
     314 
     315    PJ_UNUSED_ARG(pool); 
     316 
    314317    info = &ff->dev_info[index]; 
    315318 
     
    322325    /* Set the device capabilities here */ 
    323326    param->flags = PJMEDIA_VID_DEV_CAP_FORMAT; 
    324     pj_memcpy(&param->fmt, &info->base.fmt[0], sizeof(param->fmt)); 
    325327    param->clock_rate = 90000; 
    326     pjmedia_format_init_video(pool, &param->fmt, 320, 240, 25, 1, 
    327                               0, 0); 
    328     fmt_detail = (pjmedia_video_format_detail*)param->fmt.detail; 
    329     param->frame_rate.num = fmt_detail->fps.num; 
    330     param->frame_rate.denum = fmt_detail->fps.denum; 
     328    pjmedia_format_init_video(&param->fmt, 0, 320, 240, 25, 1); 
     329    param->fmt.id = info->base.fmt[0].id; 
    331330 
    332331    return PJ_SUCCESS; 
     
    336335 
    337336/* API: create stream */ 
    338 static pj_status_t ffmpeg_factory_create_stream(pjmedia_vid_dev_factory *f, 
    339                                                const pjmedia_vid_param *param, 
    340                                                const pjmedia_vid_cb *cb, 
    341                                                void *user_data, 
    342                                                pjmedia_vid_stream **p_vid_strm) 
     337static pj_status_t ffmpeg_factory_create_stream( 
     338                                        pjmedia_vid_dev_factory *f, 
     339                                        const pjmedia_vid_param *param, 
     340                                        const pjmedia_vid_cb *cb, 
     341                                        void *user_data, 
     342                                        pjmedia_vid_dev_stream **p_vid_strm) 
    343343{ 
    344344    ffmpeg_factory *ff = (ffmpeg_factory*)f; 
     
    349349    PJ_ASSERT_RETURN(param->dir == PJMEDIA_DIR_CAPTURE, PJ_EINVAL); 
    350350    PJ_ASSERT_RETURN((unsigned)param->cap_id < ff->dev_count, PJ_EINVAL); 
    351     PJ_ASSERT_RETURN(param->fmt.detail_type == PJMEDIA_FORMAT_DETAIL_VIDEO && 
    352                      param->fmt.detail, PJ_EINVAL); 
     351    PJ_ASSERT_RETURN(param->fmt.detail_type == PJMEDIA_FORMAT_DETAIL_VIDEO, 
     352                    PJ_EINVAL); 
    353353 
    354354    PJ_UNUSED_ARG(cb); 
     
    372372 
    373373/* API: Get stream info. */ 
    374 static pj_status_t ffmpeg_stream_get_param(pjmedia_vid_stream *s, 
     374static pj_status_t ffmpeg_stream_get_param(pjmedia_vid_dev_stream *s, 
    375375                                           pjmedia_vid_param *pi) 
    376376{ 
     
    385385 
    386386/* API: get capability */ 
    387 static pj_status_t ffmpeg_stream_get_cap(pjmedia_vid_stream *s, 
    388                                         pjmedia_vid_dev_cap cap, 
    389                                         void *pval) 
     387static pj_status_t ffmpeg_stream_get_cap(pjmedia_vid_dev_stream *s, 
     388                                         pjmedia_vid_dev_cap cap, 
     389                                         void *pval) 
    390390{ 
    391391    ffmpeg_stream *strm = (ffmpeg_stream*)s; 
     
    399399 
    400400/* API: set capability */ 
    401 static pj_status_t ffmpeg_stream_set_cap(pjmedia_vid_stream *s, 
    402                                         pjmedia_vid_dev_cap cap, 
    403                                         const void *pval) 
     401static pj_status_t ffmpeg_stream_set_cap(pjmedia_vid_dev_stream *s, 
     402                                         pjmedia_vid_dev_cap cap, 
     403                                         const void *pval) 
    404404{ 
    405405    ffmpeg_stream *strm = (ffmpeg_stream*)s; 
     
    414414 
    415415/* API: Start stream. */ 
    416 static pj_status_t ffmpeg_stream_start(pjmedia_vid_stream *s) 
     416static pj_status_t ffmpeg_stream_start(pjmedia_vid_dev_stream *s) 
    417417{ 
    418418    ffmpeg_stream *strm = (ffmpeg_stream*)s; 
     
    436436 
    437437/* API: Get frame from stream */ 
    438 static pj_status_t ffmpeg_stream_get_frame(pjmedia_vid_stream *s, 
     438static pj_status_t ffmpeg_stream_get_frame(pjmedia_vid_dev_stream *s, 
    439439                                           pjmedia_frame *frame) 
    440440{ 
     
    459459 
    460460/* API: Stop stream. */ 
    461 static pj_status_t ffmpeg_stream_stop(pjmedia_vid_stream *s) 
     461static pj_status_t ffmpeg_stream_stop(pjmedia_vid_dev_stream *s) 
    462462{ 
    463463    ffmpeg_stream *strm = (ffmpeg_stream*)s; 
     
    473473 
    474474/* API: Destroy stream. */ 
    475 static pj_status_t ffmpeg_stream_destroy(pjmedia_vid_stream *s) 
     475static pj_status_t ffmpeg_stream_destroy(pjmedia_vid_dev_stream *s) 
    476476{ 
    477477    ffmpeg_stream *strm = (ffmpeg_stream*)s; 
Note: See TracChangeset for help on using the changeset viewer.