[FFmpeg-devel] [PATCH] libaomdec: add row_mt option
Paul B Mahol
onemda at gmail.com
Wed Sep 26 10:47:42 EEST 2018
On 9/26/18, Tristan Matthews <tmatth at videolan.org> wrote:
> Partially fixes #7456
> ---
> libavcodec/libaomdec.c | 62 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 62 insertions(+)
>
> diff --git a/libavcodec/libaomdec.c b/libavcodec/libaomdec.c
> index 2530c9f76b..15cda2940a 100644
> --- a/libavcodec/libaomdec.c
> +++ b/libavcodec/libaomdec.c
> @@ -23,20 +23,63 @@
> * AV1 decoder support via libaom
> */
>
> +#define AOM_DISABLE_CTRL_TYPECHECKS 1
> #include <aom/aom_decoder.h>
> #include <aom/aomdx.h>
>
> #include "libavutil/common.h"
> #include "libavutil/imgutils.h"
> +#include "libavutil/opt.h"
>
> #include "avcodec.h"
> #include "internal.h"
> #include "profiles.h"
>
> typedef struct AV1DecodeContext {
> + AVClass *class;
> struct aom_codec_ctx decoder;
> + int row_mt;
> } AV1DecodeContext;
>
> +static const char *const ctlidstr[] = {
> + [AV1D_SET_ROW_MT] = "AV1D_SET_ROW_MT",
> +};
> +
> +
> +static av_cold void log_decoder_error(AVCodecContext *avctx, const char
> *desc)
> +{
> + AV1DecodeContext *ctx = avctx->priv_data;
> + const char *error = aom_codec_error(&ctx->decoder);
> + const char *detail = aom_codec_error_detail(&ctx->decoder);
> +
> + av_log(avctx, AV_LOG_ERROR, "%s: %s\n", desc, error);
> + if (detail)
> + av_log(avctx, AV_LOG_ERROR, " Additional information: %s\n",
> detail);
> +}
> +
> +static av_cold int codecctl_int(AVCodecContext *avctx,
> + enum aom_dec_control_id id, int val)
> +{
> + AV1DecodeContext *ctx = avctx->priv_data;
> + char buf[80];
> + int width = -30;
> + int res;
> +
> + snprintf(buf, sizeof(buf), "%s:", ctlidstr[id]);
> + av_log(avctx, AV_LOG_DEBUG, " %*s%d\n", width, buf, val);
> +
> + res = aom_codec_control(&ctx->decoder, id, val);
> + if (res != AOM_CODEC_OK) {
> + snprintf(buf, sizeof(buf), "Failed to set %s codec control",
> + ctlidstr[id]);
> + log_decoder_error(avctx, buf);
> + return AVERROR(EINVAL);
> + }
> +
> + return 0;
> +}
> +
> +
> static av_cold int aom_init(AVCodecContext *avctx,
> const struct aom_codec_iface *iface)
> {
> @@ -56,6 +99,10 @@ static av_cold int aom_init(AVCodecContext *avctx,
> return AVERROR(EINVAL);
> }
>
> + // codec control failures are currently treated only as warnings
> + av_log(avctx, AV_LOG_DEBUG, "aom_codec_control\n");
> + codecctl_int(avctx, AV1D_SET_ROW_MT, ctx->row_mt);
> +
> return 0;
> }
>
> @@ -220,6 +267,20 @@ static av_cold int av1_init(AVCodecContext *avctx)
> return aom_init(avctx, &aom_codec_av1_dx_algo);
> }
>
> +#define OFFSET(x) offsetof(AV1DecodeContext, x)
> +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
> +static const AVOption options[] = {
> + { "row-mt", "Enable row-based multithreading", OFFSET(row_mt),
> AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, VD},
AV_OPT_TYPE_BOOL
> + { NULL },
> +};
> +
> +static const AVClass class_aom = {
> + .class_name = "libaom-av1 decoder",
> + .item_name = av_default_item_name,
> + .option = options,
> + .version = LIBAVUTIL_VERSION_INT,
> +};
> +
> AVCodec ff_libaom_av1_decoder = {
> .name = "libaom-av1",
> .long_name = NULL_IF_CONFIG_SMALL("libaom AV1"),
> @@ -231,5 +292,6 @@ AVCodec ff_libaom_av1_decoder = {
> .decode = aom_decode,
> .capabilities = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
> .profiles = NULL_IF_CONFIG_SMALL(ff_av1_profiles),
> + .priv_class = &class_aom,
> .wrapper_name = "libaom",
> };
> --
> 2.17.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list