[FFmpeg-devel] avcodec/libvpxenc: add VP8/9 sharpness config option

Submitted by Rene Claus on Dec. 21, 2018, 12:51 a.m.

Details

Message ID 20181221005135.126908-1-rclaus@google.com
State Accepted
Headers show

Commit Message

Rene Claus Dec. 21, 2018, 12:51 a.m.
This commit adds configuration options to libvpxenc.c that can be used to
tune the sharpness parameter for VP8 and VP9.

Signed-off-by: Rene Claus <rclaus@google.com>
---
 doc/encoders.texi      | 4 ++++
 libavcodec/libvpxenc.c | 6 ++++++
 2 files changed, 10 insertions(+)

Comments

James Zern Dec. 21, 2018, 4:09 p.m.
On Thu, Dec 20, 2018 at 7:51 PM Rene Claus
<rclaus-at-google.com@ffmpeg.org> wrote:
>
> This commit adds configuration options to libvpxenc.c that can be used to
> tune the sharpness parameter for VP8 and VP9.
>
> Signed-off-by: Rene Claus <rclaus@google.com>
> ---
>  doc/encoders.texi      | 4 ++++
>  libavcodec/libvpxenc.c | 6 ++++++
>  2 files changed, 10 insertions(+)
>

This looks all right aside from the text comments.

> diff --git a/doc/encoders.texi b/doc/encoders.texi
> index 3d5b9fc2d2..7f9478fa9d 100644
> --- a/doc/encoders.texi
> +++ b/doc/encoders.texi
> @@ -1767,6 +1767,10 @@ Set number of frames to look ahead for frametype and ratecontrol.
>  @item error-resilient
>  Enable error resiliency features.
>
> +@item sharpness @var{integer}
> +Codec control function to set higher sharpness at the expense of a lower PSNR.
> +The valid range is [0, 7]. Default is 0.
> +

Codec control is meaningful for users of libvpx, but not here. The
text from vpxenc should work:
"Increase sharpness at the expense of lower PSNR"
The range is OK to keep, the default up to the library. From the
wrapper's point of view the default is unset.

> [...]
> +    { "sharpness", "Sharpness", offsetof(VPxContext, sharpness), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, VE},
>

This could match as well:
"Increase sharpness at the expense of lower PSNR"

No need to mention the range, that's handled automatically (try -h
encoder=libvpx).
James Almer Dec. 21, 2018, 4:24 p.m.
On 12/21/2018 1:09 PM, James Zern wrote:
> On Thu, Dec 20, 2018 at 7:51 PM Rene Claus
> <rclaus-at-google.com@ffmpeg.org> wrote:
>>
>> This commit adds configuration options to libvpxenc.c that can be used to
>> tune the sharpness parameter for VP8 and VP9.
>>
>> Signed-off-by: Rene Claus <rclaus@google.com>
>> ---
>>  doc/encoders.texi      | 4 ++++
>>  libavcodec/libvpxenc.c | 6 ++++++
>>  2 files changed, 10 insertions(+)
>>
> 
> This looks all right aside from the text comments.
> 
>> diff --git a/doc/encoders.texi b/doc/encoders.texi
>> index 3d5b9fc2d2..7f9478fa9d 100644
>> --- a/doc/encoders.texi
>> +++ b/doc/encoders.texi
>> @@ -1767,6 +1767,10 @@ Set number of frames to look ahead for frametype and ratecontrol.
>>  @item error-resilient
>>  Enable error resiliency features.
>>
>> +@item sharpness @var{integer}
>> +Codec control function to set higher sharpness at the expense of a lower PSNR.
>> +The valid range is [0, 7]. Default is 0.
>> +
> 
> Codec control is meaningful for users of libvpx, but not here. The
> text from vpxenc should work:
> "Increase sharpness at the expense of lower PSNR"
> The range is OK to keep, the default up to the library. From the
> wrapper's point of view the default is unset.
> 
>> [...]
>> +    { "sharpness", "Sharpness", offsetof(VPxContext, sharpness), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, VE},
>>
> 
> This could match as well:
> "Increase sharpness at the expense of lower PSNR"
> 
> No need to mention the range, that's handled automatically (try -h
> encoder=libvpx).

There's no need to mention it the AVOption description, but it's ok in
the encoders.texi. Other options do it as well.
James Zern Dec. 22, 2018, 12:36 a.m.
On Fri, Dec 21, 2018 at 11:24 AM James Almer <jamrial@gmail.com> wrote:
>
> On 12/21/2018 1:09 PM, James Zern wrote:
> > On Thu, Dec 20, 2018 at 7:51 PM Rene Claus
> > <rclaus-at-google.com@ffmpeg.org> wrote:
> >>
> >> This commit adds configuration options to libvpxenc.c that can be used to
> >> tune the sharpness parameter for VP8 and VP9.
> >>
> >> Signed-off-by: Rene Claus <rclaus@google.com>
> >> ---
> >>  doc/encoders.texi      | 4 ++++
> >>  libavcodec/libvpxenc.c | 6 ++++++
> >>  2 files changed, 10 insertions(+)
> >>
> >
> > This looks all right aside from the text comments.
> >
> >> diff --git a/doc/encoders.texi b/doc/encoders.texi
> >> index 3d5b9fc2d2..7f9478fa9d 100644
> >> --- a/doc/encoders.texi
> >> +++ b/doc/encoders.texi
> >> @@ -1767,6 +1767,10 @@ Set number of frames to look ahead for frametype and ratecontrol.
> >>  @item error-resilient
> >>  Enable error resiliency features.
> >>
> >> +@item sharpness @var{integer}
> >> +Codec control function to set higher sharpness at the expense of a lower PSNR.
> >> +The valid range is [0, 7]. Default is 0.
> >> +
> >
> > Codec control is meaningful for users of libvpx, but not here. The
> > text from vpxenc should work:
> > "Increase sharpness at the expense of lower PSNR"
> > The range is OK to keep, the default up to the library. From the
> > wrapper's point of view the default is unset.
> >
> >> [...]
> >> +    { "sharpness", "Sharpness", offsetof(VPxContext, sharpness), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, VE},
> >>
> >
> > This could match as well:
> > "Increase sharpness at the expense of lower PSNR"
> >
> > No need to mention the range, that's handled automatically (try -h
> > encoder=libvpx).
>
> There's no need to mention it the AVOption description, but it's ok in
> the encoders.texi. Other options do it as well.
>

Yes that's what I meant, sorry if it wasn't clear.

Patch hide | download patch | download mbox

diff --git a/doc/encoders.texi b/doc/encoders.texi
index 3d5b9fc2d2..7f9478fa9d 100644
--- a/doc/encoders.texi
+++ b/doc/encoders.texi
@@ -1767,6 +1767,10 @@  Set number of frames to look ahead for frametype and ratecontrol.
 @item error-resilient
 Enable error resiliency features.
 
+@item sharpness @var{integer}
+Codec control function to set higher sharpness at the expense of a lower PSNR.
+The valid range is [0, 7]. Default is 0.
+
 @item VP8-specific options
 @table @option
 @item ts-parameters
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index 39af586790..34d2624103 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -76,6 +76,7 @@  typedef struct VPxEncoderContext {
     struct FrameListData *coded_frame_list;
 
     int cpu_used;
+    int sharpness;
     /**
      * VP8 specific flags, see VP8F_* below.
      */
@@ -130,6 +131,7 @@  static const char *const ctlidstr[] = {
     [VP8E_SET_TUNING]            = "VP8E_SET_TUNING",
     [VP8E_SET_CQ_LEVEL]          = "VP8E_SET_CQ_LEVEL",
     [VP8E_SET_MAX_INTRA_BITRATE_PCT] = "VP8E_SET_MAX_INTRA_BITRATE_PCT",
+    [VP8E_SET_SHARPNESS]               = "VP8E_SET_SHARPNESS",
 #if CONFIG_LIBVPX_VP9_ENCODER
     [VP9E_SET_LOSSLESS]                = "VP9E_SET_LOSSLESS",
     [VP9E_SET_TILE_COLUMNS]            = "VP9E_SET_TILE_COLUMNS",
@@ -751,6 +753,9 @@  FF_ENABLE_DEPRECATION_WARNINGS
         return AVERROR(EINVAL);
     }
 
+    if (ctx->sharpness >= 0)
+        codecctl_int(avctx, VP8E_SET_SHARPNESS, ctx->sharpness);
+
     if (CONFIG_LIBVPX_VP8_ENCODER && avctx->codec_id == AV_CODEC_ID_VP8) {
 #if FF_API_PRIVATE_OPT
 FF_DISABLE_DEPRECATION_WARNINGS
@@ -1193,6 +1198,7 @@  static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt,
     {"arnr_strength", "altref noise reduction filter strength", offsetof(VPxContext, arnr_strength), AV_OPT_TYPE_INT, {.i64 = 3}, 0, 6, VE}, \
     {"arnr_type", "altref noise reduction filter type", offsetof(VPxContext, arnr_type), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 3, VE}, \
     {"rc_lookahead", "Number of frames to look ahead for alternate reference frame selection", offsetof(VPxContext, lag_in_frames), AV_OPT_TYPE_INT, {.i64 = 25}, 0, 25, VE}, \
+    { "sharpness", "Sharpness", offsetof(VPxContext, sharpness), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 7, VE},
 
 #if CONFIG_LIBVPX_VP8_ENCODER
 static const AVOption vp8_options[] = {