Professional Documents
Culture Documents
Source: https://androidxref.com/
Media Architecture
1) Application Framework
Basically application code utilize android.media APIs to interact with the successive layer through java
native interface.
Provides classes that manage various media interfaces in audio and video.
The Media APIs are used to play and, in some cases, record media files.
e.g., play a video streamed over the web or from local storage
2) Binder IPC
Location : frameworks/av/media/libmedia
APIs Functionality
MediaPlayer class can be used to control playback of audio/video files and
streams. e.g., on how to use the methods in this class can be
found in VideoView
2. attachNewPlayer() Attach new player called in the current state of media player
3. setDataSource() Set data source with parameters like httpservice , url and headers
3. getDrmInitData()
Extract DRM initialization data if it exists
4. getMetrics()
Return Metrics data about the current media container.
5. getSampleCryptoInfo
(MediaCodec.CryptoInfo info) If the sample flags indicate that the current sample is at least
partially encrypted, this call returns relevant information about
the structure of the sample data required for decryption.
6. getSampleTrackIndex()
Returns the track index the current sample originates from (or -1 if
no more samples are available)
7. getTrackCount()
Count the number of tracks found in the data source.
MediaCodec.BufferInfo Per buffer metadata includes an offset and size specifying the
range of valid data in the associated codec (output) buffer.
Media Recorder class is to record audio/video streams form device and setting
various parameters
1. setCamera Checks media recorder state (initialized) and set camera for recording.
Eg: mMediaRecorder->setCamera(camera, proxy)
2. setPreviewSurface try to set preview surface with setting the video source.
Location : /frameworks/av/media/libmedia/include/media/mediarecorder
At the native level, Android provides a multimedia framework that utilizes the Stagefright engine for
audio and video recording and playback. Stage fright comes with a default list of supported software
codecs.
I) MediaPlayerService
PATH: /frameworks/av/media/libmediaplayerservice/MediaPlayerService
MediaPlayerService
This class is primary API for providing services to video and sound. It creates player, MediaRecorder ,
remove Media recorder Client, creates Meta data retriever, display codec list.
AudioOutput provide audio services to Client based on device callback, set audio stream type,
playback rate, audio track, audio attributes, sample rates and volume.
CallbackData is passed to AudioTrack as user data. tryBeginTrackSwitch/endTrackSwitch are
used when the CallbackData is handed over to next sink.
ImediaPlayerService is an interface. It creates/remove Media Recorder Client and prepare codec
list.
BatteryUsageInfo API for battery app to pull data of codecs usage and collect information of
codec usage from media player and media recorder.
BatteryAudioFlingerUsageInfo count the number of audio streams played, display total time of
audio output device usage and check whether device is currently in use or not.
Client : This API create player and set video surface texture, buffering settings , sync settings ,
set volume, set audio stream type, set metadata, get current position and duration, reset and
notify, set next player. It also provide services to client like start, stop, pause, isplaying
AudioDeviceUpdatedNotifier sends notification to client from class Listener.
MediaRecorderClient
This API checks camera permissions to set video source and set audio and camera sources.
Provides the check service for camera if we don’t know it exists. Set the size and format rate of
video.
ServiceDeathNotifier class notifies the client about binderDied and serviceDied.
AudioDeviceUpdateNotifier sends the notification to client about audio io handle and audio port
handle from class Listener.
MetadataRetrieverClient
This API implements ImediaMetadataRetriever interface and extract Meta data. It also create Retriever
by setting data source parameters like offset and length from Media player factory.
Video Formats: H.263, H.264 AVC(BP,MP), H.265 HEVC ,MPEG-4 SP,VP8, VP9, AV1
File Formats: 3GPP (.3gp), MPEG-4 (.mp4), Matroska (.mkv) ,MPEG-TS (.ts), WebM (.webm)
For video Encoding, Decoding, Playback & Streaming speed and resolution are recommended based on
the certain parameters.
e.g.: (SD- Low/High) quality Format (H.264) -> (176 x 144 px @ 12 fps ) (480 x 360 px @ 30 fps) are
recommended respectively.
>> Similarly, for images also Android framework recommends some formats.
Stage fright is a native media playback tool used by Android and all these weaknesses reside in it.
Extractor: extract data into required format and set communication between native media
server to kernel driver.
Player: captures video and provide sources like playing, starting, etc.
Codex: prepare playback and setup decoder on request from media service to kernel driver.
what is a codec?
a) A codec is hardware device or a computer program which process input data into output data.
b) A codec encodes and decodes data stream for transmission/storage.
Android includes Stagefright, a media playback engine at the native level that has built-in
software-based codecs for popular media formats.
Stagefright uses OpenMax (Open Media Accelerator) codecs.
Open MAX codes are designed as per DRM standards.
FLOW:
Note: Stagefright also supports integration of custom hardware codec's provided by vendors (for that we need
to register their coded to Android Framework)
Location: /frameworks/av/media/libstagefright/
StagefrightPluginLoader.cpp
class StagefrightPluginLoader
struct StagefrightMetadataRetriever
StagefrightMediaScanner.cpp
struct StagefrightMediaScanner
FileHasAcceptableExtension --> ".mp3", ".mp4", ".m4a", ".3gp", ".3gpp", ".3g2",
".3gpp2",".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac",".wav", ".amr", ".midi", ".xmf", ".rtttl",
".rtx", ".ota",".mkv", ".mka", ".webm", ".ts", ".fl", ".flac", ".mxmf",".avi", ".mpeg", ".mpg", ".awb",
".mpga", ".mov",".m4v", ".oga" (supported formats).
processFile()
writer,duration,albumartist,album ...
extractAlbumArt()
PATH: /frameworks/av/media/libstagefright/omx
MPEG4Writer.cpp
MPEG4Writer path: /frameworks/av/media/libstagefright/MPEG4Writer.cpp
MPEG4Writer is an encapsulation class under the Android stagefright media framework. We usually use the
MediaRecorder interface class called video recording to implement the underlying packaging of video recording
through MPEG4Writer.
The last link of video recording of crecording a video is MPEG4Writer.
MP4, 3gp, ismv and other common media packaging formats are derived from this basic file format ( ISO 14496-12
standard).
MPEG4Writer packaged video:
There are three main steps in the Android system video packaging process:
2) While recording is in progress, the data block of the audio and video track is written in real time.
3) At the end of the recording, write the index information and update the header parameters.
Exchangeable image file format (officially Exif, according to JEIDA/JEITA/CIPA specifications) is a standard that
specifies the formats for images, sound, and ancillary tags used by digital cameras (including smartphones),
scanners and other systems handling image and sound files recorded by digital cameras.
class MPEG4Writer: public MediaWriter <--- child class of Media writer in public mode inheritance.
OpenMAX (Open Media Acceleration), often shortened as "OMX", is a non-proprietary and royalty-free
cross-platform set of C-language programming interfaces. It provides abstractions for routines that are
especially useful for processing of audio, video, and still images. It is intended for low power and
embedded system devices that need to efficiently process large amounts of multimedia data in
predictable ways, such as video codecs, graphics libraries, and other functions for video, image, audio,
voice and speech.
OpenMAX provides three layers of interfaces: application layer (AL), integration layer (IL) and
development layer (DL).
Layers
1) OpenMAX AL is the interface between multimedia applications, such as a media player, and the
platform media framework. It allows companies that develop applications to easily migrate
their applications to different platforms (customers) that support the OpenMAX AL application
programming interface (API)
3) OpenMAX DL is the interface between physical hardware, such as digital signal processor (DSP)
chips, CPUs, GPUs, and software, like video codecs and 3D engines. It allows companies to
easily integrate new hardware that supports OpenMAX DL without reoptimizing their low level
software.
Path-framerwork/av/media/libmedia/IOMX.cpp
Class-BpOMX
Path-framerwork/av/media/libstagefright/omx/omxgraphicbuffersource.cpp
Class-OmxComponentWrapper
Path-framerwork/av/media/libstagefright/omx/OMXmaster.cpp
OMXmaster.cpp Used for:-
1) addPlugin
2)clearPlugins
3)makeComponentInstance
4)destroyComponentInstance
5)enumerateComponents
6)getRolesOfComponent
OMX_core
The OMX_Core header file contains the definitions used by both the application and the
component to access common items.
OMX_core methods
OMX_init The OMX_Init method is used to initialize the OMX core. It shall be the
first call made into OMX and it should only be executed one time without
an interviening OMX_Deinit call.
OMX_deinit The OMX_Deinit method is used to deinitialize the OMX core. It shall be
the last call made into OMX.
define OMX_SendCommand( \
hComponent, \
Cmd, \
nParam, \
pCmdData) \
((OMX_COMPONENTTYPE*)(hComponent))->SendCommand( \
hComponent, \
Cmd, \
nParam, \
pCmdData) /* Macro End */
2) The OMX_STATETYPE enumeration is used to indicate or change the component state. This
enumeration reflects the current state of the component when used with the
OMX_GetState macro or becomes the parameter in a state change command when used
with the OMX_SendCommand macro.
OmxNodeInstance
Path:
/frameworks/av/media/libstagefright/omx/include/media/stagefright/omx/OMXNodeInstance.h
Methods:
CallbackDispatcherThread :- underlying thread used by the CallbackDispatcher.CallbackDispatcher:
1. Post() :- Posts |msg| to listener’s queue.
2. loop()
3. Dispatch()
API name Functionality
OmxNodeInstance() Constructor:- Initializes various class attributes
setHandle() Sets the mHandle variable.
setBufferSource() Sets mOmxBufferSource variable.
sendCommand() Changes the state of bufferSource to idle or loaded based on cmd and
param.
setParameter() Sets portIndex. Calls enableNativeBuffers_l and
storeMetaDataInBuffers_l
getGraphicBufferUsage Calls the OMX_GetExtensionIndex macro, it will invoke a
component to translate a vendor specific configuration or
parameter string into an OMX structure index and the
OMX_GetParameter macro will get one of the current
parameter settings from the component. This macro
cannot only be invoked when the component is in the
OMX_StateInvalid state.
freeNode() Transition the node from its current state all the way down to
"Loaded".
OMXutils:
Path-framerwork/av/media/libstagefright/omx/OMXutils.cpp
Used for:-
1.DescribeColorFormatParams
2.DescribeDefaultColorFormat
3.GetComponentRole