mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
修复webrtc播放时生成config rtp线程安全的bug
rtsp直接代理时会从config frame生成rtp,在获取VideoTrack配置帧列表时存在线程安全风险; 同时简化getConfigFrames函数代码,去除缓存逻辑。
This commit is contained in:
parent
1ef3642ed4
commit
2ead272187
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user