Message ID | 1595763675-1857-3-git-send-email-mypopydev@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,1/5] lavc/libkvazaar: fix framerate setting | expand |
Context | Check | Description |
---|---|---|
andriy/default | pending | |
andriy/make | success | Make finished |
andriy/make_fate | success | Make fate finished |
On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev@gmail.com> wrote: > > From: Jun Zhao <barryjzhao@tencent.com> > > Export choosen pict_type and qp. > > Signed-off-by: Jun Zhao <barryjzhao@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 ?
mypopy@gmail.com: > On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev@gmail.com> wrote: >> >> From: Jun Zhao <barryjzhao@tencent.com> >> >> Export choosen pict_type and qp. >> >> Signed-off-by: Jun Zhao <barryjzhao@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 ? Wrong commit message: It is not lavf. I have no opinion on the actual change. - Andreas
On Fri, Aug 7, 2020 at 11:16 AM Andreas Rheinhardt <andreas.rheinhardt@gmail.com> wrote: > > mypopy@gmail.com: > > On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev@gmail.com> wrote: > >> > >> From: Jun Zhao <barryjzhao@tencent.com> > >> > >> Export choosen pict_type and qp. > >> > >> Signed-off-by: Jun Zhao <barryjzhao@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 ? > > Wrong commit message: It is not lavf. I have no opinion on the actual > change. > fixed the commit message typo in local.
On 7.8.2020 5.40, mypopy@gmail.com wrote: > On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev@gmail.com> wrote: >> From: Jun Zhao <barryjzhao@tencent.com> >> >> Export choosen pict_type and qp. >> >> Signed-off-by: Jun Zhao <barryjzhao@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)) - Joose
On Mon, Aug 17, 2020 at 7:08 PM Joose Sainio <joose.sainio@tuni.fi> wrote: > > On 7.8.2020 5.40, mypopy@gmail.com wrote: > > On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev@gmail.com> wrote: > >> From: Jun Zhao <barryjzhao@tencent.com> > >> > >> Export choosen pict_type and qp. > >> > >> Signed-off-by: Jun Zhao <barryjzhao@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. > > - Joose >
On Tue, Aug 18, 2020 at 10:41 AM mypopy@gmail.com <mypopy@gmail.com> wrote: > > On Mon, Aug 17, 2020 at 7:08 PM Joose Sainio <joose.sainio@tuni.fi> wrote: > > > > On 7.8.2020 5.40, mypopy@gmail.com wrote: > > > On Sun, Jul 26, 2020 at 8:45 PM Jun Zhao <mypopydev@gmail.com> wrote: > > >> From: Jun Zhao <barryjzhao@tencent.com> > > >> > > >> Export choosen pict_type and qp. > > >> > > >> Signed-off-by: Jun Zhao <barryjzhao@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
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; }