Fix bug causing video artifects when FEC is used on Moonlight

This commit is contained in:
loki 2020-05-02 23:38:33 +02:00
parent ff7a5aa1ea
commit 4094aec2eb

View File

@ -71,6 +71,7 @@ struct video_packet_raw_t {
} }
RTP_PACKET rtp; RTP_PACKET rtp;
char reserved[4];
NV_VIDEO_PACKET packet; NV_VIDEO_PACKET packet;
}; };
@ -300,6 +301,10 @@ struct fec_t {
size_t blocksize; size_t blocksize;
util::buffer_t<char> shards; util::buffer_t<char> shards;
char *data(size_t el) {
return &shards[el*blocksize];
}
std::string_view operator[](size_t el) const { std::string_view operator[](size_t el) const {
return { &shards[el*blocksize], blocksize }; return { &shards[el*blocksize], blocksize };
} }
@ -649,6 +654,7 @@ void videoBroadcastThread(safe::signal_t *shutdown_event, udp::socket &sock, vid
video_packet->packet.flags |= FLAG_EOF; video_packet->packet.flags |= FLAG_EOF;
} }
video_packet->rtp.header = FLAG_EXTENSION;
video_packet->rtp.sequenceNumber = util::endian::big<uint16_t>(lowseq + fecIndex); video_packet->rtp.sequenceNumber = util::endian::big<uint16_t>(lowseq + fecIndex);
}); });
@ -661,7 +667,7 @@ void videoBroadcastThread(safe::signal_t *shutdown_event, udp::socket &sock, vid
} }
for (auto x = shards.data_shards; x < shards.size(); ++x) { for (auto x = shards.data_shards; x < shards.size(); ++x) {
video_packet_raw_t *inspect = (video_packet_raw_t *)shards[x].data(); auto *inspect = (video_packet_raw_t *)shards.data(x);
inspect->packet.frameIndex = packet->pts; inspect->packet.frameIndex = packet->pts;
inspect->packet.fecInfo = ( inspect->packet.fecInfo = (
@ -670,6 +676,7 @@ void videoBroadcastThread(safe::signal_t *shutdown_event, udp::socket &sock, vid
fecPercentage << 4 fecPercentage << 4
); );
inspect->rtp.header = FLAG_EXTENSION;
inspect->rtp.sequenceNumber = util::endian::big<uint16_t>(lowseq + x); inspect->rtp.sequenceNumber = util::endian::big<uint16_t>(lowseq + x);
} }