[FFmpeg-devel] [PATCH 3/5] lavf/libkvazaar: export encoded frame stats

mypopy at gmail.com mypopy at gmail.com
Thu Aug 20 10:00:10 EEST 2020


On Tue, Aug 18, 2020 at 10:41 AM mypopy at gmail.com <mypopy at gmail.com> wrote:
>
> On Mon, Aug 17, 2020 at 7:08 PM Joose Sainio <joose.sainio at tuni.fi> wrote:
> >
> > On 7.8.2020 5.40, mypopy at gmail.com wrote:
> > > On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev at gmail.com> wrote:
> > >> From: Jun Zhao <barryjzhao at tencent.com>
> > >>
> > >> Export choosen pict_type and qp.
> > >>
> > >> Signed-off-by: Jun Zhao <barryjzhao at tencent.com>
> > >> ---
> > >> libavcodec/libkvazaar.c | 30 ++++++++++++++++++++++++++++++
> > >> 1 file changed, 30 insertions(+)
> > >>
> > >> diff --git a/libavcodec/libkvazaar.c b/libavcodec/libkvazaar.c
> > >> index 71c9c8f..9032547 100644
> > >> --- a/libavcodec/libkvazaar.c
> > >> +++ b/libavcodec/libkvazaar.c
> > >> @@ -37,6 +37,7 @@
> > >>
> > >> #include "avcodec.h"
> > >> #include "internal.h"
> > >> +#include "packet_internal.h"
> > >>
> > >> typedef struct LibkvazaarContext {
> > >> const AVClass *class;
> > >> @@ -170,6 +171,7 @@ static int libkvazaar_encode(AVCodecContext *avctx,
> > >> kvz_data_chunk *data_out = NULL;
> > >> uint32_t len_out = 0;
> > >> int retval = 0;
> > >> + int pict_type;
> > >>
> > >> *got_packet_ptr = 0;
> > >>
> > >> @@ -257,6 +259,34 @@ static int libkvazaar_encode(AVCodecContext *avctx,
> > >> avpkt->flags |= AV_PKT_FLAG_KEY;
> > >> }
> > >>
> > >> + switch (frame_info.slice_type) {
> > >> + case KVZ_SLICE_I:
> > >> + pict_type = AV_PICTURE_TYPE_I;
> > >> + break;
> > >> + case KVZ_SLICE_P:
> > >> + pict_type = AV_PICTURE_TYPE_P;
> > >> + break;
> > >> + case KVZ_SLICE_B:
> > >> + pict_type = AV_PICTURE_TYPE_B;
> > >> + break;
> > >> + default:
> > >> + av_log(avctx, AV_LOG_ERROR, "Unknown picture type encountered.\n");
> > >> + return AVERROR_EXTERNAL;
> > >> + }
> > >> +#if FF_API_CODED_FRAME
> > >> +FF_DISABLE_DEPRECATION_WARNINGS
> > >> + avctx->coded_frame->pict_type = pict_type;
> > >> +FF_ENABLE_DEPRECATION_WARNINGS
> > >> +#endif
> > >> +
> > >> + ff_side_data_set_encoder_stats(avpkt, frame_info.qp * FF_QP2LAMBDA,
> > >> NULL, 0, pict_type);
> > >> +
> > >> +#if FF_API_CODED_FRAME
> > >> +FF_DISABLE_DEPRECATION_WARNINGS
> > >> + avctx->coded_frame->quality = frame_info.qp * FF_QP2LAMBDA;
> > >> +FF_ENABLE_DEPRECATION_WARNINGS
> > >> +#endif
> > >> +
> > >> *got_packet_ptr = 1;
> > >> }
> > >>
> > >> --
> > >> 2.7.4
> > >>
> > > ping ?
> > Sorry, I forgot I was subscribed to the list on the old organization
> > so the message didn't go through originally.
> >
> > In terms of Kvazaar this seems ok but the QP to lambda conversion will
> > result
> > in vastly different lambda value than what Kvazaar would have used
> > internally (and in fact the FF_QP2LAMBDA macro states it is for h.263).
> > I can't comment whether this is problem on the ffmpeg side.
> >
> > The correct formula for hevc/h.265 would be
> > lambda = 0.57 * pow(2.0, (qp - 12 / 3.0))
> This is the other issue, I think, will try to fix it.
After grep and dig in the ff_side_data_set_encoder_stats, I think use
frame_info.qp * FF_QP2LAMBDA (Avg frame QP as frame quality number
with scale number FF_QP2LAMBDA ) is Ok in this case.

In fact, the function int ff_side_data_set_encoder_stats(AVPacket
*pkt, int quality, int64_t *error, int error_count, int pict_type);
we just give a inaccuracy quality number for encoded Frame and depend
on the  specific codec


More information about the ffmpeg-devel mailing list