libnbaio
libeffects
源代码位于:frameworks/av/media/libeffects。
libdrmframework
源代码位于:frameworks/av/drm/libdrmframework。
libmedia
源代码位于:frameworks/av/media/libmedia。
声音部分在7.3.1小节有描述。
接口定义:
说明 | |
ICrypto | |
IDrm | |
IDrmClient | 回调,notify接口 |
IEffect | |
IEffectClient | |
IHDCPObserver | |
IHDCP | |
IMediaLogService | |
IMediaMetadataRetriever | |
IMediaPlayer | 播放器接口 |
IMediaPlayerClient | 播放器对应的客户端回调接口 |
IMediaPlayerService | 媒体服务接口 |
IMediaRecorder | 录像机接口 |
IMediaRecorderClient | 录像机对应的客户端回调接口 |
IOMX | OMX接口 |
IOMXObserver | OMX消息通知接口,onMessage(const omx_message &msg) |
IRemoteDisplay | 远程屏幕控制接口,pause、resume |
IRemoteDisplayClient | 远程屏幕对应的客户端回调接口,onDisplayDisconnected |
IStreamSource | 流式数据源,通过IStreamListener回调主动提供数据 |
IStreamListener | 流式数据源监听者接口queueBuffer |
基类:
类名 | 说明 |
MediaPlayerBase | 播放器抽象基类,相对于IMediaPlayer,多了playerType接口,处理Notify回调 |
MediaPlayerBase:: AudioSink | 音频输出抽象基类 |
MediaPlayerInterface | 继承MediaPlayerBase,使用软件混音AudioSink |
MediaPlayerHWInterface | 继承MediaPlayerBase,直接输出视频 |
MediaRecorderBase | 录像机抽象基类 |
类说明:
类名 | 说明 |
IMediaDeathNotifier | 单例,管理IMediaPlayerService的死亡通知 |
JetPlayer | 播放Jet音效 |
MediaMetadataRetriever | 代理IMediaMetadataRetriever |
MediaPlayer | 管理IMediaPlayer,setDataSource请求MediaPlayerService创建新的IMediaPlayer实例;继承实现IMediaPlayerClient,处理notify回调,转发给注册的MediaPlayerListener 另外包装IMediaPlayerService::decode接口 |
MediaProfiles | 媒体格式映射, |
MediaRecorder | 管理IMediaRecorder实例,继承实现IMediaRecorderClient,处理notify回调,转发给注册的MediaRecorderListener |
MediaScanner | 扫描目录,调用MediaScannerClient接口处理目录和文件 |
MediaScannerClient | 处理目录和文件的基类,协助处理字符集识别转换,unicode/ucnv |
Metadata | Meta data序列化,size, key, type, value |
SoundPool | |
SoundPoolThread | |
ToneGenerator | |
Visualizer | 继承AudioEffect |
libstagefright
源代码位于:frameworks/av/media/libstagefright。
框架类:
类名 | 说明 |
AHandler | 消息处理器,绑定一个ALooper线程,通过ID识别 onMessageReceived() |
ALooper | 消息处理线程,有一个消息队列 |
ALooperRoster | 全局单例,维护ID到AHandler的映射,以及AHandler绑定的ALooper信息 |
AMessage | 消息,内部指定了AHandler的ID,保存键值对 |
ABuffer | 管理缓存,有效范围,释放时发出Farewell消息 |
ANetworkSession | 管理套接字select,内部线程,多个Session,收到的数据通过消息发出 |
AState | 状态机一个状态,响应消息,有父子关系 |
AHierarchicalStateMachine | 继承AHandler处理消息,改变状态 |
ParsedMessage | 包装HTTP/RTSP的应答 |
OMX类说明:编译为(libstagefright_omx.so)
类名 | 说明 |
OMXPluginBase | 管理编解码模块(OMX_COMPONENTTYPE)的创建释放 |
OMXMaster | 继承OMXPluginBase,内部管理多个OMXPluginBase实现,先入为主,硬件编解码优先 libstagefrighthw.so,导出createOMXPlugin接口 |
OMXNodeInstance | 包装OMX_HANDLETYPE,代表一个编解码模块 |
GraphicBufferSource | 协助OMXNodeInstance管理输入Surface的帧数据,继承BufferQueue::ConsumerListener,有时候会丢弃后者复制最后一帧 |
OMX | 继承实现IOMX接口,管理node_id映射OMXNodeInstance;使用OMXMaster |
OMX:: CallbackDispatcher | 启动内部线程分发消息给对应的OMXNodeInstance,事件处理调用序列: OMXNodeInstance::OnEvent(OMX_EVENTTYPE) OMX::OnEvent(OMX_EVENTTYPE) OMXNodeInstance::onEvent(OMX_EVENTTYPE) CallbackDispatcher::post(omx_message) CallbackDispatcher::dispatch(omx_message) OMXNodeInstance::onMessage(omx_message) |
SoftOMXComponent | 软件编解码模块,将C接口转换为C++虚方法,引用计数 |
SimpleSoftOMXComponent | 继承SoftOMXComponent;ALooper线程,缓存管理 |
SoftOMXPlugin | libstagefright_soft_*.so,导出createSoftOMXComponent接口,创建SoftOMXComponent实例,使用静态列表描述所有编解码模块OMX.google.* |
SoftVideoDecoderOMXComponent | 继承SimpleSoftOMXComponent |
核心类:
类名 | 说明 |
MetaData | 一组键值对 |
DataSource | 数据源,提供sniff接口,一组静态SnifferFunc |
MediaExtractor | 媒体属性获取,创建MediaSource |
MediaSource | 媒体源,音频或者视频,setBuffers、read |
MediaBuffer | 多种类型缓存的联合体,void*,malloc, GraphicBuffer、ABuffer、克隆 |
MediaBufferObserver | 监视MediaBuffer释放 |
MediaWriter | 媒体格式写入,从多个MediaSource获取音视频数据,事件通知IMediaRecorderClient,派生类一般创建线程驱动读写。 |
MediaMuxer | 媒体格式写入,使用者驱动writeSampleData() 使用MediaWriter实现,使用MediaAdapter适配MediaWriter的pull模式。 |
MediaAdapter | 继承MediaSource |
类说明:
类名 | 说明 |
MediaCodecList | 管理CodecInfo优先级查找,/etc/media_codecs.xml |
MediaCodecList:: CodecInfo | mName、mIsEncoder、mTypes(位数组)、mQuirks(位数组),位数组映射如audio/3gpp到一个位 |
OMXCodec | 继承MediaSource、MediaBufferObserver 使用MediaCodecList查找编解码模块,处理flags,对编解码过滤排序 使用IOMX接口创建编解码模块,处理Meta,配置OMX节点参数 OMXCodec由外部调用read驱动,同时响应OMX事件 |
OMXCodecObserver | 继承实现IOMXObserver,将OMX事件转发给OMXCodec处理 |
MuxOMX | 继承实现IOMX,包含MediaPlayerService的全局IOMX实例,同时包含一个本地OMX实例,软编解码模块从本地创建 |
OMXClient | 与IOMX连接,远程连接使用MuxOMX封装 |
ACodec | 继承AHierarchicalStateMachine,处理OMX状态,缓存管理 |
MediaCodec | 继承AHandler,使用外部公共Looper线程处理消息,包含一个ACodec(使用外部Looper,video类型专用Looper) 基于消息驱动,协调MediaCodec使用者与ACodec的异步工作流 》使用者: dequeueInputBuffer write to buffer queueInputBuffer dequeueOutputBuffer read from buffer releaseOutputBuffer 》ACodec: ACodec::kWhatFillThisBuffer ACodec::kWhatDrainThisBuffer |
MediaCodec:: BufferInfo | 捆绑一个缓存所有相关信息 |
类说明:
类名 | 说明 |
AudioPlayer | 持有外部传入的AudioSink和MediaSource,响应AudioSink回调从MediaSource读取数据,继承TimeSource提供时间源 |
TimedEventQueue | 事件回调线程,Event::fire() |
AwesomeEvent | 在fire中调用AwesomePlayer的指定方法 |
AwesomeRenderer | render虚方法 |
AwesomeLocalRenderer | 使用SoftwareRenderer渲染 |
SoftwareRenderer | 在NativeWindow在渲染,memcpy或者使用ColorConverter |
AwesomeNativeWindowRenderer | 直接queueBuffer到NativeWindow,使用硬件旋转图像 native_window_set_buffers_transform |
AwesomePlayer | 持有AudioPlayer,在onVideoEvent中播放视频 使用MediaExtractor、OMXCodec、TimedEventQueue |
StagefrightMetadataRetriever | 继承实现MediaMetadataRetrieverBase,包含DataSource、MediaExtractor,使用OMXCodec解码,获取指定时间点的图像 |
StagefrightMediaScanner | 继承MediaScanner,使用MediaMetadataRetriever,运行在应用进程中。 |
DataSource继承体系:
类名 | 说明 |
DataUriSource | 继承DataSource,处理DATAURI |
FileSource | |
HTTPBase | HTTP抽象基类,继承DataSource |
ChromiumHTTPDataSource | 继承实现HTTPBase,使用SfDelegate处理HTTP |
NuCachedSource2 | 继承DataSource,使用PageCache缓存数据 |
MediaExtractor继承体系:
类名 | 说明 |
MPEG4Extractor |
MediaSource继承体系:
类名 | 说明 |
SurfaceMediaSource | 继承MediaSource,持有一个BufferQueue,外部作图 |
AudioSource | 继承MediaSource,持有一个AudioRecord,通过回调接收底层数据 |
OMXCodec | 见上 |
MPEG4Source |
libstagefright_httplive
类名 | 说明 |
LiveSession | 继承AHandler,在消息循环线程处理任务,采用Notify消息回调使用者,一般独立线程工作 |
M3UParser | |
PlaylistFetcher | 使用LiveSession的Looper |
LiveDataSource |
libstagefright_nuplayer
类名 | 说明 |
NuPlayerDriver | 继承实现MediaPlayerInterface,内部包含一个ALooper,驱动一个NuPlayer实例 |
NuPlayer | 继承实现AHandler,大部分操作在消息循环线程处理 |
NuPlayer::Action | 封装NuPlayer操作的抽象基类,定义execute接口 |
NuPlayer::SeekAction | 继承NuPlayer::Action,调用NuPlayer::performSeek |
NuPlayer:: SetSurfaceAction | 继承NuPlayer::Action,调用NuPlayer::performSetSurface |
NuPlayer::ShutdownDecoderAction | 继承NuPlayer::Action, 调用NuPlayer::performDecoderShutdown |
NuPlayer:: PostMessageAction | 继承NuPlayer::Action,调用AMessage::post |
NuPlayer:: SimpleAction | 继承NuPlayer::Action,调用NuPlayer的无参数方法 |
NuPlayer::Source | 封装NuPlayer的媒体源,可以获取媒体消息。继承AHandler,在消息循环线程处理任务,采用Notify消息回调使用者,从dequeueAccessUnit接口获取媒体数据,非阻塞。 |
NuPlayer:: | 继承实现NuPlayer::Source,使用DataSource加MediaExtractor实现。通过AnotherPacketSource缓存数据。 |
NuPlayer:: HTTPLiveSource | 继承实现NuPlayer::Source,使用LiveSession(使用独立的ALooper)实现。 |
NuPlayer::RTSPSource | 继承实现NuPlayer::Source |
NuPlayer:: StreamingSource | 继承实现NuPlayer::Source,封装IStreamSource,使用NuPlayerStreamListener监听数据 |
NuPlayer::NuPlayerStreamListener | 继承实现IStreamListener,拷贝数据给StreamingSource的使用者 |
NuPlayer::Decoder | 继承AHandler,主要处理解码配置数据,封装ACodec实现(分配独立的ALooper线程) |
NuPlayer::Renderer | 继承AHandler,基于消息驱动执行音视频渲染, 通过AudioSink渲染声音, 通过SoftwareRenderer渲染图像 |
SoftwareRenderer |
libstagefright_wfd
类名 | 说明 |
WifiDisplaySource | RTSP服务端,响应请求建立播放会话,继承AHandler处理消息 响应SETUP请求创建PlaybackSession |
WifiDisplaySource:: PlaybackSession | 内部包含MediaSender,SurfaceMediaSource,AudioSource,Converter,MediaPuller,Track。 创建pull_looper codec_looper |
RepeaterSource | 继承MediaSource,包装一个MediaSource,内部MediaSource没有立即数据时,重复上一帧,创建repeater_looper线程读取数据 |
MediaPuller | 从MediaSource读取数据(阻塞,需要独立的ALooper),发给Converter处理(Notify消息),继承AHandler,消息驱动,暂停状态也不停读数据并丢弃 |
Converter | 使用编码MediaCodec,继承AHandler处理消息 |
WifiDisplaySource:: PlaybackSession:: Track | 捆绑MediaPuller、Converter |
MediaSender | 内部包含TSPacketizer 和RTPSender(TS方式),或者两个RTPSender(AAC+AVC方式)。 数据接口是queueAccessUnit(),继承AHandler处理消息 |
TSPacketizer | 主要接口:packetize() |
RTPSender | 发送RTP/RTCP报文,支持UDP TCP方式,queueBuffer(),继承AHandler处理消息 |
libmediaplayerservice
源代码位于:frameworks/av/media/libmediaplayerservice。
类说明:
类名 | 说明 |
Crypto | 继承实现ICrypto |
Drm | 继承实现IDrm |
HDCP | 继承实现IHDCP |
MediaPlayerFactory | 管理多种播放器实现:StagefrightPlayer、NuPlayerDriver、MidiFile,选择最优实现 |
MediaPlayerService | 管理播放、录制会话,管理IOMX、ICrypto |
MediaPlayerService:: AudioOutput | 继承实现MediaPlayerBase.AudioSink,使用AudioTrack实现 |
MediaPlayerService:: AudioCache | 继承实现MediaPlayerBase.AudioSink,在线程CallbackThread中使用AudioCallback回调获取音频数据,数据存在IMemoryHeap中。 |
MediaPlayerService:: Client | 继承实现IMediaPlayer,内部管理一个MediaPlayerBase实例,AudioOutput和ANativeWindow;调用IMediaPlayerClient回调 |
MediaRecorderClient | 继承实现IMediaRecorder,内部管理一个MediaRecorderBase |
MetadataRetrieverClient | 继承实现IMetadataRetriever, 内部管理一个MediaMetadataRetrieverBase |
MidiFile | 继承实现MediaPlayerInterface,AudioSink由外部设置 |
MidiMetadataRetriever | 继承实现MediaMetadataRetrieverBase,通过MidiFile实现 |
SharedLibrary | 封装dlopen、dlsym、dlclose、dlerror |
StagefrightPlayer | 继承实现MediaPlayerInterface,通过AwesomePlayer实现 |
StagefrightRecorder | 继承实现MediaRecorderBase,内部持有ICamera、AudioSource、MediaWriter,编码器由OMXCodec创建 |
RemoteDisplay | 继承实现IRemoteDisplay,内部包含WifiDisplaySource,并为其提供wfd_looper线程 |
libmedialogservice
源代码位于:frameworks/av/services/medialog。
mediaserver
源代码位于:frameworks/av/media/mediaserver。
运行AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService服务。
如果"ro.test_harness"大于0,那么运行MediaLogService,启动子进程运行上面的服务。