From: Zhao Zhili <quinkblack@foxmail.com> To: ffmpeg-devel@ffmpeg.org Cc: matthieu.bouron@stupeflix.com, Zhao Zhili <zhilizhao@tencent.com>, aman@tmm1.net Subject: [FFmpeg-devel] [PATCH v2 00/12] Add MediaCodec encoder and NDK MediaCodec support Date: Sun, 20 Nov 2022 14:49:35 +0800 Message-ID: <tencent_0CF19A1E40169A509FCEAB374E65708C2D08@qq.com> (raw) From: Zhao Zhili <zhilizhao@tencent.com> v2: Rebased on master. 01/12: Use crop-width/crop-height as fallback and add TODO. Co-authored-by: Aman Karmani 07/12: Fix libavcodec/version.h conflict 10/12: Change default i-frame-interval to 1 and add log message; bump minor version 12/12: Fix rebase conflict v1: Firstly, some bugs were fixed (patch 1-4). Patch 5 and 6 make mediacodec_wrapper support Java MediaCodec and NDK MediaCodec. The use case I'm considering is run FFmpeg on cmdline without JVM, for example, run FFmpeg inside of termux (an Android terminal emulator). It's well known that NDK MediaCodec missing some important functions, like get the list of codecs, but still useable. Patch 7 add NDK MediaCodec decoder support. It can be enabled via options, and enabled automatically if no JVM is available. Patch 8 add ANativeWindow support to hwcontext_mediacodec. It can be set by user, and can be created via AMediaCodec_createPersistentInputSurface automatically. This is a preparation for encoder. Patch 9 makes MediaCodec decoder to support ANativeWindow directly. It worth to note that AVMediaCodecContext has only surface. Although we provided av_mediacodec_alloc_context(), we didn't strictly prevent users to allocate AVMediaCodecContext on stack. I'm not sure if it's OK to add new field to AVMediaCodecContext. Patch 10 add MediaCodec encoder support. Frame can be feed to encoder via buffer, or via Surface/ANativeWindow. If Surface/ANativeWindow is used, and the frames come from our MediaCodec decoder wrapper, we can control it's 'render' (send to encoder's surface) via av_mediacodec_release_buffer(). A DTS generation strategy works in this case. However, if frames comes from other sources, like a camera, there is no way to control the 'render' yet, so DTS is missing in this case. Finally, we can do mediacodec transcoding with FFmpeg cmdline on Android. More importantly, we can do MediaCodec decoder to encoder without copy frames, although it's very limited since most of avfilters doesn't work. For example: ./ffmpeg -hwaccel mediacodec -hwaccel_output_format mediacodec -i /sdcard/test.mp4 -an -c:v h264_mediacodec -y /sdcard/out.mp4 Since there is no real AVHWFrameContext implementation in hwcontext_mediacodec. there is no hwframe_ctx for mediacodec and av_hwframe_transfer_data() doesn't work. So if -hwaccel_output_format isn't being specified like: ./ffmpeg -hwaccel mediacodec -i /sdcard/test.mp4 -an -c:v h264_mediacodec -y /sdcard/out.mp4 It will trigger a crash in av_hwframe_transfer_data. Patch 11 add a check on hwframe_ctx. Patch 12 set hwaccel_output_format automatically to avoid such case. Zhao Zhili (12): avcodec/mediacodec: fix incorrect crop info avcodec/mediacodecdec: don't break out if both input and output port return try again avcodec/mediacodecdec_common: fix misuse av_free/av_freep avcodec/mediacodecdec_common: fix useless av_buffer_unref avcodec/mediacodec_wrapper: separate implementation from interface avcodec/mediacodec: add NDK media codec wrapper avcodec/mediacodecdec: enable NDK mediacodec avutil/hwcontext_mediacodec: add ANativeWindow support avcodec/mediacodec: add ANativeWindow support avcodec: add MediaCodec encoder avutil/hwcontext: verify hw_frames_ctx in transfer_data_alloc fftools/ffmpeg_opt: set default hwaccel_output_format for mediacodec Changelog | 2 + configure | 6 + fftools/ffmpeg_demux.c | 4 + libavcodec/Makefile | 2 + libavcodec/allcodecs.c | 2 + libavcodec/mediacodec_surface.c | 46 +- libavcodec/mediacodec_surface.h | 8 +- libavcodec/mediacodec_wrapper.c | 941 +++++++++++++++++++++++++++--- libavcodec/mediacodec_wrapper.h | 275 +++++++-- libavcodec/mediacodecdec.c | 21 +- libavcodec/mediacodecdec_common.c | 46 +- libavcodec/mediacodecdec_common.h | 1 + libavcodec/mediacodecenc.c | 504 ++++++++++++++++ libavcodec/version.h | 4 +- libavutil/hwcontext.c | 6 +- libavutil/hwcontext_mediacodec.c | 56 +- libavutil/hwcontext_mediacodec.h | 11 + libavutil/version.h | 2 +- 18 files changed, 1797 insertions(+), 140 deletions(-) create mode 100644 libavcodec/mediacodecenc.c -- 2.25.1 _______________________________________________ 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-11-20 6:50 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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_0CF19A1E40169A509FCEAB374E65708C2D08@qq.com \ --to=quinkblack@foxmail.com \ --cc=aman@tmm1.net \ --cc=ffmpeg-devel@ffmpeg.org \ --cc=matthieu.bouron@stupeflix.com \ --cc=zhilizhao@tencent.com \ /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