Friday, May 20, 2011

NuPlayer for HTTP live streaming

HTTP Live Streaming is separated from Stagefright on the recent release, which is basically another light-weighted playback engine, except it only supports the fixed container and codecs format currently.
It seems that the author really prefers rewriting than refactoring:)

Unlike Awesomeplayer, NuPlayer is built upon Stagefright's foundation classes, and leverages the Looper/Handlers mechanism to handle requests asynchronously by queuing them in a message loop, so there are less mutex/lock in place.


  • NuPlayer::Source is the parser module. Actually its interface looks like a combination of MediaExtractor and MediaSource, and it also makes seekTo as an explicit API now.
  • NuPlayer::Decoder connects to ACodec for AVC decoding, and to DecoderWrapper for AAC decoding, which in turn wrapps AAC software decoder in the OpenMAX style. ACodec is functionally similar as OMXCodec in Stagefright, besides the application of State pattern and passing MediaBuffers around with messages.
  • NuPlayer::Render is responsible for rendering audio and also controls when to post video buffers back to NativeWindow for A/V sync.

5 comments:

Anonymous said...

Thanks for the detailed description. Can I ask where you found the source code to come up with the API flow control? I could not find it myself at the kernel.org website.

Anonymous said...

Thanks for the detailed description. I found it very useful. Could you please post details how rtsp streamig handled in android media framework

freepine said...

Hi, RTSP streaming is handled similarly as HLS in NuPlayer via RTSPSource, which implements NuPlayer::Source and leverages the same implementation as in Stagefright (media/libstagefright/rtsp/MyHandle.h, etc.). You can refer to my previous posts about RTSP:)

Anonymous said...

Can you advice how to force stagefright rtsp to use tcp transport instead of udp ?
Thanks in advance!

freepine said...

Hi, I don't think there is an option in Stagefright to use tcp for payload transportation.
You can add your own implementation if it's desired.