the android media framework
play

The Android media framework Author: Bert Van Dam & - PowerPoint PPT Presentation

Android builders summit The Android media framework Author: Bert Van Dam & Poornachandra Kallare Date: 22 April 2014 Usage models Use the framework: MediaPlayer android.media.MediaPlayer Framework manages Demuxing


  1. Android builders summit The Android media framework Author: Bert Van Dam & Poornachandra Kallare Date: 22 April 2014

  2. Usage models • Use the framework: MediaPlayer – android.media.MediaPlayer – Framework manages • Demuxing • Decoding • AV synchronization • AV rendering • DIY: the application manages – Demuxing: android.media.mediaExtractor – Decoding: android.media.MediaCodec – Video rendering: android.media.MediaCodec – Audio rendering: android.media.AudioTrack 2

  3. MediaPlayer usage model • The easy way: instantiate VideoView – Creates the MediaPlayer for you – Exports similar API to MediaPlayer • The slightly more complicated way – Application creates SurfaceView – Application creates MediaPlayer – MediaPlayer.setSurface(surface) 3

  4. Which media players exist • Built-in players – AwesomePlayer (default player selected) – NuPlayer (Apple HLS) – SonivoxPlayer (midi files) – testPlayer • Extra player factories can be registered • Every player provides same interface – frameworks/av/include/media/MediaPlayerInterface.h 4

  5. JAVA Native Architecture Application frameworks/base/media/java/android/media/MediaPlayer.java android.media.MediaPlayer JNI frameworks/base/media/jni/android_media_MediaPlayer.cpp Native MediaPlayer frameworks/av/media/libmedia/mediaplayer.cpp Binder Media service frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp MediaPlayerService MediaPlayer frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp Factory creates NuPlayer frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp Driver StageFright frameworks/av/media/libmediaplayerservice/StagefrightPlayer.cpp Player frameworks/av/media/libstagefright/AwesomePlayer.cpp Awesome instantiates Player 5

  6. JAVA Player creation (simplified) Native Application (1) mp = new MediaPlayer(); native_setup( new WeakReference<MediaPlayer>(this)); MediaPlayer.java android_media_MediaPlayer.cpp sp<MediaPlayer> mp = new MediaPlayer(); Object initialization mAudioSessionId = AudioSystem::newAudioSessionId(); mediaplayer.cpp AudioSystem::acquireAudioSessionId(mAudioSessionId); Nothing much happened yet … 6

  7. JAVA Player creation (simplified) Native binder (2)) mp.SetDataSource(URL); Application setDataSource(URL); MediaPlayer.java mp.setDataSource(URL); android_media_MediaPlayer.cpp getMediaPlayerService; mediaplayer.cpp Player = Service.create(audiosessionid); new Client(); MediaPlayerService.cpp Player->setDataSource(URL); mediaplayer.cpp Check network permissions MediaPlayerService.cpp MediaPlayerFactory::createPlayer(); Which player handles this URL??? 7

  8. Player creation factory class NuPlayerFactory : public MediaPlayerFactory::IFactory player_type MediaPlayerFactory:: getDefaultPlayerType () { { char value[PROPERTY_VALUE_MAX]; if (property_get("media.stagefright.use-nuplayer", value, NULL) public: Default is && (!strcmp("1", value) || !strcasecmp("true", value))) { virtual float scoreFactory(const sp<IMediaPlayer>& client, StageFright return NU_PLAYER; const char* url, } float curScore) { static const float kOurScore = 0.8; return STAGEFRIGHT_PLAYER ; } if (kOurScore <= curScore) return 0.0; Apple if (!strncasecmp("http://", url, 7) class SonivoxPlayerFactory : public || !strncasecmp("https://", url, 8)) { HLS MediaPlayerFactory::IFactory { size_t len = strlen(url); public: if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { virtual float scoreFactory(const sp<IMediaPlayer>& client, return kOurScore; const char* url, } float curScore) { Handle these static const float kOurScore = 0.4; if (strstr(url,"m3u8")) { static const char* const FILE_EXTS[] = { ".mid", extensions return kOurScore; And ".midi", } only ".smf", RTSP } ".xmf", ".mxmf", if (!strncasecmp("rtsp://", url, 7)) { ".imy", return kOurScore; ".rtttl", } ".rtx", ".ota" }; return 0.0; } 8

  9. AwesomePlayer • Building blocks – OMX-IL • http://www.khronos.org/openmax/il/ • Standardized interface for accessing streaming components • Google provides set of SW decoders • SOC suppliers provide HW accelerated decoders – MediaExtractors • frameworks/av/media/libstagefright/ • Classes capable of demuxing specific container formats (MP3Extractor, MPEG4Extractor, MatroskaExtractor , …) • Allow extraction of audio, video, subtitle tracks – Audioflinger, surfaceflinger for rendering 9

  10. OMX-IL - principles Used by Stagefright players 10

  11. OMX-IL – Android integration 11

  12. OMX-IL – example config file media_codecs.xml 12

  13. MediaPlayer.prepare Example AwesomePlayer.cpp mConnectingDataSource = HTTPBase::Create; creates a ChromiumHttpClient mConnectingDataSource->connect(URL); mCachedSource = new NuCachedSource2(); dataSource = mCachedSource; Go through the cache from here onwards AwesomePlayer.cpp Wait for 192 KB of data in the cache Datasource->sniff() ; Detect the MIME type of the stream Already registered extractor = MediaExtractor::Create(MIME, datasource); Create the extractor Calculate bitrate of stream through extractor Select first video and audio stream as default initVideoDecoder() Create and start the video decoder mVideoSource = OMXCodec::Create(); mVideoSource->start(); initAudioDecoder(); Create and start the audio decoder mAudioSource = OMXCodec::Create(); mAudioSource->start(); Continue buffering Notify Prepared state when highwatermark is reached MediaPlayer is now ready to start playback Decoding is not yet happening at this stage!!! 13

  14. Status after prepare AwesomePlayer MediaSource API instances MediaSource API instances • mVideoTrack • mVideoSource • mAudioTrack • mAudioSource MediaExtractor OMXCodec (video) OMXCodec (audio) datasource NuCachedSoure2 FileSource (network files) (local files) buffer ChromiumHttpClient (fetches data over IP) 14

  15. MediaPlayer.start mp.setSurface(); Call needed to have a destination for rendering (VideoView srf) Application mp.start(); mAudioPlayer = new AudioPlayer(); AwesomePlayer.cpp mAudioPlayer->setSource(mAudioSource); mTimeSource = mAudioPlayer; Audio track used as timing reference startAudioPlayer_l(); Starts the audio player mTextDriver->start(); Start subtitle player initRenderer_l(); Initialize the rendering path (based on SW/HW codec) Start video event generation loop of video events with A/V sync logic Render buffers after applying AV sync logic 15

  16. Video data pulled by timed events AwesomePlayer Status after start AV sync happens here … AudioPlayer AwesomeRenderer textDriver MediaSource API instances • mVideoTrack audiosink • mAudioTrack MediaSource API instances nativeWindow • mVideoSource MediaExtractor • mAudioSource OMXCodec (video) OMXCodec (audio) datasource NuCachedSoure2 FileSource AudioFlinger (network files) (local files) buffer Audio data pulled by sink SurfaceFlinger through callback ChromiumHttpClient (fetches data over IP) Audio Video 16

  17. Track selection – MediaPlayer. getTrackInfo • Returns list of tracks – MediaPlayer. selectTrack(idx) • Maps to MediaExtractor • Select audio, video or subtitle track 17

  18. Subtitle handling • Limited formats supported – SRT, 3GPP • Both embedded and external files – addTimedTextSource to add external file – MediaPlayer.getTrackInfo returns both internal and external subtitle tracks • Player takes care of syncing to playback time – TimedText notifications raised at correct time 18

  19. Subtitle rendering Simple TextView can be used to render 19

  20. The DIY model • android.media.MediaCodecList – Returns supported formats – Based on config.xml file explained before • android.media.MediaCodec – Is basically an abstraction of OMX-IL – Application juggles buffers to and from component • Application acts as the player in this case – Responsible for rendering + AV sync 20

  21. The DIY model – typical setup MyActivity Create SurfaceView (for rendering video) Create AudioTrack (for rendering audio) Create MediaExtractor (alternatively have your own system for ES retrieval) -> query tracks -> selectTrack(audio track idx) -> selectTrack(video track idx) -> getTrackFormat(idx) Create MediaCodec for audio and for video MediaExtractor Configure MediaCodecs as per formats detected above, and start them while (1) on thread 1 { extr.readSampleData extr.getSampleTrackIndex // determine if it’s the audio or video extr.getSampleTime // presentation time audio/videodec.queueInputBuffer SurfaceView } ~~~ while(1) on thread 2 { audio/videodec.dequeueOutputBuffer audiotrack.write for audio – videodec.releaseOutputBuffer for video } MediaCodec MediaCodec AudioTrack audiodec videodec 21

  22. Classic DRM Framework http://developer.android.com/reference/android/drm/package-summary.html 22

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend