I modified the common.gypi file mentioned above and did a full rebuild of Chromium. Now when I launch Chromium I get some additional logging, but I do not see any messages like you described above saying "Incoming PLI" or "Incoming FIR" packet. I am attempting to send both FLI and FIR packets using the methods below. It is like Chromium is either not receiving the packets or not accepting them? Is there any additional logging I can enable or where should I set breakpoints for debugging?
std::shared_ptr<talk_base::Buffer> BuildPLIPacket(uint32 localSsrc, uint32 remoteSsrc)
{
const int bufferSize = 20;
const int bufferCapacity = bufferSize + 14;
uint8_t rtcpbuffer[bufferSize];
std::fill(std::begin(rtcpbuffer), std::end(rtcpbuffer), 0);
int pos = 0;
// add picture loss indicator
uint8_t FMT = 1;
rtcpbuffer[pos++]=(uint8_t)0x80 + FMT;
rtcpbuffer[pos++]=(uint8_t)206;
//Used fixed length of 2
rtcpbuffer[pos++]=(uint8_t)0;
rtcpbuffer[pos++]=(uint8_t)(2);
// Add our own SSRC
AssignUWord32ToBuffer(rtcpbuffer+pos, localSsrc);
pos += 4;
// Add the remote SSRC
AssignUWord32ToBuffer(rtcpbuffer+pos, remoteSsrc);
pos += 4;
//Build and send buffer packet
std::cout << "Built PLI packet for localSsrc: " << localSsrc
<< " -- remoteSsrc: " << remoteSsrc << " -- pos: " << pos
<< std::endl;
return std::make_shared<talk_base::Buffer>(rtcpbuffer, bufferSize,
bufferCapacity);
}
static int firSequenceNumber = 0;
std::shared_ptr<talk_base::Buffer> BuildFIRPacket(uint32 localSsrc,
uint32 remoteSsrc) {
//Build FIR packet
const int bufferSize = 20;
const int bufferCapacity = bufferSize + 14;
uint8_t rtcpbuffer[bufferSize];
std::fill(std::begin(rtcpbuffer), std::end(rtcpbuffer), 0);
int pos = 0;
// add full intra request indicator
uint8_t FMT = 4;
rtcpbuffer[pos++] = (uint8_t) 0x80 + FMT;
rtcpbuffer[pos++] = (uint8_t) 206;
//Length of 4
rtcpbuffer[pos++] = (uint8_t) 0;
rtcpbuffer[pos++] = (uint8_t)(4);
// Add our own SSRC
AssignUWord32ToBuffer(rtcpbuffer + pos, localSsrc);
pos += 4;
// RFC 5104 4.3.1.2. Semantics
// SSRC of media source
rtcpbuffer[pos++] = (uint8_t) 0;
rtcpbuffer[pos++] = (uint8_t) 0;
rtcpbuffer[pos++] = (uint8_t) 0;
rtcpbuffer[pos++] = (uint8_t) 0;
// Additional Feedback Control Information (FCI)
AssignUWord32ToBuffer(rtcpbuffer + pos, remoteSsrc);
pos += 4;
rtcpbuffer[pos++] = (uint8_t)(firSequenceNumber);
rtcpbuffer[pos++] = (uint8_t) 0;
rtcpbuffer[pos++] = (uint8_t) 0;
rtcpbuffer[pos++] = (uint8_t) 0;
firSequenceNumber++;
//Build and send buffer packet
std::cout << "Built FIR packet for localSsrc: " << localSsrc
<< " -- remoteSsrc: " << remoteSsrc << " -- pos: " << pos
<< std::endl;
return std::make_shared<talk_base::Buffer>(rtcpbuffer, bufferSize,
bufferCapacity);
}
//Sending code - I have also tried it with BuildPLIPacket
firPacket = BuildFIRPacket(presenterVideoChannel->GetSendSsrc(),
presenterVideoChannel->GetRecvSsrc());
presenterVideoChannel->SendRtcp(firPacket.get());