On Tue, 02 Feb 2016 16:14:09 +0100
Anton Khirnov <[email protected]> wrote:

> Quoting wm4 (2016-02-02 13:35:46)
> > On Tue,  2 Feb 2016 12:41:28 +0100
> > Anton Khirnov <[email protected]> wrote:
> >   
> > > ---
> > >  libavfilter/avfilter.c  | 15 +++++++++++++++
> > >  libavfilter/avfilter.h  |  7 +++++++
> > >  libavfilter/buffersrc.c |  9 +++++++++
> > >  3 files changed, 31 insertions(+)
> > > 
> > > diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> > > index cd98d16..8eefc51 100644
> > > --- a/libavfilter/avfilter.c
> > > +++ b/libavfilter/avfilter.c
> > > @@ -20,8 +20,10 @@
> > >   */
> > >  
> > >  #include "libavutil/avstring.h"
> > > +#include "libavutil/buffer.h"
> > >  #include "libavutil/channel_layout.h"
> > >  #include "libavutil/common.h"
> > > +#include "libavutil/hwcontext.h"
> > >  #include "libavutil/imgutils.h"
> > >  #include "libavutil/internal.h"
> > >  #include "libavutil/opt.h"
> > > @@ -217,6 +219,17 @@ int avfilter_config_links(AVFilterContext *filter)
> > >                      return ret;
> > >                  }
> > >  
> > > +            if (link->src->nb_inputs && 
> > > link->src->inputs[0]->hw_frames_ctx &&
> > > +                !link->hw_frames_ctx) {
> > > +                AVHWFramesContext *input_ctx = 
> > > (AVHWFramesContext*)link->src->inputs[0]->hw_frames_ctx->data;
> > > +
> > > +                if (input_ctx->format == link->format) {
> > > +                    link->hw_frames_ctx = 
> > > av_buffer_ref(link->src->inputs[0]->hw_frames_ctx);
> > > +                    if (!link->hw_frames_ctx)
> > > +                        return AVERROR(ENOMEM);
> > > +                }
> > > +            }
> > > +
> > >              link->init_state = AVLINK_INIT;
> > >          }
> > >      }
> > > @@ -481,6 +494,8 @@ static void free_link(AVFilterLink *link)
> > >      if (link->dst)
> > >          link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
> > >  
> > > +    av_buffer_unref(&link->hw_frames_ctx);
> > > +
> > >      ff_formats_unref(&link->in_formats);
> > >      ff_formats_unref(&link->out_formats);
> > >      ff_formats_unref(&link->in_samplerates);
> > > diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> > > index 1890858..0a0c415 100644
> > > --- a/libavfilter/avfilter.h
> > > +++ b/libavfilter/avfilter.h
> > > @@ -35,6 +35,7 @@
> > >  
> > >  #include "libavutil/attributes.h"
> > >  #include "libavutil/avutil.h"
> > > +#include "libavutil/buffer.h"
> > >  #include "libavutil/frame.h"
> > >  #include "libavutil/log.h"
> > >  #include "libavutil/samplefmt.h"
> > > @@ -387,6 +388,12 @@ struct AVFilterLink {
> > >       * Sinks can use it to set a default output frame rate.
> > >       */
> > >      AVRational frame_rate;
> > > +
> > > +    /**
> > > +     * For hwaccel pixel formats, this should be a reference to the
> > > +     * AVHWFramesContext describing the frames.
> > > +     */
> > > +    AVBufferRef *hw_frames_ctx;
> > >  };
> > >  
> > >  /**
> > > diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
> > > index f5b852f..41ac9fd 100644
> > > --- a/libavfilter/buffersrc.c
> > > +++ b/libavfilter/buffersrc.c
> > > @@ -52,6 +52,8 @@ typedef struct BufferSourceContext {
> > >      char               *pix_fmt_str;
> > >      AVRational        pixel_aspect;
> > >  
> > > +    AVBufferRef **hw_frames_ctx;
> > > +
> > >      /* audio only */
> > >      int sample_rate;
> > >      enum AVSampleFormat sample_fmt;
> > > @@ -193,6 +195,7 @@ static const AVOption video_options[] = {
> > >      { "sar",           "sample aspect ratio",    OFFSET(pixel_aspect),   
> > >   AV_OPT_TYPE_RATIONAL, { .dbl = 1 }, 0, DBL_MAX, V },
> > >      { "time_base",     NULL,                     OFFSET(time_base),      
> > >   AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
> > >      { "frame_rate",    NULL,                     OFFSET(frame_rate),     
> > >   AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
> > > +    { "hw_frames_ctx", NULL,                     OFFSET(hw_frames_ctx),  
> > >   AV_OPT_TYPE_BINARY, .flags = V },  
> > 
> > Really. Why can't the user set it directly?  
> 
> Directly how/where?
> 

Maybe a setter. Unless AVOption is this setter in your opinion, but
it's still not a nice API. Where is this option even documented?
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to