源代码位于:frameworks/av/media/libeffects。
源代码位于:frameworks/av/drm/libdrmframework。
源代码位于: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 |
源代码位于: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 |
类名 |
说明 |
LiveSession |
继承AHandler,在消息循环线程处理任务,采用Notify消息回调使用者,一般独立线程工作 |
M3UParser |
|
PlaylistFetcher |
使用LiveSession的Looper |
LiveDataSource |
类名 |
说明 |
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 |
类名 |
说明 |
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处理消息 |
源代码位于: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线程 |
源代码位于:frameworks/av/services/medialog。
源代码位于:frameworks/av/media/mediaserver。
运行AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService服务。
如果"ro.test_harness"大于0,那么运行MediaLogService,启动子进程运行上面的服务。