Ignore:
Timestamp:
Aug 19, 2008 12:11:39 PM (16 years ago)
Author:
nanang
Message:

Ticket #593: Fixed RTP timestamp calculation in RX & TX for multichannel audio.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/stream.c

    r2100 r2224  
    144144                                                 normalization process  
    145145                                                 is needed                  */ 
    146     unsigned                 rtp_tx_samples_per_pkt; 
    147                                             /**< Normalized samples per packet  
     146    unsigned                 rtp_tx_ts_len_per_pkt; 
     147                                            /**< Normalized ts length per packet 
    148148                                                 transmitted according to  
    149149                                                 'erroneous' definition     */ 
    150     unsigned                 rtp_rx_samples_per_frame; 
    151                                             /**< Normalized samples per frame  
     150    unsigned                 rtp_rx_ts_len_per_frame; 
     151                                            /**< Normalized ts length per frame 
    152152                                                 received according to  
    153153                                                 'erroneous' definition     */ 
     
    687687    /* Number of samples in the frame */ 
    688688    if (frame->type == PJMEDIA_FRAME_TYPE_AUDIO) 
    689         ts_len = (frame->size >> 1); 
     689        ts_len = (frame->size >> 1) / stream->codec_param.info.channel_cnt; 
    690690    else 
    691691        ts_len = 0; 
     
    699699     */ 
    700700    if (stream->has_g722_mpeg_bug) 
    701         rtp_ts_len = stream->rtp_tx_samples_per_pkt; 
     701        rtp_ts_len = stream->rtp_tx_ts_len_per_pkt; 
    702702    else 
    703703        rtp_ts_len = ts_len; 
     
    12471247                                    stream->port.info.samples_per_frame >> 1)) 
    12481248                    { 
    1249                         if (peer_frm_ts_diff < stream->rtp_rx_samples_per_frame) 
    1250                             stream->rtp_rx_samples_per_frame = peer_frm_ts_diff; 
     1249                        if (peer_frm_ts_diff < stream->rtp_rx_ts_len_per_frame) 
     1250                            stream->rtp_rx_ts_len_per_frame = peer_frm_ts_diff; 
    12511251 
    12521252                        if (--stream->rtp_rx_check_cnt == 0) { 
    12531253                            PJ_LOG(4, (THIS_FILE, "G722 codec used, remote" 
    12541254                                       " samples per frame detected = %d",  
    1255                                        stream->rtp_rx_samples_per_frame)); 
     1255                                       stream->rtp_rx_ts_len_per_frame)); 
    12561256                             
    12571257                            /* Reset jitter buffer once detection done */ 
     
    12651265            } 
    12661266 
    1267             ts_span = stream->rtp_rx_samples_per_frame; 
     1267            ts_span = stream->rtp_rx_ts_len_per_frame; 
    12681268 
    12691269        } else { 
    12701270            ts_span = stream->codec_param.info.frm_ptime *  
    1271                       stream->codec_param.info.clock_rate * 
    1272                       stream->codec_param.info.channel_cnt / 
     1271                      stream->codec_param.info.clock_rate / 
    12731272                      1000; 
    12741273        } 
    12751274#else 
    12761275        ts_span = stream->codec_param.info.frm_ptime *  
    1277                   stream->codec_param.info.clock_rate * 
    1278                   stream->codec_param.info.channel_cnt / 
     1276                  stream->codec_param.info.clock_rate / 
    12791277                  1000; 
    12801278#endif 
     
    15631561 
    15641562        stream->enc_samples_per_pkt = stream->codec_param.info.enc_ptime * 
     1563                                      stream->codec_param.info.channel_cnt * 
    15651564                                      stream->port.info.clock_rate / 1000; 
    15661565 
     
    16131612    stream->rtp_rx_last_ts = 0; 
    16141613    stream->rtp_rx_last_cnt = 0; 
    1615     stream->rtp_tx_samples_per_pkt = stream->enc_samples_per_pkt; 
    1616     stream->rtp_rx_samples_per_frame = stream->port.info.samples_per_frame; 
     1614    stream->rtp_tx_ts_len_per_pkt = stream->enc_samples_per_pkt / 
     1615                                     stream->codec_param.info.channel_cnt; 
     1616    stream->rtp_rx_ts_len_per_frame = stream->port.info.samples_per_frame /  
     1617                                       stream->codec_param.info.channel_cnt; 
    16171618 
    16181619    /* Init RTCP session: */ 
     
    16261627        stream->has_g722_mpeg_bug = PJ_TRUE; 
    16271628        /* RTP clock rate = 1/2 real clock rate */ 
    1628         stream->rtp_tx_samples_per_pkt >>= 1; 
     1629        stream->rtp_tx_ts_len_per_pkt >>= 1; 
    16291630    } else { 
    16301631        pjmedia_rtcp_init(&stream->rtcp, stream->port.info.name.ptr, 
Note: See TracChangeset for help on using the changeset viewer.