Message ID | 20200210183009.22206-1-wonkap@google.com |
---|---|
State | Accepted |
Headers | show |
Series | [FFmpeg-devel,v7] avcodec/libvpxenc: add a way to explicitly set temporal layer id | expand |
Context | Check | Description |
---|---|---|
andriy/ffmpeg-patchwork | success | Make fate finished |
On Mon, Feb 10, 2020 at 10:30 AM Wonkap Jang <wonkap-at-google.com@ffmpeg.org> 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 | 9 ++++++++- > libavcodec/libvpxenc.c | 13 ++++++++++++- > 2 files changed, 20 insertions(+), 2 deletions(-) > lgtm. I'll apply this soon. > diff --git a/doc/encoders.texi b/doc/encoders.texi > index 7bae39435e..56fe208fef 100644 > --- a/doc/encoders.texi > +++ b/doc/encoders.texi > @@ -1918,7 +1918,14 @@ 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 @code{metadata} field in @code{AVFrame} with following keys. I wrapped these lines at 80 characters locally.
On Mon, Feb 10, 2020 at 12:58 PM James Zern <jzern@google.com> wrote: > > On Mon, Feb 10, 2020 at 10:30 AM Wonkap Jang > <wonkap-at-google.com@ffmpeg.org> 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 | 9 ++++++++- > > libavcodec/libvpxenc.c | 13 ++++++++++++- > > 2 files changed, 20 insertions(+), 2 deletions(-) > > > > lgtm. I'll apply this soon. > applied, thanks.
diff --git a/doc/encoders.texi b/doc/encoders.texi index 7bae39435e..56fe208fef 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -1918,7 +1918,14 @@ 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 @code{metadata} field in @code{AVFrame} with following keys. +@table @option +@item vp8-flags +Sets the flags passed into the encoder to indicate the referencing scheme for the current frame. +Refer to function @code{vpx_codec_encode} in @code{vpx/vpx_encoder.h} for more details. +@item temporal_id +Explicitly sets the temporal id of the current frame to encode. +@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) {