Re: [FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-04-02 Thread Mark Thompson

On 01/04/2024 19:55, Mark Thompson wrote:

On 01/04/2024 17:25, Mark Samuelson wrote:

On Mon, Apr 1, 2024 at 10:06 AM Mark Thompson  wrote:


On 28/03/2024 12:34, Mark Samuelson wrote:

Thank you for the notes, here is a new patch that incorporates your

suggestions.  You are right, the default value of 12 for gop_size is
suprising, I didn't know about it before now.


---
   libavcodec/mf_utils.h |  5 +
   libavcodec/mfenc.c    | 33 +++--
   2 files changed, 32 insertions(+), 6 deletions(-)


Patch looks good.

I did a bit of testing with the Microsoft H.264 MFT: GOP size and

compression level work as expected, and VBV parameters seem to be doing
something sensible.


Under what conditions are you expecting global_quality ->

AVEncVideoEncodeQP to do anything, though?  When I set it alone the output
was always identical regardless of what value I set > it to.  (Including
with "-rate_control quality".)


Thanks,

- Mark




I have also had issues making the Media Foundation encoder respect that
value.  I put it in there so that I could easily test it, because I was
having issues with the existing opt_enc_quality -> AVEncCommonQuality.  I
figured it was better to leave it in so people can experiment with it.


Fair, these options are not particularly consistent between different encoder 
MFT implementations.

I will apply this patch tomorrow unless there are any more comments on it.


Applied.

(git hint for emails: write email commentary below the "---" line - everything 
above that ends up in the commit message.  I edited this out of the patch.)

Thanks,

- Mark
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-04-01 Thread Mark Thompson

On 01/04/2024 17:25, Mark Samuelson wrote:

On Mon, Apr 1, 2024 at 10:06 AM Mark Thompson  wrote:


On 28/03/2024 12:34, Mark Samuelson wrote:

Thank you for the notes, here is a new patch that incorporates your

suggestions.  You are right, the default value of 12 for gop_size is
suprising, I didn't know about it before now.


---
   libavcodec/mf_utils.h |  5 +
   libavcodec/mfenc.c| 33 +++--
   2 files changed, 32 insertions(+), 6 deletions(-)


Patch looks good.

I did a bit of testing with the Microsoft H.264 MFT: GOP size and

compression level work as expected, and VBV parameters seem to be doing
something sensible.


Under what conditions are you expecting global_quality ->

AVEncVideoEncodeQP to do anything, though?  When I set it alone the output
was always identical regardless of what value I set > it to.  (Including
with "-rate_control quality".)


Thanks,

- Mark




I have also had issues making the Media Foundation encoder respect that
value.  I put it in there so that I could easily test it, because I was
having issues with the existing opt_enc_quality -> AVEncCommonQuality.  I
figured it was better to leave it in so people can experiment with it.


Fair, these options are not particularly consistent between different encoder 
MFT implementations.

I will apply this patch tomorrow unless there are any more comments on it.

Thanks,

- Mark
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-04-01 Thread Mark Samuelson
On Mon, Apr 1, 2024 at 10:06 AM Mark Thompson  wrote:

> > On 28/03/2024 12:34, Mark Samuelson wrote:
> > > Thank you for the notes, here is a new patch that incorporates your
> suggestions.  You are right, the default value of 12 for gop_size is
> suprising, I didn't know about it before now.
> > >
> > > ---
> > >   libavcodec/mf_utils.h |  5 +
> > >   libavcodec/mfenc.c| 33 +++--
> > >   2 files changed, 32 insertions(+), 6 deletions(-)
> >
> > Patch looks good.
> >
> > I did a bit of testing with the Microsoft H.264 MFT: GOP size and
> compression level work as expected, and VBV parameters seem to be doing
> something sensible.
> >
> > Under what conditions are you expecting global_quality ->
> AVEncVideoEncodeQP to do anything, though?  When I set it alone the output
> was always identical regardless of what value I set > it to.  (Including
> with "-rate_control quality".)
> >
> > Thanks,
> >
> > - Mark
>

I have also had issues making the Media Foundation encoder respect that
value.  I put it in there so that I could easily test it, because I was
having issues with the existing opt_enc_quality -> AVEncCommonQuality.  I
figured it was better to leave it in so people can experiment with it.

>
> > > diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h
> > > index aebfb9ad21..387c005f38 100644
> > > --- a/libavcodec/mf_utils.h
> > > +++ b/libavcodec/mf_utils.h
> > > @@ -97,6 +97,11 @@ DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable,
> 0xee6cad62, 0xd305, 0x4248, 0xa
> > >   DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353,
> 0x475a, 0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
> > >   DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac,
> 0xdc5c, 0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
> > >   DEFINE_GUID(ff_CODECAPI_AVScenarioInfo,
> 0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
> > > +DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4,
> 0x4c8b, 0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
> > > +DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9,
> 0x4ebf, 0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
> > > +DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8,
> 0x03cd, 0x476b, 0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
> > > +DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa,
> 0x93, 0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
> > > +DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb,
> 0x4ce1, 0xa0, 0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
> > >
> > >   DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408,
> 0xbe, 0xe3, 0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);
> > >   DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9,
> 0xc7, 0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
> > > diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c
> > > index 9225692c51..cad531bd7d 100644
> > > --- a/libavcodec/mfenc.c
> > > +++ b/libavcodec/mfenc.c
> > > @@ -695,6 +695,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
> > >   if (c->opt_enc_quality >= 0)
> > >   ICodecAPI_SetValue(c->codec_api,
> _CODECAPI_AVEncCommonQuality, FF_VAL_VT_UI4(c->opt_enc_quality));
> > >
> > > +if (avctx->rc_max_rate > 0)
> > > +ICodecAPI_SetValue(c->codec_api,
> _CODECAPI_AVEncCommonMaxBitRate, FF_VAL_VT_UI4(avctx->rc_max_rate));
> > > +
> > > +if (avctx->gop_size > 0)
> > > +ICodecAPI_SetValue(c->codec_api,
> _CODECAPI_AVEncMPVGOPSize, FF_VAL_VT_UI4(avctx->gop_size));
> > > +
> > > +if(avctx->rc_buffer_size > 0)
> > > +ICodecAPI_SetValue(c->codec_api,
> _CODECAPI_AVEncCommonBufferSize, FF_VAL_VT_UI4(avctx->rc_buffer_size));
> > > +
> > > +if(avctx->compression_level >= 0)
> > > +ICodecAPI_SetValue(c->codec_api,
> _CODECAPI_AVEncCommonQualityVsSpeed,
> FF_VAL_VT_UI4(avctx->compression_level));
> > > +
> > > +if(avctx->global_quality > 0)
> > > +ICodecAPI_SetValue(c->codec_api,
> _CODECAPI_AVEncVideoEncodeQP, FF_VAL_VT_UI4(avctx->global_quality ));
> > > +
> > >   // Always set the number of b-frames. Qualcomm's HEVC
> encoder on SD835
> > >   // defaults this to 1, and that setting is buggy with many
> of the
> > >   // rate control modes. (0 or 2 b-frames works fine with most
> rate
> > > @@ -1223,7 +1238,7 @@ static int mf_init(AVCodecContext *avctx)
> > >
> > >   #define OFFSET(x) offsetof(MFContext, x)
> > >
> > > -#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, FMTS, CAPS) \
> > > +#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, FMTS, CAPS, DEFAULTS) \
> > >   static const AVClass ff_ ## NAME ## _mf_encoder_class = {
>   \
> > >   .class_name = #NAME "_mf",
>\
> > >   .item_name  = av_default_item_name,
>   \
> > > @@ -1243,6 +1258,7 @@ static int mf_init(AVCodecContext *avctx)
> > >   FMTS
>\
> > >   CAPS
>\
> 

Re: [FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-04-01 Thread Mark Thompson

On 28/03/2024 12:34, Mark Samuelson wrote:

Thank you for the notes, here is a new patch that incorporates your 
suggestions.  You are right, the default value of 12 for gop_size is suprising, 
I didn't know about it before now.

---
  libavcodec/mf_utils.h |  5 +
  libavcodec/mfenc.c| 33 +++--
  2 files changed, 32 insertions(+), 6 deletions(-)


Patch looks good.

I did a bit of testing with the Microsoft H.264 MFT: GOP size and compression 
level work as expected, and VBV parameters seem to be doing something sensible.

Under what conditions are you expecting global_quality -> AVEncVideoEncodeQP to do 
anything, though?  When I set it alone the output was always identical regardless of what 
value I set it to.  (Including with "-rate_control quality".)

Thanks,

- Mark


diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h
index aebfb9ad21..387c005f38 100644
--- a/libavcodec/mf_utils.h
+++ b/libavcodec/mf_utils.h
@@ -97,6 +97,11 @@ DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable,0xee6cad62, 
0xd305, 0x4248, 0xa
  DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353, 0x475a, 
0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
  DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac, 0xdc5c, 
0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
  DEFINE_GUID(ff_CODECAPI_AVScenarioInfo, 
0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4, 0x4c8b, 
0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9, 0x4ebf, 
0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8, 0x03cd, 0x476b, 
0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
+DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa, 0x93, 
0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
+DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb, 0x4ce1, 0xa0, 
0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
  
  DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408, 0xbe, 0xe3, 0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);

  DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9, 0xc7, 
0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c
index 9225692c51..cad531bd7d 100644
--- a/libavcodec/mfenc.c
+++ b/libavcodec/mfenc.c
@@ -695,6 +695,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
  if (c->opt_enc_quality >= 0)
  ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonQuality, 
FF_VAL_VT_UI4(c->opt_enc_quality));
  
+if (avctx->rc_max_rate > 0)

+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonMaxBitRate, 
FF_VAL_VT_UI4(avctx->rc_max_rate));
+
+if (avctx->gop_size > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncMPVGOPSize, 
FF_VAL_VT_UI4(avctx->gop_size));
+
+if(avctx->rc_buffer_size > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonBufferSize, 
FF_VAL_VT_UI4(avctx->rc_buffer_size));
+
+if(avctx->compression_level >= 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonQualityVsSpeed, FF_VAL_VT_UI4(avctx->compression_level));
+
+if(avctx->global_quality > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncVideoEncodeQP, 
FF_VAL_VT_UI4(avctx->global_quality ));
+
  // Always set the number of b-frames. Qualcomm's HEVC encoder on SD835
  // defaults this to 1, and that setting is buggy with many of the
  // rate control modes. (0 or 2 b-frames works fine with most rate
@@ -1223,7 +1238,7 @@ static int mf_init(AVCodecContext *avctx)
  
  #define OFFSET(x) offsetof(MFContext, x)
  
-#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, FMTS, CAPS) \

+#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, FMTS, CAPS, DEFAULTS) \
  static const AVClass ff_ ## NAME ## _mf_encoder_class = { 
 \
  .class_name = #NAME "_mf",
 \
  .item_name  = av_default_item_name,   
 \
@@ -1243,6 +1258,7 @@ static int mf_init(AVCodecContext *avctx)
  FMTS  
 \
  CAPS  
 \
  .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,  
 \
+   .defaults   = DEFAULTS, 
   \
  };
  
  #define AFMTS \

@@ -1252,9 +1268,9 @@ static int mf_init(AVCodecContext *avctx)
  .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID |  
 \
AV_CODEC_CAP_DR1 | AV_CODEC_CAP_VARIABLE_FRAME_SIZE,
  
-MF_ENCODER(AUDIO, aac, AAC, NULL, AFMTS, ACAPS);

-MF_ENCODER(AUDIO, ac3, AC3, NULL, AFMTS, ACAPS);
-MF_ENCODER(AUDIO, mp3, MP3, 

[FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-03-28 Thread Mark Samuelson
Thank you for the notes, here is a new patch that incorporates your 
suggestions.  You are right, the default value of 12 for gop_size is suprising, 
I didn't know about it before now.

---
 libavcodec/mf_utils.h |  5 +
 libavcodec/mfenc.c| 33 +++--
 2 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h
index aebfb9ad21..387c005f38 100644
--- a/libavcodec/mf_utils.h
+++ b/libavcodec/mf_utils.h
@@ -97,6 +97,11 @@ DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable,0xee6cad62, 
0xd305, 0x4248, 0xa
 DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353, 0x475a, 
0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
 DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac, 0xdc5c, 
0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
 DEFINE_GUID(ff_CODECAPI_AVScenarioInfo, 
0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4, 0x4c8b, 
0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9, 0x4ebf, 
0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8, 0x03cd, 0x476b, 
0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
+DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa, 0x93, 
0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
+DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb, 0x4ce1, 0xa0, 
0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
 
 DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408, 0xbe, 0xe3, 
0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);
 DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9, 0xc7, 
0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c
index 9225692c51..cad531bd7d 100644
--- a/libavcodec/mfenc.c
+++ b/libavcodec/mfenc.c
@@ -695,6 +695,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
 if (c->opt_enc_quality >= 0)
 ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonQuality, 
FF_VAL_VT_UI4(c->opt_enc_quality));
 
+if (avctx->rc_max_rate > 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonMaxBitRate, FF_VAL_VT_UI4(avctx->rc_max_rate));
+
+if (avctx->gop_size > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncMPVGOPSize, 
FF_VAL_VT_UI4(avctx->gop_size));
+
+if(avctx->rc_buffer_size > 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonBufferSize, FF_VAL_VT_UI4(avctx->rc_buffer_size));
+
+if(avctx->compression_level >= 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonQualityVsSpeed, 
FF_VAL_VT_UI4(avctx->compression_level));
+
+if(avctx->global_quality > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncVideoEncodeQP, 
FF_VAL_VT_UI4(avctx->global_quality ));
+
 // Always set the number of b-frames. Qualcomm's HEVC encoder on SD835
 // defaults this to 1, and that setting is buggy with many of the
 // rate control modes. (0 or 2 b-frames works fine with most rate
@@ -1223,7 +1238,7 @@ static int mf_init(AVCodecContext *avctx)
 
 #define OFFSET(x) offsetof(MFContext, x)
 
-#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, FMTS, CAPS) \
+#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, FMTS, CAPS, DEFAULTS) \
 static const AVClass ff_ ## NAME ## _mf_encoder_class = {  
\
 .class_name = #NAME "_mf", 
\
 .item_name  = av_default_item_name,
\
@@ -1243,6 +1258,7 @@ static int mf_init(AVCodecContext *avctx)
 FMTS   
\
 CAPS   
\
 .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,   
\
+   .defaults   = DEFAULTS, 
   \
 };
 
 #define AFMTS \
@@ -1252,9 +1268,9 @@ static int mf_init(AVCodecContext *avctx)
 .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID |   
\
   AV_CODEC_CAP_DR1 | AV_CODEC_CAP_VARIABLE_FRAME_SIZE,
 
-MF_ENCODER(AUDIO, aac, AAC, NULL, AFMTS, ACAPS);
-MF_ENCODER(AUDIO, ac3, AC3, NULL, AFMTS, ACAPS);
-MF_ENCODER(AUDIO, mp3, MP3, NULL, AFMTS, ACAPS);
+MF_ENCODER(AUDIO, aac, AAC, NULL, AFMTS, ACAPS, NULL);
+MF_ENCODER(AUDIO, ac3, AC3, NULL, AFMTS, ACAPS, NULL);
+MF_ENCODER(AUDIO, mp3, MP3, NULL, AFMTS, ACAPS, NULL);
 
 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 static const AVOption venc_opts[] = {
@@ -1283,6 +1299,11 @@ static const AVOption venc_opts[] = {
 {NULL}
 };
 
+static const FFCodecDefault defaults[] = {
+{ "g", "0" },
+{ NULL },
+};
+
 #define VFMTS \
 

Re: [FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-03-27 Thread Stefano Sabatini
On date Tuesday 2024-03-26 14:25:37 -0500, Mark Samuelson wrote:
> ---
>  libavcodec/mf_utils.h |  5 +
>  libavcodec/mfenc.c| 19 +++
>  2 files changed, 24 insertions(+)
> 
> diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h
> index aebfb9ad21..387c005f38 100644
> --- a/libavcodec/mf_utils.h
> +++ b/libavcodec/mf_utils.h
> @@ -97,6 +97,11 @@ DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable,
> 0xee6cad62, 0xd305, 0x4248, 0xa
>  DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353, 0x475a, 
> 0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
>  DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac, 0xdc5c, 
> 0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
>  DEFINE_GUID(ff_CODECAPI_AVScenarioInfo, 
> 0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
> +DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4, 0x4c8b, 
> 0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
> +DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9, 0x4ebf, 
> 0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
> +DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8, 0x03cd, 
> 0x476b, 0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
> +DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa, 0x93, 
> 0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
> +DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb, 0x4ce1, 
> 0xa0, 0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
>  
>  DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408, 0xbe, 
> 0xe3, 0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);
>  DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9, 0xc7, 
> 0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
> diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c
> index 9225692c51..36f64a93b8 100644
> --- a/libavcodec/mfenc.c
> +++ b/libavcodec/mfenc.c
> @@ -54,6 +54,8 @@ typedef struct MFContext {
>  int opt_enc_quality;
>  int opt_enc_scenario;
>  int opt_enc_hw;

> +int opt_enc_bufferSize;
> +int opt_enc_encodeQP;

use snake_case

>  } MFContext;
>  
>  static int mf_choose_output_type(AVCodecContext *avctx);
> @@ -695,6 +697,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
>  if (c->opt_enc_quality >= 0)
>  ICodecAPI_SetValue(c->codec_api, 
> _CODECAPI_AVEncCommonQuality, FF_VAL_VT_UI4(c->opt_enc_quality));
>  
> +if (avctx->rc_max_rate > 0)
> +ICodecAPI_SetValue(c->codec_api, 
> _CODECAPI_AVEncCommonMaxBitRate, FF_VAL_VT_UI4(avctx->rc_max_rate));
> +
> +if (avctx->gop_size > 0)
> +ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncMPVGOPSize, 
> FF_VAL_VT_UI4(avctx->gop_size));
> +
> +if(c->opt_enc_bufferSize > 0)
> +ICodecAPI_SetValue(c->codec_api, 
> _CODECAPI_AVEncCommonBufferSize, FF_VAL_VT_UI4(c->opt_enc_bufferSize));
> +
> +if(avctx->compression_level >= 0)
> +ICodecAPI_SetValue(c->codec_api, 
> _CODECAPI_AVEncCommonQualityVsSpeed, 
> FF_VAL_VT_UI4(avctx->compression_level));
> +
> +if(c->opt_enc_encodeQP > 15)
> +ICodecAPI_SetValue(c->codec_api, 
> _CODECAPI_AVEncVideoEncodeQP, FF_VAL_VT_UI4(c->opt_enc_encodeQP));
> +
>  // Always set the number of b-frames. Qualcomm's HEVC encoder on 
> SD835
>  // defaults this to 1, and that setting is buggy with many of the
>  // rate control modes. (0 or 2 b-frames works fine with most rate
> @@ -1280,6 +1297,8 @@ static const AVOption venc_opts[] = {
>  
>  {"quality",   "Quality", OFFSET(opt_enc_quality), AV_OPT_TYPE_INT, 
> {.i64 = -1}, -1, 100, VE},
>  {"hw_encoding",   "Force hardware encoding", OFFSET(opt_enc_hw), 
> AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VE},

> +{"buffer_size", "BufferSize", OFFSET(opt_enc_bufferSize), 
> AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, VE},
> +{"encodeQP", "QualityQP", OFFSET(opt_enc_encodeQP), AV_OPT_TYPE_INT, 
> {.i64 = 15}, 15, 51, VE},

use snake_case and provide meaningful description for the help field
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


Re: [FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-03-26 Thread Mark Thompson

On 26/03/2024 19:25, Mark Samuelson wrote:

---
  libavcodec/mf_utils.h |  5 +
  libavcodec/mfenc.c| 19 +++
  2 files changed, 24 insertions(+)


This seems like a good idea.


diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h
index aebfb9ad21..387c005f38 100644
--- a/libavcodec/mf_utils.h
+++ b/libavcodec/mf_utils.h
@@ -97,6 +97,11 @@ DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable,0xee6cad62, 
0xd305, 0x4248, 0xa
  DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353, 0x475a, 
0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
  DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac, 0xdc5c, 
0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
  DEFINE_GUID(ff_CODECAPI_AVScenarioInfo, 
0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4, 0x4c8b, 
0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9, 0x4ebf, 
0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8, 0x03cd, 0x476b, 
0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
+DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa, 0x93, 
0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
+DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb, 0x4ce1, 0xa0, 
0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
  
  DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408, 0xbe, 0xe3, 0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);

  DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9, 0xc7, 
0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c
index 9225692c51..36f64a93b8 100644
--- a/libavcodec/mfenc.c
+++ b/libavcodec/mfenc.c
@@ -54,6 +54,8 @@ typedef struct MFContext {
  int opt_enc_quality;
  int opt_enc_scenario;
  int opt_enc_hw;
+int opt_enc_bufferSize;
+int opt_enc_encodeQP;
  } MFContext;
  
  static int mf_choose_output_type(AVCodecContext *avctx);

@@ -695,6 +697,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
  if (c->opt_enc_quality >= 0)
  ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonQuality, 
FF_VAL_VT_UI4(c->opt_enc_quality));
  
+if (avctx->rc_max_rate > 0)

+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonMaxBitRate, 
FF_VAL_VT_UI4(avctx->rc_max_rate));
+
+if (avctx->gop_size > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncMPVGOPSize, 
FF_VAL_VT_UI4(avctx->gop_size));


AVCodecContext.gop_size has a surprise default value of 12, which trips this 
up.  Suggest adding an FFCodecDefault section so that your new option works as 
a user might expect.


+
+if(c->opt_enc_bufferSize > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonBufferSize, 
FF_VAL_VT_UI4(c->opt_enc_bufferSize));


For VBV/HRD buffer size use AVCodecContext.rc_buffer_size (but be careful with 
the units!).


+
+if(avctx->compression_level >= 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonQualityVsSpeed, FF_VAL_VT_UI4(avctx->compression_level));
+
+if(c->opt_enc_encodeQP > 15)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncVideoEncodeQP, 
FF_VAL_VT_UI4(c->opt_enc_encodeQP));


Where has 15 come from?  Ideally don't constrain the range unless there is some 
specific reason to do so.

Can you use AVCodecContext.global_quality to avoid adding an ad-hoc option?


+
  // Always set the number of b-frames. Qualcomm's HEVC encoder on SD835
  // defaults this to 1, and that setting is buggy with many of the
  // rate control modes. (0 or 2 b-frames works fine with most rate
@@ -1280,6 +1297,8 @@ static const AVOption venc_opts[] = {
  
  {"quality",   "Quality", OFFSET(opt_enc_quality), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 100, VE},

  {"hw_encoding",   "Force hardware encoding", OFFSET(opt_enc_hw), 
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VE},
+{"buffer_size", "BufferSize", OFFSET(opt_enc_bufferSize), AV_OPT_TYPE_INT, 
{.i64 = 0}, 0, INT_MAX, VE},
+{"encodeQP", "QualityQP", OFFSET(opt_enc_encodeQP), AV_OPT_TYPE_INT, {.i64 
= 15}, 15, 51, VE},
  {NULL}
  };
  


Thanks,

- Mark
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] avcodec/mfenc: expose more properties of the media foundation encoder

2024-03-26 Thread Mark Samuelson
---
 libavcodec/mf_utils.h |  5 +
 libavcodec/mfenc.c| 19 +++
 2 files changed, 24 insertions(+)

diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h
index aebfb9ad21..387c005f38 100644
--- a/libavcodec/mf_utils.h
+++ b/libavcodec/mf_utils.h
@@ -97,6 +97,11 @@ DEFINE_GUID(ff_CODECAPI_AVEncH264CABACEnable,0xee6cad62, 
0xd305, 0x4248, 0xa
 DEFINE_GUID(ff_CODECAPI_AVEncVideoForceKeyFrame, 0x398c1b98, 0x8353, 0x475a, 
0x9e, 0xf2, 0x8f, 0x26, 0x5d, 0x26, 0x3, 0x45);
 DEFINE_GUID(ff_CODECAPI_AVEncMPVDefaultBPictureCount, 0x8d390aac, 0xdc5c, 
0x4200, 0xb5, 0x7f, 0x81, 0x4d, 0x04, 0xba, 0xba, 0xb2);
 DEFINE_GUID(ff_CODECAPI_AVScenarioInfo, 
0xb28a6e64,0x3ff9,0x446a,0x8a,0x4b,0x0d,0x7a,0x53,0x41,0x32,0x36);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonBufferSize, 0x0db96574, 0xb6a4, 0x4c8b, 
0x81, 0x06, 0x37, 0x73, 0xde, 0x03, 0x10, 0xcd);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonMaxBitRate, 0x9651eae4, 0x39b9, 0x4ebf, 
0x85, 0xef, 0xd7, 0xf4, 0x44, 0xec, 0x74, 0x65);
+DEFINE_GUID(ff_CODECAPI_AVEncCommonQualityVsSpeed, 0x98332df8, 0x03cd, 0x476b, 
0x89, 0xfa, 0x3f, 0x9e, 0x44, 0x2d, 0xec, 0x9f);
+DEFINE_GUID(ff_CODECAPI_AVEncMPVGOPSize, 0x95f31b26, 0x95a4, 0x41aa, 0x93, 
0x03, 0x24, 0x6a, 0x7f, 0xc6, 0xee, 0xf1);
+DEFINE_GUID(ff_CODECAPI_AVEncVideoEncodeQP, 0x2cb5696b, 0x23fb, 0x4ce1, 0xa0, 
0xf9, 0xef, 0x5b, 0x90, 0xfd, 0x55, 0xca);
 
 DEFINE_GUID(ff_MF_SA_D3D11_BINDFLAGS, 0xeacf97ad, 0x065c, 0x4408, 0xbe, 0xe3, 
0xfd, 0xcb, 0xfd, 0x12, 0x8b, 0xe2);
 DEFINE_GUID(ff_MF_SA_D3D11_USAGE, 0xe85fe442, 0x2ca3, 0x486e, 0xa9, 0xc7, 
0x10, 0x9d, 0xda, 0x60, 0x98, 0x80);
diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c
index 9225692c51..36f64a93b8 100644
--- a/libavcodec/mfenc.c
+++ b/libavcodec/mfenc.c
@@ -54,6 +54,8 @@ typedef struct MFContext {
 int opt_enc_quality;
 int opt_enc_scenario;
 int opt_enc_hw;
+int opt_enc_bufferSize;
+int opt_enc_encodeQP;
 } MFContext;
 
 static int mf_choose_output_type(AVCodecContext *avctx);
@@ -695,6 +697,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
 if (c->opt_enc_quality >= 0)
 ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncCommonQuality, 
FF_VAL_VT_UI4(c->opt_enc_quality));
 
+if (avctx->rc_max_rate > 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonMaxBitRate, FF_VAL_VT_UI4(avctx->rc_max_rate));
+
+if (avctx->gop_size > 0)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncMPVGOPSize, 
FF_VAL_VT_UI4(avctx->gop_size));
+
+if(c->opt_enc_bufferSize > 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonBufferSize, FF_VAL_VT_UI4(c->opt_enc_bufferSize));
+
+if(avctx->compression_level >= 0)
+ICodecAPI_SetValue(c->codec_api, 
_CODECAPI_AVEncCommonQualityVsSpeed, 
FF_VAL_VT_UI4(avctx->compression_level));
+
+if(c->opt_enc_encodeQP > 15)
+ICodecAPI_SetValue(c->codec_api, _CODECAPI_AVEncVideoEncodeQP, 
FF_VAL_VT_UI4(c->opt_enc_encodeQP));
+
 // Always set the number of b-frames. Qualcomm's HEVC encoder on SD835
 // defaults this to 1, and that setting is buggy with many of the
 // rate control modes. (0 or 2 b-frames works fine with most rate
@@ -1280,6 +1297,8 @@ static const AVOption venc_opts[] = {
 
 {"quality",   "Quality", OFFSET(opt_enc_quality), AV_OPT_TYPE_INT, 
{.i64 = -1}, -1, 100, VE},
 {"hw_encoding",   "Force hardware encoding", OFFSET(opt_enc_hw), 
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, VE},
+{"buffer_size", "BufferSize", OFFSET(opt_enc_bufferSize), AV_OPT_TYPE_INT, 
{.i64 = 0}, 0, INT_MAX, VE},
+{"encodeQP", "QualityQP", OFFSET(opt_enc_encodeQP), AV_OPT_TYPE_INT, {.i64 
= 15}, 15, 51, VE},
 {NULL}
 };
 
-- 
2.43.0.windows.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".