[FFmpeg-devel] libavc/libx264: add support to propagate SSE values through encoder stats

Anton Khirnov anton at khirnov.net
Tue Oct 10 13:54:41 EEST 2023


Quoting Carotti, Elias via ffmpeg-devel (2023-10-02 19:35:09)
> diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
> index 77a9f173b4..4c643c9066 100644
> --- a/libavcodec/libx264.c
> +++ b/libavcodec/libx264.c
> @@ -129,6 +129,8 @@ typedef struct X264Context {
>      int roi_warned;
> 
>      int mb_info;
> +
> +    int64_t sse[3];

The values don't need to be preserved across frames, so might as well
put this on stack in the block calling ff_side_data_set_encoder_stats().

>  } X264Context;
> 
>  static void X264_log(void *p, int level, const char *fmt, va_list args)
> @@ -726,7 +728,40 @@ FF_ENABLE_DEPRECATION_WARNINGS
> 
>      pkt->flags |= AV_PKT_FLAG_KEY*pic_out.b_keyframe;
>      if (ret) {
> -        ff_side_data_set_encoder_stats(pkt, (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA, NULL, 0, pict_type);
> +        const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(csp_to_pixfmt(pic_out.img.i_csp));
> +        int error_count = 0;
> +        int64_t *errors = NULL;
> +
> +        if (ctx->flags & AV_CODEC_FLAG_PSNR) {
> +            double scale[3] = { 1,
> +                (1 << pix_desc->log2_chroma_h) * (double)(1 << pix_desc->log2_chroma_w),
> +                (1 << pix_desc->log2_chroma_h) * (double)(1 << pix_desc->log2_chroma_w),

Any particular reason the cast is on the second value? It looks strange.

> +            };
> +            double mse;
> +            int i;
> +
> +            error_count = pix_desc->nb_components;
> +
> +            av_log(ctx, AV_LOG_DEBUG, "PSNR values from libx264: %.3f %.3f %.3f.\n",
> +                   pic_out.prop.f_psnr[0], pic_out.prop.f_psnr[1], pic_out.prop.f_psnr[2]);
> +
> +            for (i = 0; i < pix_desc->nb_components; ++i) {

for (int i ....

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list