From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 8BCBB40166 for ; Sun, 4 Dec 2022 17:13:09 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 150DD68B8BE; Sun, 4 Dec 2022 19:13:06 +0200 (EET) Received: from out162-62-57-64.mail.qq.com (out162-62-57-64.mail.qq.com [162.62.57.64]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C9C7C68B7F1 for ; Sun, 4 Dec 2022 19:12:58 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1670173975; bh=YTkZWSN08bD6dP+TlULdk4sHjLww5DBTMrBlvYIwCrk=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=vopNq+FK/cRM0VzHArDvqgU0FHUAPmDNyxc9NqXnsKzzOFzF1Tog1hG67mtI0PIrT NHorDTuKKlaeNqAn2Q+Wggb1DGFA2qcDsWst1Xa4UvTVPR3/KzulmgLaynmWJ3Q7wp L1sfi0P2iAcpZ7XX7sk5cEnmNDBykxkYVgloEk4I= Received: from localhost.localdomain ([14.153.79.182]) by newxmesmtplogicsvrszb1-0.qq.com (NewEsmtp) with SMTP id 334B3853; Mon, 05 Dec 2022 01:12:52 +0800 X-QQ-mid: xmsmtpt1670173974t0hppu7r0 Message-ID: X-QQ-XMAILINFO: N7/wgsuYk0VxHowYHQX2utWXj5rLcjOb1qZO9GldaMHn6FOGwawmvbkospwlrr lMJcR0ZFYuoLO+Fku6sG7rMYgOqAu5OrxrwwlC4nCHktV+7YMUWhNODuZ6uRNX1jkJx0CkNWTSrj V9NU0Kq8zBoDsMDwC3ds/RjNhJ3g24fyS6mjgLmqsJhmlWno3Nd3rOmLD7/K4afqg/nGn9/Gemc6 fAvF00unlQlGHkJroKYKJtknQ6rH6RxxiDPDvZ0Ubg/aEF8BoEFwKRKpVlvkauln97mfUqN2aeVh yD8EiqC7oJ7PQLbFnw2Yvjl/doxusc/SWZQMDPH1Xk0luXI0nb2JM57OgEFeLXR7WQQacO+VImr+ 3bvvI9Lr5bIHjiglpgnAEPf8LM1prsUo9H0Sn4kRI49/cdettErJf7bDQyzZrtgxG4szHM3HhGsG vjza0ZQ4520id6zgLN9M0ABvlm4qE5NVC+7PvvyQGqiRY/5eZ/u2NDHcwWo5oCNFOOI/n2IRHtr4 flPTXLYYBkzpoOxW2Ob5cUFrwlnEBTu6pX2IK9D5MmkOR+VdpijF0XZjvY/Txe49LtVsZkTR+6wc M+hHD4EEHoi0tOIag17yhj+p+jwMkFYSFTfZxbBm35gCLFggIZBb11ew2S0OGZlNpEnURvIdBSlr 7xzUeXXhqqGOxrGvjt9JO7e46yfJkCbt/1miqL7avC95F8YMo1d4tOOir2ITNFFWtnaOv1qPkW1J Ve2BSBWYbGs90scXJFinIngu2D7Wu+tdcbxfz9XWvRyue0dCQTrWIhv8YU1WMjBTurhm86GSYJ8z YVpxiRZT3flkU6VkexSmFN9R+jqOEH+Ecv2dJ3qHWL+ZG0T6/odpYik57hT9Znyd/yvWvfogOaJV Dn0bMxx0PRcKj7pTAkLAd+ue/QUbu0AjnrE/4aDku1/6HTDlWKPQA3UEYC7X25PmGe/68SUR6TSg 4uT0bfeqYg9GS6kahoVhme+wVSPU/utAP4o5xCbpKEkmjbAkYluuyi3TaZxqa1 From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Mon, 5 Dec 2022 01:12:25 +0800 X-OQ-MSGID: <20221204171228.50160-4-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221204171228.50160-1-quinkblack@foxmail.com> References: <20221204171228.50160-1-quinkblack@foxmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/7] avcodec/mediacodecenc: use bsf to handle crop X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Zhao Zhili Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: From: Zhao Zhili It's well known that mediacodec encoder requires 16x16 alignment. Use our bsf to fix the crop info. --- configure | 2 ++ libavcodec/mediacodecenc.c | 65 +++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 0d754e7ae9..3bb0a091d4 100755 --- a/configure +++ b/configure @@ -3169,6 +3169,7 @@ h264_mediacodec_decoder_extralibs="-landroid" h264_mediacodec_decoder_select="h264_mp4toannexb_bsf h264_parser" h264_mediacodec_encoder_deps="mediacodec" h264_mediacodec_encoder_extralibs="-landroid" +h264_mediacodec_encoder_select="h264_metadata" h264_mf_encoder_deps="mediafoundation" h264_mmal_decoder_deps="mmal" h264_nvenc_encoder_deps="nvenc" @@ -3190,6 +3191,7 @@ hevc_mediacodec_decoder_extralibs="-landroid" hevc_mediacodec_decoder_select="hevc_mp4toannexb_bsf hevc_parser" hevc_mediacodec_encoder_deps="mediacodec" hevc_mediacodec_encoder_extralibs="-landroid" +hevc_mediacodec_encoder_select="hevc_metadata" hevc_mf_encoder_deps="mediafoundation" hevc_nvenc_encoder_deps="nvenc" hevc_nvenc_encoder_select="atsc_a53" diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c index d098880941..dce4a96d1f 100644 --- a/libavcodec/mediacodecenc.c +++ b/libavcodec/mediacodecenc.c @@ -28,6 +28,7 @@ #include "libavutil/opt.h" #include "avcodec.h" +#include "bsf.h" #include "codec_internal.h" #include "encode.h" #include "hwconfig.h" @@ -78,6 +79,7 @@ typedef struct MediaCodecEncContext { int eof_sent; AVFrame *frame; + AVBSFContext *bsf; int bitrate_mode; int level; @@ -119,6 +121,42 @@ static void mediacodec_output_format(AVCodecContext *avctx) ff_AMediaFormat_delete(out_format); } +static int mediacodec_init_bsf(AVCodecContext *avctx) +{ + MediaCodecEncContext *s = avctx->priv_data; + char str[128]; + int ret; + int crop_right = s->width - avctx->width; + int crop_bottom = s->height - avctx->height; + + if (!crop_right && !crop_bottom) + return 0; + + if (avctx->codec_id == AV_CODEC_ID_H264) + 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); + else + return 0; + + if (ret >= sizeof(str)) + return AVERROR_BUFFER_TOO_SMALL; + + ret = av_bsf_list_parse_str(str, &s->bsf); + if (ret < 0) + return ret; + + ret = avcodec_parameters_from_context(s->bsf->par_in, avctx); + if (ret < 0) + return ret; + s->bsf->time_base_in = avctx->time_base; + ret = av_bsf_init(s->bsf); + + return ret; +} + static av_cold int mediacodec_init(AVCodecContext *avctx) { const char *codec_mime = NULL; @@ -159,7 +197,7 @@ static av_cold int mediacodec_init(AVCodecContext *avctx) ff_AMediaFormat_setString(format, "mime", codec_mime); s->width = FFALIGN(avctx->width, 16); - s->height = avctx->height; + s->height = FFALIGN(avctx->height, 16); ff_AMediaFormat_setInt32(format, "width", s->width); ff_AMediaFormat_setInt32(format, "height", s->height); @@ -252,6 +290,10 @@ static av_cold int mediacodec_init(AVCodecContext *avctx) goto bailout; } + ret = mediacodec_init_bsf(avctx); + if (ret) + goto bailout; + mediacodec_output_format(avctx); s->frame = av_frame_alloc(); @@ -444,10 +486,24 @@ static int mediacodec_encode(AVCodecContext *avctx, AVPacket *pkt) // 2. Got a packet success // 3. No AVFrame is available yet (don't return if get_frame return EOF) while (1) { + if (s->bsf) { + ret = av_bsf_receive_packet(s->bsf, pkt); + if (!ret) + return 0; + if (ret != AVERROR(EAGAIN)) + return ret; + } + ret = mediacodec_receive(avctx, pkt, &got_packet); - if (!ret) - return 0; - else if (ret != AVERROR(EAGAIN)) + if (s->bsf) { + if (!ret || ret == AVERROR_EOF) + ret = av_bsf_send_packet(s->bsf, pkt); + } else { + if (!ret) + return 0; + } + + if (ret != AVERROR(EAGAIN)) return ret; if (!s->frame->buf[0]) { @@ -480,6 +536,7 @@ static av_cold int mediacodec_close(AVCodecContext *avctx) s->window = NULL; } + av_bsf_free(&s->bsf); av_frame_free(&s->frame); return 0; -- 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".