diff mbox

[FFmpeg-devel,1/2] vaapi_h264: Add named options for setting profile and level

Message ID 7b694785-1c62-3584-b9ac-1faa325021c6@jkqxz.net
State Accepted
Commit c490fc9536dcea7fdf1245a340bf075533610bc2
Headers show

Commit Message

Mark Thompson Nov. 29, 2017, 11:27 p.m. UTC
---
 libavcodec/vaapi_encode_h264.c | 48 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

Comments

Zhong Li Nov. 30, 2017, 8:52 a.m. UTC | #1
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf

> Of Mark Thompson


> +#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \

> +      { .i64 = value }, 0, 0, FLAGS, "level"

> +    { LEVEL("1",   10) },

> +    { LEVEL("1.1", 11) },

> +    { LEVEL("1.2", 12) },

> +    { LEVEL("1.3", 13) },

> +    { LEVEL("2",   20) },

> +    { LEVEL("2.1", 21) },

> +    { LEVEL("2.2", 22) },

> +    { LEVEL("3",   30) },

> +    { LEVEL("3.1", 31) },

> +    { LEVEL("3.2", 32) },

> +    { LEVEL("4",   40) },

> +    { LEVEL("4.1", 41) },

> +    { LEVEL("4.2", 42) },

> +    { LEVEL("5",   50) },

> +    { LEVEL("5.1", 51) },

> +    { LEVEL("5.2", 52) },

> +    { LEVEL("6",   60) },

> +    { LEVEL("6.1", 61) },

> +    { LEVEL("6.2", 62) },


IIRC, level 5.2 is the maximum level of H264? 

> +#undef LEVEL

> +

>      { NULL },

>  };
Moritz Barsnick Nov. 30, 2017, 2:33 p.m. UTC | #2
On Thu, Nov 30, 2017 at 08:52:21 +0000, Li, Zhong wrote:
> > +    { LEVEL("6",   60) },
> > +    { LEVEL("6.1", 61) },
> > +    { LEVEL("6.2", 62) },
> 
> IIRC, level 5.2 is the maximum level of H264? 

Higher levels were introduced in 2016. Edition V12 of H.264 lists 6,
6.1 and 6.2 in Annex A, Table A-1. It basically lists the same thing as
Wikipedia:
https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels

Moritz
Zhong Li Dec. 1, 2017, 5:24 a.m. UTC | #3
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf

> Of Moritz Barsnick

> Sent: Thursday, November 30, 2017 10:33 PM

> To: FFmpeg development discussions and patches

> <ffmpeg-devel@ffmpeg.org>

> Subject: Re: [FFmpeg-devel] [PATCH 1/2] vaapi_h264: Add named options for

> setting profile and level

> 

> On Thu, Nov 30, 2017 at 08:52:21 +0000, Li, Zhong wrote:

> > > +    { LEVEL("6",   60) },

> > > +    { LEVEL("6.1", 61) },

> > > +    { LEVEL("6.2", 62) },

> >

> > IIRC, level 5.2 is the maximum level of H264?

> 

> Higher levels were introduced in 2016. Edition V12 of H.264 lists 6,

> 6.1 and 6.2 in Annex A, Table A-1. It basically lists the same thing as

> Wikipedia:

> https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels


Exactly.
Mark Thompson Dec. 2, 2017, 3:36 p.m. UTC | #4
On 01/12/17 05:24, Li, Zhong wrote:
>> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf
>> Of Moritz Barsnick
>> Sent: Thursday, November 30, 2017 10:33 PM
>> To: FFmpeg development discussions and patches
>> <ffmpeg-devel@ffmpeg.org>
>> Subject: Re: [FFmpeg-devel] [PATCH 1/2] vaapi_h264: Add named options for
>> setting profile and level
>>
>> On Thu, Nov 30, 2017 at 08:52:21 +0000, Li, Zhong wrote:
>>>> +    { LEVEL("6",   60) },
>>>> +    { LEVEL("6.1", 61) },
>>>> +    { LEVEL("6.2", 62) },
>>>
>>> IIRC, level 5.2 is the maximum level of H264?
>>
>> Higher levels were introduced in 2016. Edition V12 of H.264 lists 6,
>> 6.1 and 6.2 in Annex A, Table A-1. It basically lists the same thing as
>> Wikipedia:
>> https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels
> 
> Exactly.
To clarify, are you happy with this patch and the matching one for H.265 now?

Thanks,

- Mark
Zhong Li Dec. 4, 2017, 5:25 a.m. UTC | #5
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf

> Of Mark Thompson

> Sent: Saturday, December 2, 2017 11:36 PM

> To: ffmpeg-devel@ffmpeg.org

> Subject: Re: [FFmpeg-devel] [PATCH 1/2] vaapi_h264: Add named options for

> setting profile and level

> 

> On 01/12/17 05:24, Li, Zhong wrote:

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

> Behalf

> >> Of Moritz Barsnick

> >> Sent: Thursday, November 30, 2017 10:33 PM

> >> To: FFmpeg development discussions and patches

> >> <ffmpeg-devel@ffmpeg.org>

> >> Subject: Re: [FFmpeg-devel] [PATCH 1/2] vaapi_h264: Add named options

> >> for setting profile and level

> >>

> >> On Thu, Nov 30, 2017 at 08:52:21 +0000, Li, Zhong wrote:

> >>>> +    { LEVEL("6",   60) },

> >>>> +    { LEVEL("6.1", 61) },

> >>>> +    { LEVEL("6.2", 62) },

> >>>

> >>> IIRC, level 5.2 is the maximum level of H264?

> >>

> >> Higher levels were introduced in 2016. Edition V12 of H.264 lists 6,

> >> 6.1 and 6.2 in Annex A, Table A-1. It basically lists the same thing

> >> as

> >> Wikipedia:

> >> https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels

> >

> > Exactly.

> To clarify, are you happy with this patch and the matching one for H.265

> now?


Yeah, LGTM. 
For h265, level_idc is not set by avctx->level in libx265, so we can just make it consistent with nvenc instead of libx264.
Mark Thompson Dec. 4, 2017, 11:34 p.m. UTC | #6
On 04/12/17 05:25, Li, Zhong wrote:
>> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On Behalf
>> Of Mark Thompson
>> Sent: Saturday, December 2, 2017 11:36 PM
>> To: ffmpeg-devel@ffmpeg.org
>> Subject: Re: [FFmpeg-devel] [PATCH 1/2] vaapi_h264: Add named options for
>> setting profile and level
>>
>> On 01/12/17 05:24, Li, Zhong wrote:
>>>> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces@ffmpeg.org] On
>> Behalf
>>>> Of Moritz Barsnick
>>>> Sent: Thursday, November 30, 2017 10:33 PM
>>>> To: FFmpeg development discussions and patches
>>>> <ffmpeg-devel@ffmpeg.org>
>>>> Subject: Re: [FFmpeg-devel] [PATCH 1/2] vaapi_h264: Add named options
>>>> for setting profile and level
>>>>
>>>> On Thu, Nov 30, 2017 at 08:52:21 +0000, Li, Zhong wrote:
>>>>>> +    { LEVEL("6",   60) },
>>>>>> +    { LEVEL("6.1", 61) },
>>>>>> +    { LEVEL("6.2", 62) },
>>>>>
>>>>> IIRC, level 5.2 is the maximum level of H264?
>>>>
>>>> Higher levels were introduced in 2016. Edition V12 of H.264 lists 6,
>>>> 6.1 and 6.2 in Annex A, Table A-1. It basically lists the same thing
>>>> as
>>>> Wikipedia:
>>>> https://en.wikipedia.org/wiki/H.264/MPEG-4_AVC#Levels
>>>
>>> Exactly.
>> To clarify, are you happy with this patch and the matching one for H.265
>> now?
> 
> Yeah, LGTM. 
> For h265, level_idc is not set by avctx->level in libx265, so we can just make it consistent with nvenc instead of libx264. 

Yep.

Applied; thank you!

- Mark
diff mbox

Patch

diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 5fd0bf7796..6940823b8e 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -93,6 +93,8 @@  typedef struct VAAPIEncodeH264Options {
     int coder;
     int aud;
     int sei;
+    int profile;
+    int level;
 } VAAPIEncodeH264Options;
 
 
@@ -886,6 +888,11 @@  static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
 
     ctx->codec = &vaapi_encode_type_h264;
 
+    if (avctx->profile == FF_PROFILE_UNKNOWN)
+        avctx->profile = opt->profile;
+    if (avctx->level == FF_LEVEL_UNKNOWN)
+        avctx->level = opt->level;
+
     switch (avctx->profile) {
     case FF_PROFILE_H264_BASELINE:
         av_log(avctx, AV_LOG_WARNING, "H.264 baseline profile is not "
@@ -1010,12 +1017,49 @@  static const AVOption vaapi_encode_h264_options[] = {
     { "recovery_point", "Include recovery points where appropriate",
       0, AV_OPT_TYPE_CONST, { .i64 = SEI_RECOVERY_POINT },
       INT_MIN, INT_MAX, FLAGS, "sei" },
+
+    { "profile", "Set profile (profile_idc and constraint_set*_flag)",
+      OFFSET(profile), AV_OPT_TYPE_INT,
+      { .i64 = FF_PROFILE_H264_HIGH }, 0x0000, 0xffff, FLAGS, "profile" },
+
+#define PROFILE(name, value)  name, NULL, 0, AV_OPT_TYPE_CONST, \
+      { .i64 = value }, 0, 0, FLAGS, "profile"
+    { PROFILE("constrained_baseline", FF_PROFILE_H264_CONSTRAINED_BASELINE) },
+    { PROFILE("main",                 FF_PROFILE_H264_MAIN) },
+    { PROFILE("high",                 FF_PROFILE_H264_HIGH) },
+#undef PROFILE
+
+    { "level", "Set level (level_idc)",
+      OFFSET(level), AV_OPT_TYPE_INT,
+      { .i64 = 51 }, 0x00, 0xff, FLAGS, "level" },
+
+#define LEVEL(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, \
+      { .i64 = value }, 0, 0, FLAGS, "level"
+    { LEVEL("1",   10) },
+    { LEVEL("1.1", 11) },
+    { LEVEL("1.2", 12) },
+    { LEVEL("1.3", 13) },
+    { LEVEL("2",   20) },
+    { LEVEL("2.1", 21) },
+    { LEVEL("2.2", 22) },
+    { LEVEL("3",   30) },
+    { LEVEL("3.1", 31) },
+    { LEVEL("3.2", 32) },
+    { LEVEL("4",   40) },
+    { LEVEL("4.1", 41) },
+    { LEVEL("4.2", 42) },
+    { LEVEL("5",   50) },
+    { LEVEL("5.1", 51) },
+    { LEVEL("5.2", 52) },
+    { LEVEL("6",   60) },
+    { LEVEL("6.1", 61) },
+    { LEVEL("6.2", 62) },
+#undef LEVEL
+
     { NULL },
 };
 
 static const AVCodecDefault vaapi_encode_h264_defaults[] = {
-    { "profile",        "100" },
-    { "level",          "51"  },
     { "b",              "0"   },
     { "bf",             "2"   },
     { "g",              "120" },