[FFmpeg-devel] MediaCodec support

Matthieu Bouron matthieu.bouron at gmail.com
Tue Feb 16 18:51:32 CET 2016


On Tue, Feb 16, 2016 at 2:47 PM, Matthieu Bouron <matthieu.bouron at gmail.com>
wrote:

>
>
> On Tue, Feb 16, 2016 at 12:36 PM, wm4 <nfxjfg at googlemail.com> wrote:
>
>> On Tue, 16 Feb 2016 12:09:58 +0100
>> Matthieu Bouron <matthieu.bouron at gmail.com> wrote:
>>
>> > On Tue, Feb 16, 2016 at 10:41 AM, wm4 <nfxjfg at googlemail.com> wrote:
>> >
>> > > On Mon, 15 Feb 2016 18:52:25 +0100
>> > > Matthieu Bouron <matthieu.bouron at gmail.com> wrote:
>> > >
>> > > > Hello,
>> > > >
>> > > > The following patchset adds basic MediaCodec support to libavcodec,
>> ie:
>> > > only
>> > > > h264 is supported and the HWAccel part (Surface output) is missing.
>> > > >
>> > > > JNI comes as a dependency. The JNI support is based on the same
>> patchset
>> > > I've
>> > > > sent some time ago with some improvements.
>> > > >
>> > > > I originally developed the patch against the Ndk API (Android >=
>> 5.0)
>> > > but then
>> > > > changed my mind and go with the JNI version for two main reasons:
>> > > >
>> > > >   * there are still too many android 4 devices
>> > > >   * there is still needs for some jni bits as the MediaCodec Ndk API
>> > > >   does not provide a way to known the codec name which is mandatory
>> > > >   to workaround or blacklist some implementations (ie: do not use
>> known
>> > > >   software decoders, workaround OMX.SEC.avc.dec as it returns
>> invalid
>> > > >   stride and slice-height values, ...)
>> > > >
>> > >
>> > > I guess there's no way around it.
>> > >
>> > > > I decided to mimic the Ndk API minus a few differences (see
>> > > > mediacodec_wrapper.h) so it can be ported more easily to the C API
>> in the
>> > > > future. The other reason being it is to totally hide the JNI code.
>> > > >
>> > > > The HWAccel part is on my todo list but I wanted a real use case to
>> > > develop the
>> > > > API against.
>> > > >
>> > > > The development branch can be found here:
>> > > > https://github.com/mbouron/FFmpeg/tree/feature/mediacodec-support
>> > > >
>> > > > --enable-jni and --enable-mediacodec is required to build the
>> > > h264_mediacodec
>> > > > decoder.
>> > > >
>> > > > av_jni_register_java_vm(vm) must called before lavc is used.
>> > >
>> > > Wasn't there some sort of trick that could avoid this?
>> > >
>> >
>> > The workaround for this is to call a *private* C++ API, and in
>> particular
>> > checking that the variable jni_invocation_ is initialized
>> > and call the GetCreatedJavaVMS function from:
>> >
>> https://android.googlesource.com/platform/libnativehelper/+/master/JniInvocation.cpp
>> >
>> >
>>
>> If I read this right, the host can somehow initialize the JNI, and then
>> JNI_GetCreatedJavaVMs() will work?
>>
>
> AFAIK, This is initialized when the VM (dalvik or art) is initialized.
>
>>
>> Though it looks like that function will just crash if the jni stuff is
>> not initialized. With no way to ensure or verify initialization using
>> public (or just C++?) API. Well, I guess this is Android quality code...
>>
>
> Well it is ... this api is not public.
>

I implemented this and pushed it to the development branch, so there is no
need to call av_jni_register_java_vm anymore (so this part of the public
api will be removed)

[...]


More information about the ffmpeg-devel mailing list