Access StageFright.so directly to decode H.264 stream from JNIlayer in Android
h.264, stagefright
Solution
If your objective is to decode an elementary `H.264` stream, then your code will have to ensure that the stream is extracted, the `codec-specific-data` is provided to the codec which is primarily `SPS` and `PPS` data and frame data along with time-stamps is provided to the codec. Across all `Android` versions, the most common interface would be `OMXCodec` which is an abstraction over an underlying `OMX` component.
In Gingerbread (Android 2.3) and ICS (Android 4.0.0), if you would like to create a decoder, the best method would be to create an `OMXCodec` component and abstract your code through a `MediaSource` interface i.e. your wrapper code is modeled as `MediaSource` and `OMXCodec` reads from this source and performs the decoding.
Link to Android 2.3 Video decoder creation: http://androidxref.com/2.3.6/xref/frameworks/base/media/libstagefright/AwesomePlayer.cpp#1094
Link to Android 4.0.0 Video decoder creation: http://androidxref.com/4.0.4/xref/frameworks/base/media/libstagefright/AwesomePlayer.cpp#1474
The main challenges would be the following:
Model the input as a `MediaSource`.
Read a wrapper code to read the buffer from the codec and handle the same and release it back to the codec.
For simplification, you could look `stagefright` command line executable code as in http://androidxref.com/4.0.4/xref/frameworks/base/cmds/stagefright/stagefright.cpp#233
However, if your program is based on JellyBean (Android 4.1.x, 4.2.x) onwards, then these are slightly more simplified. From your JNI code, you could create a `MediaCodec` component and employ the same for decoding. To integrate the same into your program, you could refer to the `SimplePlayer` implementation as in http://androidxref.com/4.2.2_r1/xref/frameworks/av/cmds/stagefright/SimplePlayer.cpp#316
Problem
Is there a way to access `libstagefright.so` directly to decode `H.264` stream from `JNI` layer on Android 2.3 or above?