欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

RTP包处理器,rtp处理器,void MultiFr

来源: javaer 分享于  点击 12481 次 点评:101

RTP包处理器,rtp处理器,void MultiFr


void MultiFramedRTPSource::networkReadHandler1() {  BufferedPacket* bPacket = fPacketReadInProgress;  if (bPacket == NULL) {    // Normal case: Get a free BufferedPacket descriptor to hold the new network packet:    bPacket = fReorderingBuffer->getFreePacket(this);  }  // Read the network packet, and perform sanity checks on the RTP header:  Boolean readSuccess = False;  do {    Boolean packetReadWasIncomplete = fPacketReadInProgress != NULL;    if (!bPacket->fillInData(fRTPInterface, packetReadWasIncomplete)) break;    if (packetReadWasIncomplete) {      // We need additional read(s) before we can process the incoming packet:      fPacketReadInProgress = bPacket;      return;    } else {      fPacketReadInProgress = NULL;    }#ifdef TEST_LOSS    setPacketReorderingThresholdTime(0);       // don't wait for 'lost' packets to arrive out-of-order later    if ((our_random()%10) == 0) break; // simulate 10% packet loss#endif    // Check for the 12-byte RTP header:    if (bPacket->dataSize() < 12) break;    unsigned rtpHdr = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4);    Boolean rtpMarkerBit = (rtpHdr&0x00800000) >> 23;    unsigned rtpTimestamp = ntohl(*(u_int32_t*)(bPacket->data()));ADVANCE(4);    unsigned rtpSSRC = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4);    // rcr it looks like the java version has 10 extra bytes after SSRC    // Check the RTP version number (it should be 2):    if ((rtpHdr&0xC0000000) != 0x80000000) break;    // Skip over any CSRC identifiers in the header:    unsigned cc = (rtpHdr>>24)&0xF;    if (bPacket->dataSize() < cc) break;    ADVANCE(cc*4);    //rcr  the above does not seem to be skipping any bytes    // Check for (& ignore) any RTP header extension    if (rtpHdr&0x10000000) {      if (bPacket->dataSize() < 4) break;      unsigned extHdr = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4);      unsigned remExtSize = 4*(extHdr&0xFFFF);      if (bPacket->dataSize() < remExtSize) break;      ADVANCE(remExtSize);    }    //rcr the above does not seem to b skipping    // Discard any padding bytes:    if (rtpHdr&0x20000000) {      if (bPacket->dataSize() == 0) break;      unsigned numPaddingBytes    = (unsigned)(bPacket->data())[bPacket->dataSize()-1];      if (bPacket->dataSize() < numPaddingBytes) break;      bPacket->removePadding(numPaddingBytes);    }    //rcr the above does not seem skipping bytes    // Check the Payload Type.    if ((unsigned char)((rtpHdr&0x007F0000)>>16)    != rtpPayloadFormat()) {      break;    }    // The rest of the packet is the usable data.  Record and save it:    fLastReceivedSSRC = rtpSSRC;    unsigned short rtpSeqNo = (unsigned short)(rtpHdr&0xFFFF);    Boolean usableInJitterCalculation      = packetIsUsableInJitterCalculation((bPacket->data()),                          bPacket->dataSize());    struct timeval presentationTime; // computed by:    Boolean hasBeenSyncedUsingRTCP; // computed by:    receptionStatsDB()      .noteIncomingPacket(rtpSSRC, rtpSeqNo, rtpTimestamp,              timestampFrequency(),              usableInJitterCalculation, presentationTime,              hasBeenSyncedUsingRTCP, bPacket->dataSize());    //rcr this dataSize is the same as the java getPacketData().length    // envir() << "M-frmRTPsrc.readHndlr pck sz " << bPacket->dataSize();    // Fill in the rest of the packet descriptor, and store it:    struct timeval timeNow;    gettimeofday(&timeNow, NULL);    bPacket->assignMiscParams(rtpSeqNo, rtpTimestamp, presentationTime,                  hasBeenSyncedUsingRTCP, rtpMarkerBit,                  timeNow);    if (!fReorderingBuffer->storePacket(bPacket)) break;    readSuccess = True;  } while (0);  if (!readSuccess) fReorderingBuffer->freePacket(bPacket);  doGetNextFrame1();  // If we didn't get proper data this time, we'll get another chance}
相关栏目:

用户点评