if (remainPktSize > 0) { /* set the E bit: mark as last fragment */ //设置结束标志 rtpPacket->rtppayload[2] |= 1 << 6; /* complete and send last RTP packet */ memcpy(& rtpPacket->rtppayload[RTP_HEADER_SIZE], frame, frameSize); ret = RtpSendPacket(socket, ip, port, rtpPacket, frameSize+2); if(ret < 0) return -1; rtpPacket->rtpHeader.seq++; sendBytes += ret; }
时间: 2024-02-10 13:25:47 浏览: 161
这段代码是在剩余不完整包大小大于0的情况下执行的逻辑。以下是代码的解析:
1. `rtpPacket->rtppayload[2] |= 1 << 6;`
这行代码设置RTP包有效负载的第3个字节(索引为2)的第7位(E位)为1,表示当前包是最后一个分片。这是通过按位或操作和按位左移操作实现的。
2. `memcpy(&rtpPacket->rtppayload[RTP_HEADER_SIZE], frame, frameSize);`
这行代码将完整帧的数据拷贝到RTP包的有效负载中。与之前不同的是,这里是拷贝完整帧的数据而不是剩余不完整包的数据。
3. `ret = RtpSendPacket(socket, ip, port, rtpPacket, frameSize+2);`
这行代码调用了名为`RtpSendPacket`的函数,将包含完整帧数据的RTP包发送到指定的IP地址和端口。与之前不同的是,这里发送的RTP包大小为完整帧大小加2字节。其中2字节表示RTP包头的大小。
4. `if(ret < 0) return -1;`
这行代码检查发送RTP包的返回值`ret`是否小于0,如果是,则表明发送失败,直接返回-1。
5. `rtpPacket->rtpHeader.seq++;`
这行代码递增RTP头中的序列号,以便下一个RTP包有一个新的序列号。
6. `sendBytes += ret;`
这行代码将发送的字节数累加到`sendBytes`变量中,用于统计发送的总字节数。
这段代码的作用是处理剩余不完整包的情况。它将最后一个分片的结束标志设置为1,将完整帧数据拷贝到RTP包的有效负载中,并发送RTP包到指定的目标地址和端口。同时,更新了RTP头的序列号和统计发送的总字节数。
阅读全文