@startuml MediaPlayer

skinparam {
    ' monochrome true
    ClassBorderColor white
    ClassBackgroundColor white
    Shadowing false
    NoteFontColor #Black
    NoteFontSize 16
    NoteTextAlignment left
    NoteBackgroundColor WhiteSmoke
    NoteColor transparent
    NoteBorderThickness 0
    NoteBorderColor transparent
    NoteBorderThickness 0
    ' Linetype ortho
    ' Linetype polyline
}

package "<font size=48>MediaPlayerService</font>" {
    class "MediaPlayerService::Client" as Client
    class MediaPlayerService
    interface IMediaPlayerService
}

package "<font size=48>MediaExtractor</font>" {
    interface "IMediaSource" as AudioMediaSource
    interface "IMediaSource" as VideoMediaSource
    class RemoteMediaSource
    class MediaTrack
    class MediaTrackCUnwrapper
    class MediaTrackHelper
    class MPEG4Source
    class MediaBufferGroup
    class MediaBufferGroupHelper
    class CMediaBufferGroup
    class RemoteMediaExtractor
    interface IMediaExtractor
    class InternalData
    class MediaBufferBase
    class MediaBuffer
    class "void *" as DATA
    interface IMemory
    interface IMemoryHeap
    class MemoryBase
    class MemoryHeapBase
}

package "<font size=48>NuPlayer</font>" {
    class NuPlayer
    class NuPlayerDriver
    class "NuPlayer::Decoder" as Decoder
    class "NuPlayer::DecoderBase" as DecoderBase
    interface MediaPlayerInterface
    class MediaPlayerBase
    class Source
    class GenericSource
    class "Track" as TrackVideo
    class "Track" as TrackAudio
    class AudioOutput
    class "NuPlayer::Renderer" as NuPlayerRenderer
    class "MediaPlayerBase::AudioSink" as MediaPlayerBaseAudioSink
}


package "<font size=48>MediaCodec(CCodec)</font>" {
    class BufferCallback
    class MediaCodec
    class CodecBase
    class BufferChannelBase
    class "CCodec::ClientListener" as ClientListener
    class "Client2Client::Listener" as Listener
    class CCodec
    class CCodecBufferChannel
    class HidlListener
    interface IHwComponentListener
    class "Codec2Client::Component" as Codec2ClientComponent
    class "Codec2Client::Component::OutputBufferQueue" as Codec2ClientComponentOutputBufferQueue
    class OutputBufferQueue
}


package "<font size=48>C2Work</font>" {
    class C2Work
    class C2FrameData
    class "C2FrameData" as OutputFrame
    class C2Worklet
}

package "<font size=48>Output</font>" {
    class OutputBuffers
    ' class OutputBuffersArray
    class Output
    class "Codec2Buffer" as DummyCodec2Buffer
    class FlexOutputBuffers
    class GraphicOutputBuffers
    ' class BuffersArrayImpl
    class "Entry" as OutputEntry
    class DummyContainerBuffer
    class FlexBuffersImpl
    class "MediaCodecBuffer" as OutputMediaCodecBuffer
    class "BufferInfo" as OutputBufferInfo
}

package "<font size=48>Input</font>" {
    class Input
    class "Entry" as InputEntry
    class InputBuffers
    class LinearInputBuffers
    class "FlexBuffersImpl" as InputFlexBuffersImpl
    class LinearBlockBuffer
    class Codec2Buffer
    class MediaCodecBuffer
    class ABuffer
    class BufferInfo
    class "C2WriteView::Impl" as C2WriteViewImpl
    class C2WriteView
}

package "<font size=48>ION</font>" {
    class "C2HandleIon" as ImplC2HandleIon
    class "C2AllocationIon::Impl" as C2AllocationIonImpl
    class "C2AllocationIon::ImplV2" as C2AllocationIonImplV2
    class "int" as IonFd
    class "void *" as MAPDATA
    class C2AllocationIon
    class C2AllocatorIon
    class C2HandleIon
    class C2Allocator
    class native_handle_t
    class "int" as BufferFd
    class C2LinearAllocation
}

package "<font size=48>C2BlockPool</font>" {
    class "BufferPoolClient::Impl" as BufferPoolClientImpl
    class "C2PooledBlockPool::Impl" as C2PooledBlockPoolImpl
    class C2BlockPool
    class ClientManager
    class "ClientManager::Impl" as ClientManagerImpl
    class BufferPoolClient
    class Connection
    class Accessor
    class "Accessor::Impl" as AccessorImpl
    class BufferPool
    class InternalBuffer
    class BufferPoolAllocation
    class _C2BufferPoolAllocator
    class C2PooledBlockPool
    class BufferCache
    class BufferPoolAllocator
    class ClientBuffer
}

package "<font size=48>AudioTrack</font>" {
    class AudioTrack
    class AudioFlingerClient
    class AudioDeviceCallback
    interface IAudioFlingerClient
    class "audio_stream_type_t" as TrackStream
}

package "<font size=48>AAudio</font>" {
    class AudioStreamBuilder {
        build()
        builder_createStream()
    }

    class AudioStreamInternalPlay
    class AudioStreamAAudio
    class AAudioLoader
    class AudioStream
    class AudioStreamBase
    class AudioStreamInternal
    class AAudioBinderAdapter
    class AAudioServiceInterface
    class AudioEndpointParcelable
    class EndpointDescriptor
    class RingBufferParcelable
    class SharedRegionParcelable

    class AudioEndpoint
    class FifoBufferIndirect
    class RingBufferDescriptor
}

package "<font size=48>AAudioService</font>" {
    interface IAAudioService
    class AAudioServiceStreamBase
    class AAudioEndpointManager
    class AudioEndpointParcelable
    class "AudioEndpointParcelable" as AudioEndpointParcelable2

    class AAudioServiceEndpointMMAP {
        open()
        openWithFormat()
    }
    class AAudioEndpointManager {
        openEndpoint()
        openExclusiveEndpoint()
    }
    class AAudioService {
        openStream()
    }
    class AAudioServiceStreamMMAP
}

interface IAudioFlinger

' package USBAudio {
package "<font size=48>AudioHal</font>" {
    class AudioStreamOut
    interface StreamOutHalInterface
    class StreamOutHalHidl
    interface StreamHalInterface
    class StreamOut
    class StreamHalHidl
    interface IStreamOut
    interface IStream
    class Stream
    interface IDevice
    class Device
    class DeviceHalHidl
    interface DeviceHalInterface
    class AudioHwDevice
}

package "<font size=48>USBAudio</font>" {
    class stream_out
    class audio_stream_out
    class audio_stream
    class audio_device
    class audio_hw_device
    class audio_module
    class hw_module_methods_t
    class hw_module_t
}

package "<font size=48>USB</font>" {
    class "UsbAlsaDevice" as UsbAlsaDevice2
    class UsbHostManager
    class UsbAlsaManager
    class UsbAlsaDevice
    class UsbService
    interface IUsbManager
    class "Thread" as UsbHostManagerThread
}

package "<font size=48>AudioServer</font>" {
    interface IAudioService
    class AudioService
    class AudioDeviceBroker
    class AudioDeviceInventory
    class AudioSystemAdapter
    class "AudioSystem" as AudioSystem2
}

package "<font size=48>AudioPolicyService</font>" {
    interface IAudioPolicyService
    class AudioPolicyService
    class Engine {
        getOutputDevicesForStream()
        getOutputDevicesForAttributes()
        getDevicesForProductStrategy()
        getDevicesForStrategyInt(**STRATEGY_MEDIA**)
    }
    class "audio_attributes_t" as EngineAttr
    interface AudioPolicyInterface
    interface EngineInterface
    ' class AudioPolicyClient
    class EngineBase
    class AudioPolicyManager
    class AudioPolicyManagerObserver
    class DeviceDescriptor
    class DeviceDescriptorBase
    class AudioPortConfig
    class AudioPort
    class IOProfile
    class "IOProfile" as IOProfile2
    class SwAudioOutputCollection
    class DefaultKeyedVector
    class AudioOutputDescriptor
    class SwAudioOutputDescriptor
    class PolicyAudioPort
    class HwModule
    class audio_port_type_t
    class ClientMapHandler
    class TrackClientDescriptor
    class audio_port_handle_t
    class audio_module_handle_t
    class "audio_io_handle_t" as audio_io_handle_t2
    interface AudioPolicyClientInterface
    class AudioPolicyClient
    class audio_stream_type_t
    class audio_attributes_t
    class product_strategy_t
}

package "<font size=48>Track</font>" {
    interface IAudioTrack
    class Track
    class TrackHandle
    class AudioResampler
    class AudioResamplerDyn
    class audio_track_cblk_t
    ' class Client
    ' class MemoryDealer
    ' class SimpleBestFitAllocator
    class PatchProxyBufferProvider
    class TrackBase
    class "TrackBase" as RecordTrackBase
    class "void *" as BUFFER
    class PatchPanel
    class PatchRecord
    class PatchTrack
    class RecordTrack
    class PatchTrackBase
    class Patch

    interface "IMemory" as AudioIMemory
    class "MemoryBase" as AudioMemoryBase
    class Allocation
}

package "<font size=48>PlaybackThread</font>" {
    class MixerThread
    class PlaybackThread
    class ThreadBase
    class audio_io_handle_t
    class FastMixer
    class AudioMixer
    class NBAIO_Port
    class Thread
    class NBAIO_Sink
    class FastThread
    class AudioMixerBase
    class FastMixerStateQueue
    class EffectChain
    class EffectModule
    class EffectHalHidl
    interface IEffect
    interface EffectHalInterface
    class Effect
}

package "<font size=48>MmapThread</font>" {
    class MmapPlaybackThread
    interface MmapStreamInterface
    class MmapThreadHandle
    class MmapThread
    class audio_mmap_buffer_info
}

package "<font size=48>Bluetooth</font>" {
    class A2dpService
    class A2dpStateMachine
    class AudioManager
}

' package "<font size=48>C2Buffer</font>" {
'     class C2Buffer
'     class "C2Buffer::Impl" as C2BufferImpl
'     class "C2BufferData::Impl" as C2BufferDataImpl
'     class BufferDataBuddy
'     ' class "C2Buffer" as OutputC2Buffer
'     class C2BufferData
' }

package "<font size=48>C2Block1D</font>" {
    class "C2Buffer" as C2Buffer1D
    class "C2Buffer::Impl" as C2BufferImpl1D
    class "C2BufferData::Impl" as C2BufferDataImpl1D
    class "BufferDataBuddy" as BufferDataBuddy1D
    class "C2BufferData" as C2BufferData1D

    class "C2ReadView::Impl" as C2ReadViewImpl
    class C2ReadView
    class C2ConstLinearBlock
    class "C2Block1D" as ConstC2Block1D
    class C2LinearBlock
    class C2Block1D
    class "C2Block1D::Impl" as C2Block1DImpl
    class BufferPoolData
    class C2PooledBlockPoolData
    class _C2BlockPoolData
    class _C2MappedBlock1DImpl
    class "uint8_t *" as DATA2
    class _C2Block1DImpl
    class "C2Fence" as C2Fence1D
    class "C2Fence::Impl" as C2FenceImpl1D
}

package "<font size=48>WorkBundle</font>" {
    class WorkBundle
    class "Work" as Work
    class "FrameData" as OutputFrameData
    class "FrameData" as InputFrameData
    class "Buffer" as WorkBuffer
    class "Buffer" as WorkInputBuffer
    class Worklet
    class "Block" as WorkBlock
    class "Block" as InputBlock
    class "native_handle_t" as WorkHandle
    class "hidl_handle" as BufferHandle
    ' class "hidl_handle" as BlockHandle
    class "hidl_handle" as LinearHandle
    ' class hidl_union
    ' class SyncFenceImpl
    class "BaseBlock" as LinearBaseBlock
    class "BaseBlock" as GraphicBaseBlock
    class "hidl_union" as LinearBlockUnion
    class "hidl_union" as GraphicBlockUnion
    ' class "Fence" as LinearFence
    class "native_handle_t" as Fence1DHandle
}

package "<font size=48>C2Block2D</font>" {
    class "C2Buffer" as C2Buffer2D
    class "C2Buffer::Impl" as C2BufferImpl2D
    class "C2BufferData::Impl" as C2BufferDataImpl2D
    class "BufferDataBuddy" as BufferDataBuddy2D
    class "C2BufferData" as C2BufferData2D

    class C2Block2D
    class "C2Block2D::Impl" as C2Block2DImpl
    class C2ConstGraphicBlock
    class C2Fence
    class "C2Fence::Impl" as C2FenceImpl
    class _C2MappingBlock2DImpl
    ' class C2GraphicBlock
    ' class C2BaseBlock
    class "hidl_handle" as GraphicHandle
    class "_C2BlockPoolData" as Graphic_C2BlockPoolData
    class "C2AllocatorGralloc::Impl" as C2AllocatorGrallocImpl
    class C2Handle
    class C2GraphicAllocation
    class C2HandleGralloc
    class _C2Block2DImpl
    class C2AllocatorGralloc
    class C2AllocationGralloc
    ' class C2BufferQueueBlockPoolData
}

package "<font size=48>BufferQueue</font>" {
    interface IGraphicBufferProducer
    class BufferQueueProducer
    class BufferQueueCore
    interface IConsumerListener
    class ConsumerBase
    interface FrameAvailableListener
    class BLASTBufferQueue
    class Transaction
    class ComposerState
    class layer_state_t
    class ConsumerListener
    class impl::HWComposer
}

package "<font size=48>SurfaceFlinger</font>" {
    interface IBinder
    class BBinder
    class "Handle" as SFLayerHandle
    class Layer
    class BufferLayer
    class ExternalTexture
    class SurfaceFlinger
    class DisplayDevice
    class "impl::Display" as implDisplay
    class "impl::Output" as implOutput
    class SkiaRenderEngine
    class GrGLOpsRenderPass
    class RenderSurface
    class DisplaySurface
    class FramebufferSurface
    class CompositionEngine
    class RenderEngine
    class RenderEngineThreaded
    class SkiaGLRenderEngine
    class LocalRef
    class AutoBackendTexture
    class SkSurface
    class SkSurface_Gpu
    class SkSurface_Base
    class GrDirectContext
    class GrDirectContextPriv
    class GrOpsTask
    class GrOp
    class OpChain
    class GrDrawOp
    class GrMeshDrawOp
    class FillRectOp
    class GrQuadPerEdgeAA
    class GrOpsRenderPass
    class GrGLGpu
    class ComposerCallback
    class GrDrawingManager
    class GrRenderTask
    class SkCanvas
    class MCRec
    class SkBaseGpuDevice
    class SkGpuDevice
    class GrSurfaceDrawContext
    class libGLESv1_CM
    class BufferStateLayer
    class GraphicBuffer
    class ComposerCallbackBridge
}

package "<font size=48>HWC</font>" {
    interface IComposerCallback
    class OutputLayer
    class CE::OutputLayer
    class OutputLayerCompositionState
    class Hwc
    class HWC2::Layer::hwcLayer
    class HWC2::Layer
    class impl::Layer
    class "Hwc2::Composer" as Hwc2Composer
    class "impl::Composer" as implComposer
    class HwcBufferCache
}

package "<font size=48>VSync</font>" {
    class Scheduler
    class VsyncSchedule
    class VSyncDispatch
    class VSyncDispatchTimerQueue
    class VSyncDispatchTimerQueueEntry
    class VSyncSource
    class CallbackRepeater
    class VSyncSource
    class EventThread
    class EventThreadConnection
    class BitTube
}
package "<font size=48>com.android.gallary3d</font>" {
    class Looper
    class Response
    class Request
    class Choreographer
    class FrameDisplayEventReceiver
    class NativeDisplayEventReceiver
    class LooperCallback
    class ViewRootImpl
    class HardwareRenderer
    class DrawFrameTask
    class ThreadedRenderer
    class CanvasContext
    class SkiaPipeline
    class EglManager
    class Surface
    class BufferQueueProducer
    class CallbackRecord
    class TraversalRunnable
    class DisplayEventReceiver
    class RenderProxy
    class CallbackQueue
    class libEGL
    class SkiaOpenGLPipeline
}

AudioOutput o--- AudioTrack:mTrack

' C2Block2D <|-- C2GraphicBlock

_C2MappingBlock2DImpl <|-- C2Block2DImpl
_C2Block2DImpl <|-- _C2MappingBlock2DImpl
_C2Block2DImpl o--- C2GraphicAllocation:mAllocation
_C2Block2DImpl o--- Graphic_C2BlockPoolData:mPoolData

' Work ..> C2Work
' Worklet ..> C2Worklet
' OutputFrame ..> C2FrameData
' WorkBuffer ..> C2Buffer

WorkBundle o--- Work:works
WorkBundle o--- LinearBaseBlock:baseBlocks[]
LinearBaseBlock o--- LinearBlockUnion:hidl_u
LinearBlockUnion o--- LinearHandle:nativeBlock
WorkBundle o--- GraphicBaseBlock:baseBlocks[]
GraphicBaseBlock o--- GraphicBlockUnion:hidl_u
GraphicBlockUnion o--- BufferHandle:nativeBlock
' C2Handle .. BlockHandle
' C2Handle ..> C2GraphicBlock:CreateGraphicBlock()
C2AllocatorGralloc ..> C2GraphicAllocation:priorGraphicAllocation()
C2AllocatorGralloc o--- C2AllocatorGrallocImpl:mImpl
C2Handle <|-- C2HandleGralloc
C2HandleGralloc ..> GraphicHandle:UnwrapNativeHandle
C2GraphicAllocation <|-- C2AllocationGralloc
C2AllocationGralloc o--- C2HandleGralloc:mHandle
' Graphic_C2BlockPoolData <|-- C2BufferQueueBlockPoolData
' C2BaseBlock o--- C2GraphicBlock
' C2GraphicBlock ..> C2Buffer2D:createGraphicBuffer()

C2BufferImpl2D o--- C2ConstGraphicBlock:mData
C2BufferDataImpl2D o--- C2ConstGraphicBlock:mGraphicBlocks[]

' Work .. C2Work:objcpy()
' Worklet .. C2Worklet:objcpy()
' OutputFrameData .. C2FrameData:objcpy()
' WorkBuffer .. C2Buffer2D:objcpy()

Work o--- Worklet:worklets
Worklet o--- OutputFrameData:output
OutputFrameData o--- WorkBuffer:buffers
Worklet o--- InputFrameData:input
InputFrameData o--- WorkInputBuffer:buffers

WorkBuffer o--- WorkBlock:blocks[]
C2AllocationIonImpl o--- C2HandleIon:mHandle

WorkBlock o--- BufferHandle:fence
InputBlock o--- LinearHandle:fence
LinearHandle o--- Fence1DHandle:mHandle
WorkInputBuffer o--- InputBlock:blocks[]
BufferHandle o--- WorkHandle:mHandle
' C2FenceImpl <|-- SyncFenceImpl
C2FenceImpl <.. BufferHandle:CreateFromNativeHandle()
C2Fence o--- C2FenceImpl:mImpl
C2ConstGraphicBlock o--- C2Fence:mFence
C2Block2D <|-- C2ConstGraphicBlock
C2Block2D o--- C2Block2DImpl

NuPlayer o--- NuPlayerRenderer:mRenderer

IMediaPlayerService <|-- MediaPlayerService
MediaPlayerService o--- Client:mClients[]
NuPlayerDriver o--- NuPlayer:mPlayer
Client o--- MediaPlayerBase:mPlayer
MediaPlayerBase <|-- MediaPlayerInterface
MediaPlayerInterface <|-- NuPlayerDriver
NuPlayer o--- Source:mSource
Source <|-- GenericSource
GenericSource o--- TrackVideo:mVideoTrack
TrackVideo o--- VideoMediaSource:mSource
GenericSource o--- TrackAudio:mAudioTrack
TrackAudio o--- AudioMediaSource:mSource
VideoMediaSource <|-- RemoteMediaSource
AudioMediaSource <|-- RemoteMediaSource
RemoteMediaSource o--- RemoteMediaExtractor:mExtractor
IMediaExtractor <|-- RemoteMediaExtractor
RemoteMediaSource o--- MediaTrack:mTrack
NuPlayer o--- DecoderBase:mVideoDecoder

MediaPlayerBaseAudioSink <|-- AudioOutput
NuPlayerRenderer o--- MediaPlayerBaseAudioSink:mAudioSink

GenericSource ..> IMediaExtractor:getTrack()
RemoteMediaExtractor ..> VideoMediaSource:getTrack()

VideoMediaSource <|-- MediaTrackCUnwrapper
MediaTrackCUnwrapper ..> MediaTrackHelper:start()
MediaTrackHelper <|-- MPEG4Source
MPEG4Source o--- MediaBufferGroupHelper:mBufferGroup
MediaBufferGroupHelper o--- CMediaBufferGroup:mGroup
CMediaBufferGroup ..> MediaBufferGroup:init()
MediaBufferGroup o--- CMediaBufferGroup:mWrapper
MediaBufferGroup o--- InternalData:mInternal
InternalData o--- MediaBufferBase:mBuffers[]
MediaBufferBase <|-- MediaBuffer
MediaBuffer o--- DATA:mData
MediaBuffer o--- IMemory:mMemory
IMemory <|-- MemoryBase
MemoryBase o--- IMemoryHeap:mHeap
IMemoryHeap <|-- MemoryHeapBase

Decoder o--- Source:mSource
DecoderBase <|-- Decoder
CCodec o--- CCodecBufferChannel:mChannel
BufferChannelBase <|-- CCodecBufferChannel
CCodecBufferChannel o--- Codec2ClientComponent
Codec2ClientComponent o--- Codec2ClientComponentOutputBufferQueue:mOutputBufferQueue
OutputBufferQueue <|-- Codec2ClientComponentOutputBufferQueue
OutputBufferQueue ..> IGraphicBufferProducer:mIgbp
BufferChannelBase o--- BufferCallback:mCallback
BufferCallback ..> MediaCodec:**CALLBACK**
' BufferCallback ..[#blue]> MediaCodec:<font color=blue>**kWhatFillThisBuffer**
' BufferCallback ..[#red]> MediaCodec:<font color=red>**kWhatDrainThisBuffer**
' MediaCodec ..[#blue]> Decoder:<font color=blue>**CB_INPUT_AVAILABLE**
' MediaCodec ..[#red]> Decoder:<font color=red>**CB_OUTPUT_AVAILABLE**
MediaCodec o--- BufferChannelBase:mBufferChannel

IHwComponentListener <|-- HidlListener
HidlListener *-- Listener:base
Listener <|-- ClientListener
ClientListener o--- CCodec:mCodec
CodecBase <|-- CCodec
MediaCodec o--- CodecBase:mCodec
Decoder o--- MediaCodec:mCodec

MediaCodecBuffer <|-- Codec2Buffer

MediaCodecBuffer o--- ABuffer:mBuffer
CCodecBufferChannel o--- Input:mInput
Input o--- InputBuffers:buffers
' CCodecBuffers <|-- InputBuffers
InputBuffers <|-- LinearInputBuffers
InputBuffers o--- C2BlockPool:mPool
C2BlockPool <|-- C2PooledBlockPool
C2PooledBlockPool o--- C2PooledBlockPoolImpl:mImpl
C2PooledBlockPoolImpl o--- ClientManager:mBufferPoolManager
ClientManager o--- ClientManagerImpl:mImpl
ClientManagerImpl ..> BufferPoolClient:alloc()
BufferPoolClient o--- BufferPoolClientImpl:mImpl
BufferPoolClientImpl o--- Connection:mLocalConnection
Connection o--- Accessor:mAccessor
Accessor o--- AccessorImpl:mImpl
AccessorImpl o--- BufferPoolAllocator:mAllocator
BufferPoolAllocator <|-- _C2BufferPoolAllocator

LinearInputBuffers o--- InputFlexBuffersImpl:mImpl
InputFlexBuffersImpl o--- InputEntry:mBuffers[]
InputEntry o--- Codec2Buffer:clientBuffer
InputEntry o--- C2Buffer1D:compBuffer
Codec2Buffer <|-- LinearBlockBuffer
LinearBlockBuffer o--- C2WriteView:mWriteView
LinearBlockBuffer o--- C2LinearBlock:mBlock
LinearBlockBuffer ..> C2Buffer1D:asC2Buffer()
C2Block1D <|-- C2LinearBlock
C2Block1D o--- C2Block1DImpl:mImpl

' CCodecBuffers <|-- OutputBuffers
' OutputBuffers <|-- OutputBuffersArray
' OutputBuffersArray o--- BuffersArrayImpl:mImpl
OutputBuffers <|-- FlexOutputBuffers
FlexOutputBuffers <|-- GraphicOutputBuffers
CCodecBufferChannel o--- Output:mOutput
Output o--- OutputBuffers:buffers
FlexOutputBuffers o--- FlexBuffersImpl:mImpl
FlexBuffersImpl o--- OutputEntry:mBuffers[]
OutputEntry o--- DummyCodec2Buffer:clientBuffer
DummyCodec2Buffer <|-- DummyContainerBuffer
OutputMediaCodecBuffer <|-- DummyCodec2Buffer
DummyContainerBuffer o--- C2Buffer2D:mBufferRef

C2Buffer1D o--- C2BufferImpl1D:mImpl
C2BufferImpl1D o--- BufferDataBuddy1D:mData
C2BufferData1D <|-- BufferDataBuddy1D
C2BufferData1D o--- C2BufferDataImpl1D:mImpl

C2Buffer2D o--- C2BufferImpl2D:mImpl
C2BufferImpl2D o--- BufferDataBuddy2D:mData
C2BufferData2D <|-- BufferDataBuddy2D
C2BufferData2D o--- C2BufferDataImpl2D:mImpl

C2BufferDataImpl1D o--- C2ConstLinearBlock:mLinearBlocks[]
ConstC2Block1D <|-- C2ConstLinearBlock
ConstC2Block1D o.. C2Block1DImpl:mImpl
C2ConstLinearBlock o--- C2ReadView:mReadView
C2ConstLinearBlock o--- C2Fence1D:mFence
C2Fence1D o--- C2FenceImpl1D:mImpl
C2FenceImpl1D ..> Fence1DHandle:createNativeHandle()
C2ReadView o--- C2ReadViewImpl:mImpl
_C2MappedBlock1DImpl <|-- C2ReadViewImpl
_C2MappedBlock1DImpl o--- DATA2:mData

C2WriteView o--- C2WriteViewImpl:mImpl
_C2MappedBlock1DImpl <|-- C2WriteViewImpl

_C2Block1DImpl <|-- _C2MappedBlock1DImpl
_C2Block1DImpl o--- C2LinearAllocation:mAllocation
_C2Block1DImpl o--- _C2BlockPoolData:mPoolData

' NuPlayer ..> NuPlayer:**kWhatScanSources**
' NuPlayer ..> DecoderBase:**kWhatConfigure**
' Decoder ..> MediaCodec:**kWhatStart**
' MediaCodec ..> CCodec:**kWhatStart**

_C2BlockPoolData <|-- C2PooledBlockPoolData
C2PooledBlockPoolData o--- BufferPoolData:mData
BufferPoolClient o--- BufferCache:mCache
BufferCache o--- ClientBuffer:mBuffers<BufferId,>
BufferPoolClientImpl ..> ClientBuffer:CREATE
_C2BufferPoolAllocator ..> BufferPoolAllocation:allocate()
AccessorImpl o--- BufferPool:mmBufferPool
BufferPool o--- InternalBuffer:mBuffers<BufferId,>
InternalBuffer o--- BufferPoolAllocation:mAllocation
BufferPoolAllocation o--- native_handle_t:mHandle
ClientBuffer o.. native_handle_t:mHandle
C2PooledBlockPoolImpl o--- _C2BufferPoolAllocator:mAllocator
_C2BufferPoolAllocator o--- C2Allocator:mAllocator
C2Allocator <|-- C2AllocatorIon
native_handle_t <|-- C2HandleIon
C2LinearAllocation <|-- C2AllocationIon
C2AllocationIon o--- C2AllocationIonImpl:mImpl
C2AllocationIonImpl <|-- C2AllocationIonImplV2
C2AllocationIonImpl o.. IonFd:mIonFd
C2AllocatorIon o--- IonFd:mIonFd
C2AllocatorIon ..> C2AllocationIon:priorLinearAllocation()
C2AllocationIonImpl o--- ImplC2HandleIon:mHandle
C2HandleIon o--- BufferFd:mFds
ImplC2HandleIon o.. BufferFd:mFds
MAPDATA <.. C2AllocationIon:ion_map()
_C2MappedBlock1DImpl o.. MAPDATA:mData
C2BlockPool .[#blue].> C2LinearBlock:fetchLinearBlock()
MediaCodec o--- BufferInfo:mPortBuffers[]
BufferInfo o--- MediaCodecBuffer:mData
Decoder o--- MediaCodecBuffer:mInputBuffers
Decoder o--- OutputMediaCodecBuffer:mOutputBuffers
OutputBufferInfo o--- OutputMediaCodecBuffer:mData
MediaCodec o--- OutputBufferInfo:mPortBuffers[]

BufferPoolData ..> ClientBuffer:INDEX

C2Work *-- C2FrameData:input
C2FrameData o--- C2Buffer1D:buffers[]
C2Work o--- C2Worklet:worklets
C2Worklet o--- OutputFrame:output
OutputFrame o--- C2Buffer2D:buffers[]

UsbService o--- UsbHostManager:mHostManager
IUsbManager <|-- UsbService
' UsbManager o--- IUsbManager:mService
UsbHostManager ...> UsbHostManagerThread:CREATE
UsbHostManagerThread ...> UsbHostManager:monitorUsbHostBus()
note on link:**NEW_DEVICE_ADDED**

UsbHostManager o--- UsbAlsaManager:mUsbAlsaManager
UsbAlsaManager o--- IAudioService:mAudioService
UsbAlsaDevice2 o--- IAudioService:mAudioService
UsbAlsaManager o--- UsbAlsaDevice:mAlsaDevices[]
UsbAlsaManager o--- UsbAlsaDevice2:mSelectedDevice
IAudioService <|-- AudioService
AudioService o--- AudioDeviceBroker:mDeviceBroker
AudioDeviceBroker o--- AudioDeviceInventory:mDeviceInventory
AudioDeviceInventory o--- AudioSystemAdapter:mAudioSystem
AudioSystemAdapter ...> AudioSystem2:<font color=blue>**setDeviceConnectionState()**
AudioSystem2 ...> AudioPolicyService:<font color=blue>**setDeviceConnectionState()**

A2dpStateMachine ...> A2dpService:<font color=blue>**ACTION_CONNECTION_STATE_CHANGED**
A2dpService o--- AudioManager:<font color=blue>**mAudioManager**
AudioManager ...> IAudioService:<font color=blue>**handleBluetoothActiveDeviceChanged()**

stream_out *-- audio_stream_out:stream
audio_stream_out *-- audio_stream:common
audio_device *-- audio_hw_device:hw_device
audio_hw_device ...> audio_stream_out:open_output_stream()
audio_module *-- hw_module_t:common
hw_module_t o--- hw_module_methods_t:methods
hw_module_methods_t ...> audio_hw_device:open()
StreamOut o--- audio_stream_out:mStream
IStream <|-- Stream
Stream o--- audio_stream:mStream
Device o--- audio_hw_device:mDevice
audio_device ...> stream_out:output_stream_list[]

AudioFlinger ...> AudioSystem:getOutputForAttr()
AudioSystem ...> IAudioPolicyService:getOutputForAttr()

' AudioPolicyService o--- AudioPolicyClient:mAudioPolicyClient
AudioPolicyService o--- AudioPolicyInterface:<font color=blue>**mAudioPolicyManager**
AudioPolicyInterface <|--- AudioPolicyManager
IAudioPolicyService <|-- AudioPolicyService
AudioPolicyService o--- EngineInterface:mEngine
EngineInterface <|-- EngineBase

EngineBase <|-- Engine
EngineBase o--- AudioPolicyManagerObserver:mApmObserver

AudioTrack *-- TrackStream:mOriginalStreamType
TrackStream ...> EngineAttr:AudioSystem::streamTypeToAttributes()
EngineAttr ...> audio_stream_type_t:getStreamTypeForAttributes()
audio_stream_type_t ...> audio_attributes_t:getAttributesForStreamType()
audio_attributes_t ...> product_strategy_t:getProductStrategyForAttributes()
product_strategy_t ...> DeviceDescriptor:getDevicesForStrategyInt()

AudioPolicyManagerObserver <|-- AudioPolicyManager 
AudioPolicyManager o--- DeviceDescriptor:mAvailableOutputDevices
AudioPolicyManager o--- SwAudioOutputCollection:mOutputs
AudioPolicyManager ...> AudioFlinger:<font color=blue>**installPatch()**
AudioFlinger ...> Patch:<font color=blue>**createAudioPatch()**
DefaultKeyedVector <|-- SwAudioOutputCollection 
DefaultKeyedVector o--- SwAudioOutputDescriptor:mDefault
AudioOutputDescriptor <|-- SwAudioOutputDescriptor 
SwAudioOutputDescriptor o--- AudioPolicyClientInterface
AudioPolicyClientInterface <|-- AudioPolicyClient
AudioPolicyClient ...> IAudioFlinger:openOutput()
IAudioFlinger  <|-- AudioFlinger
SwAudioOutputCollection o--- IOProfile:mProfile
AudioPort <|-- IOProfile 
PolicyAudioPort <|-- IOProfile 
AudioPort o--- audio_port_type_t:mType
AudioOutputDescriptor o--- PolicyAudioPort:mPolicyAudioPort
PolicyAudioPort o--- HwModule:mModule
HwModule *-- audio_module_handle_t:mHandle
HwModule o--- IOProfile2:mOutputProfiles
ClientMapHandler <|-- AudioOutputDescriptor 
ClientMapHandler o--- TrackClientDescriptor:mClients[<audio_port_handle_t>]
TrackClientDescriptor o--- audio_port_handle_t:mPreferredDeviceId
AudioPortConfig o--- audio_io_handle_t2:mId
audio_io_handle_t2 .. audio_io_handle_t
DeviceDescriptorBase <|-- DeviceDescriptor
AudioPortConfig <|-- DeviceDescriptorBase 
AudioPort <|-- DeviceDescriptorBase
AudioPortConfig <|-- AudioOutputDescriptor

AudioStream <|-- AudioStreamAAudio 
AudioStreamBase <|-- AudioStream 
AudioStreamAAudio o--- AAudioLoader:mLibLoader

AudioStreamBuilder ...> AudioStreamAAudio:build()
AudioStreamBuilder ...> AudioStreamInternalPlay:CREATE
AudioStreamInternal <|-- AudioStreamInternalPlay 
AudioStream <|-- AudioStreamInternal 
AudioStreamInternal o--- AAudioServiceInterface:mServiceInterface
AAudioServiceInterface <|-- AAudioBinderAdapter 
AAudioBinderAdapter o--- IAAudioService:mDelegate
IAAudioService <|-- AAudioService 
AudioStreamInternal o--- AudioEndpointParcelable:mEndPointParcelable
AudioEndpointParcelable ...> EndpointDescriptor:resolve()
EndpointDescriptor *---- RingBufferDescriptor:downMessageQueueDescriptor
RingBufferDescriptor ..> unique_fd:dataAddress
AudioEndpointParcelable o--- RingBufferParcelable:mDownDataQueueParcelable
RingBufferParcelable o--- SharedRegionParcelable:mDataParcelable
AudioStreamInternal o--- AudioEndpoint:mAudioEndpoint
AudioStreamInternal o--- FifoBufferIndirect:mDataQueue
AudioEndpoint ...> FifoBufferIndirect:PARAMS

AudioDeviceCallback <|-- AudioTrack 
' AudioTrack ...> AudioFlinger:createTrack()
IAudioTrack <|-- TrackHandle 
TrackHandle o--- Track:mTrack
PlaybackThread o--- Track:mTracks
AudioTrack o--- IAudioTrack:mAudioTrack

AudioFlinger o--- NotificationClient:mNotificationClients
NotificationClient o--- IAudioFlingerClient:mAudioFlingerClient
IAudioFlingerClient <|-- AudioFlingerClient 
AudioFlingerClient o--- AudioDeviceCallback:mAudioDeviceCallbacks

' MixerThread o--- AudioStreamOut:mOutput
AudioStreamOut o--- AudioHwDevice:audioHwDev
AudioHwDevice o--- DeviceHalInterface:mHwDevice
AudioStreamOut o--- StreamOutHalInterface:stream
PlaybackThread o--- AudioStreamOut:mOutput
StreamHalHidl <|-- StreamOutHalHidl 
StreamOutHalInterface <|-- StreamOutHalHidl 
StreamHalInterface <|-- StreamOutHalInterface 
StreamOutHalHidl o--- IStreamOut:mStream
StreamHalHidl o--- IStream:mStream
IStream <|-- IStreamOut 
IStreamOut <|-- StreamOut
IDevice <|-- Device 
DeviceHalInterface <|-- DeviceHalHidl 
DeviceHalHidl o--- IDevice:mDevice

PlaybackThread <|-- MixerThread 
ThreadBase <|-- PlaybackThread 
ThreadBase o--- audio_io_handle_t:mId
Thread <|-- ThreadBase 
ThreadBase o--- EffectChain:mEffectChains[]
EffectChain o--- EffectModule:mEffects[]
EffectModule o--- EffectHalInterface:mEffectInterface
EffectHalInterface <|-- EffectHalHidl 
EffectHalHidl o--- IEffect:mEffect
IEffect <|-- Effect 
MixerThread o--- AudioMixer
AudioMixerBase <|-- AudioMixer 
MixerThread o--- FastMixer:mFastMixer
FastThread <|-- FastMixer 
FastMixer o--- AudioMixer:mMixer
FastMixer o--- NBAIO_Sink:mOutputSink
NBAIO_Port <|-- NBAIO_Sink 
FastMixer o--- FastMixerStateQueue:mSQ
' AudioFlinger o--- AudioHwDevice:mAudioHwDevs[]
AudioFlinger o--- PlaybackThread:mPlaybackThreads
AudioFlinger o--- MmapThread:mMmapThreads
MmapThread <|-- MmapPlaybackThread 
' AudioFlinger o--- AudioHwDevice:mPrimaryHardwareDev

' AudioFlinger ...> Track:CREATE
Device ...> StreamOut:OPEN

AudioFlinger o--- PatchPanel:mPatchPanel
PatchPanel o--- Patch:mPatchs
Patch o--- PatchTrack:<font color=blue>**mPlayback**
Patch o---- PatchRecord:<font color=blue>**mRecord**
RecordTrack <|----PatchRecord 
RecordTrackBase <|---- RecordTrack 
RecordTrackBase o--- BUFFER:<font color=blue>**mBuffer**

TrackBase o.... BUFFER:mBuffer
Track <|---- PatchTrack 
PatchTrackBase <|-- PatchTrack 
TrackBase o--- AudioResampler:mResampler
TrackBase <|---- Track 
Track o--- audio_track_cblk_t:mCblk
Track o--- AudioIMemory:mCblkMemory
' TrackBase o--- Client:mClient
' Client o--- MemoryDealer:mMemoryDealer
' MemoryDealer o--- SimpleBestFitAllocator:mAllocator
AudioMemoryBase <|-- Allocation 
AudioIMemory <|-- AudioMemoryBase 
AudioTrack o.. AudioIMemory:mSharedBuffer
AudioTrack o.. audio_track_cblk_t:mCblk
AudioResampler <|-- AudioResamplerDyn 

TrackBase o--- ThreadBase:mThread
TrackBase o--- PatchProxyBufferProvider:bufferProvider
PatchTrackBase <|-- PatchRecord 
PatchProxyBufferProvider <|-- PatchTrackBase 
' PatchTrackBase o--- ClientProxy:mProxy
MmapStreamInterface ...> AudioFlinger:openMmapStream()

AAudioServiceEndpointMMAP ...> MmapStreamInterface:openMmapStream()
AAudioEndpointManager ...> AAudioServiceEndpointMMAP:CREATE
AAudioServiceStreamBase o--- AAudioEndpointManager:mEndpointManage
AAudioServiceStreamBase <|-- AAudioServiceStreamMMAP 
AAudioServiceEndpointMMAP o--- MmapStreamInterface:mMmapStream
MmapStreamInterface <|-- MmapThreadHandle 
MmapThreadHandle o--- MmapThread:mThread
MmapThread ...> audio_mmap_buffer_info:createMmapBuffer()
AAudioServiceEndpointMMAP o--- audio_mmap_buffer_info:mMmapBufferinfo
audio_mmap_buffer_info *-- unique_fd:shared_memory_fd
AAudioServiceEndpointMMAP *-- unique_fd:mAudioDataFileDescriptor

SharedRegionParcelable o.. unique_fd:mFd

AAudioService ...> AAudioServiceStreamMMAP:CREATE
AAudioServiceStreamMMAP ...> AudioEndpointParcelable2:getAudioDataDescription_l()
AudioEndpointParcelable2 ...> AudioEndpointParcelable:BINDER



' bufferqueue
IGraphicBufferProducer <|-- BufferQueueProducer
BufferQueueProducer o-- BufferQueueCore:mCore
BufferQueueCore o-- IConsumerListener:mConsumerListener
IConsumerListener <|-- ConsumerListener
ConsumerListener <|-- ConsumerBase
ConsumerBase o-- FrameAvailableListener:mFrameAvailableListener
FrameAvailableListener <|-- BLASTBufferQueue
BLASTBufferQueue --> Transaction
Transaction o-- ComposerState:mComposerState
ComposerState o-- layer_state_t:state
layer_state_t o-- IBinder:surface



' surfaceflinger
IBinder <|-- BBinder
BBinder <|--SFLayerHandle
SFLayerHandle o-- Layer:owner
Layer <|-- BufferLayer
BufferLayer <|-- BufferStateLayer
BufferLayer o-- ExternalTexture:mBufferInfo.mBuffer
ExternalTexture o-- GraphicBuffer:buffer
SurfaceFlinger o-- Layer:mLayersPendingRefresh
SurfaceFlinger o-- DisplayDevice:mDisplays[]
DisplayDevice o-- implDisplay:mCompositionDisplay
implOutput <|-- implDisplay
implOutput o-- RenderSurface:mRenderSurface
RenderSurface o-- DisplaySurface:mDisplaySurface
DisplaySurface <|-- FramebufferSurface
FramebufferSurface o-- Hwc2Composer:mHwc
FrameAvailableListener o-- impl::HWComposer:mHwc
SurfaceFlinger o-- CompositionEngine:mCompositionEngine
CompositionEngine o-- RenderEngine:mRenderEngine
RenderEngine <|-- RenderEngineThreaded
RenderEngineThreaded o-- SkiaRenderEngine:mRenderEngine
SkiaRenderEngine <|-- SkiaGLRenderEngine
SkiaGLRenderEngine o-- LocalRef:mTextureCache<,>
LocalRef o-- AutoBackendTexture:mTexture
AutoBackendTexture o-- SkSurface:mSurface
SkSurface <|-- SkSurface_Base
SkSurface_Base <|-- SkSurface_Gpu
SkSurface_Gpu --> GrDirectContextPriv
GrDirectContextPriv o-- GrDirectContext:fContext
GrDirectContext --> GrDrawingManager
GrDrawingManager o-- GrRenderTask:fDAG
GrRenderTask <|-- GrOpsTask
GrOpsTask o-- OpChain:fOpChains
OpChain o-- GrOp:fList[]
GrOp <|- GrDrawOp
GrDrawOp <|-- GrMeshDrawOp
GrMeshDrawOp <|- FillRectOp
FillRectOp --> GrQuadPerEdgeAA
GrQuadPerEdgeAA o-- GrOpsRenderPass:fOpsRenderPass
GrOpsRenderPass <|-- GrGLOpsRenderPass
GrGLOpsRenderPass o-- GrGLGpu:fGpu
GrGLGpu --> libGLESv1_CM
LocalRef ..> SkCanvas:getOrCreateSurface
SkCanvas o-- MCRec:fMCRec
MCRec --> SkBaseGpuDevice
SkBaseGpuDevice <|-- SkGpuDevice
SkGpuDevice o-- GrSurfaceDrawContext:fContext
GrSurfaceDrawContext --> GrOpsTask
OutputLayer o-- Layer:mLayerFE
OutputLayer o-- OutputLayerCompositionState:mState
CE::OutputLayer <|-- OutputLayer
implOutput o-- CE::OutputLayer:mCurrentOutputLayerOrdedByZ[]
OutputLayerCompositionState o-- Hwc:hwc
Hwc o-- HWC2::Layer:hwcLayer
Hwc o-- HwcBufferCache:hwcBufferCache
HwcBufferCache : mBuffers(GraphicBuffer)
HWC2::Layer <|-- impl::Layer
impl::Layer o-- Hwc2Composer
Hwc2Composer <|-- implComposer
ComposerCallback <|--SurfaceFlinger
ComposerCallbackBridge o-- ComposerCallback:mCallback
IComposerCallback <|-- ComposerCallbackBridge
SurfaceFlinger o-- Scheduler:mScheduler
Scheduler o-- VsyncSchedule:mVsyncSchedule
VsyncSchedule o-- VSyncDispatch:dispatch
VSyncDispatch <|-- VSyncDispatchTimerQueue
VSyncDispatchTimerQueue o-- VSyncDispatchTimerQueueEntry:mCallbacks<>
VSyncDispatchTimerQueueEntry o-- VSyncDispatch::Callback:mCallback
VSyncDispatch::Callback o-- CallbackRepeater
CallbackRepeater o-- VSyncSource::Callback:mCallbacks
VSyncSource::Callback <|-- EventThread
EventThread o-- EventThreadConnection:mEventThreadConnections
EventThreadConnection o-- BitTube:mChannel
Looper o-- BitTube:mReceived
Looper o-- Response:mResponses[]
Response o-- Request:request
Request o-- LooperCallback:callback
Choreographer o-- FrameDisplayEventReceiver:mHead[]
DisplayEventReceiver <|-- FrameDisplayEventReceiver
NativeDisplayEventReceiver ..> DisplayEventReceiver:dispatchVsync
LooperCallback <|-- NativeDisplayEventReceiver
Choreographer o-- CallbackQueue:mCallbackQueues[]
CallbackQueue o-- CallbackRecord:mHead[]
CallbackRecord o-- TraversalRunnable:action
ViewRootImpl o-- TraversalRunnable:mTraversalRunnable
ViewRootImpl --> ThreadedRenderer
HardwareRenderer <|-- ThreadedRenderer
ThreadedRenderer o-- RenderProxy:mNativeProxy
RenderProxy o-- DrawFrameTask
DrawFrameTask o-- CanvasContext:mContext
CanvasContext o-- SkiaOpenGLPipeline:mRenderPipeline
SkiaPipeline <|-- SkiaOpenGLPipeline
SkiaPipeline o-- EglManager:mEglManager
EglManager --> libEGL
libEGL --> Surface
Surface o-- BufferQueueProducer:mGraphicBufferProducer

@enduml