[FFmpeg-devel] [PATCH 2/5] pp: add pp_get_context2().

Michael Niedermayer michaelni at gmx.at
Sun Nov 18 00:24:45 CET 2012


On Sat, Nov 17, 2012 at 07:59:50PM +0100, Clément Bœsch wrote:
> On Sat, Nov 17, 2012 at 07:33:21PM +0100, Michael Niedermayer wrote:
> > On Sat, Nov 17, 2012 at 01:07:10PM +0100, Clément Bœsch wrote:
> > > ---
> > >  libpostproc/postprocess.c | 42 +++++++++++++++++++++++++++++++++++++-----
> > >  libpostproc/postprocess.h |  3 ++-
> > >  libpostproc/version.h     |  2 +-
> > >  3 files changed, 40 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/libpostproc/postprocess.c b/libpostproc/postprocess.c
> > > index b4ae866..21238fd 100644
> > > --- a/libpostproc/postprocess.c
> > > +++ b/libpostproc/postprocess.c
> > > @@ -88,6 +88,7 @@ try to unroll inner for(x=0 ... loop to avoid these damn if(x ... checks
> > >  #include "postprocess.h"
> > >  #include "postprocess_internal.h"
> > >  #include "libavutil/avstring.h"
> > > +#include "libavutil/pixdesc.h"
> > >  
> > >  unsigned postproc_version(void)
> > >  {
> > > @@ -586,11 +587,11 @@ static inline void postProcess(const uint8_t src[], int srcStride, uint8_t dst[]
> > >  #if CONFIG_RUNTIME_CPUDETECT
> > >  #if ARCH_X86 && HAVE_INLINE_ASM
> > >          // ordered per speed fastest first
> > > -        if      (c->cpuCaps & PP_CPU_CAPS_MMX2)     pp = postProcess_MMX2;
> > > -        else if (c->cpuCaps & PP_CPU_CAPS_3DNOW)    pp = postProcess_3DNow;
> > > -        else if (c->cpuCaps & PP_CPU_CAPS_MMX)      pp = postProcess_MMX;
> > > +        if      (c->cpuCaps & AV_CPU_FLAG_MMXEXT)   pp = postProcess_MMX2;
> > > +        else if (c->cpuCaps & AV_CPU_FLAG_3DNOW)    pp = postProcess_3DNow;
> > > +        else if (c->cpuCaps & AV_CPU_FLAG_MMX)      pp = postProcess_MMX;
> > >  #elif HAVE_ALTIVEC
> > > -        if      (c->cpuCaps & PP_CPU_CAPS_ALTIVEC)  pp = postProcess_altivec;
> > > +        if      (c->cpuCaps & AV_CPU_FLAG_ALTIVEC)  pp = postProcess_altivec;
> > >  #endif
> > >  #else /* CONFIG_RUNTIME_CPUDETECT */
> > >  #if   HAVE_MMXEXT_INLINE
> > > @@ -896,7 +897,6 @@ pp_context *pp_get_context(int width, int height, int cpuCaps){
> > >  
> > >      memset(c, 0, sizeof(PPContext));
> > >      c->av_class = &av_codec_context_class;
> > > -    c->cpuCaps= cpuCaps;
> > >      if(cpuCaps&PP_FORMAT){
> > >          c->hChromaSubSample= cpuCaps&0x3;
> > >          c->vChromaSubSample= (cpuCaps>>4)&0x3;
> > > @@ -904,6 +904,11 @@ pp_context *pp_get_context(int width, int height, int cpuCaps){
> > >          c->hChromaSubSample= 1;
> > >          c->vChromaSubSample= 1;
> > >      }
> > > +    c->cpuCaps = 0;
> > > +    if (cpuCaps & PP_CPU_CAPS_MMX)      c->cpuCaps |= AV_CPU_FLAG_MMX;
> > > +    if (cpuCaps & PP_CPU_CAPS_MMX2)     c->cpuCaps |= AV_CPU_FLAG_MMXEXT;
> > > +    if (cpuCaps & PP_CPU_CAPS_3DNOW)    c->cpuCaps |= AV_CPU_FLAG_3DNOW;
> > > +    if (cpuCaps & PP_CPU_CAPS_ALTIVEC)  c->cpuCaps |= AV_CPU_FLAG_ALTIVEC;
> > >  
> > >      reallocBuffers(c, width, height, stride, qpStride);
> > >  
> > > @@ -912,6 +917,33 @@ pp_context *pp_get_context(int width, int height, int cpuCaps){
> > >      return c;
> > >  }
> > >  
> > > +pp_context *pp_get_context2(int width, int height, int pixfmt)
> > > +{
> > > +    PPContext *c;
> > > +    int stride   = FFALIGN(width, 16);  //assumed / will realloc if needed
> > > +    int qpStride = (width+15)/16 + 2;   //assumed / will realloc if needed
> > > +    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(pixfmt);
> > > +
> > > +    if (!pix_desc) {
> > > +        av_log(NULL, AV_LOG_ERROR, "Unknown pixel format %d\n", pixfmt);
> > > +        return NULL;
> > > +    }
> > > +
> > > +    c = av_mallocz(sizeof(*c));
> > > +    if (!c)
> > > +        return NULL;
> > > +
> > > +    c->cpuCaps  = av_get_cpu_flags();
> > > +    c->av_class = &av_codec_context_class;
> > > +    c->hChromaSubSample = pix_desc->log2_chroma_w;
> > > +    c->vChromaSubSample = pix_desc->log2_chroma_h;
> > > +
> > > +    reallocBuffers(c, width, height, stride, qpStride);
> > > +
> > > +    c->frameNum = -1;
> > > +    return c;
> > > +}
> > > +
> > >  void pp_free_context(void *vc){
> > >      PPContext *c = (PPContext*)vc;
> > >      int i;
> > > diff --git a/libpostproc/postprocess.h b/libpostproc/postprocess.h
> > > index 623b3b5..af6d55a 100644
> > > --- a/libpostproc/postprocess.h
> > > +++ b/libpostproc/postprocess.h
> > > @@ -77,7 +77,8 @@ void  pp_postprocess(const uint8_t * src[3], const int srcStride[3],
> > >  pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality);
> > >  void pp_free_mode(pp_mode *mode);
> > >  
> > > -pp_context *pp_get_context(int width, int height, int flags);
> > > +attribute_deprecated pp_context *pp_get_context(int width, int height, int flags);
> > > +pp_context *pp_get_context2(int width, int height, int pixfmt);
> > >  void pp_free_context(pp_context *ppContext);
> > 
> > Is this neccessary ?
> > wouldnt simply adding a PP_CPU_CAPS_AUTO achive nearly the same ?
> > 
> 
> Sure, but I thought it would be better to get rid at some point of the
> duplicated flags and pixel formats; that's the main reason of that patch,
> we can remove all the PP macro and allow a better integration with FFmpeg.
> 
> This will also allow a native vf pp to not bother anymore about a pixel
> formats mapping.
> 
> New attached patch clarifies how it would look at next major bump.
[...]

> --- a/libpostproc/postprocess.h
> +++ b/libpostproc/postprocess.h
> @@ -77,9 +77,11 @@ void  pp_postprocess(const uint8_t * src[3], const int srcStride[3],
>  pp_mode *pp_get_mode_by_name_and_quality(const char *name, int quality);
>  void pp_free_mode(pp_mode *mode);
>  
> -pp_context *pp_get_context(int width, int height, int flags);
> +pp_context *pp_get_context2(int width, int height, int pixfmt);

before this there are general purpose flags allowing future extension
after this they are not there anymore.
I dont know if we will ever need such flags but it doesnt seem
a good idea to me to drop them

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I have often repented speaking, but never of holding my tongue.
-- Xenocrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121118/df0148b4/attachment.asc>


More information about the ffmpeg-devel mailing list