Android 框架实现分析 - 多媒体 - Native层

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::
GenericSource

继承实现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,启动子进程运行上面的服务。

你可能感兴趣的:(Android,框架实现分析,android)