Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: "Zhao Zhili" <quinkblack@foxmail.com>
To: "'FFmpeg development discussions and patches'" <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] Defect: MediaCodec Encoder - Pixel ColorSpace of many Adreno GPUs not supported
Date: Thu, 8 Dec 2022 01:16:02 +0800
Message-ID: <tencent_24C1D567A7303888167ACD76A031CDB04F07@qq.com> (raw)
In-Reply-To: <CAARLgwKi_N5DK-9YvPuSbwOOTir=A3-2QADxDGmOso8yDhWi-A@mail.gmail.com>

> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Ben Temple
> Sent: 2022年12月7日 6:53
> To: ffmpeg-devel@ffmpeg.org; Zhao Zhili <zhilizhao@tencent.com>
> Subject: [FFmpeg-devel] Defect: MediaCodec Encoder - Pixel ColorSpace of many Adreno GPUs not supported
> 
> MediaCodec Encoder: Pixel ColorSpace of many Adreno GPUs is not supported
> (<= Adreno 650 in our testing)What you were trying to accomplish?
> 
> I am trying to transcode an MP4 file using the MediaCodec encoder support
> that was recently added by Zhao Zhili <zhilizhao@tencent.com> here
> <https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/0ff18a7d6d496f89d9e007ddd1cad7116baf5c7c>
> (
> https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/0ff18a7d6d496f89d9e007ddd1cad7116baf5c7c
> )
> The problem you encountered:
> 
> On multiple phones containing an Adreno GPU, the encoding process
> immediately fails because the color space expected by the GPU is
> unsupported.
> 
> The exact error output: “does not support color format 19”
> 
...
> 
> The exact command line you were using:
> 
> -hwaccel mediacodec -hwaccel_output_format mediacodec -i
> "/data/user/0/com.test.ffmpeg_kit_android_demo/cache/test_input.mp4"  -c:v
> h264_mediacodec  -ndk_codec 1  -y
> "/data/user/0/com.test.ffmpeg_kit_android_demo/cache/test_output.mp4"
> -loglevel trace

Thank you for your valuable test!

There is an unexpected behavior in the test. The test was conducted with ffmpeg-kit, not ffmpeg cmdline.
With FFmpeg cmdline and -hwcontext mediacodec, the encoder should have "-pix_fmt mediacodec" by
default, and have an AVMediaCodecDeviceContext (with Android 8.0 or higher). The encoder doesn't
setup properly with ffmpeg-kit.

pix_fmt mediacodec should be supported by most of Android devices. It do have its limitation, e.g., it needs
a Surface object or require Android 8.0, and it doesn't work with avfilter.

The above issue can be fixed on the ffmpeg-kit's side. Now comes the dark corner of Mediacodec. It should
work without pix_fmt mediacodec. Can you try specify the encoder pix_fmt as nv12, that's

-hwaccel mediacodec -hwaccel_output_format mediacodec -i test_input.mp4 -c:v h264_mediacodec -ndk_codec 1 -pix_fmt nv12 -y test_output.mp4

I guess these devices work with nv12.

There is an old story "MediaCodec and device compatibility"

https://groups.google.com/g/android-platform/c/p_MoSk0JPNM

Ten years on, the situation doesn't improved much:
1. There is an ugly API to get color format supported by a codec.
2. It's only available in Java.
3. Different codec component have different color format.

Yes, we can use a bunch of JNI to get the supported color format. It must be done before create
AVCodecContext. But different mediacodec component have different color format, user can select 
mediacodec by name (see the following patch), we have only one AVCodec.pix_fmts.

avcodec/mediacodecenc: add option to select codec by name
https://patchwork.ffmpeg.org/project/ffmpeg/patch/tencent_729F52ABE34E4770972DB89AF840549A8208@qq.com/

We can add query the supported color format and add some hints when mediacodec configure failed.
Or we can add a helper function for user to query the color format. It will be a bunch of JNI code, limited
by the ugly MediaCodecInfo.CodecCapabilities API. It's easy to be done with Java. TBH, it's much easier with
trial and error, try nv12 then yuv420.

We can do something with FFCodec.init_static_data, but we need a strategy first. I don't want to go with a long
blacklist/whitelist.

** We only need one pixel format which supported by all devices, COLOR_FormatSurface doesn't count, and
COLOR_FormatYUV420Flexible doesn't count. **

Maybe Google can fix these issues with another 10 year.

> Console output:
> 
> See attached console_output.log
> Input Files:
> 
> See attached test_input.mp4

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2022-12-07 17:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-06 22:52 Ben Temple
2022-12-07 17:16 ` Zhao Zhili [this message]
2022-12-07 18:03   ` Ben Temple
2022-12-12 15:30   ` Tomas Härdin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tencent_24C1D567A7303888167ACD76A031CDB04F07@qq.com \
    --to=quinkblack@foxmail.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git