diff --git a/libavcodec/hw_base_encode.c b/libavcodec/hw_base_encode.c index 7b6ec97d3bb88..c28f1aa91cf8a 100644 --- a/libavcodec/hw_base_encode.c +++ b/libavcodec/hw_base_encode.c @@ -22,6 +22,7 @@ #include "libavutil/log.h" #include "libavutil/mem.h" #include "libavutil/pixdesc.h" +#include "libavutil/intreadwrite.h" #include "encode.h" #include "avcodec.h" @@ -551,6 +552,30 @@ int ff_hw_base_encode_set_output_property(FFHWBaseEncodeContext *ctx, (3 * ctx->output_delay + ctx->async_depth)]; } + if ((avctx->codec_id == AV_CODEC_ID_AV1) && + ((avctx->coded_width != avctx->width) || + (avctx->coded_height != avctx->height))) { + int err; + size_t crop_data_size = 4*4; + + uint8_t *crop_data = av_mallocz(crop_data_size); + if (!crop_data) { + av_buffer_unref(&pkt->buf); + return AVERROR(ENOMEM); + } + + AV_WL32(&crop_data[2], ctx->surface_width - avctx->width); + AV_WL32(&crop_data[3], ctx->surface_height - avctx->height); + + err = av_packet_add_side_data(pkt, AV_PKT_DATA_FRAME_CROPPING, + crop_data, crop_data_size); + if (err < 0) { + av_buffer_unref(&pkt->buf); + av_free(crop_data); + return err; + } + } + return 0; }