【tg】8: Manager的主要功能

Manager 提供的是media thread

  • 说明media thread 是主线程, 而 mediamgr里是worker thread
  • networkmgr是network thread了。
    在这里插入图片描述

Manager 的功能重要,但是特别短

  • G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Manager.cpp

class Manager final : public std::enable_shared_from_this<Manager> {
private:struct ResolvedNetworkStatus {bool isLowCost = false;bool isLowDataRequested = false;bool operator==(const ResolvedNetworkStatus &rhs) const;bool operator!=(const ResolvedNetworkStatus &rhs) const;};public:static rtc::Thread *getMediaThread();Manager(rtc::Thread *thread, Descriptor &&descriptor);~Manager();void start();void receiveSignalingData(const std::vector<uint8_t> &data);void setVideoCapture(std::shared_ptr<VideoCaptureInterface> videoCapture);void sendVideoDeviceUpdated();void setRequestedVideoAspect(float aspect);void setMuteOutgoingAudio(bool mute);void setIncomingVideoOutput(std::weak_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> sink);void setIsLowBatteryLevel(bool isLowBatteryLevel);void setIsLocalNetworkLowCost(bool isLocalNetworkLowCost);void getNetworkStats(std::function<void(TrafficStats, CallStats)> completion);void setAudioInputDevice(std::string id);void setAudioOutputDevice(std::string id);void setInputVolume(float level);void setOutputVolume(float level);void addExternalAudioSamples(std::vector<uint8_t> &&samples);private:void sendSignalingAsync(int delayMs, int cause);void receiveMessage(DecryptedMessage &&message);void updateCurrentResolvedNetworkStatus();void sendInitialSignalingMessages();rtc::Thread *_thread;EncryptionKey _encryptionKey;EncryptedConnection _signaling;bool _enableP2P = false;bool _enableTCP = false;bool _enableStunMarking = false;ProtocolVersion _protocolVersion = ProtocolVersion::V0;FilePath _statsLogPath;std::vector<RtcServer> _rtcServers;std::unique_ptr<Proxy> _proxy;MediaDevicesConfig _mediaDevicesConfig;std::shared_ptr<VideoCaptureInterface> _videoCapture;std::function<void(State)> _stateUpdated;std::function<void(AudioState, VideoState)> _remoteMediaStateUpdated;std::function<void(bool)> _remoteBatteryLevelIsLowUpdated;std::function<void(float)> _remotePrefferedAspectRatioUpdated;std::function<void(const std::vector<uint8_t> &)> _signalingDataEmitted;std::function<void(int)> _signalBarsUpdated;std::function<void(float)> _audioLevelUpdated;std::function<rtc::scoped_refptr<webrtc::AudioDeviceModule>(webrtc::TaskQueueFactory*)> _createAudioDeviceModule;std::function<uint32_t(const Message &)> _sendSignalingMessage;std::function<void(Message&&)> _sendTransportMessage;std::unique_ptr<ThreadLocalObject<NetworkManager>> _networkManager;std::unique_ptr<ThreadLocalObject<MediaManager>> _mediaManager;State _state = State::Reconnecting;bool _didConnectOnce = false;bool _enableHighBitrateVideo = false;DataSaving _dataSaving = DataSaving::Never;std::vector<std::string> _preferredCodecs;bool _localNetworkIsLowCost = false;bool _remoteNetworkIsLowCost = false;bool _remoteIsLowDataRequested = false;absl::optional<ResolvedNetworkStatus> _currentResolvedLocalNetworkStatus;absl::optional<ResolvedNetworkStatus> _currentResolvedNetworkStatus;};

信令

_signaling(EncryptedConnection::Type::Signaling,_encryptionKey,[=](int delayMs, int cause) { sendSignalingAsync(delayMs, cause); }),

信令发送方式 :_sendSignalingMessage

在这里插入图片描述

sendSignalingAsync : 扔到主线程(mediathread) 执行延迟任务?

void Manager::sendSignalingAsync(int delayMs, int cause) {auto task = [weak = std::weak_ptr<Manager>(shared_from_this()), cause] {const auto strong = weak.lock();if (!strong) {return;}if (const auto prepared = strong->_signaling.prepareForSendingService(cause)) {strong->_signalingDataEmitted(prepared->bytes);}};if (delayMs) {_thread->PostDelayedTask(std::move(task), delayMs);} else {_thread->PostTask(std::move(task));}
}

媒体包发送 :_sendTransportMessage

	_sendTransportMessage = [=](Message &&message) {_networkManager->perform(RTC_FROM_HERE, [message = std::move(message)](NetworkManager *networkManager) {networkManager->sendMessage(message);});};

在Manager中完成对消息发送方的实现

  • 但是_sendSignalingMessage 是外部传递下来的:
    在这里插入图片描述

收到消息的处理

在这里插入图片描述

void Manager::receiveMessage(DecryptedMessage &&message) {const auto data = &message.message.data;if (const auto candidatesList = absl::get_if<CandidatesListMessage>(data)) {_networkManager->perform(RTC_FROM_HERE, [message = std::move(message)](NetworkManager *networkManager) mutable {networkManager->receiveSignalingMessage(std::move(message));});} else if (const auto videoFormats = absl::get_if<VideoFormatsMessage>(data)) {_mediaManager->perform(RTC_FROM_HERE, [message = std::move(message)](MediaManager *mediaManager) mutable {mediaManager->receiveMessage(std::move(message));});} else if (const auto remoteMediaState = absl::get_if<RemoteMediaStateMessage>(data)) {if (_remoteMediaStateUpdated) {_remoteMediaStateUpdated(remoteMediaState->audio,remoteMediaState->video);}_mediaManager->perform(RTC_FROM_HERE, [video = remoteMediaState->video](MediaManager *mediaManager) {mediaManager->remoteVideoStateUpdated(video);});} else if (const auto remoteBatteryLevelIsLow = absl::get_if<RemoteBatteryLevelIsLowMessage>(data)) {if (_remoteBatteryLevelIsLowUpdated) {_remoteBatteryLevelIsLowUpdated(remoteBatteryLevelIsLow->batteryLow);}} else if (const auto remoteNetworkStatus = absl::get_if<RemoteNetworkStatusMessage>(data)) {_remoteNetworkIsLowCost = remoteNetworkStatus->isLowCost;_remoteIsLowDataRequested = remoteNetworkStatus->isLowDataRequested;updateCurrentResolvedNetworkStatus();} else {if (const auto videoParameters = absl::get_if<VideoParametersMessage>(data)) {float value = ((float)videoParameters->aspectRatio) / 1000.0;if (_remotePrefferedAspectRatioUpdated) {_remotePrefferedAspectRatioUpdated(value);}}_mediaManager->perform(RTC_FROM_HERE, [=, message = std::move(message)](MediaManager *mediaManager) mutable {mediaManager->receiveMessage(std::move(message));});}
}

candidatesList 给到networkManager

	if (const auto candidatesList = absl::get_if<CandidatesListMessage>(data)) {_networkManager->perform(RTC_FROM_HERE, [message = std::move(message)](NetworkManager *networkManager) mutable {networkManager->receiveSignalingMessage(std::move(message));});}

VideoFormatsMessage 给到mediaManager

	} else if (const auto videoFormats = absl::get_if<VideoFormatsMessage>(data)) {_mediaManager->perform(RTC_FROM_HERE, [message = std::move(message)](MediaManager *mediaManager) mutable {mediaManager->receiveMessage(std::move(message));});

RemoteMediaStateMessage

    } else if (const auto remoteMediaState = absl::get_if<RemoteMediaStateMessage>(data)) {if (_remoteMediaStateUpdated) {_remoteMediaStateUpdated(remoteMediaState->audio,remoteMediaState->video);}_mediaManager->perform(RTC_FROM_HERE, [video = remoteMediaState->video](MediaManager *mediaManager) {mediaManager->remoteVideoStateUpdated(video);});}

RemoteBatteryLevelIsLowMessage 对端的电池

	} else if (const auto remoteBatteryLevelIsLow = absl::get_if<RemoteBatteryLevelIsLowMessage>(data)) {if (_remoteBatteryLevelIsLowUpdated) {_remoteBatteryLevelIsLowUpdated(remoteBatteryLevelIsLow->batteryLow);}} 

对端的网络

    } else if (const auto remoteNetworkStatus = absl::get_if<RemoteNetworkStatusMessage>(data)) {_remoteNetworkIsLowCost = remoteNetworkStatus->isLowCost;_remoteIsLowDataRequested = remoteNetworkStatus->isLowDataRequested;updateCurrentResolvedNetworkStatus();} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/115155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3传递prop踩坑

这是官方文档中的介绍&#xff1a; Vue3中文官网 我们在组件中定义props时推荐使用驼峰命名&#xff0c;但是在父组件中传递数据时要使用kebab-case形式 这是我写的loading组件中定义的几个porps 我在使用时是这样传入的 但是打印出来的值是&#xff1a; 可以看到这里的ou…

Merge Joins(PostgreSQL 14 Internals翻译版)

合并连接处理按连接键排序的数据集&#xff0c;并返回以类似方式排序的结果。输入集可以在索引扫描后预先排序;否则&#xff0c;执行者必须在实际合并开始之前对它们进行排序。 归并排序集 让我们看一个合并连接的例子;它在执行计划中由Merge Join节点表示&#xff1a; 优化器…

uni-app:多种方法写入图片路径

一、文件在前端文件夹中 1、相对路径引用 从当前文件所在位置开始寻找图片文件的路径。../../ 表示返回两级目录&#xff0c;即从当前文件所在的 wind.vue 所在的位置开始向上回退两级。接着&#xff0c;进入 static 目录&#xff0c;再进入 look 目录&#xff0c;最后定位到 …

uview1.0部分机型u-input组件禁用后无法触发click事件

最近&#xff0c;线上的一个 App 收到用户反馈&#xff0c;输入框禁用状态下点击无法拉起模态框。找了一下身边可用机型进行了测试&#xff0c;起初所有机型都没有复现这个问题&#xff0c;突然有一天 Redmi K30S Ultra 出现了异常&#xff0c;点击输入框无法触发点击事件&…

Oracle 数据库相关操作记录

1 数据库操作&#xff1a; 1.1 --调用存储过程&#xff1a; DECLARE P_DATA_DATE VARCHAR2(32767);--定义输入参数 P_O_RESULT VARCHAR2(32767); BEGIN P_DATA_DATE : 20220320;--输入日期 P_O_RESULT : NULL; TPS.PR_TP_RBC34_TMP ( P_DATA_DATE, P_O_RESULT );--输…

n皇后问题,不用递归

注释如下&#xff1a; class Solution:def totalNQueens(self, n: int) -> int:if n < 1: # 如果 n 小于 1&#xff0c;直接返回 0return 0count 0 # 初始化解的个数为 0stack [(0, set(), set(), set())] # 初始化一个栈&#xff0c;元素为当前处理的行数、已经放…

专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明

基本介绍 极限投屏是一款批量投屏管理安卓设备的软件&#xff0c;是QtScrcpy作者基于QtScrcpyCore开发&#xff0c;主要功能有&#xff1a; 设备投屏&控制&#xff1a;单个控制、批量控制分组管理wifi投屏adb shell快捷指令文件传输、apk安装 更多功能还在持续更新。 极…

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具&#xff0c;可以通过 Python 代码构造来定义用户行为&#xff0c;避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…

【限时免费】20天拿下华为OD笔试之 【单调栈】2023B-阿里巴巴找黄金宝箱(4)【欧弟算法】全网注释最详细分类最全的华为OD真题题解

【单调栈】2023B-阿里巴巴找黄金宝箱(4) 题目描述与示例 一贫如洗的椎夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从 0-N 的子&#xff0c;每个箱子上面有一人数字&#xff0c;箱子排列成一个环&#xff0c;编号最大的箱子的…

远程监控高并发高吞吐java进程

文章目录 背景工具jconsole和jvisualvm 压测实战以太坊Java程序监控1.使用jconsole监控2.使用jvisualvm监控 问题分析堆内存使用异常通过调整内存策略来应对&#xff1a; 交易虚增问题 背景 作为使用java技术栈的金融类公司&#xff0c;确保Java程序在生产环境中的稳定性和性能…

2023年【北京市安全员-B证】考试试卷及北京市安全员-B证模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-B证考试试卷考前必练&#xff01;安全生产模拟考试一点通每个月更新北京市安全员-B证模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过北京市安全员-B证在线考试很简单。 1、【多选题】《…

JVM(Java Virtual Machine)垃圾收集算法篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;主要介绍GC相关的算法&#xff0c;引用计数法、可达性分析算法、垃圾收集算法&#xff08;分代收集理论&#xff0c;标记-清除/整理/复制&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&…

leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解

leetcode 2525 根据规则将箱子分类 题目 给你四个整数 length &#xff0c;width &#xff0c;height 和 mass &#xff0c;分别表示一个箱子的三个维度和质量&#xff0c;请你返回一个表示箱子 类别 的字符串。 如果满足以下条件&#xff0c;那么箱子是 “Bulky” 的&#…

macrodata数据集在Python统计建模和计量经济学中的应用

目录 一、数据介绍二、应用三、statsmodels 统计模块四、使用 statsmodels 统计模块分析 macrodata.csv 数据集参考 一、数据介绍 macrodata.csv是一个示例数据集&#xff0c;通常用于统计分析和计量经济学中的教育和训练目的。这个数据集通常包括以下列&#xff1a; year&am…

深度学习八股文: 模型训练全过程及各阶段的原因

深度学习模型的训练全过程通常包括以下步骤&#xff1a; 数据准备&#xff1a; 首先&#xff0c;需要准备用于训练的数据集。数据集应包含输入特征&#xff08;通常是数值或图像数据&#xff09;和相应的目标标签。数据通常需要被分为训练集、验证集和测试集&#xff0c;以便评…

STM32使用WWDG窗口看门狗

1 WWDG 介绍 1.1 WWDG 简介 窗口看门狗 WWDG 其实和独立看门狗类似&#xff0c;它是一个 7 位递减计数器不断的往下递减计数&#xff0c; 当减到一个固定值 0X40 时还不喂狗的话&#xff0c;产生一个 MCU 复位&#xff0c;这个值叫窗口的下限&#xff0c;是固定的值&#xf…

支持语音与视频即时通讯项目杂记(二)

目录 概念&#xff1a; 视频帧&#xff08;Video Frame&#xff09;是组成视频的基本单元。它可以被视为一幅静止的图像&#xff0c;它在一定的时间间隔内连续播放&#xff0c;从而形成了流畅的视频。 Changes to Qt Multimedia New features in Qt 6 Removed features C…

居民小区电动汽车有序充电策略研究

摘 要&#xff1a;针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题&#xff0c;提出一种采用延迟充电的电动汽车有序充电控制策略&#xff0c;并在分析国内外电动汽车有序充电的研究现状后&#xff0c;设计了居民小区电动汽车有序充电策略的总体框架。…

android利用FFmpeg进行视频转换

大致思路&#xff1a;首先安装FFmpeg库到windows电脑上&#xff0c;先测试命令行工具是否可以使用&#xff08;需要先配置环境&#xff09;&#xff0c;之后再集成到android程序中。 一些命令&#xff1a; 转化为流文件&#xff1a; ffmpeg -i input.mp4 -codec copy -bsf:v …

JIT耗时优化

优质博文&#xff1a;IT-BLOG-CN 一、背景 业务流量突增&#xff0c;机器直接接入大量流量QPS2000&#xff0c;JIT和GC会消耗太多CPU资源&#xff0c;导致1-2分钟时间内的请求超时导致异常&#xff0c;因此采用流量预热的方式&#xff0c;让机器逐步接入流量&#xff0c;需要预…