[FFmpeg-devel] [PATCH v6] avcodec/libvpxenc: add a way to explicitly set temporal layer id
Wonkap Jang
wonkap at google.com
Fri Feb 7 20:38:13 EET 2020
Hi James,
On Fri, Feb 7, 2020 at 10:36 AM Wonkap Jang <wonkap at google.com> wrote:
> In order for rate control to correctly allocate bitrate to each temporal
> layer, correct temporal layer id has to be set to each frame. This
> commit provides the ability to set correct temporal layer id for each
> frame.
> ---
> doc/encoders.texi | 8 +++++++-
> libavcodec/libvpxenc.c | 13 ++++++++++++-
> 2 files changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index 7bae39435e..b1c4740fe9 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -1918,7 +1918,13 @@ Currently supports the following options.
> @table @option
> @item 0
> No temporal layering flags are provided internally,
> -relies on flags being passed in using metadata in AVFrame.
> +relies on flags being passed in using metadata in AVFrame with following
> keys.
> + at table @option
> + at item vp8-flags
> +Sets the flags passed into the encoder to indicate the referencing scheme
> for the current frame.
> + at item temporal_id
> +Explicitly sets the temporal id of the current frame to encode.
> + at end table
> @item 2
> Two temporal layers. 0-1...
> @item 3
> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index d522c43928..60a858853d 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -1519,11 +1519,22 @@ static int vpx_encode(AVCodecContext *avctx,
> AVPacket *pkt,
> #endif
> if (frame->pict_type == AV_PICTURE_TYPE_I)
> flags |= VPX_EFLAG_FORCE_KF;
> - if (CONFIG_LIBVPX_VP8_ENCODER && avctx->codec_id ==
> AV_CODEC_ID_VP8 && frame->metadata) {
> + if (frame->metadata) {
> AVDictionaryEntry* en = av_dict_get(frame->metadata,
> "vp8-flags", NULL, 0);
> if (en) {
> flags |= strtoul(en->value, NULL, 10);
> }
> +
> + memset(&layer_id, 0, sizeof(layer_id));
> +
> + en = av_dict_get(frame->metadata, "temporal_id", NULL, 0);
> + if (en) {
> + layer_id.temporal_layer_id = strtoul(en->value, NULL, 10);
> +#ifdef VPX_CTRL_VP9E_SET_MAX_INTER_BITRATE_PCT
> + layer_id.temporal_layer_id_per_spatial[0] =
> layer_id.temporal_layer_id;
> +#endif
> + layer_id_valid = 1;
> + }
> }
>
> if (sd) {
> --
> 2.25.0.341.g760bfbb309-goog
>
>
Please take a look. Suggestions are welcome on the text.
Thank you,
Wonkap
More information about the ffmpeg-devel
mailing list