diff mbox

[FFmpeg-devel,v7,1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper.

Message ID 1552041419-18267-1-git-send-email-jing.a.sun@intel.com
State Superseded
Headers show

Commit Message

Jing SUN March 8, 2019, 10:36 a.m. UTC
From: Jing Sun <jing.a.sun@intel.com>

base on patch by Huang, Zhengxu from https://github.com/intel/SVT-HEVC

V4: - Fix the build error with new API in PR#52
    - Fix the encoding hang issue by API change in PR#52
    - Fix the last frame dropping issue
    - Fix the invalid parameter causing segmentation fault issue
    - Add the support to svt hevc and av1 plugins coexistance
    - Add the VMAF optimized mode to "-tune"
    - Add the "-hdr" parameter

V3: - Fix the build error with new API

V2: - Change the config options (didn't need to enable-gpl for BSD+Patent,
      it's can compatible with LGPL2+, thanks Xavier correct this part),
      now just need to "--enable-libsvthevc" option
    - Add force_idr option
    - Remove default GoP size setting in the wrapper, SVT-HEVC will calc
      the the GoP size internal
    - Refine the code as the FFmpeg community's comments
      (https://patchwork.ffmpeg.org/patch/11347/)

V1: - base on patch by Huang, Zhengxu, then refine some code.

Change-Id: If0dcc5044ab9effd6847a8f48797b985d02b0816
Signed-off-by: Huang, Zhengxu <zhengxu.huang@intel.com>
Signed-off-by: hassene <hassene.tmar@intel.com>
Signed-off-by: Jun Zhao <jun.zhao@intel.com>
Signed-off-by: Jing Sun <jing.a.sun@intel.com>
Signed-off-by: Jing SUN <jing.a.sun@intel.com>
---
 configure                |   4 +
 libavcodec/Makefile      |   1 +
 libavcodec/allcodecs.c   |   1 +
 libavcodec/libsvt_hevc.c | 528 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 534 insertions(+)
 create mode 100644 libavcodec/libsvt_hevc.c

Comments

Vittorio Giovara March 8, 2019, 8:47 p.m. UTC | #1
On Fri, Mar 8, 2019 at 4:39 AM Jing SUN <jing.a.sun@intel.com> wrote:

> From: Jing Sun <jing.a.sun@intel.com>
>
> base on patch by Huang, Zhengxu from https://github.com/intel/SVT-HEVC
>
> V4: - Fix the build error with new API in PR#52
>     - Fix the encoding hang issue by API change in PR#52
>     - Fix the last frame dropping issue
>     - Fix the invalid parameter causing segmentation fault issue
>     - Add the support to svt hevc and av1 plugins coexistance
>     - Add the VMAF optimized mode to "-tune"
>     - Add the "-hdr" parameter
>

Apologies if i missed your reply but i think my question was not answered

Is there any way to preserve the color matrix/primary/transfer properties
during encoding?

Thank you
Carl Eugen Hoyos March 8, 2019, 9:06 p.m. UTC | #2
2019-03-08 11:36 GMT+01:00, Jing SUN <jing.a.sun@intel.com>:

> +static void free_buffer(SvtContext *svt_enc)
> +{
> +    EB_H265_ENC_INPUT *in_data =
> (EB_H265_ENC_INPUT *)svt_enc->in_buf.pBuffer;

Is the cast necessary?
Or actually: Can't in_data be whatever doesn't produce
a warning?

> +
> +    if (in_data)
> +        av_freep(&in_data);

The condition is unnecessary.

Carl Eugen
Jing SUN March 11, 2019, 4:17 a.m. UTC | #3
-----Original Message-----
From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf Of Carl Eugen Hoyos

Sent: Saturday, March 9, 2019 5:07 AM
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper.

2019-03-08 11:36 GMT+01:00, Jing SUN <jing.a.sun@intel.com>:

> +static void free_buffer(SvtContext *svt_enc) {

> +    EB_H265_ENC_INPUT *in_data =

> (EB_H265_ENC_INPUT *)svt_enc->in_buf.pBuffer;


Is the cast necessary?
Or actually: Can't in_data be whatever doesn't produce a warning?
[SUN, Jing] Yes, it's necessary, because the type of pBuffer is uint8_t* in libsvt_hevc.

> +

> +    if (in_data)

> +        av_freep(&in_data);


The condition is unnecessary.
[SUN, Jing] If av_mallocz fails, free_buffer will be called with in_data being NULL. Checking it avoids unnecessary calling to av_freep in that case.

static void free_buffer(SvtContext *svt_enc)
{
    ...
    if (in_data)
        av_freep(&in_data);
}

static int alloc_buffer(EB_H265_ENC_CONFIGURATION *config, SvtContext *svt_enc)
{
    ...

    in_data  = av_mallocz(sizeof(*in_data));
    if (!in_data)
        goto failed;
   ...

failed:
    free_buffer(svt_enc);
    ...
}
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Jing SUN March 11, 2019, 4:50 a.m. UTC | #4
I just searched my inbox again but failed to find that email of question you mentioned.
Could you please elaborate your request? What is the preservation for and how is it expected to work?

Regards,
SUN, Jing

From: Vittorio Giovara [mailto:vittorio.giovara@gmail.com]

Sent: Saturday, March 9, 2019 4:48 AM
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Cc: Sun, Jing A <jing.a.sun@intel.com>; Huang, Zhengxu <zhengxu.huang@intel.com>; Jun Zhao <jun.zhao@intel.com>; Tmar, Hassene <hassene.tmar@intel.com>
Subject: Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper.



On Fri, Mar 8, 2019 at 4:39 AM Jing SUN <jing.a.sun@intel.com<mailto:jing.a.sun@intel.com>> wrote:
From: Jing Sun <jing.a.sun@intel.com<mailto:jing.a.sun@intel.com>>


base on patch by Huang, Zhengxu from https://github.com/intel/SVT-HEVC

V4: - Fix the build error with new API in PR#52
    - Fix the encoding hang issue by API change in PR#52
    - Fix the last frame dropping issue
    - Fix the invalid parameter causing segmentation fault issue
    - Add the support to svt hevc and av1 plugins coexistance
    - Add the VMAF optimized mode to "-tune"
    - Add the "-hdr" parameter

Apologies if i missed your reply but i think my question was not answered

Is there any way to preserve the color matrix/primary/transfer properties during encoding?

Thank you
--
Vittorio
Carl Eugen Hoyos March 11, 2019, 8:36 a.m. UTC | #5
2019-03-11 5:17 GMT+01:00, Sun, Jing A <jing.a.sun@intel.com>:

> 2019-03-08 11:36 GMT+01:00, Jing SUN <jing.a.sun@intel.com>:
>
>> +static void free_buffer(SvtContext *svt_enc) {
>> +    EB_H265_ENC_INPUT *in_data =
>> (EB_H265_ENC_INPUT *)svt_enc->in_buf.pBuffer;
>
> Is the cast necessary?
> Or actually: Can't in_data be whatever doesn't produce a warning?
> [SUN, Jing] Yes, it's necessary, because the type of pBuffer is uint8_t* in
> libsvt_hevc.

You could make in_data uint8_t*.

>> +
>> +    if (in_data)
>> +        av_freep(&in_data);
>
> The condition is unnecessary.
> [SUN, Jing] If av_mallocz fails, free_buffer will be called with in_data
> being NULL. Checking it avoids unnecessary calling to av_freep in that
> case.

Please remove the condition (or the function).

Please fix your quoting, Carl Eugen
Moritz Barsnick March 11, 2019, 8:49 a.m. UTC | #6
On Mon, Mar 11, 2019 at 04:17:21 +0000, Sun, Jing A wrote:
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf Of Carl Eugen Hoyos
> > The condition is unnecessary.
> [SUN, Jing] If av_mallocz fails, free_buffer will be called with in_data being NULL. Checking it avoids unnecessary calling to av_freep in that case.

Please read the kind documentation (and the "Note" quzoted below) or
the source of said function, and how other uses within ffmpeg are:

https://www.ffmpeg.org/doxygen/4.1/group__lavu__mem__funcs.html#ga0cc84043ea2167ad005c86e11d0bcdba

    void av_freep (void *ptr)
    [...]
    Note
        *ptr = NULL is safe and leads to no action.

In other words, av_freep() already has this check.

Moritz
Carl Eugen Hoyos March 11, 2019, 9:01 a.m. UTC | #7
2019-03-11 9:49 GMT+01:00, Moritz Barsnick <barsnick@gmx.net>:
> On Mon, Mar 11, 2019 at 04:17:21 +0000, Sun, Jing A wrote:
>> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf Of
>> Carl Eugen Hoyos
>> > The condition is unnecessary.
>> [SUN, Jing] If av_mallocz fails, free_buffer will be called with in_data
>> being NULL. Checking it avoids unnecessary calling to av_freep in that
>> case.
>
> Please read the kind documentation (and the "Note" quzoted below) or
> the source of said function, and how other uses within ffmpeg are:
>
> https://www.ffmpeg.org/doxygen/4.1/group__lavu__mem__funcs.html#ga0cc84043ea2167ad005c86e11d0bcdba
>
>     void av_freep (void *ptr)
>     [...]
>     Note
>         *ptr = NULL is safe and leads to no action.

> In other words, av_freep() already has this check.

I believe his argumentation was that he knows but that in case
of oom, he wants to avoid extra indirections.

Carl Eugen
Jing SUN March 11, 2019, 9:32 a.m. UTC | #8
-----Original Message-----
From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf Of Carl Eugen Hoyos

Sent: Monday, March 11, 2019 5:01 PM
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper.

2019-03-11 9:49 GMT+01:00, Moritz Barsnick <barsnick@gmx.net>:
> On Mon, Mar 11, 2019 at 04:17:21 +0000, Sun, Jing A wrote:

>> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf 

>> Of Carl Eugen Hoyos

>> > The condition is unnecessary.

>> [SUN, Jing] If av_mallocz fails, free_buffer will be called with 

>> in_data being NULL. Checking it avoids unnecessary calling to 

>> av_freep in that case.

>

> Please read the kind documentation (and the "Note" quzoted below) or 

> the source of said function, and how other uses within ffmpeg are:

>

> https://www.ffmpeg.org/doxygen/4.1/group__lavu__mem__funcs.html#ga0cc8

> 4043ea2167ad005c86e11d0bcdba

>

>     void av_freep (void *ptr)

>     [...]

>     Note

>         *ptr = NULL is safe and leads to no action.


> In other words, av_freep() already has this check.


I believe his argumentation was that he knows but that in case of oom, he wants to avoid extra indirections.

Carl Eugen

[SUN, Jing] Modified and thanks for the review!

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Vittorio Giovara March 11, 2019, 2:49 p.m. UTC | #9
On Mon, Mar 11, 2019 at 12:50 AM Sun, Jing A <jing.a.sun@intel.com> wrote:

> I just searched my inbox again but failed to find that email of question
> you mentioned.
>

Yeah I often see my mail bounced with this message:
Address not foundYour message wasn't delivered to *jun.zhao@intel.com*
because the address couldn't be found, or is unable to receive mail.

For reference this was the message on the mailing list
https://ffmpeg.org/pipermail/ffmpeg-devel/2019-March/240663.html

Could you please elaborate your request? What is the preservation for and
> how is it expected to work?
>

Yes of course, when you encode an HEVC stream you should be able to signal
how the color properties of the video buffers should be rendered. This is
usually conveyed with three parameters, the matrix coefficients, the color
primaries and the transfer characteristics. Without such information, the
data stored in the video may be interpreted differently and often
incorrectly by modern video players, causing image degradation, wrong
rendering and off colors.

For HEVC they are usually expressed in the stream itself, under the VUI,
and it is kinda expected that modern encoder allow to set them to any of
the applicable values.
In ffmpeg-land, they are represented by the colorspace, color_primaries and
color_transfer options in AVCodecContext and carried over through the whole
video processing.
Jing SUN March 13, 2019, 3:40 a.m. UTC | #10
Hi Giovara,

SVT HEVC has the interface to enable/disable sending a vui structure in the HEVC bitstream, but supports no interface for setting the color properties before encoding yet. I will be opening an issue in SVT HEVC github asking if they have plans to add such feature, and will keep you posted. In the meantime, I think it is not blocking the first version of this plugin’s merging , is it?

VideoUsabilityInfo

Enables or disables sending a vui
structure in the HEVC Elementary
bitstream. 0 = OFF, 1 = ON


Regards,
SUN, Jing

From: Vittorio Giovara [mailto:vittorio.giovara@gmail.com]

Sent: Monday, March 11, 2019 10:50 PM
To: Sun, Jing A <jing.a.sun@intel.com>
Cc: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>; Huang, Zhengxu <zhengxu.huang@intel.com>; Tmar, Hassene <hassene.tmar@intel.com>
Subject: Re: [FFmpeg-devel] [PATCH v7 1/2] lavc/svt_hevc: add libsvt hevc encoder wrapper.



On Mon, Mar 11, 2019 at 12:50 AM Sun, Jing A <jing.a.sun@intel.com<mailto:jing.a.sun@intel.com>> wrote:
I just searched my inbox again but failed to find that email of question you mentioned.

Yeah I often see my mail bounced with this message:

Address not found
Your message wasn't delivered to jun.zhao@intel.com<mailto:jun.zhao@intel.com> because the address couldn't be found, or is unable to receive mail.


For reference this was the message on the mailing list https://ffmpeg.org/pipermail/ffmpeg-devel/2019-March/240663.html

Could you please elaborate your request? What is the preservation for and how is it expected to work?

Yes of course, when you encode an HEVC stream you should be able to signal how the color properties of the video buffers should be rendered. This is usually conveyed with three parameters, the matrix coefficients, the color primaries and the transfer characteristics. Without such information, the data stored in the video may be interpreted differently and often incorrectly by modern video players, causing image degradation, wrong rendering and off colors.

For HEVC they are usually expressed in the stream itself, under the VUI, and it is kinda expected that modern encoder allow to set them to any of the applicable values.
In ffmpeg-land, they are represented by the colorspace, color_primaries and color_transfer options in AVCodecContext and carried over through the whole video processing.
--
Vittorio
Jing SUN March 13, 2019, 5:33 a.m. UTC | #11
On  Monday, March 11, 2019 10:50 PM Vittorio Giovara vittorio.giovara@gmail.com wrote:

>On Mon, Mar 11, 2019 at 12:50 AM Sun, Jing A <jing.a.sun@intel.com> wrote:

>I just searched my inbox again but failed to find that email of question you mentioned.

>

>Yeah I often see my mail bounced with this message:

>

>Address not found

>Your message wasn't delivered to jun.zhao@intel.com because the address couldn't be found, or is unable to receive mail. 

 
>For reference this was the message on the mailing list https://ffmpeg.org/pipermail/ffmpeg-devel/2019-March/240663.html

>

>Could you please elaborate your request? What is the preservation for and how is it expected to work? 

>

>Yes of course, when you encode an HEVC stream you should be able to signal how the color properties of the video buffers should be rendered. This is usually conveyed with three 

>parameters, the matrix coefficients, the color primaries and the transfer characteristics. Without such information, the data stored in the video may be interpreted differently and often 

>incorrectly by modern video players, causing image degradation, wrong rendering and off colors.


>For HEVC they are usually expressed in the stream itself, under the VUI, and it is kinda expected that modern encoder allow to set them to any of the applicable values.

>In ffmpeg-land, they are represented by the colorspace, color_primaries and color_transfer options in AVCodecContext and carried over through the whole video processing.

>-- 

>Vittorio


Hi Giovara,

SVT HEVC has the interface to enable/disable sending a vui structure in the HEVC bitstream, but supports no interface for setting the color properties before encoding yet. I will be opening an issue in SVT HEVC github asking if they have plans to add such feature, and will keep you posted. In the meantime, I think it is not blocking the first version of this plugin’s merging , is it?

In SVT HEVC user guide: "VideoUsabilityInfo - Enables or disables sending a vui structure in the HEVC Elementary bitstream. 0 = OFF, 1 = ON"

Regards,
SUN, Jing
Jing SUN March 13, 2019, 6:38 a.m. UTC | #12
On  Monday, March 11, 2019 10:50 PM Vittorio Giovara vittorio.giovara@gmail.com wrote:

>On Mon, Mar 11, 2019 at 12:50 AM Sun, Jing A <jing.a.sun@intel.com> wrote:

>I just searched my inbox again but failed to find that email of question you mentioned.

>

>Yeah I often see my mail bounced with this message:

>

>Address not found

>Your message wasn't delivered to jun.zhao@intel.com because the address couldn't be found, or is unable to receive mail. 

 
>For reference this was the message on the mailing list 

>https://ffmpeg.org/pipermail/ffmpeg-devel/2019-March/240663.html

>

>Could you please elaborate your request? What is the preservation for and how is it expected to work? 

>

>Yes of course, when you encode an HEVC stream you should be able to 

>signal how the color properties of the video buffers should be 

>rendered. This is usually conveyed with three parameters, the matrix coefficients, the color primaries and the transfer characteristics. Without such information, the data stored in the video may be interpreted differently and often incorrectly by modern video players, causing image degradation, wrong rendering and off colors.


>For HEVC they are usually expressed in the stream itself, under the VUI, and it is kinda expected that modern encoder allow to set them to any of the applicable values.

>In ffmpeg-land, they are represented by the colorspace, color_primaries and color_transfer options in AVCodecContext and carried over through the whole video processing.

>--

>Vittorio


Hi Giovara,

SVT HEVC has the interface to enable/disable sending a vui structure in the HEVC bitstream, but supports no interface for setting the color properties before encoding yet. I will be opening an issue in SVT HEVC github asking if they have plans to add such feature, and will keep you posted. In the meantime, I think it is not blocking the first version of this plugin’s merging , is it?

In SVT HEVC user guide: "VideoUsabilityInfo - Enables or disables sending a vui structure in the HEVC Elementary bitstream. 0 = OFF, 1 = ON"

Regards,
SUN, Jing

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Vittorio Giovara March 13, 2019, 6:50 p.m. UTC | #13
On Tue, Mar 12, 2019 at 11:40 PM Sun, Jing A <jing.a.sun@intel.com> wrote:

> Hi Giovara,
>
>
>
> SVT HEVC has the interface to enable/disable sending a vui structure in
> the HEVC bitstream, but supports no interface for setting the color
> properties before encoding yet. I will be opening an issue in SVT HEVC
> github asking if they have plans to add such feature, and will keep you
> posted. In the meantime, I think it is not blocking the first version of
> this plugin’s merging , is it?
>
>
>
It kind-of is, what is the point of setting the HDR information (or
encoding in hevc at all) if you can't set the related color properties?
At the very least there should be a big fat warning that notifies users of
this missing feature, when such information is lost.
Jing SUN March 14, 2019, 12:29 a.m. UTC | #14
> On Tue, Mar 12, 2019 at 11:40 PM Sun, Jing A <jing.a.sun@intel.com<mailto:jing.a.sun@intel.com>> wrote:

Hi Giovara,

SVT HEVC has the interface to enable/disable sending a vui structure in the HEVC bitstream, but supports no interface for setting the color properties before encoding yet. I will be opening an issue in SVT HEVC github asking if they have plans to add such feature, and will keep you posted. In the meantime, I think it is not blocking the first version of this plugin’s merging , is it?


> It kind-of is, what is the point of setting the HDR information (or encoding in hevc at all) if you can't set the related color properties?

> At the very least there should be a big fat warning that notifies users of this missing feature, when such information is lost.

> --

> Vittorio


SVT HEVC’s HDR is also an on-off switch, please refer to https://github.com/intel/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md.

-Jing
Vittorio Giovara March 14, 2019, 2:50 a.m. UTC | #15
On Wed, Mar 13, 2019 at 8:29 PM Sun, Jing A <jing.a.sun@intel.com> wrote:

>
>
> > On Tue, Mar 12, 2019 at 11:40 PM Sun, Jing A <jing.a.sun@intel.com>
> wrote:
>
> Hi Giovara,
>
>
>
> SVT HEVC has the interface to enable/disable sending a vui structure in
> the HEVC bitstream, but supports no interface for setting the color
> properties before encoding yet. I will be opening an issue in SVT HEVC
> github asking if they have plans to add such feature, and will keep you
> posted. In the meantime, I think it is not blocking the first version of
> this plugin’s merging , is it?
>
>
>
>
>
> > It kind-of is, what is the point of setting the HDR information (or
> encoding in hevc at all) if you can't set the related color properties?
>
> > At the very least there should be a big fat warning that notifies users
> of this missing feature, when such information is lost.
>
> > --
>
> > Vittorio
>
>
>
> SVT HEVC’s HDR is also an on-off switch, please refer to
> https://github.com/intel/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md
> .
>
>
>
> -Jing
>

Sorry, I fail to see the logical connection between my comment and your
reply.
Jing SUN March 14, 2019, 2:56 a.m. UTC | #16
On Wed, Mar 13, 2019 at 8:29 PM Sun, Jing A <jing.a.sun@intel.com> wrote:

>

>

> > On Tue, Mar 12, 2019 at 11:40 PM Sun, Jing A <jing.a.sun@intel.com>

> wrote:

>

> Hi Giovara,

>

>

>

> SVT HEVC has the interface to enable/disable sending a vui structure 

> in the HEVC bitstream, but supports no interface for setting the color 

> properties before encoding yet. I will be opening an issue in SVT HEVC 

> github asking if they have plans to add such feature, and will keep 

> you posted. In the meantime, I think it is not blocking the first 

> version of this plugin’s merging , is it?

>

>

>

>

>

> > It kind-of is, what is the point of setting the HDR information (or

> encoding in hevc at all) if you can't set the related color properties?

>

> > At the very least there should be a big fat warning that notifies 

> > users

> of this missing feature, when such information is lost.

>

> > --

>

> > Vittorio

>

>

>

> SVT HEVC’s HDR is also an on-off switch, please refer to 

> https://github.com/intel/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_us

> er_guide.md

> .

>

>

>

> -Jing

>


>Sorry, I fail to see the logical connection between my comment and your reply.

>--

>Vittorio


The feature request is being considered: https://github.com/intel/SVT-HEVC/issues/148
-Jing
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
diff mbox

Patch

diff --git a/configure b/configure
index dcead3a..36bc8c1 100755
--- a/configure
+++ b/configure
@@ -264,6 +264,7 @@  External library support:
   --enable-libspeex        enable Speex de/encoding via libspeex [no]
   --enable-libsrt          enable Haivision SRT protocol via libsrt [no]
   --enable-libssh          enable SFTP protocol via libssh [no]
+  --enable-libsvthevc      enable HEVC encoding via svt [no]
   --enable-libtensorflow   enable TensorFlow as a DNN module backend
                            for DNN based filters like sr [no]
   --enable-libtesseract    enable Tesseract, needed for ocr filter [no]
@@ -1784,6 +1785,7 @@  EXTERNAL_LIBRARY_LIST="
     libspeex
     libsrt
     libssh
+    libsvthevc
     libtensorflow
     libtesseract
     libtheora
@@ -3173,6 +3175,7 @@  libshine_encoder_select="audio_frame_queue"
 libspeex_decoder_deps="libspeex"
 libspeex_encoder_deps="libspeex"
 libspeex_encoder_select="audio_frame_queue"
+libsvt_hevc_encoder_deps="libsvthevc"
 libtheora_encoder_deps="libtheora"
 libtwolame_encoder_deps="libtwolame"
 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
@@ -6209,6 +6212,7 @@  enabled libsoxr           && require libsoxr soxr.h soxr_create -lsoxr
 enabled libssh            && require_pkg_config libssh libssh libssh/sftp.h sftp_init
 enabled libspeex          && require_pkg_config libspeex speex speex/speex.h speex_decoder_init
 enabled libsrt            && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket
+enabled libsvthevc        && require_pkg_config libsvthevc SvtHevcEnc svt-hevc/EbApi.h EbInitHandle
 enabled libtensorflow     && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow
 enabled libtesseract      && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate
 enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 15c43a8..c93e545 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -987,6 +987,7 @@  OBJS-$(CONFIG_LIBOPUS_ENCODER)            += libopusenc.o libopus.o     \
 OBJS-$(CONFIG_LIBSHINE_ENCODER)           += libshine.o
 OBJS-$(CONFIG_LIBSPEEX_DECODER)           += libspeexdec.o
 OBJS-$(CONFIG_LIBSPEEX_ENCODER)           += libspeexenc.o
+OBJS-$(CONFIG_LIBSVT_HEVC_ENCODER)        += libsvt_hevc.o
 OBJS-$(CONFIG_LIBTHEORA_ENCODER)          += libtheoraenc.o
 OBJS-$(CONFIG_LIBTWOLAME_ENCODER)         += libtwolame.o
 OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER)     += libvo-amrwbenc.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index b26aeca..e93f66f 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -703,6 +703,7 @@  extern AVCodec ff_librsvg_decoder;
 extern AVCodec ff_libshine_encoder;
 extern AVCodec ff_libspeex_encoder;
 extern AVCodec ff_libspeex_decoder;
+extern AVCodec ff_libsvt_hevc_encoder;
 extern AVCodec ff_libtheora_encoder;
 extern AVCodec ff_libtwolame_encoder;
 extern AVCodec ff_libvo_amrwbenc_encoder;
diff --git a/libavcodec/libsvt_hevc.c b/libavcodec/libsvt_hevc.c
new file mode 100644
index 0000000..de11a19
--- /dev/null
+++ b/libavcodec/libsvt_hevc.c
@@ -0,0 +1,528 @@ 
+/*
+* Scalable Video Technology for HEVC encoder library plugin
+*
+* Copyright (c) 2018 Intel Corporation
+*
+* This file is part of FFmpeg.
+*
+* FFmpeg is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version.
+*
+* FFmpeg is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "svt-hevc/EbErrorCodes.h"
+#include "svt-hevc/EbTime.h"
+#include "svt-hevc/EbApi.h"
+
+#include "libavutil/common.h"
+#include "libavutil/frame.h"
+#include "libavutil/opt.h"
+
+#include "internal.h"
+#include "avcodec.h"
+
+typedef enum eos_status {
+    EOS_NOT_REACHED = 0,
+    EOS_REACHED,
+    EOS_TOTRIGGER
+}EOS_STATUS;
+
+typedef struct SvtContext {
+    AVClass *class;
+
+    EB_H265_ENC_CONFIGURATION enc_params;
+    EB_COMPONENTTYPE *svt_handle;
+    EB_BUFFERHEADERTYPE in_buf;
+    EOS_STATUS eos_flag;
+
+    // User options.
+    int vui_info;
+    int hierarchical_level;
+    int la_depth;
+    int enc_mode;
+    int rc_mode;
+    int scd;
+    int tune;
+    int qp;
+    int hdr;
+
+    int forced_idr;
+
+    int aud;
+
+    int profile;
+    int tier;
+    int level;
+
+    int base_layer_switch_mode;
+} SvtContext;
+
+static int error_mapping(EB_ERRORTYPE svt_ret)
+{
+    int err;
+
+    switch (svt_ret) {
+    case EB_ErrorInsufficientResources:
+        err = AVERROR(ENOMEM);
+        break;
+
+    case EB_ErrorUndefined:
+    case EB_ErrorInvalidComponent:
+    case EB_ErrorBadParameter:
+        err = AVERROR(EINVAL);
+        break;
+
+    case EB_ErrorDestroyThreadFailed:
+    case EB_ErrorSemaphoreUnresponsive:
+    case EB_ErrorDestroySemaphoreFailed:
+    case EB_ErrorCreateMutexFailed:
+    case EB_ErrorMutexUnresponsive:
+    case EB_ErrorDestroyMutexFailed:
+        err = AVERROR_EXTERNAL;
+            break;
+
+    case EB_NoErrorEmptyQueue:
+        err = AVERROR(EAGAIN);
+
+    case EB_ErrorNone:
+        err = 0;
+        break;
+
+    default:
+        err = AVERROR_UNKNOWN;
+    }
+
+    return err;
+}
+
+static void free_buffer(SvtContext *svt_enc)
+{
+    EB_H265_ENC_INPUT *in_data = (EB_H265_ENC_INPUT *)svt_enc->in_buf.pBuffer;
+
+    if (in_data)
+        av_freep(&in_data);
+}
+
+static int alloc_buffer(EB_H265_ENC_CONFIGURATION *config, SvtContext *svt_enc)
+{
+    EB_H265_ENC_INPUT *in_data;
+
+    // allocate buffer for in and out
+    in_data  = av_mallocz(sizeof(*in_data));
+    if (!in_data)
+        goto failed;
+    svt_enc->in_buf.pBuffer  = (unsigned char *)in_data;
+
+    svt_enc->in_buf.nSize        = sizeof(svt_enc->in_buf);
+    svt_enc->in_buf.pAppPrivate  = NULL;
+
+    return 0;
+
+failed:
+    free_buffer(svt_enc);
+    return AVERROR(ENOMEM);
+}
+
+static int config_enc_params(EB_H265_ENC_CONFIGURATION *param,
+                             AVCodecContext *avctx)
+{
+    SvtContext *svt_enc = avctx->priv_data;
+    int             ret;
+    int        ten_bits = 0;
+
+    param->sourceWidth     = avctx->width;
+    param->sourceHeight    = avctx->height;
+
+    if (avctx->pix_fmt == AV_PIX_FMT_YUV420P10LE) {
+        av_log(avctx, AV_LOG_DEBUG , "Encoder 10 bits depth input\n");
+
+        // Encoding the source frames of the compressed 10-bit format
+        // supported by SVT-HEVC requires an extra conversion operation
+        // from yuv420p10le to that format. Disable it for now in ffmpeg.
+
+        param->compressedTenBitFormat = 0;
+        ten_bits = 1;
+    }
+
+    // Update param from options
+    param->hierarchicalLevels     = svt_enc->hierarchical_level - 1;
+    param->encMode                = svt_enc->enc_mode;
+    param->profile                = svt_enc->profile;
+    param->tier                   = svt_enc->tier;
+    param->level                  = svt_enc->level;
+    param->rateControlMode        = svt_enc->rc_mode;
+    param->sceneChangeDetection   = svt_enc->scd;
+    param->tune                   = svt_enc->tune;
+    param->baseLayerSwitchMode    = svt_enc->base_layer_switch_mode;
+    param->qp                     = svt_enc->qp;
+    param->accessUnitDelimiter    = svt_enc->aud;
+
+    param->targetBitRate          = avctx->bit_rate;
+    if (avctx->gop_size > 0)
+        param->intraPeriodLength  = avctx->gop_size - 1;
+
+    if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
+        param->frameRateNumerator     = avctx->framerate.num;
+        param->frameRateDenominator   = avctx->framerate.den * avctx->ticks_per_frame;
+    } else {
+        param->frameRateNumerator     = avctx->time_base.den;
+        param->frameRateDenominator   = avctx->time_base.num * avctx->ticks_per_frame;
+    }
+
+    if (param->rateControlMode) {
+        param->maxQpAllowed       = avctx->qmax;
+        param->minQpAllowed       = avctx->qmin;
+    }
+
+    param->intraRefreshType       =
+        !!(avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) + 1;
+
+    // is it repeat headers for MP4 or Annex-b
+    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)
+        param->codeVpsSpsPps          = 0;
+    else
+        param->codeVpsSpsPps          = 1;
+
+    param->codeEosNal             = 1;
+
+    if (svt_enc->hdr) {
+        svt_enc->vui_info = 1;
+        param->highDynamicRangeInput = svt_enc->hdr;
+    }
+
+    if (svt_enc->vui_info)
+        param->videoUsabilityInfo = svt_enc->vui_info;
+
+    if (svt_enc->la_depth != -1)
+        param->lookAheadDistance  = svt_enc->la_depth;
+
+    if (ten_bits) {
+        param->encoderBitDepth        = 10;
+    }
+
+    ret = alloc_buffer(param, svt_enc);
+
+    return ret;
+}
+
+static void read_in_data(EB_H265_ENC_CONFIGURATION *config,
+                         const AVFrame *frame,
+                         EB_BUFFERHEADERTYPE *header_ptr)
+{
+    uint8_t is16bit = config->encoderBitDepth > 8;
+    uint64_t luma_size =
+        (uint64_t)config->sourceWidth * config->sourceHeight<< is16bit;
+    EB_H265_ENC_INPUT *in_data = (EB_H265_ENC_INPUT *)header_ptr->pBuffer;
+
+    // support yuv420p and yuv420p010
+    in_data->luma = frame->data[0];
+    in_data->cb   = frame->data[1];
+    in_data->cr   = frame->data[2];
+
+    // stride info
+    in_data->yStride  = frame->linesize[0] >> is16bit;
+    in_data->cbStride = frame->linesize[1] >> is16bit;
+    in_data->crStride = frame->linesize[2] >> is16bit;
+
+    header_ptr->nFilledLen   += luma_size * 3/2u;
+}
+
+static av_cold int eb_enc_init(AVCodecContext *avctx)
+{
+    SvtContext   *svt_enc = avctx->priv_data;
+    EB_ERRORTYPE svt_ret;
+
+    svt_enc->eos_flag = EOS_NOT_REACHED;
+
+    svt_ret = EbInitHandle(&svt_enc->svt_handle, svt_enc, &svt_enc->enc_params);
+    if (svt_ret != EB_ErrorNone) {
+        av_log(avctx, AV_LOG_ERROR, "Error init encoder handle\n");
+        goto failed;
+    }
+
+    svt_ret = config_enc_params(&svt_enc->enc_params, avctx);
+    if (svt_ret != EB_ErrorNone) {
+        av_log(avctx, AV_LOG_ERROR, "Error configure encoder parameters\n");
+        goto failed_init_handle;
+    }
+
+    svt_ret = EbH265EncSetParameter(svt_enc->svt_handle, &svt_enc->enc_params);
+    if (svt_ret != EB_ErrorNone) {
+        av_log(avctx, AV_LOG_ERROR, "Error setting encoder parameters\n");
+        goto failed_init_handle;
+    }
+
+    svt_ret = EbInitEncoder(svt_enc->svt_handle);
+    if (svt_ret != EB_ErrorNone) {
+        av_log(avctx, AV_LOG_ERROR, "Error init encoder\n");
+        goto failed_init_handle;
+    }
+
+    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) {
+        EB_BUFFERHEADERTYPE *header_ptr = NULL;
+
+        svt_ret = EbH265EncStreamHeader(svt_enc->svt_handle, &header_ptr);
+        if (svt_ret != EB_ErrorNone) {
+            av_log(avctx, AV_LOG_ERROR, "Error when build stream header.\n");
+            goto failed_init_enc;
+        }
+
+        avctx->extradata_size = header_ptr->nFilledLen;
+        avctx->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+        if (!avctx->extradata) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Cannot allocate HEVC header of size %d.\n", avctx->extradata_size);
+            svt_ret = EB_ErrorInsufficientResources;
+            goto failed_init_enc;
+        }
+        memcpy(avctx->extradata, header_ptr->pBuffer, avctx->extradata_size);
+    }
+
+    return 0;
+
+failed_init_enc:
+    EbDeinitEncoder(svt_enc->svt_handle);
+failed_init_handle:
+    EbDeinitHandle(svt_enc->svt_handle);
+failed:
+    free_buffer(svt_enc);
+    svt_enc->svt_handle = NULL;
+    svt_enc = NULL;
+    return error_mapping(svt_ret);
+}
+
+static int eb_send_frame(AVCodecContext *avctx, const AVFrame *frame)
+{
+    SvtContext           *svt_enc = avctx->priv_data;
+    EB_BUFFERHEADERTYPE  *header_ptr = &svt_enc->in_buf;
+
+    if (!frame) {
+        EB_BUFFERHEADERTYPE header_ptr_last;
+        header_ptr_last.nAllocLen   = 0;
+        header_ptr_last.nFilledLen  = 0;
+        header_ptr_last.nTickCount  = 0;
+        header_ptr_last.pAppPrivate = NULL;
+        header_ptr_last.pBuffer     = NULL;
+        header_ptr_last.nFlags      = EB_BUFFERFLAG_EOS;
+
+        EbH265EncSendPicture(svt_enc->svt_handle, &header_ptr_last);
+        svt_enc->eos_flag = EOS_REACHED;
+        av_log(avctx, AV_LOG_DEBUG, "Finish sending frames!!!\n");
+        return 0;
+    }
+
+    read_in_data(&svt_enc->enc_params, frame, header_ptr);
+
+    header_ptr->nFlags       = 0;
+    header_ptr->pAppPrivate  = NULL;
+    header_ptr->pts          = frame->pts;
+    switch (frame->pict_type) {
+    case AV_PICTURE_TYPE_I:
+        header_ptr->sliceType = svt_enc->forced_idr > 0 ? EB_IDR_PICTURE : EB_I_PICTURE;
+        break;
+    case AV_PICTURE_TYPE_P:
+        header_ptr->sliceType = EB_P_PICTURE;
+        break;
+    case AV_PICTURE_TYPE_B:
+        header_ptr->sliceType = EB_B_PICTURE;
+        break;
+    default:
+        header_ptr->sliceType = EB_INVALID_PICTURE;
+        break;
+    }
+    EbH265EncSendPicture(svt_enc->svt_handle, header_ptr);
+
+    return 0;
+}
+
+static int eb_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
+{
+    SvtContext  *svt_enc = avctx->priv_data;
+    EB_BUFFERHEADERTYPE   *header_ptr = NULL;
+    EB_ERRORTYPE          svt_ret;
+    int ret = 0;
+
+    if (EOS_TOTRIGGER == svt_enc->eos_flag) {
+        pkt = NULL;
+        return AVERROR_EOF;
+    }
+
+    svt_ret = EbH265GetPacket(svt_enc->svt_handle, &header_ptr, svt_enc->eos_flag);
+    if (svt_ret == EB_NoErrorEmptyQueue)
+        return AVERROR(EAGAIN);
+
+    if ((ret = ff_alloc_packet2(avctx, pkt, header_ptr->nFilledLen, 0)) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to allocate output packet.\n");
+        EbH265ReleaseOutBuffer(&header_ptr);
+        return ret;
+    }
+
+    memcpy(pkt->data, header_ptr->pBuffer, header_ptr->nFilledLen);
+
+    pkt->size = header_ptr->nFilledLen;
+    pkt->pts  = header_ptr->pts;
+    pkt->dts  = header_ptr->dts;
+    if ((header_ptr->sliceType == EB_IDR_PICTURE) ||
+        (header_ptr->sliceType == EB_I_PICTURE))
+        pkt->flags |= AV_PKT_FLAG_KEY;
+    if (header_ptr->sliceType == EB_NON_REF_PICTURE)
+        pkt->flags |= AV_PKT_FLAG_DISPOSABLE;
+
+    EbH265ReleaseOutBuffer(&header_ptr);
+
+    if (EB_BUFFERFLAG_EOS == header_ptr->nFlags)
+        svt_enc->eos_flag = EOS_TOTRIGGER;
+
+    return 0;
+}
+
+static av_cold int eb_enc_close(AVCodecContext *avctx)
+{
+    SvtContext *svt_enc = avctx->priv_data;
+
+    if (svt_enc) {
+        if (svt_enc->svt_handle) {
+            EbDeinitEncoder(svt_enc->svt_handle);
+            EbDeinitHandle(svt_enc->svt_handle);
+            svt_enc->svt_handle = NULL;
+        }
+
+        free_buffer(svt_enc);
+        svt_enc = NULL;
+    }
+
+    return 0;
+}
+
+#define OFFSET(x) offsetof(SvtContext, x)
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption options[] = {
+    { "vui", "Enable vui info", OFFSET(vui_info),
+      AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
+
+    { "aud", "Include AUD", OFFSET(aud),
+      AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+
+    { "hielevel", "Hierarchical prediction levels setting", OFFSET(hierarchical_level),
+      AV_OPT_TYPE_INT, { .i64 = 4 }, 1, 4, VE , "hielevel"},
+        { "flat",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 },  INT_MIN, INT_MAX, VE, "hielevel" },
+        { "2level", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 },  INT_MIN, INT_MAX, VE, "hielevel" },
+        { "3level", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 3 },  INT_MIN, INT_MAX, VE, "hielevel" },
+        { "4level", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 4 },  INT_MIN, INT_MAX, VE, "hielevel" },
+
+    { "la_depth", "Look ahead distance [0, 256]", OFFSET(la_depth),
+      AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 256, VE },
+
+    { "preset", "Encoding preset [0, 12] (e,g, for subjective quality tuning mode and >=4k resolution), [0, 10] (for >= 1080p resolution), [0, 9] (for all resolution and modes)",
+      OFFSET(enc_mode), AV_OPT_TYPE_INT, { .i64 = 9 }, 0, 12, VE },
+
+    { "profile", "Profile setting, Main Still Picture Profile not supported", OFFSET(profile),
+      AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_HEVC_MAIN_10 }, FF_PROFILE_HEVC_MAIN, FF_PROFILE_HEVC_MAIN_10, VE, "profile"},
+
+#define PROFILE(name, value)  name, NULL, 0, AV_OPT_TYPE_CONST, \
+    { .i64 = value }, 0, 0, VE, "profile"
+        { PROFILE("main",   FF_PROFILE_HEVC_MAIN)    },
+        { PROFILE("main10", FF_PROFILE_HEVC_MAIN_10) },
+#undef PROFILE
+
+    { "tier", "Set tier (general_tier_flag)", OFFSET(tier),
+      AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE, "tier" },
+        { "main", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, VE, "tier" },
+        { "high", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, VE, "tier" },
+
+    { "level", "Set level (level_idc)", OFFSET(level),
+      AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xff, VE, "level" },
+
+#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
+      { .i64 = value }, 0, 0, VE, "level"
+        { LEVEL("1",   10) },
+        { LEVEL("2",   20) },
+        { LEVEL("2.1", 21) },
+        { LEVEL("3",   30) },
+        { LEVEL("3.1", 31) },
+        { LEVEL("4",   40) },
+        { LEVEL("4.1", 41) },
+        { LEVEL("5",   50) },
+        { LEVEL("5.1", 51) },
+        { LEVEL("5.2", 52) },
+        { LEVEL("6",   60) },
+        { LEVEL("6.1", 61) },
+        { LEVEL("6.2", 62) },
+#undef LEVEL
+
+    { "rc", "Bit rate control mode", OFFSET(rc_mode),
+      AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE , "rc"},
+        { "cqp", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 },  INT_MIN, INT_MAX, VE, "rc" },
+        { "vbr", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 },  INT_MIN, INT_MAX, VE, "rc" },
+
+    { "qp", "QP value for intra frames", OFFSET(qp),
+      AV_OPT_TYPE_INT, { .i64 = 32 }, 0, 51, VE },
+
+    { "sc_detection", "Scene change detection", OFFSET(scd),
+      AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
+
+    { "tune", "Quality tuning mode", OFFSET(tune), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 2, VE, "tune" },
+        { "sq", "Visually optimized mode", 0,
+          AV_OPT_TYPE_CONST, { .i64 = 0 },  INT_MIN, INT_MAX, VE, "tune" },
+        { "oq",  "PSNR / SSIM optimized mode",  0,
+          AV_OPT_TYPE_CONST, { .i64 = 1 },  INT_MIN, INT_MAX, VE, "tune" },
+        { "vmaf", "VMAF optimized mode", 0,
+          AV_OPT_TYPE_CONST, { .i64 = 2 },  INT_MIN, INT_MAX, VE, "tune" },
+
+    { "bl_mode", "Random Access Prediction Structure type setting", OFFSET(base_layer_switch_mode),
+      AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
+
+    { "forced-idr", "If forcing keyframes, force them as IDR frames.", OFFSET(forced_idr),
+      AV_OPT_TYPE_BOOL,   { .i64 = 0 }, -1, 1, VE },
+
+    { "hdr", "High dynamic range input", OFFSET(hdr),
+      AV_OPT_TYPE_BOOL,   { .i64 = 0 }, 0, 1, VE },
+
+    {NULL},
+};
+
+static const AVClass class = {
+    .class_name = "libsvt_hevc",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+static const AVCodecDefault eb_enc_defaults[] = {
+    { "b",         "7M"    },
+    { "flags",     "+cgop" },
+    { "qmin",      "10"    },
+    { "qmax",      "48"    },
+    { "g",         "-2"    },
+    { NULL },
+};
+
+AVCodec ff_libsvt_hevc_encoder = {
+    .name           = "libsvt_hevc",
+    .long_name      = NULL_IF_CONFIG_SMALL("SVT-HEVC(Scalable Video Technology for HEVC) encoder"),
+    .priv_data_size = sizeof(SvtContext),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_HEVC,
+    .init           = eb_enc_init,
+    .send_frame     = eb_send_frame,
+    .receive_packet = eb_receive_packet,
+    .close          = eb_enc_close,
+    .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P,
+                                                    AV_PIX_FMT_YUV420P10,
+                                                    AV_PIX_FMT_NONE },
+    .priv_class     = &class,
+    .defaults       = eb_enc_defaults,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .wrapper_name   = "libsvt_hevc",
+};