[FFmpeg-trac] #7599(avcodec:new): Add monochrome/gray pixel format to libaom-av1
FFmpeg
trac at avcodec.org
Thu Jan 10 23:10:46 EET 2019
#7599: Add monochrome/gray pixel format to libaom-av1
-------------------------------------+-----------------------------------
Reporter: Ewout | Owner:
Type: enhancement | Status: new
Priority: wish | Component: avcodec
Version: git-master | Resolution:
Keywords: libaom | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-----------------------------------
Comment (by cehoyos):
Does this work any better?
{{{
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index faec61c..e8fb507 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -248,6 +248,8 @@ static int set_pix_fmt(AVCodecContext *avctx,
aom_codec_caps_t codec_caps,
enccfg->g_profile = FF_PROFILE_AV1_PROFESSIONAL;
*img_fmt = AOM_IMG_FMT_I422;
return 0;
+ case AV_PIX_FMT_GRAY8:
+ ctx->rawimg.monochrome = 1;
case AV_PIX_FMT_YUV444P:
enccfg->g_profile = FF_PROFILE_AV1_HIGH;
*img_fmt = AOM_IMG_FMT_I444;
@@ -275,11 +277,14 @@ static int set_pix_fmt(AVCodecContext *avctx,
aom_codec_caps_t codec_caps,
return 0;
}
break;
+ case AV_PIX_FMT_GRAY10:
+ case AV_PIX_FMT_GRAY12:
+ ctx->rawimg.monochrome = 1;
case AV_PIX_FMT_YUV444P10:
case AV_PIX_FMT_YUV444P12:
if (codec_caps & AOM_CODEC_CAP_HIGHBITDEPTH) {
enccfg->g_bit_depth = enccfg->g_input_bit_depth =
- avctx->pix_fmt == AV_PIX_FMT_YUV444P10 ? 10 : 12;
+ avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt
== AV_PIX_FMT_GRAY10 ? 10 : 12;
enccfg->g_profile =
enccfg->g_bit_depth == 10 ? FF_PROFILE_AV1_HIGH :
FF_PROFILE_AV1_PROFESSIONAL;
*img_fmt = AOM_IMG_FMT_I44416;
@@ -902,11 +907,18 @@ 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 (rawimg.monochrome) {
+ rawimg->planes[AOM_PLANE_U] = frame->data[0];
+ rawimg->planes[AOM_PLANE_V] = frame->data[0];
+ rawimg->stride[AOM_PLANE_U] = frame->linesize[0];
+ rawimg->stride[AOM_PLANE_V] = frame->linesize[0];
+ } else {
+ rawimg->planes[AOM_PLANE_U] = frame->data[1];
+ rawimg->planes[AOM_PLANE_V] = frame->data[2];
+ 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:
@@ -950,6 +962,7 @@ static const enum AVPixelFormat av1_pix_fmts[] = {
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV444P,
+ AV_PIX_FMT_GRAY8,
AV_PIX_FMT_NONE
};
@@ -957,12 +970,15 @@ static const enum AVPixelFormat
av1_pix_fmts_highbd[] = {
AV_PIX_FMT_YUV420P,
AV_PIX_FMT_YUV422P,
AV_PIX_FMT_YUV444P,
+ AV_PIX_FMT_GRAY8,
AV_PIX_FMT_YUV420P10,
AV_PIX_FMT_YUV422P10,
AV_PIX_FMT_YUV444P10,
+ AV_PIX_FMT_GRAY10,
AV_PIX_FMT_YUV420P12,
AV_PIX_FMT_YUV422P12,
AV_PIX_FMT_YUV444P12,
+ AV_PIX_FMT_GRAY12,
AV_PIX_FMT_NONE
};
}}}
--
Ticket URL: <https://trac.ffmpeg.org/ticket/7599#comment:4>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list