[FFmpeg-devel] [PATCHv4] avcodec: Add librav1e encoder

James Almer jamrial at gmail.com
Sat Jul 13 21:37:24 EEST 2019


On 7/9/2019 3:34 PM, Derek Buitenhuis wrote:
> Port to the new send/receive API by: James Almer <jamrial at gmail.com>.
> 
> Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>
> ---
> Lots of stuff happened since v3!
> 
> * The C API / library is now in rav1e's main repo, and officially supported.
> * rav1e will bump the soname and pkg-config version on any breaking changes.
> * C API is now as fast as the Rust API.
> * Added two pass support.
> * Added min quantizer support.
> * Added tiles / speed to AVOptions.
> * Mapped min/max keyint.
> * Applied all the fixes requested in the last round.
> ---
>  configure              |   4 +
>  doc/encoders.texi      |  37 +++
>  doc/general.texi       |   7 +
>  libavcodec/Makefile    |   1 +
>  libavcodec/allcodecs.c |   1 +
>  libavcodec/librav1e.c  | 578 +++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 628 insertions(+)
>  create mode 100644 libavcodec/librav1e.c

> +static int get_stats(AVCodecContext *avctx, int eos)
> +{
> +    librav1eContext *ctx = avctx->priv_data;
> +    uint8_t *buf;
> +    size_t buf_size = 0;
> +
> +    buf = rav1e_twopass_out(ctx->ctx, &buf_size);
> +    if (!buf)
> +        return 0;
> +
> +    if (!eos) {
> +        uint8_t *tmp = av_fast_realloc(ctx->pass_data, &ctx->pass_size,
> +                                      ctx->pass_pos + buf_size);

Just use av_reallocp(). Each call will make the buffer bigger, so you're
not really making use the no-op benefits from av_fast_realloc(), which
only trigger if newsize <= size.

> +static av_cold int librav1e_encode_init(AVCodecContext *avctx)
> +{
> +    librav1eContext *ctx = avctx->priv_data;
> +    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
> +    RaConfig *cfg = NULL;
> +    int rret;
> +    int ret = 0;
> +
> +    cfg = rav1e_config_default();
> +    if (!cfg) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not allocate rav1e config.\n");
> +        return AVERROR_EXTERNAL;
> +    }
> +
> +    rav1e_config_set_time_base(cfg, (RaRational) {
> +                               avctx->time_base.num * avctx->ticks_per_frame,
> +                               avctx->time_base.den
> +                               });
> +
> +    if (avctx->flags & AV_CODEC_FLAG_PASS2) {
> +        if (!avctx->stats_in) {
> +            av_log(avctx, AV_LOG_ERROR, "No stats file provided for second pass.\n");
> +            ret = AVERROR(EINVAL);
> +            goto end;
> +        }
> +
> +        ctx->pass_size = (strlen(avctx->stats_in) * 3) / 4;

AV_BASE64_DECODE_SIZE(strlen(avctx->stats_in));


More information about the ffmpeg-devel mailing list