Changeset 3616


Ignore:
Timestamp:
Jul 12, 2011 1:45:21 AM (8 years ago)
Author:
ming
Message:

Re #1261: Video tee

Location:
pjproject/branches/projects/2.0-dev/pjmedia
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/build/Makefile

    r3606 r3616  
    6868                        transport_ice.o transport_loop.o transport_srtp.o transport_udp.o \ 
    6969                        types.o vid_codec.o vid_codec_util.o \ 
    70                         videoport.o vid_stream.o \ 
     70                        vid_port.o vid_stream.o vid_tee.o \ 
    7171                        wav_player.o wav_playlist.o wav_writer.o wave.o \ 
    7272                        wsola.o 
  • pjproject/branches/projects/2.0-dev/pjmedia/include/pjmedia/vid_tee.h

    r3614 r3616  
    4646 * The video tee is not thread-safe, so it is application responsibility 
    4747 * to synchronize video tee operations, e.g: make sure the source port is 
    48  * paused during adding or removing a destination channel. 
     48 * paused during adding or removing a destination port. 
    4949 */ 
    5050 
     
    6060     * Tell the video tee that the destination port will do in-place 
    6161     * processing, so the delivered data may be modified by this port. 
     62     * If this flag is used, buffer will be copied before being given to 
     63     * the destination port. 
    6264     */ 
    6365    PJMEDIA_VID_TEE_DST_DO_IN_PLACE_PROC    = 4, 
     
    6769 
    6870/** 
    69  * Create a video tee port with the specified source media port. 
     71 * Create a video tee port with the specified source media port. Application 
     72 * should destroy the tee with pjmedia_port_destroy() as usual. Note that 
     73 * destroying the tee does not destroy its destination ports. 
    7074 * 
    7175 * @param pool              The pool. 
    72  * @param src               The source media port. 
    73  * @param max_ch_cnt        The maximum channel count. 
     76 * @param fmt               The source media port's format. 
     77 * @param max_dst_cnt       The maximum number of destination ports supported. 
    7478 * @param p_vid_tee         Pointer to receive the video tee port. 
    7579 * 
     
    7882 */ 
    7983PJ_DECL(pj_status_t) pjmedia_vid_tee_create(pj_pool_t *pool, 
    80                                             pjmedia_format *fmt, 
    81                                             unsigned max_ch_cnt, 
     84                                            const pjmedia_format *fmt, 
     85                                            unsigned max_dst_cnt, 
    8286                                            pjmedia_port **p_vid_tee); 
    8387 
     
    8690 * 
    8791 * @param vid_tee           The video tee. 
    88  * @param ch_option         Channel option, see @pjmedia_vid_tee_flag. 
     92 * @param option            Video tee option, see @pjmedia_vid_tee_flag. 
    8993 * @param port              The destination media port. 
    9094 * 
     
    9296 *                          code. 
    9397 */ 
    94 PJ_DECL(pj_status_t) pjmedia_vid_tee_add_channel(pjmedia_port *vid_tee, 
    95                                                  unsigned option, 
    96                                                  pjmedia_port *port); 
     98PJ_DECL(pj_status_t) pjmedia_vid_tee_add_dst_port(pjmedia_port *vid_tee, 
     99                                                  unsigned option, 
     100                                                  pjmedia_port *port); 
    97101 
    98102 
     
    106110 *                          code. 
    107111 */ 
    108 PJ_DECL(pj_status_t) pjmedia_vid_tee_remove_channel(pjmedia_port *vid_tee, 
    109                                                     pjmedia_port *port); 
     112PJ_DECL(pj_status_t) pjmedia_vid_tee_remove_dst_port(pjmedia_port *vid_tee, 
     113                                                     pjmedia_port *port); 
    110114 
    111115 
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia/vid_tee.c

    r3614 r3616  
    2626 
    2727 
    28 typedef struct vid_tee_channel 
     28typedef struct vid_tee_dst_port 
    2929{ 
    3030    pjmedia_port        *dst; 
    3131    unsigned             option; 
    32 } vid_tee_channel; 
     32} vid_tee_dst_port; 
    3333 
    3434 
     
    3838    void                *buf; 
    3939    pj_size_t            buf_size; 
    40     unsigned             channel_maxcnt; 
    41     unsigned             channel_cnt; 
    42     vid_tee_channel     *channels; 
     40    unsigned             dst_port_maxcnt; 
     41    unsigned             dst_port_cnt; 
     42    vid_tee_dst_port    *dst_ports; 
    4343} vid_tee_port; 
    4444 
     
    5252 */ 
    5353PJ_DEF(pj_status_t) pjmedia_vid_tee_create( pj_pool_t *pool, 
    54                                             pjmedia_format *fmt, 
    55                                             unsigned max_ch_cnt, 
     54                                            const pjmedia_format *fmt, 
     55                                            unsigned max_dst_cnt, 
    5656                                            pjmedia_port **p_vid_tee) 
    5757{ 
     
    6969 
    7070    /* Initialize video tee structure */ 
    71     tee->channel_maxcnt = max_ch_cnt; 
    72     tee->channels = (vid_tee_channel*)pj_pool_calloc(pool, max_ch_cnt, 
    73                                                      sizeof(vid_tee_channel)); 
     71    tee->dst_port_maxcnt = max_dst_cnt; 
     72    tee->dst_ports = (vid_tee_dst_port*) 
     73                     pj_pool_calloc(pool, max_dst_cnt, 
     74                                    sizeof(vid_tee_dst_port)); 
    7475 
    7576    /* Initialize video tee buffer, its size is one frame */ 
     
    110111 * Add a destination media port to the video tee. 
    111112 */ 
    112 PJ_DEF(pj_status_t) pjmedia_vid_tee_add_channel( pjmedia_port *vid_tee, 
     113PJ_DEF(pj_status_t) pjmedia_vid_tee_add_dst_port(pjmedia_port *vid_tee, 
    113114                                                 unsigned option, 
    114115                                                 pjmedia_port *port) 
     
    120121                     PJ_EINVAL); 
    121122 
    122     if (tee->channel_cnt >= tee->channel_maxcnt) 
     123    if (tee->dst_port_cnt >= tee->dst_port_maxcnt) 
    123124        return PJ_ETOOMANY; 
    124125 
     
    133134    } 
    134135 
    135     tee->channels[tee->channel_cnt].dst = port; 
    136     tee->channels[tee->channel_cnt].option = option; 
    137     ++tee->channel_cnt; 
     136    tee->dst_ports[tee->dst_port_cnt].dst = port; 
     137    tee->dst_ports[tee->dst_port_cnt].option = option; 
     138    ++tee->dst_port_cnt; 
    138139 
    139140    return PJ_SUCCESS; 
     
    144145 * Remove a destination media port from the video tee. 
    145146 */ 
    146 PJ_DECL(pj_status_t) pjmedia_vid_tee_remove_channel(pjmedia_port *vid_tee, 
    147                                                     pjmedia_port *port) 
     147PJ_DECL(pj_status_t) pjmedia_vid_tee_remove_dst_port(pjmedia_port *vid_tee, 
     148                                                     pjmedia_port *port) 
    148149{ 
    149150    vid_tee_port *tee = (vid_tee_port*)vid_tee; 
     
    153154                     PJ_EINVAL); 
    154155 
    155     for (i = 0; i < tee->channel_cnt; ++i) { 
    156         if (tee->channels[i].dst == port) { 
    157             pj_array_erase(tee->channels, sizeof(tee->channels[0]), 
    158                            tee->channel_cnt, i); 
    159             --tee->channel_cnt; 
     156    for (i = 0; i < tee->dst_port_cnt; ++i) { 
     157        if (tee->dst_ports[i].dst == port) { 
     158            pj_array_erase(tee->dst_ports, sizeof(tee->dst_ports[0]), 
     159                           tee->dst_port_cnt, i); 
     160            --tee->dst_port_cnt; 
    160161            return PJ_SUCCESS; 
    161162        } 
     
    171172    unsigned i; 
    172173 
    173     for (i = 0; i < tee->channel_cnt; ++i) { 
     174    for (i = 0; i < tee->dst_port_cnt; ++i) { 
    174175        pjmedia_frame frame_ = *frame; 
    175176 
    176         /* For channels that do in-place processing, we need to duplicate 
     177        /* For dst_ports that do in-place processing, we need to duplicate 
    177178         * the data source first. 
    178179         */ 
    179         if (tee->channels[i].option & PJMEDIA_VID_TEE_DST_DO_IN_PLACE_PROC) { 
     180        if (tee->dst_ports[i].option & PJMEDIA_VID_TEE_DST_DO_IN_PLACE_PROC) { 
    180181            PJ_ASSERT_RETURN(tee->buf_size <= frame->size, PJ_ETOOBIG); 
    181182            frame_.buf = tee->buf; 
     
    185186 
    186187        /* Deliver the data */ 
    187         pjmedia_port_put_frame(tee->channels[i].dst, &frame_); 
     188        pjmedia_port_put_frame(tee->dst_ports[i].dst, &frame_); 
    188189    } 
    189190 
Note: See TracChangeset for help on using the changeset viewer.