[FFmpeg-devel] [PATCH 1/2] libavcodec/libaomenc.c: Support gray input
Ryo Hirafuji
ryo.hirafuji at gmail.com
Sat Apr 4 12:53:40 EEST 2020
AV1 decoders, libaomdec and libdav1d, both support grayscale image.
However, libaomenc does not support it yet.
In this patch, I add a grayscale image support also to libaomenc.
---
libavcodec/libaomenc.c | 48 ++++++++++++++++++++++++++++++++++++------
1 file changed, 42 insertions(+), 6 deletions(-)
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 096aadbe1c..fb61ce82e2 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -276,6 +276,25 @@ static int set_pix_fmt(AVCodecContext *avctx, aom_codec_caps_t codec_caps,
AOMContext av_unused *ctx = avctx->priv_data;
enccfg->g_bit_depth = enccfg->g_input_bit_depth = 8;
switch (avctx->pix_fmt) {
+ case AV_PIX_FMT_GRAY8:
+ enccfg->monochrome = 1u;
+ enccfg->g_profile = FF_PROFILE_AV1_MAIN;
+ *img_fmt = AOM_IMG_FMT_I420;
+ return 0;
+ case AV_PIX_FMT_GRAY10:
+ case AV_PIX_FMT_GRAY12:
+ if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
+ enccfg->monochrome = 1u;
+ enccfg->g_profile =
+ avctx->pix_fmt == AV_PIX_FMT_GRAY10 ? FF_PROFILE_AV1_MAIN
+ : FF_PROFILE_AV1_PROFESSIONAL;
+ enccfg->g_bit_depth = enccfg->g_input_bit_depth =
+ avctx->pix_fmt == AV_PIX_FMT_GRAY10 ? 10 : 12;
+ *img_fmt = AOM_IMG_FMT_I420;
+ *flags |= AOM_CODEC_USE_HIGHBITDEPTH;
+ return 0;
+ }
+ break;
case AV_PIX_FMT_YUV420P:
enccfg->g_profile = FF_PROFILE_AV1_MAIN;
*img_fmt = AOM_IMG_FMT_I420;
@@ -979,12 +998,25 @@ static int aom_encode(AVCodecContext *avctx, AVPacket *pkt,
if (frame) {
rawimg = &ctx->rawimg;
- rawimg->planes[AOM_PLANE_Y] = frame->data[0];
- rawimg->planes[AOM_PLANE_U] = frame->data[1];
- rawimg->planes[AOM_PLANE_V] = frame->data[2];
- rawimg->stride[AOM_PLANE_Y] = frame->linesize[0];
- rawimg->stride[AOM_PLANE_U] = frame->linesize[1];
- rawimg->stride[AOM_PLANE_V] = frame->linesize[2];
+ if (frame->format == AV_PIX_FMT_GRAY8 ||
+ frame->format == AV_PIX_FMT_GRAY10 ||
+ frame->format == AV_PIX_FMT_GRAY12) {
+ rawimg->monochrome = 1;
+ rawimg->planes[AOM_PLANE_Y] = frame->data[0];
+ rawimg->planes[AOM_PLANE_U] = frame->data[0];
+ rawimg->planes[AOM_PLANE_V] = frame->data[0];
+ rawimg->stride[AOM_PLANE_Y] = frame->linesize[0];
+ rawimg->stride[AOM_PLANE_U] = frame->linesize[0];
+ rawimg->stride[AOM_PLANE_V] = frame->linesize[0];
+ } else {
+ rawimg->monochrome = 0;
+ rawimg->planes[AOM_PLANE_Y] = frame->data[0];
+ rawimg->planes[AOM_PLANE_U] = frame->data[1];
+ rawimg->planes[AOM_PLANE_V] = frame->data[2];
+ rawimg->stride[AOM_PLANE_Y] = frame->linesize[0];
+ rawimg->stride[AOM_PLANE_U] = frame->linesize[1];
+ rawimg->stride[AOM_PLANE_V] = frame->linesize[2];
+ }
timestamp = frame->pts;
switch (frame->color_range) {
case AVCOL_RANGE_MPEG:
@@ -1025,6 +1057,7 @@ static int aom_encode(AVCodecContext *avctx, AVPacket *pkt,
}
static const enum AVPixelFormat av1_pix_fmts[] = {
+ AV_PIX_FMT_GRAY8,
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV444P,
@@ -1032,6 +1065,9 @@ static const enum AVPixelFormat av1_pix_fmts[] = {
};
static const enum AVPixelFormat av1_pix_fmts_highbd[] = {
+ AV_PIX_FMT_GRAY8,
+ AV_PIX_FMT_GRAY10,
+ AV_PIX_FMT_GRAY12,
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV444P,
--
2.20.1
More information about the ffmpeg-devel
mailing list