[libav-devel] [PATCH] avcodec/libaomenc: export the Sequence Header OBU as extradata

2018-10-08 Thread James Almer
Signed-off-by: James Almer 
---
 configure  |  8 +++-
 libavcodec/libaomenc.c | 34 +-
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 48e8536b0..2aa7eb627 100755
--- a/configure
+++ b/configure
@@ -4664,7 +4664,13 @@ enabled cuvid && require cuvid cuviddec.h 
cuvidCreateDecoder -lnvcuv
 enabled frei0r&& require_headers frei0r.h
 enabled gnutls&& require_pkg_config gnutls gnutls gnutls/gnutls.h 
gnutls_global_init &&
  check_lib gmp gmp.h mpz_export -lgmp
-enabled libaom&& require_pkg_config libaom "aom >= 0.1.0" 
aom/aom_codec.h aom_codec_version
+enabled libaom&& {
+enabled libaom_av1_decoder && require_pkg_config libaom_av1_decoder "aom 
>= 1.0.0" "aom/aom_decoder.h aom/aomdx.h" aom_codec_av1_dx
+enabled libaom_av1_encoder && {
+require_pkg_config libaom_av1_encoder "aom >= 1.0.0" 
"aom/aom_encoder.h aom/aomcx.h" aom_codec_av1_cx &&
+require_cpp_condition libaom_av1_encoder aom/aom_encoder.h 
"defined AOM_FRAME_IS_INTRAONLY";
+}
+}
 enabled libbs2b   && require_pkg_config libbs2b libbs2b bs2b.h 
bs2b_open
 enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 
dc1394/dc1394.h dc1394_new
 enabled libdcadec && require libdcadec libdcadec/dca_context.h 
dcadec_context_create -ldcadec
diff --git a/libavcodec/libaomenc.c b/libavcodec/libaomenc.c
index 9807bd5ad..69e4ea126 100644
--- a/libavcodec/libaomenc.c
+++ b/libavcodec/libaomenc.c
@@ -68,6 +68,8 @@ static const char *const ctlidstr[] = {
 [AOME_SET_CQ_LEVEL] = "AOME_SET_CQ_LEVEL",
 [AOME_SET_ENABLEAUTOALTREF] = "AOME_SET_ENABLEAUTOALTREF",
 [AOME_SET_STATIC_THRESHOLD] = "AOME_SET_STATIC_THRESHOLD",
+[AV1E_SET_CHROMA_SUBSAMPLING_X] = "AV1E_SET_CHROMA_SUBSAMPLING_X",
+[AV1E_SET_CHROMA_SUBSAMPLING_Y] = "AV1E_SET_CHROMA_SUBSAMPLING_Y",
 };
 
 static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
@@ -197,7 +199,7 @@ static av_cold int aom_init(AVCodecContext *avctx)
 AOMContext *ctx = avctx->priv_data;
 struct aom_codec_enc_cfg enccfg = { 0 };
 AVCPBProperties *cpb_props;
-int res;
+int res, h_shift, v_shift;
 const struct aom_codec_iface *iface = &aom_codec_av1_cx_algo;
 
 av_log(avctx, AV_LOG_INFO, "%s\n", aom_codec_version_str());
@@ -332,6 +334,13 @@ static av_cold int aom_init(AVCodecContext *avctx)
 codecctl_int(avctx, AOME_SET_STATIC_THRESHOLD, ctx->static_thresh);
 codecctl_int(avctx, AOME_SET_CQ_LEVEL, ctx->crf);
 
+res = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &h_shift, &v_shift);
+if (res < 0)
+return res;
+
+codecctl_int(avctx, AV1E_SET_CHROMA_SUBSAMPLING_X, h_shift);
+codecctl_int(avctx, AV1E_SET_CHROMA_SUBSAMPLING_Y, v_shift);
+
 // provide dummy value to initialize wrapper, values will be updated each 
_encode()
 aom_img_wrap(&ctx->rawimg, ff_aom_pixfmt_to_imgfmt(avctx->pix_fmt),
  avctx->width, avctx->height, 1, (unsigned char *)1);
@@ -340,6 +349,29 @@ static av_cold int aom_init(AVCodecContext *avctx)
 if (!cpb_props)
 return AVERROR(ENOMEM);
 
+if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
+aom_fixed_buf_t *seq = aom_codec_get_global_headers(&ctx->encoder);
+if (!seq)
+return AVERROR_UNKNOWN;
+
+avctx->extradata = av_malloc(seq->sz + AV_INPUT_BUFFER_PADDING_SIZE);
+if (!avctx->extradata) {
+free(seq->buf);
+free(seq);
+return AVERROR(ENOMEM);
+}
+avctx->extradata_size = seq->sz;
+memcpy(avctx->extradata, seq->buf, seq->sz);
+memset(avctx->extradata + seq->sz, 0, AV_INPUT_BUFFER_PADDING_SIZE);
+
+/* Doxy says: "The caller owns the memory associated with this buffer.
+ * Memory is allocated using malloc(), and should be freed
+ * via call to free()"
+ */
+free(seq->buf);
+free(seq);
+}
+
 if (enccfg.rc_end_usage == AOM_CBR ||
 enccfg.g_pass != AOM_RC_ONE_PASS) {
 cpb_props->max_bitrate = avctx->rc_max_rate;
-- 
2.19.0

___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Re: [libav-devel] [PATCH 1/2] avcodec/libaomenc: export Sequence Header and Metadata OBUs as extradata

2018-10-08 Thread Luca Barbato
On 08/10/2018 00:42, James Almer wrote:
> If you'd rather avoid nonetheless the complexity, i can cook up a patch
> to use it and make the minimum required libaom version something recent
> enough. Unless the plan was to tag a libav release, in which case it
> would probably not be a good idea.

If you have something almost ready I'd pick that and simplify the muxer
code to just reject non-extradata streams.

lu
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel