rtc_base属于WebRTC的基础模块,属于最基础的模块,它里面大部分的封装主要解决平台差异(不同的平台间相同的功能系统函数会存在差异以及平台间提供的功能会有差异或者缺失),它封装了各种使用功能以及对第三库进一步封装让其更加好用,它封装了各种通用数据结构与算法。
- 字符处理相关的封装:封装了兼容Win32的wchar_t和char类型的各种字符串处理函数,封装了各种类型的编码转换
- 文件(夹)相关的封装:路径管理Pathname、文件操作File、文件件迭代器DirectoryIterator、文件系统操作Filesystem、选项文件OptionsFile
- 网络处理相关的封装:IP地址封装IPAddress、带端口的IP地址SocketAddress、同步套接字Socket、异步套接字AsyncSocket、网卡信息Network、网卡管理NetworkManager、
- 缓冲区相关的封装:位操作BitBuffer、字节操作ByteBuffer、支持自动扩容的缓冲区BufferT、缓冲队列管理BufferQueue以及各种流处理封装FileStream、MemoryStream等
- 线程相关的封装:带消息队列管理的跨平台线程Thread、不带消息队列的PlatformThread、专注处理消息的TaskQueue、只执行一次任务SignalThread
- 日志断言相关的封装:终端日志LOG、事件追中日志EventTracer、日志文件FileRotatingLogSink、断言RTC_CHECK、调试模式下断言RTC_DCHECK
- 一些实用封装:Optional、sigslot、MD5、Base64、CRC、JSON、AtomicOps
文件 | 简介 |
---|---|
asyncinvoker | 封装了一个异步调用的类AsyncInvoker,该类会保证通过该对象的异步调用都会被执行(调用时计数加一,调用结束计数减一,当析构时判断计数大于0则等待调用完成),且允许异步转同步(Flush),此类通过原子操作和内存顺序来保证线程安全 |
asyncpacketsocket | 封装了一个异步收包的套接字AsyncPacketSocket(虚类,TCP/UDP分别实现一个对应的子类),发送数据不做缓冲,因为在高负载下丢弃数据包是可以接受的 |
asyncresolverinterface | 封装了一个异步解析hostname的类AsyncResolverInterface(虚类) |
asynctcpsocket | 虚类AsyncPacketSocket的TCP协议的通用实现AsyncTCPSocketBase(Server和Client端的通用部分),以及WebRTC版的异步TCP协议套接字的实现AsyncTCPSocket(在数据的头部用两个字节表示数据的长度,发送和接收数据都需要特殊处理),为了保证数据的可靠性,数据先存储到内存中,以处理发送失败或者发送不全的情况 |
asyncudpsocket | 虚类AsyncPacketSocket的UDP协议的实现AsyncUDPSocket |
atomicops | 统一POSIX和Windows的原子操作接口为:Increment、Decrement、AcquireLoad、ReleaseStore、CompareAndSwap、AcquireLoadPtr和CompareAndSwapPtr |
base64 | 实现了base64的编码和解码功能 |
bind | 封装了一个模板函数Bind,用于绑定类对象的函数为一个变量,新版的WebRTC中以及去掉了,改用lambda或者std::bind |
bitbuffer | 封装了一个位缓冲BitBuffer,用于读取buffer的特定连续的位的值,例如用来解析SPS/PPS数据结构。还封装了一个BitBufferWriter,它是BitBuffer的子类,增加了写的语法,在WebRTC中它用于修改SPS中的VUI的结构 |
bufferqueue | 封装了一个线程安全的BufferQueue,它内部使用std::deque<Buffer*> 来存储buffer,Buffer是uint8_t类型的BufferT |
bytebuffer | 封装了一个可以按byte为最小颗粒的操作ByteBufferWriter和ByteBufferReader,支持大端和小端 |
checks | 封装了断言宏(RTC_CHECK、RTC_CHECK_EQ、RTC_DCHECK、RTC_DCHECK_NE等),当条件不匹配的时候会打印自定义错误信息、当前文件和行号信息,还会打印调用栈(通过backtrace实现)。在debug版本中RTC_DCHECK的功能和RTC_CHECK一样,在非debug版本中RTC_DCHECK不会执行断言,只会输出错误信息而已 |
copyonwritebuffer | 封装了一个写时复制缓存CopyOnWriteBuffer,其实就是封装了一个共享指针Buffer以及处理nullptr Buffer的情况,WebRTC中常用于RTP包的传递 |
cpu_time | 获取进程和线程时间(单位是纳秒),仅支持Linux、Mac和Windows平台 |
crc32 | WebRTC实现的一个RFC 1952标准的CRC32循环冗余校验,P2P模块中有用到 |
criticalsection | 封装跨平台的递归互斥锁CriticalSection(同一个线程允许重复获得同一个锁),以及临界区CritScope(构造时自动获取锁,析构时释放锁),一个基于引用计数实现的全局锁GlobalLockPod以及对应的临界区GlobalLockScope |
cryptstring | 封装了一个加密字符串CryptString,加密字符串的字符可以是任意字符,所以在获取大小和操作时和普通字符有细微的差别 |
event | 封装了一个统一的匿名事件Event(用于阻塞(Wait)和恢复(Set)线程),Windows平台本身就支持,POSIX平台需要自行实现一个和Windows平台一样的功能 |
fakeclock | 一个假的时钟,它并不会自动滴答,它被用于VirtualSocketServer中(一个虚拟的Socket服务(没有实际硬件支持)) |
file | 封装了一个平台无关的文件类File,磨平了平台的差异,支持Open、Crate、Remove、Close、Write、Read、WriteAt、ReadAt、Seek和IsOpen操作 |
file_posix | 实现了POSIX架构(Linux、Mac、Android、iOS)的文件操作Close、Write、Read、WriteAt、ReadAt和Seek |
file_win | 实现了Windows平台的文件操作Close、Write、Read、WriteAt、ReadAt和Seek |
filerotatingstream | 封装了一个循环读写文件的类FileRotatingStream,允许指定单个文件最大大小以及最大文件个数,它的作用是保留最近的日志文件。还封装了一个保留开头和结尾日志的类CallSessionFileRotatingStream,一旦超过限制则删除中间的日志 |
fileutils | 封装了一个目录迭代器DirectoryIterator,可以用于遍历给定目录下的所有文件夹及目录。还封装了一个文件系统Filesystem,实现了与平台无关的操作:DeleteFile、CreateFolder、MoveFile、IsFolder、IsFile、TempFilename和GetFileSize |
firewallsocketserver | 实现一个简单的防火墙,支持控制是否使能UDP Socket、TCP Socket和TCP监听,支持配置输入输出流的规则(TCP/UDP的输入输出规则)、支持配置输入输出的目的地址(黑白名单) |
flags | 对main函数的参数进行封装,方便读取参数,支持默认值和类型判断 |
helpers | 对随机数进行封装,方便获取各种类型的随机数以及随机字符串 |
httpbase | 实现了一个http基础逻辑HttpBase,内部维护了一个状态机以及处理http的数据交互逻辑 |
httpcommon | http通用数据结构的定义及实现,例如:错误码、版本号、http方法、头部类型、URL、请求数据HttpRequestData(header、body)和回应数据HttpResponseData(header、body) |
httpserver | 实现了一个http服务器HttpListenServer |
ifaddrs-android | 在Android平台实现getifaddrs 和freeifaddrs 函数以及封装了一个ifaddrs 数据结构,其他平台支持这两个接口但是Android平台原生是不支持的,可以好好看看WebRTC是如何实现的。getifaddrs用于获取本地网络信息的,例如设备列表,设备ip地址,广播地址等。 |
ifaddrs_converter | 地址转换,把原生层的数据结构ifaddrs转换为WebRTC封装的InterfaceAddress |
ipaddress | 对IP地址的封装IPAddress和InterfaceAddress,IPAddress重载了== 、!= 、< 和> 、地址支持string、sensitive_string和uint32_t(AF_INET)类型输出,还支持IPV4转IPV6类型。InterfaceAddress是IPAddress的子类,增加了IPv6属性(None、Temporary、Deprecated) |
json | 对jsoncpp的封装,做了一些兼容处理并让接口更加统一 |
location | 对文件名、函数名和行号的封装,用于logging |
logging | 日志管理,日志级别参考Android的Logcat,支持三种输出方式:标准输出、文件和回调(LogSink),而且三种输出方式的日志级别可以各不相同 |
logsinks | 日志文件管理,是LogSink的子类,基于FileRotatingStream实现日志文件管理,支持设置单个日志文件大小,以及最多文件个数,当超过文件个数之后循环写入,值保留最近的日志 |
macifaddrs_converter | 获取iOS和Mac的IP地址属性并转换为WebRTC封装的属性(IPv6AddressFlag),并且iOS平台本身是不支持获取这个属性的,可以看看WebRTC是如何实现的 |
macutils | 实现了CFStringRef和std::string转换,以及获取Mac平台的系统版本 |
md5 | MD5的实现,提供C风格的接口 |
md5digest | 基于MD5实现的MessageDigest |
memory_usage | 获取当前进程的内存使用情况(单位是bytes),仅支持PC平台(Windows、Linux、Mac) |
messagedigest | 实现了多种类型的消息摘要算法,包括MD5、SHA_1、SHA_224、SHA_256、SHA_384和SHA_512 |
messagehandler | 封装了一个消息处理器MessageHandler(调用指定函数OnMessage执行该消息)以及一个函数消息处理器FunctorMessageHandler(自动执行给定函数), |
messagequeue | 一些消息队列相关的封装,消息数据MessageData(以及Scoped、ScopedRef等类型的数据)、消息(位置信息posted_from、属于谁phandler、消息号message_id、消息内容pdata以及该消息延迟执行时间ts_sensitive)、消息队列MessageQueue(负责管理消息(出入、清除、暂停、执行),每个Thread都会继承MessageQueue) |
natserver | - |
natsocketfactory | - |
nattypes | 定义了NAT类型NATType,定义了一个抽象NAT类(用于判断不同类型的NAT的特性)且实现了每种类型对应的子类 |
nethelpers | 封装了一个异步获取HostName对应的IP地址的类AsyncResolver |
network | 网络设备相关的封装,定义了一个网卡管理虚类NetworkManager(网卡列表、变化监听、网卡信息(名字、IP、Mask、Type、Cost、Active等))、通用逻辑实现NetworkManagerBase、通用实现BasicNetworkManager、Android平台还有一个平台相关的实现AndroidNetworkMonitor |
nullsocketserver | 实现一个空的SocketServer子类NullSocketServer,用于不支持的平台 |
openssladapter | - |
openssldigest | 基于OpenSSL实现的MessageDigest,它同时实现了SHA_1、SHA_224、SHA_256、SHA_384和SHA_512 |
opensslidentity | - |
opensslstreamadapter | - |
optional | 实现了一个模板可选项Optional,实现了默认构造、拷贝构造、右值构造、右值拷贝、重载了= 、bool 、== 、!= 、-> 等符号。和C++17的std::optional功能类似 |
optionsfile | 实现简单选项的存储到磁盘上的文本文件中,可以用于简单的配置文件,而且key不能相同,简单来说就是存储和操作文件中的kv选项 |
pathutils | 封装了一个路径类Pathname,实现了获取文件夹路径、父文件路径、文件名、后缀名、基础文件名(不带后缀)功能 |
physicalsocketserver | POSIX平台下的Socket相关实现,实现了同步套接字PhysicalSocket、异步套接字SocketDispatcher和套接字服务PhysicalSocketServer |
platform_file | 抽象(typedef)了一个平台无关的文件句柄类型PlatformFile,并实现Open、Close、Create、Remove以及PlatformFile转FILE的功能 |
platform_thread | 封装了一个平台无关的线程类PlatformThread,以及实现一些与平台无关的线程相关函数:CurrentThreadId、CurrentThreadRef、IsThreadRefEqual和SetCurrentThreadName。rtc::PlatformThread和rtc::Thread相比,rtc::PlatformThread仅仅实现了一个平台无关的线程,rtc::Thread实现了一个带任务管理的线程 |
proxyinfo | 封装一个代理信息数据结构ProxyInfo |
proxyserver | 实现了一个代理服务器 |
race_checker | 封装了一个检测是否使用同一个线程的类RaceChecker,用于限制某几个函数同一时刻只能允许一个线程调用。例如A、B两个函数,如果a线程正在调用A函数,此时b线程调用B函数则会发生崩溃 |
random | 封装了一个非系统随机数Random(假的随机数),并实现了获取指定范围内的随机数的功能 |
rate_limiter | 封装了一个码率限制的类webrtc::RateLimiter,用于限制音视频最大发送码率,SetMaxRate设定一个最大码率,当要发送数据的时候先判断(TryUseRate)加上此数据是否超过最大码率 |
rate_statistics | 封装了一个计算最近一段时间内的码率的类RateStatistics,时间单位刻度是毫秒,原理是把每个点(毫秒)的数据存起来(用数组存储,类似一个滑动窗口),随着时间的推移移动这个窗口,把窗口之外的数据移除(保留最近一段时间内的数据) |
ratelimiter | 封装了一个码率限制的类rtc::RateLimiter,它的实现比webrtc::RateLimiter简单,时间单位刻度是秒,时间复杂度低内存占用少,用于限制非音视频数据最大发送码率,实现原理是记录一个时间窗口的开始和介绍位置以及这段时间内收到的包大小,当超过这段时间后重置时间窗口 |
ratetracker | 封装了一个速率跟踪器RateTracker,用于计算给定时间内的速率,实现原理是使用桶来存储一段时间内(bucket_milliseconds)的数据,桶的个数(bucket_count)和每个桶记录的时间长度(bucket_milliseconds)决定了能记录最近时间的范围 |
rollingaccumulator | 封装了一个最近样本存储和计算的类RollingAccumulator,存储最近的N个样本,并记录样本中的最大最小值,样本数,计算样本的平均值、加权平均值和方差,WebRTC在在抖动估计中用此类来计算帧率 |
rtccertificate | - |
rtccertificategenerator | - |
sequenced_task_checker | 封装了一个辅助类SequencedTaskChecker,用于检测某个类的某些方法是否在同一个线程或者任务队列上被调用。如果对象是在任务队列上创建的,则SequencedTaskChecker绑定到任务队列,否则绑定到线程 |
sha1 | SHA_1的实现,提供C风格的接口 |
sha1digest | 基于SHA_1实现的MessageDigest |
signalthread | SignalThread一个带信号的线程(执行完任务会发一个信号SignalWorkDone),它是一个抽象类,抽象了线程执行的各个环节OnWorkStart、DoWork、OnWorkStop和OnWorkDone。 |
sigslot | 线程安全的信号槽(可以理解为对回调函数的封装),目前它只提供了最多9个参数的信号槽(signal9),如果有更多的参数要求可以自行扩展一下,内部使用std::list来存储槽,它是依据注册的先后顺序执行的,并且是同步的,所以如果是指针或者引用类型的数据有可能会在前面的环节被修改 |
socketadapters | - |
socketaddress | 封装了一个网络地址类SocketAddress(包含IP/HostName和Port),实现了各种使用的功能:支持各种类型的地址、ToString、FromString等 |
socketaddresspair | 封装了一个记录原地址和目标地址的类SocketAddressPair,并重载了== 和< 运算法 |
socketstream | 使用Socket实现一个StreamInterface子类SocketStream |
ssladapter | - |
sslfingerprint | - |
sslidentity | - |
sslstreamadapter | - |
stream | 封装了各种各样的异步流,StreamInterface是一个虚类,抽象了流的操作接口(Read、Write、Close、异步信号等)。实现了空流NullStream、文件流FileStream、内存流MemoryStream、扩展内存流ExternalMemoryStream、FIFO流FifoBuffer(线程安全)、字符串流StringStream |
string_to_number | 封装了一个不会发生错误的字符串转数字的函数StringToNumber,返回值是一个rtc::Optional模板类型的整型对象,基于std::strtoll和std::strtoull实现的 |
stringencode | 字符串相关功能的封装,例如:utf8编解码、url编解码、html编解码、xml编解码、16进制编解码、转义、字符串拆分、基本类型与字符串相互转换等 |
stringutils | 统一POSIX和Windows的字符串处理接口,使wchar_t和char类型的处理接口一样。还封装了一些非系统库的字符串处理,例如replace_substrs、starts_with、ends_with、string_trim |
task_queue_gcd | 使用iOS和Mac系统SDK实现rtc::TaskQueue类,它会为每个TaskQueue创建一个单独的线程(线程由系统维护),任务队列也是由系统维护 |
task_queue_libevent | 使用libevent库实现rtc::TaskQueue类(Android、Linux以及非iOS和Mac平台的Unix系统的实现),它需要自己创建和维护一个单独的线程,任务队列由libevent维护 |
task_queue_win | 使用Win32系统SDK实现rtc::TaskQueue类,它需要自己创建和维护一个单独的线程和事件(用于唤醒线程),任务队列由系统维护 |
task_queue | 封装了一个平台无关的任务队列TaskQueue,它提供的是一个FIFO类型的队列,此类提供了线程安全的任务管理功能(Post立即任务、PostDelayed延迟任务),当任务列表被销毁的时候还有任务没有执行完,剩下的任务会被销毁。任务列表关注的是任务,所以我们不能控制线程,只要列表还在线程就跑着。 |
thread | 封装了一个平台无关的带消息队列的线程rtc::Thread,它的队列是自己实现的并非像TaskQueue一样是与平台相关,Thread内部存在两个消息队列,其中父类MessageQueue维护一个异步消息队列,Thread本身维护一个同步消息队列,同步消息队列的优先级较高。线程类关注的是线程本身,线程可以随时停止和重新开始,消息任务不会因为线程本身销毁而被销毁 |
timedelta | 封装一个以纳秒为单位的时间类TimeDelta,并提供了转换为其他单位(秒、微妙、毫秒等)的函数,并重载了与之相关的所有符号- 、+ 、* 、/ 等,有点类似于C++的std::chrono::duration ,但是没有std::chrono::duration 提供的功能丰富 |
thread_checker_impl | 封装了一个线程是否形同的类ThreadCheckerImpl,构造时获取当前线程的id,通过CalledOnValidThread检测线程是否相同 |
timestampaligner | 封装了一个将相机采集时间戳转换为系统单调递增时间戳的一个类TimestampAligner,那为啥不直接使用系统单调递增时间戳呢?因为相机的内置的时间戳更加精准,但是相机时间戳采用的锚定时间是未知的 |
timeutils | 封装了时间工具,单调递增的时间戳SystemTimeMillis、TimeNanos、Time32(低32位)、TimeMillis、TimeMicros、TimeAfter等,还有tm转秒函数TmToSeconds,墙上时间函数TimeUTCMicros |
unixfilesystem | 虚类FilesystemInterface在Unix平台的实现 |
virtualsocketserver | 实现一个虚拟的套接字VirtualSocket(它相当于是把Socket的功能模拟了一遍)以及套接字服务VirtualSocketServer,使用同一个VirtualSocketServer创建的Socket可用相互通信(需要绑定在同一个虚拟网卡),这个虚拟套接字一般用来做回环测试和丢包测试等。 |
weak_ptr | 实现一个弱指针WeakPtr以及弱引用工厂WeakPtrFactory,这里的弱引用和C++上的实现有所不同,弱引用的生命周期由WeakPtrFactory控制 |
win32 | 实现一些与win32平台相关的功能,例如网络相关inet_ntop、字符串编码相关utf8/16、时间戳相关FileTimeTo(From)UnixTime以及系统版本等功能 |
win32filesystem | 虚类FilesystemInterface在Win32平台的实现 |
win32securityerrors | Security相关的错误码对应的错误信息 |
win32socketserver | Win32平台下的Socket相关实现,实现了同步和异步套接字Win32Socket以及套接字服务Win32SocketServer |
win32window | 封装了一个Win32平台的窗口(HWND) |
window | 定义一个通用的窗口类型WindowT,以及管理次窗口类型的WindowId类 |