Ignore:
Timestamp:
Apr 6, 2011 1:55:01 PM (10 years ago)
Author:
nanang
Message:

Re #1186:

  • Added custom negotiation callback mechanism in SDP negotiator, mainly for specific formats that require SDP fmtp negotiation.
  • Modified video codec ID string to use encoding name+payload type (was encoding name+clock rate), also added encoding description in video codec info, so duplicated codecs (e.g: multiple H264 configurations) can be differentiated.
  • Few enhancements for H264 in ffmpeg wrapper (e.g: added proper profile-id & packetization-mode setup).
File:
1 edited

Legend:

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

    r3497 r3500  
    2222#include <pjmedia/rtcp.h> 
    2323#include <pjmedia/jbuf.h> 
     24#include <pjmedia/sdp_neg.h> 
    2425#include <pjmedia/stream_common.h> 
    2526#include <pj/array.h> 
     
    17221723                                              const pjmedia_sdp_media *rem_m) 
    17231724{ 
    1724     const pjmedia_sdp_attr *attr; 
    1725     pjmedia_sdp_rtpmap *rtpmap; 
    1726     unsigned i, pt = 0; 
     1725    unsigned pt = 0; 
     1726    const pjmedia_vid_codec_info *p_info; 
    17271727    pj_status_t status; 
    17281728 
    1729     /* Get codec info. 
    1730      * For static payload types, get the info from codec manager. 
    1731      * For dynamic payload types, MUST get the rtpmap. 
    1732      */ 
    17331729    pt = pj_strtoul(&local_m->desc.fmt[0]); 
     1730 
     1731    /* Get codec info. */ 
     1732    status = pjmedia_vid_codec_mgr_get_codec_info(mgr, pt, &p_info); 
     1733    if (status != PJ_SUCCESS) 
     1734        return status; 
     1735 
     1736    si->codec_info = *p_info; 
     1737 
     1738    /* Get payload type for receiving direction */ 
    17341739    si->rx_pt = pt; 
     1740 
     1741    /* Get payload type for transmitting direction */ 
    17351742    if (pt < 96) { 
    1736         const pjmedia_vid_codec_info *p_info; 
    1737  
    1738         status = pjmedia_vid_codec_mgr_get_codec_info(mgr, pt, &p_info); 
    1739         if (status != PJ_SUCCESS) 
    1740             return status; 
    1741  
    1742         si->codec_info = *p_info; 
    1743  
    17441743        /* For static payload type, pt's are symetric */ 
    17451744        si->tx_pt = pt; 
    17461745 
    17471746    } else { 
    1748         unsigned info_cnt = 1; 
    1749         const pjmedia_vid_codec_info *p_info; 
    1750  
    1751         attr = pjmedia_sdp_media_find_attr(local_m, &ID_RTPMAP,  
    1752                                            &local_m->desc.fmt[0]); 
    1753         if (attr == NULL) 
    1754             return PJMEDIA_EMISSINGRTPMAP; 
    1755  
    1756         status = pjmedia_sdp_attr_to_rtpmap(pool, attr, &rtpmap); 
    1757         if (status != PJ_SUCCESS) 
    1758             return status; 
    1759  
    1760         /* Get codec info from codec id */ 
    1761         status = pjmedia_vid_codec_mgr_find_codecs_by_id( 
    1762                                             mgr, &rtpmap->enc_name, 
    1763                                             &info_cnt, &p_info, NULL); 
    1764         if (status != PJ_SUCCESS) 
    1765             return status; 
    1766  
    1767         si->codec_info = *p_info; 
     1747        unsigned i; 
    17681748 
    17691749        /* Determine payload type for outgoing channel, by finding 
     
    17721752        si->tx_pt = 0xFFFF; 
    17731753        for (i=0; i<rem_m->desc.fmt_count; ++i) { 
    1774             unsigned rpt; 
    1775             pjmedia_sdp_attr *r_attr; 
    1776             pjmedia_sdp_rtpmap r_rtpmap; 
    1777  
    1778             rpt = pj_strtoul(&rem_m->desc.fmt[i]); 
    1779             if (rpt < 96) 
    1780                 continue; 
    1781  
    1782             r_attr = pjmedia_sdp_media_find_attr(rem_m, &ID_RTPMAP, 
    1783                                                  &rem_m->desc.fmt[i]); 
    1784             if (!r_attr) 
    1785                 continue; 
    1786  
    1787             if (pjmedia_sdp_attr_get_rtpmap(r_attr, &r_rtpmap) != PJ_SUCCESS) 
    1788                 continue; 
    1789  
    1790             if (!pj_stricmp(&rtpmap->enc_name, &r_rtpmap.enc_name) && 
    1791                 rtpmap->clock_rate == r_rtpmap.clock_rate) 
     1754            if (pjmedia_sdp_neg_fmt_match(NULL, 
     1755                                          (pjmedia_sdp_media*)local_m, 0, 
     1756                                          (pjmedia_sdp_media*)rem_m, i, 0) == 
     1757                PJ_SUCCESS) 
    17921758            { 
    17931759                /* Found matched codec. */ 
    1794                 si->tx_pt = rpt; 
    1795  
     1760                si->tx_pt = pj_strtoul(&rem_m->desc.fmt[i]); 
    17961761                break; 
    17971762            } 
Note: See TracChangeset for help on using the changeset viewer.