已开启
Miracast安全问题增改 #571
Bingka_OH创建于 17 天前
Miracast安全问题增改 #571
已开启
共 4 个文件变更+35-12
| @@ -105,8 +105,13 @@ void AudioAACDecoder::OnFrame(const Frame::Ptr &frame) | |||
| 105 | avPacket_->data = frame->Data(); | 105 | avPacket_->data = frame->Data(); |
| 106 | avPacket_->size = frame->Size(); | 106 | avPacket_->size = frame->Size(); |
| 107 | 107 | ||
| 108 | - avcodec_send_packet(codecCtx_, avPacket_); | 108 | + int ret = avcodec_send_packet(codecCtx_, avPacket_); |
| 109 | - int ret = avcodec_receive_frame(codecCtx_, avFrame_); | 109 | + if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { |
| 110 | + SHARING_LOGE("avcodec send packet failed, ret=%{public}d", ret); | ||
| 111 | + return; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + ret = avcodec_receive_frame(codecCtx_, avFrame_); | ||
| 110 | if (ret < 0) { | 115 | if (ret < 0) { |
| 111 | SHARING_LOGE("avcodec receive frame failed, ret=%{public}d", ret); | 116 | SHARING_LOGE("avcodec receive frame failed, ret=%{public}d", ret); |
| 112 | return; | 117 | return; |
| @@ -117,8 +117,11 @@ void WfdRtpConsumer::UpdateOperation(ProsumerStatusMsg::Ptr &statusMsg) | |||
| 117 | } | 117 | } |
| 118 | break; | 118 | break; |
| 119 | case PROSUMER_PAUSE: | 119 | case PROSUMER_PAUSE: |
| 120 | - isPaused_ = true; | 120 | + { |
| 121 | - mediaTypePaused_ = statusMsg->mediaType; | 121 | + std::lock_guard<std::mutex> lock(pauseMutex_); |
| 122 | + isPaused_ = true; | ||
| 123 | + mediaTypePaused_ = statusMsg->mediaType; | ||
| 124 | + } | ||
| 122 | statusMsg->status = PROSUMER_NOTIFY_PAUSE_SUCCESS; | 125 | statusMsg->status = PROSUMER_NOTIFY_PAUSE_SUCCESS; |
| 123 | UpdateWritingTimerState(true); | 126 | UpdateWritingTimerState(true); |
| 124 | break; | 127 | break; |
| @@ -315,8 +318,11 @@ void WfdRtpConsumer::OnRtpUnpackCallback(uint32_t ssrc, const Frame::Ptr &frame) | |||
| 315 | 318 | ||
| 316 | MediaData::Ptr mediaData; | 319 | MediaData::Ptr mediaData; |
| 317 | if (frame->GetTrackType() == TRACK_AUDIO) { | 320 | if (frame->GetTrackType() == TRACK_AUDIO) { |
| 318 | - if (isPaused_ && (mediaTypePaused_ == MEDIA_TYPE_AUDIO || mediaTypePaused_ == MEDIA_TYPE_AV)) { | 321 | + { |
| 319 | - return; | 322 | + std::lock_guard<std::mutex> lock(pauseMutex_); |
| 323 | + if (isPaused_ && (mediaTypePaused_ == MEDIA_TYPE_AUDIO || mediaTypePaused_ == MEDIA_TYPE_AV)) { | ||
| 324 | + return; | ||
| 325 | + } | ||
| 320 | } | 326 | } |
| 321 | 327 | ||
| 322 | mediaData = std::make_shared<MediaData>(); | 328 | mediaData = std::make_shared<MediaData>(); |
| @@ -330,8 +336,11 @@ void WfdRtpConsumer::OnRtpUnpackCallback(uint32_t ssrc, const Frame::Ptr &frame) | |||
| 330 | 336 | ||
| 331 | dispatcher->InputData(mediaData); | 337 | dispatcher->InputData(mediaData); |
| 332 | } else if (frame->GetTrackType() == TRACK_VIDEO) { | 338 | } else if (frame->GetTrackType() == TRACK_VIDEO) { |
| 333 | - if (isPaused_ && (mediaTypePaused_ == MEDIA_TYPE_VIDEO || mediaTypePaused_ == MEDIA_TYPE_AV)) { | 339 | + { |
| 334 | - return; | 340 | + std::lock_guard<std::mutex> lock(pauseMutex_); |
| 341 | + if (isPaused_ && (mediaTypePaused_ == MEDIA_TYPE_VIDEO || mediaTypePaused_ == MEDIA_TYPE_AV)) { | ||
| 342 | + return; | ||
| 343 | + } | ||
| 335 | } | 344 | } |
| 336 | 345 | ||
| 337 | auto p = frame->Data(); | 346 | auto p = frame->Data(); |
| @@ -88,6 +88,7 @@ private: | |||
| 88 | std::chrono::steady_clock::time_point gopInterval_; | 88 | std::chrono::steady_clock::time_point gopInterval_; |
| 89 | std::pair<int32_t, NetworkFactory::ServerPtr> rtpServer_ = {0, nullptr}; | 89 | std::pair<int32_t, NetworkFactory::ServerPtr> rtpServer_ = {0, nullptr}; |
| 90 | 90 | ||
| 91 | + std::mutex pauseMutex_; | ||
| 91 | std::atomic<int> mediaTypePaused_ = MEDIA_TYPE_AV; | 92 | std::atomic<int> mediaTypePaused_ = MEDIA_TYPE_AV; |
| 92 | 93 | ||
| 93 | RtpUnpack::Ptr rtpUnpacker_ = nullptr; | 94 | RtpUnpack::Ptr rtpUnpacker_ = nullptr; |