Changeset 4666


Ignore:
Timestamp:
Dec 2, 2013 4:40:29 AM (10 years ago)
Author:
ming
Message:

Re #1519: Add call media

Location:
pjproject/branches/projects/pjsua2/pjsip
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/pjsua2/pjsip/include/pjsua2/call.hpp

    r4663 r4666  
    10891089     */ 
    10901090    bool hasMedia() const; 
     1091     
     1092    /** 
     1093     * Get media for the specified media index. 
     1094     * 
     1095     * @psaram med_idx      Media index. 
     1096     * 
     1097     * @return              The media or NULL if invalid or inactive. 
     1098     */ 
     1099    Media *getMedia(unsigned med_idx) const; 
    10911100 
    10921101    /** 
     
    14201429    MediaTransportInfo getMedTransportInfo(unsigned med_idx) const throw(Error); 
    14211430 
     1431    /** 
     1432     * Internal function (callled by Endpoint( to process update to call 
     1433     * medias when call media state changes. 
     1434     */ 
     1435    void processMediaUpdate(OnCallMediaStateParam &prm); 
     1436 
     1437    /** 
     1438     * Internal function (called by Endpoint) to process call state change. 
     1439     */ 
     1440    void processStateChange(OnCallStateParam &prm); 
     1441     
    14221442public: 
    14231443    /* 
     
    16651685    {} 
    16661686 
    1667 protected: 
    1668     friend class Endpoint; 
    1669      
    16701687private: 
    16711688    Account             &acc; 
    16721689    pjsua_call_id        id; 
    16731690    Token                userData; 
     1691    std::vector<Media *> medias; 
    16741692}; 
    16751693 
  • pjproject/branches/projects/pjsua2/pjsip/include/pjsua2/media.hpp

    r4663 r4666  
    142142    virtual ~Media(); 
    143143 
     144    /** 
     145     * Get type of the media. 
     146     * 
     147     * @return          The media type. 
     148     */ 
     149    pjmedia_type getType() const; 
     150 
    144151protected: 
    145152    /** 
    146153     * Constructor. 
    147154     */ 
    148     Media(); 
     155    Media(pjmedia_type med_type); 
     156 
     157private: 
     158    /** 
     159     * Media type. 
     160     */ 
     161    pjmedia_type        type; 
    149162}; 
    150163 
  • pjproject/branches/projects/pjsua2/pjsip/src/pjsua2/call.cpp

    r4663 r4666  
    1919#include <pjsua2/account.hpp> 
    2020#include <pjsua2/call.hpp> 
     21#include <pjsua2/endpoint.hpp> 
    2122#include <pj/ctype.h> 
    2223#include "util.hpp" 
     
    139140 
    140141////////////////////////////////////////////////////////////////////////////// 
     142 
     143/* Call Audio Media. */ 
     144class CallAudioMedia : public AudioMedia 
     145{ 
     146public: 
     147    /* 
     148     * Set the conference port identification associated with the 
     149     * call audio media. 
     150     */ 
     151    void setPortId(int id); 
     152}; 
     153 
     154 
     155void CallAudioMedia::setPortId(int id) 
     156{ 
     157    this->id = id; 
     158} 
    141159 
    142160CallOpParam::CallOpParam(bool useDefaultCallSetting) 
     
    409427} 
    410428 
     429Media *Call::getMedia(unsigned med_idx) const 
     430{ 
     431    /* Check if the media index is valid and if the media has a valid port ID */ 
     432    if (med_idx >= medias.size() || 
     433        (medias[med_idx] && medias[med_idx]->getType() == PJMEDIA_TYPE_AUDIO && 
     434         ((AudioMedia *)medias[med_idx])->getPortId() == PJSUA_INVALID_ID)) 
     435    { 
     436        return NULL; 
     437    } 
     438     
     439    return medias[med_idx]; 
     440} 
     441 
    411442pjsip_dialog_cap_status Call::remoteHasCap(int htype, 
    412443                                           const string &hname, 
     
    563594int Call::vidGetStreamIdx() const 
    564595{ 
     596#if PJSUA_HAS_VIDEO 
    565597    return pjsua_call_get_vid_stream_idx(id); 
     598#else 
     599    return PJSUA_INVALID_ID; 
     600#endif 
    566601} 
    567602 
    568603bool Call::vidStreamIsRunning(int med_idx, pjmedia_dir dir) const 
    569604{ 
     605#if PJSUA_HAS_VIDEO 
    570606    return pjsua_call_vid_stream_is_running(id, med_idx, dir); 
     607#else 
     608    return false; 
     609#endif 
    571610} 
    572611 
     
    574613                        const CallVidSetStreamParam &param) throw(Error) 
    575614{ 
     615#if PJSUA_HAS_VIDEO 
    576616    pjsua_call_vid_strm_op_param prm; 
    577617     
     
    580620    prm.cap_dev = param.capDev; 
    581621    PJSUA2_CHECK_EXPR( pjsua_call_set_vid_strm(id, op, &prm) ); 
     622#else 
     623    PJSUA2_RAISE_ERROR(PJ_EINVOP); 
     624#endif 
    582625} 
    583626 
     
    613656    return mti; 
    614657} 
     658 
     659void Call::processMediaUpdate(OnCallMediaStateParam &prm) 
     660{ 
     661    pjsua_call_info pj_ci; 
     662    unsigned mi; 
     663     
     664    if (pjsua_call_get_info(id, &pj_ci) == PJ_SUCCESS) { 
     665        for (mi = 0; mi < pj_ci.media_cnt; mi++) { 
     666            if (mi >= medias.size()) { 
     667                if (pj_ci.media[mi].type == PJMEDIA_TYPE_AUDIO) { 
     668                    medias.push_back(new CallAudioMedia); 
     669                } else { 
     670                    medias.push_back(NULL); 
     671                } 
     672            } 
     673             
     674            if (pj_ci.media[mi].type == PJMEDIA_TYPE_AUDIO) { 
     675                CallAudioMedia *aud_med = (CallAudioMedia *)medias[mi]; 
     676                 
     677                aud_med->setPortId(pj_ci.media[mi].stream.aud.conf_slot); 
     678                /* Add media if the conference slot ID is valid. */ 
     679                if (pj_ci.media[mi].stream.aud.conf_slot != PJSUA_INVALID_ID) 
     680                { 
     681                    Endpoint::instance().addMedia((AudioMedia &)*aud_med); 
     682                } else { 
     683                    Endpoint::instance().removeMedia((AudioMedia &)*aud_med); 
     684                } 
     685            } 
     686        } 
     687    } 
     688     
     689    /* Call media state callback. */ 
     690    onCallMediaState(prm); 
     691} 
     692 
     693void Call::processStateChange(OnCallStateParam &prm) 
     694{ 
     695    pjsua_call_info pj_ci; 
     696    unsigned mi; 
     697     
     698    if (pjsua_call_get_info(id, &pj_ci) == PJ_SUCCESS && 
     699        pj_ci.state == PJSIP_INV_STATE_DISCONNECTED) 
     700    { 
     701        /* Clear medias. */ 
     702        for (mi = 0; mi < medias.size(); mi++) { 
     703            if (medias[mi]) 
     704                delete medias[mi]; 
     705        } 
     706        medias.clear(); 
     707    } 
     708     
     709    onCallState(prm); 
     710    /* If the state is DISCONNECTED, this call may have already been deleted 
     711     * by the application in the callback, so do not access it anymore here. 
     712     */ 
     713} 
  • pjproject/branches/projects/pjsua2/pjsip/src/pjsua2/endpoint.cpp

    r4663 r4666  
    709709    prm.e.fromPj(*e); 
    710710     
    711     call->onCallState(prm); 
     711    call->processStateChange(prm); 
    712712    /* If the state is DISCONNECTED, call may have already been deleted 
    713713     * by the application in the callback, so do not access it anymore here. 
     
    736736        return; 
    737737    } 
    738      
     738 
    739739    OnCallMediaStateParam prm; 
    740     call->onCallMediaState(prm); 
     740    call->processMediaUpdate(prm); 
    741741} 
    742742 
  • pjproject/branches/projects/pjsua2/pjsip/src/pjsua2/media.cpp

    r4662 r4666  
    5656} 
    5757/////////////////////////////////////////////////////////////////////////////// 
    58 Media::Media() 
     58Media::Media(pjmedia_type med_type) 
     59: type(med_type) 
    5960{ 
    6061 
     
    6667} 
    6768 
     69pjmedia_type Media::getType() const 
     70{ 
     71    return type; 
     72} 
     73 
    6874/////////////////////////////////////////////////////////////////////////////// 
    6975AudioMedia::AudioMedia()  
    70 : id(PJSUA_INVALID_ID), mediaPool(NULL) 
     76: Media(PJMEDIA_TYPE_AUDIO), id(PJSUA_INVALID_ID), mediaPool(NULL) 
    7177{ 
    7278 
Note: See TracChangeset for help on using the changeset viewer.