[FFmpeg-devel] [PATCH 1/2] lavc/mediacodecenc: Probe supported pixel formats

Tomas Härdin git at haerdin.se
Fri Jan 6 20:21:55 EET 2023


lör 2023-01-07 klockan 02:03 +0800 skrev Zhao Zhili:
> On Fri, 2023-01-06 at 16:42 +0100, Tomas Härdin wrote:
> 
> > +            if (!(format = ff_AMediaFormat_new(use_ndk_codec))) {
> > +                av_log(NULL, AV_LOG_ERROR, "Failed to create media
> > format\n");
> > +                ff_AMediaCodec_delete(codec);
> > +                continue;
> 
> Here is a use-after-free (codec) issue.

Oops. I had the call to ff_AMediaCodec_createEncoderByType() inside the
loop earlier. Will fix.


> init_static_data should be determinate, no matter when it was called,
> it should
> give the same result.

You mean across devices? That obviously won't work. On the same device?
I would assume it always returns the same results, modulo what you
wrote below.

> In addition to the 'different MediaCodec backends support
> different pixel format' issue, another concern of this method is that
> it's not
> determinate, it can give different results at different
> time/condition.
> 
> MediaCodec can fail for all kinds of reasons, and it can fail
> dynamically. For
> example, the supported instance is limited
> (getMaxSupportedInstances()). Some
> low end/legacy chip only support one instance. So it can fail when
> another app
> or another SDK in the same app has already created a codec instance.

Won't the encoder fail anyway in that case? Also will the JNI probe
still fail in that case?

> It can
> fail when out of other resouce (like GPU memory) temporarily. Since
> init_static_data() only being called once, there is no way to recover
> from a
> temporary failure.

Well, the code can try to probe the color formats more than once inside
the function. But that feels very wrong.

/Tomas



More information about the ffmpeg-devel mailing list