[FFmpeg-devel] [PATCH 3/3] avcodec/mediacodecenc: workaround the alignment requirement for H.265

Zhao Zhili quinkblack at foxmail.com
Thu May 23 10:08:56 EEST 2024


From: Zhao Zhili <zhilizhao at tencent.com>

Signed-off-by: Zhao Zhili <zhilizhao at tencent.com>
---
 libavcodec/mediacodecenc.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
index bfff149039..a42270551b 100644
--- a/libavcodec/mediacodecenc.c
+++ b/libavcodec/mediacodecenc.c
@@ -154,8 +154,12 @@ static int mediacodec_init_bsf(AVCodecContext *avctx)
             ret = snprintf(str, sizeof(str), "h264_metadata=crop_right=%d:crop_bottom=%d",
                            crop_right, crop_bottom);
         else if (avctx->codec_id == AV_CODEC_ID_HEVC)
-            ret = snprintf(str, sizeof(str), "hevc_metadata=crop_right=%d:crop_bottom=%d",
-                           crop_right, crop_bottom);
+            /* Encoder can use CTU size larger than 16x16, so the real crop
+             * margin can be larger than crop_right/crop_bottom. Let bsf figure
+             * out the real crop margin.
+             */
+            ret = snprintf(str, sizeof(str), "hevc_metadata=width=%d:height=%d",
+                           avctx->width, avctx->height);
         if (ret >= sizeof(str))
             return AVERROR_BUFFER_TOO_SMALL;
     }
@@ -235,7 +239,8 @@ static av_cold int mediacodec_init(AVCodecContext *avctx)
     // Workaround the alignment requirement of mediacodec. We can't do it
     // silently for AV_PIX_FMT_MEDIACODEC.
     if (avctx->pix_fmt != AV_PIX_FMT_MEDIACODEC &&
-        avctx->codec_id == AV_CODEC_ID_H264) {
+        (avctx->codec_id == AV_CODEC_ID_H264 ||
+         avctx->codec_id == AV_CODEC_ID_HEVC)) {
         s->width = FFALIGN(avctx->width, 16);
         s->height = FFALIGN(avctx->height, 16);
     } else {
-- 
2.42.0



More information about the ffmpeg-devel mailing list