修复webrtc播放时生成config rtp线程安全的bug

rtsp直接代理时会从config frame生成rtp,在获取VideoTrack配置帧列表时存在线程安全风险;
同时简化getConfigFrames函数代码,去除缓存逻辑。
This commit is contained in:
xiongziliang 2024-06-21 20:46:17 +08:00 committed by 夏楚
parent 1ef3642ed4
commit 2ead272187
5 changed files with 27 additions and 17 deletions

View File

@ -235,13 +235,17 @@ void H264Track::setExtraData(const uint8_t *data, size_t bytes) {
} }
bool H264Track::update() { bool H264Track::update() {
_config_frames = std::vector<Frame::Ptr>{
createConfigFrame<H264Frame>(_sps, 0, getIndex()),
createConfigFrame<H264Frame>(_pps, 0, getIndex())
};
return getAVCInfo(_sps, _width, _height, _fps); return getAVCInfo(_sps, _width, _height, _fps);
} }
std::vector<Frame::Ptr> H264Track::getConfigFrames() const {
if (!ready()) {
return {};
}
return { createConfigFrame<H264Frame>(_sps, 0, getIndex()),
createConfigFrame<H264Frame>(_pps, 0, getIndex()) };
}
Track::Ptr H264Track::clone() const { Track::Ptr H264Track::clone() const {
return std::make_shared<H264Track>(*this); return std::make_shared<H264Track>(*this);
} }

View File

@ -115,7 +115,7 @@ public:
toolkit::Buffer::Ptr getExtraData() const override; toolkit::Buffer::Ptr getExtraData() const override;
void setExtraData(const uint8_t *data, size_t size) override; void setExtraData(const uint8_t *data, size_t size) override;
bool update() override; bool update() override;
std::vector<Frame::Ptr> getConfigFrames() const override { return _config_frames; } std::vector<Frame::Ptr> getConfigFrames() const override;
private: private:
Sdp::Ptr getSdp(uint8_t payload_type) const override; Sdp::Ptr getSdp(uint8_t payload_type) const override;
@ -130,7 +130,6 @@ private:
float _fps = 0; float _fps = 0;
std::string _sps; std::string _sps;
std::string _pps; std::string _pps;
std::vector<Frame::Ptr> _config_frames;
}; };
template <typename FrameType> template <typename FrameType>

View File

@ -182,14 +182,18 @@ void H265Track::setExtraData(const uint8_t *data, size_t bytes) {
} }
bool H265Track::update() { bool H265Track::update() {
_config_frames = std::vector<Frame::Ptr>{
createConfigFrame<H265Frame>(_vps, 0, getIndex()),
createConfigFrame<H265Frame>(_sps, 0, getIndex()),
createConfigFrame<H265Frame>(_pps, 0, getIndex())
};
return getHEVCInfo(_vps, _sps, _width, _height, _fps); return getHEVCInfo(_vps, _sps, _width, _height, _fps);
} }
std::vector<Frame::Ptr> H265Track::getConfigFrames() const {
if (!ready()) {
return {};
}
return { createConfigFrame<H265Frame>(_vps, 0, getIndex()),
createConfigFrame<H265Frame>(_sps, 0, getIndex()),
createConfigFrame<H265Frame>(_pps, 0, getIndex()) };
}
Track::Ptr H265Track::clone() const { Track::Ptr H265Track::clone() const {
return std::make_shared<H265Track>(*this); return std::make_shared<H265Track>(*this);
} }

View File

@ -142,7 +142,7 @@ public:
toolkit::Buffer::Ptr getExtraData() const override; toolkit::Buffer::Ptr getExtraData() const override;
void setExtraData(const uint8_t *data, size_t size) override; void setExtraData(const uint8_t *data, size_t size) override;
bool update() override; bool update() override;
std::vector<Frame::Ptr> getConfigFrames() const override { return _config_frames; } std::vector<Frame::Ptr> getConfigFrames() const override;
private: private:
Sdp::Ptr getSdp(uint8_t payload_type) const override; Sdp::Ptr getSdp(uint8_t payload_type) const override;
@ -158,7 +158,6 @@ private:
std::string _vps; std::string _vps;
std::string _sps; std::string _sps;
std::string _pps; std::string _pps;
std::vector<Frame::Ptr> _config_frames;
}; };
}//namespace mediakit }//namespace mediakit

View File

@ -129,7 +129,12 @@ void WebRtcPlayer::sendConfigFrames(uint32_t before_seq, uint32_t sample_rate, u
if (!play_src) { if (!play_src) {
return; return;
} }
auto video_track = std::dynamic_pointer_cast<mediakit::VideoTrack>(play_src->getTrack(mediakit::TrackVideo)); SdpParser parser(play_src->getSdp());
auto video_sdp = parser.getTrack(TrackVideo);
if (!video_sdp) {
return;
}
auto video_track = dynamic_pointer_cast<VideoTrack>(Factory::getTrackBySdp(video_sdp));
if (!video_track) { if (!video_track) {
return; return;
} }
@ -146,9 +151,8 @@ void WebRtcPlayer::sendConfigFrames(uint32_t before_seq, uint32_t sample_rate, u
encoder->setRtpInfo(0, video_mtu, sample_rate, 0, 0, 0); encoder->setRtpInfo(0, video_mtu, sample_rate, 0, 0, 0);
auto seq = before_seq - frames.size(); auto seq = before_seq - frames.size();
for (const auto &frame : video_track->getConfigFrames()) { for (const auto &frame : frames) {
auto rtp = encoder->getRtpInfo().makeRtp( auto rtp = encoder->getRtpInfo().makeRtp(TrackVideo, frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(), false, 0);
TrackVideo, frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(), false, 0);
auto header = rtp->getHeader(); auto header = rtp->getHeader();
header->seq = htons(seq++); header->seq = htons(seq++);
header->stamp = htonl(timestamp); header->stamp = htonl(timestamp);