On Wed, 6 Sep 2017 20:18:19 +0100
Mark Thompson <s...@jkqxz.net> wrote:

> On 06/09/17 19:14, wm4 wrote:
> > On Wed, 6 Sep 2017 18:55:46 +0100
> > Mark Thompson <s...@jkqxz.net> wrote:
> >   
> >> On 06/09/17 17:29, wm4 wrote:  
> >>> On Wed, 6 Sep 2017 16:53:04 +0100
> >>> Mark Thompson <s...@jkqxz.net> wrote:
> >>>     
> >>>> On 06/09/17 15:37, wm4 wrote:    
> >>>>> On Tue,  5 Sep 2017 23:59:31 +0100
> >>>>> Mark Thompson <s...@jkqxz.net> wrote:
> >>>>>       
> >>>>>> ---
> >>>>>>  doc/APIchanges       |  3 +++
> >>>>>>  libavcodec/avcodec.h | 23 +++++++++++++++++++++++
> >>>>>>  2 files changed, 26 insertions(+)
> >>>>>>
> >>>>>> diff --git a/doc/APIchanges b/doc/APIchanges
> >>>>>> index 6f70f3c96..f21dc4db0 100644
> >>>>>> --- a/doc/APIchanges
> >>>>>> +++ b/doc/APIchanges
> >>>>>> @@ -14,6 +14,9 @@ libavutil:     2017-03-23
> >>>>>>  API changes, most recent first:
> >>>>>>  
> >>>>>>  2017-xx-xx - xxxxxxx - lavc 58.x+1.0 - avcodec.h
> >>>>>> +  Add AVCodecHWConfig and AVCodec.hw_configs.
> >>>>>> +
> >>>>>> +2017-xx-xx - xxxxxxx - lavc 58.x+1.0 - avcodec.h
> >>>>>>    Add AV_HWACCEL_FLAG_REUSE_CONTEXT.
> >>>>>>  
> >>>>>>  2017-xx-xx - xxxxxxx - lavfi 7.x+1.0 - avfilter.h
> >>>>>> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> >>>>>> index 89e432d16..4f6b76203 100644
> >>>>>> --- a/libavcodec/avcodec.h
> >>>>>> +++ b/libavcodec/avcodec.h
> >>>>>> @@ -35,6 +35,7 @@
> >>>>>>  #include "libavutil/cpu.h"
> >>>>>>  #include "libavutil/dict.h"
> >>>>>>  #include "libavutil/frame.h"
> >>>>>> +#include "libavutil/hwcontext.h"
> >>>>>>  #include "libavutil/log.h"
> >>>>>>  #include "libavutil/pixfmt.h"
> >>>>>>  #include "libavutil/rational.h"
> >>>>>> @@ -2773,6 +2774,19 @@ typedef struct AVProfile {
> >>>>>>      const char *name; ///< short name for the profile
> >>>>>>  } AVProfile;
> >>>>>>  
> >>>>>> +typedef struct AVCodecHWConfig {
> >>>>>> +    /**
> >>>>>> +     * A device type which can be supplied to the codec.
> >>>>>> +     */
> >>>>>> +    enum AVHWDeviceType device_type;
> >>>>>> +    /**
> >>>>>> +     * The matching hardware pixel format which the codec can produce.
> >>>>>> +     *
> >>>>>> +     * Set to AV_PIX_FMT_NONE if no hardware pixel format is 
> >>>>>> available.
> >>>>>> +     */
> >>>>>> +    enum AVPixelFormat pix_fmt;
> >>>>>> +} AVCodecHWConfig;
> >>>>>> +
> >>>>>>  typedef struct AVCodecDefault AVCodecDefault;
> >>>>>>  
> >>>>>>  struct AVSubtitle;
> >>>>>> @@ -2808,6 +2822,15 @@ typedef struct AVCodec {
> >>>>>>      const AVClass *priv_class;              ///< AVClass for the 
> >>>>>> private context
> >>>>>>      const AVProfile *profiles;              ///< array of recognized 
> >>>>>> profiles, or NULL if unknown, array is terminated by 
> >>>>>> {FF_PROFILE_UNKNOWN}
> >>>>>>  
> >>>>>> +    /**
> >>>>>> +     * Array of hardware configurations supported by the codec, or 
> >>>>>> NULL
> >>>>>> +     * if no hardware supported.
> >>>>>> +     *
> >>>>>> +     * The array is terminated by a configuration with a device_type 
> >>>>>> of
> >>>>>> +     * AV_HW_DEVICE_TYPE_NONE.
> >>>>>> +     */
> >>>>>> +    const AVCodecHWConfig *hw_configs;
> >>>>>> +
> >>>>>>      /*****************************************************************
> >>>>>>       * No fields below this line are part of the public API. They
> >>>>>>       * may not be used outside of libavcodec and can be changed and   
> >>>>>>    
> >>>>>
> >>>>> What if a decoder provides hardware decoding, but has no associated
> >>>>> AVHWDeviceType? (Such as mmal.)      
> >>>>
> >>>> They are in the pix_fmts list.  What other information do you want?    
> >>>
> >>> They don't necessarily output a hw format. For example, crystalhd
> >>> (ffmpeg only) doesn't. It would also not be very uniform.    
> >>
> >> If it doesn't require any additional setup and it outputs software frames 
> >> then it's indistinguishable from a normal software decoder; therefore, 
> >> treat it as such.
> >>
> >> MMAL is harder - I'm only treating the real hwaccels here because they now 
> >> have a consistent form we can make use of.
> >>
> >> I haven't really thought about this properly, but how about something like:
> >>
> >> enum AVCodecHWConfigMethod {
> >>   AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE = 1,
> >>   AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES = 2,
> >>   AV_CODEC_HW_CONFIG_METHOD_LEGACY_SHIT = 4,
> >>   AV_CODEC_HW_CONFIG_METHOD_MAGIC = 8,
> >> };
> >>
> >> struct AVCodecHWConfig {
> >>   int methods;
> >>   enum AVHWDeviceType device_type;
> >>   enum AVPixelFormat pix_fmt;
> >> };
> >>
> >> Then you would label MMAL as MAGIC, because it can just output the MMAL 
> >> frames without additional setup.  VAAPI/VDPAU would be HW_DEVICE | 
> >> HW_FRAMES | LEGACY_SHIT.  QSV would be HW_FRAMES | LEGACY_SHIT.  
> > 
> > That sounds OK too. Maybe we should include the information whether it's
> > a hwaccel, i.e. something that has an actual software decoder under the
> > hood, and that dynamic fallback/resuming HW decoding is supported?  
> 
> I was thinking that was implied by not-MAGIC, but it isn't.  Yeah, that flag 
> would help.  Does it actually need to be externally-visible, though?

I think being explicit about it would potentially be less confusing to
API users.

> > What is LEGACY_SHIT exactly?  
> 
> "This has some arcane rules that can't be expressed here, go read the code" - 
> the old hwaccels where you have to put structure X in hwaccel_context and 
> call special function Y before you do anything.

Sounds fine.

> >> Is there then sufficient information for ff_get_format() to look at this 
> >> list to decide on whether it needs an AVHWAccel, and therefore eliminate 
> >> dummy hwaccels?  
> > 
> > I suspect it is. I wonder why this check is even being done at all.  
> 
> With the needs_hwaccel flag then yes.

I mean, for normal hwaccel, it uses that to find the AVHWAccel.
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to