[FFmpeg-devel] [PATCH] lavfi: new colorspace conversion filter.
Clément Bœsch
u at pkh.me
Wed Apr 6 18:14:26 CEST 2016
On Wed, Apr 06, 2016 at 11:44:22AM -0400, Ronald S. Bultje wrote:
[...]
> > Note: a cleaner way to do this (IMO) is to do put the settings into the
> > template file, and do something like:
> >
> > #define TEMPLATE_444
> > #include "colorspacedsp_template.c"
> > #undef TEMPLATE_444
> >
> > #define TEMPLATE_422
> > #include "colorspacedsp_template.c"
> > #undef TEMPLATE_422
> >
> > #define TEMPLATE_420
> > #include "colorspacedsp_template.c"
> > #undef TEMPLATE_420
> >
> > it's simpler for the caller, and in the template you see the exact
> > settings in use for each "profile".
> >
> > See libswresample/rematrix{,_template}.c for a complete example.
> >
>
> Hm, I based this off of how lavc/bit_depth_template.c is typically used. I
> guess there's various way to do it. How much do you want me to change it?
>
The question is: if you ignore the changing effort and the consistency,
which version do you actually prefer? It's your filter so it's up to you.
I just believe this is much more readable that way, but it's an opinion :)
> [...]
> > > +typedef void (*yuv2rgb_fn)(int16_t *rgb[3], ptrdiff_t rgb_stride,
> > > + uint8_t *yuv[3], ptrdiff_t yuv_stride[3],
> > > + int w, int h, const int16_t
> > yuv2rgb_coeffs[3][3][8],
> > > + const int16_t yuv_offset[8]);
> > > +typedef void (*rgb2yuv_fn)(uint8_t *yuv[3], ptrdiff_t yuv_stride[3],
> > > + int16_t *rgb[3], ptrdiff_t rgb_stride,
> > > + int w, int h, const int16_t
> > rgb2yuv_coeffs[3][3][8],
> > > + const int16_t yuv_offset[8]);
> > > +typedef void (*yuv2yuv_fn)(uint8_t *yuv_out[3], ptrdiff_t
> > yuv_out_stride[3],
> > > + uint8_t *yuv_in[3], ptrdiff_t
> > yuv_in_stride[3],
> > > + int w, int h, const int16_t
> > yuv2yuv_coeffs[3][3][8],
> > > + const int16_t yuv_offset[2][8]);
> >
> > I suppose you didn't make use of const for the input because of the
> > pain of the multiple dimensions?
> >
>
> Right.
>
> uint8_t * const in[N] doesn't do the trick?
> >
>
> Well, it's incomplete const, right? I want to indicate that both the plane
> pointers as well as the data in the plane pointers should be considered
> immutable for the dsp function, but as you pointed out, that's not easy
> with C multi-dimensional arrays... I can add half-baked const if you like...
>
It's fine, I just like to hint about the constness. Knowning that it's not
trashing or permuting the input is kinda helpful in these cases.
[...]
> > > + yuv0 += (yuv_stride[0] * (1 << SS_H)) / sizeof(pixel);
> > > + yuv1 += yuv_stride[1] / sizeof(pixel);
> > > + yuv2 += yuv_stride[2] / sizeof(pixel);
> > > + rgb0 += rgb_stride * (1 << SS_H);
> > > + rgb1 += rgb_stride * (1 << SS_H);
> > > + rgb2 += rgb_stride * (1 << SS_H);
> >
> > i know we will have some asm for this, but compiler will probably like to
> > have these increment variables in some const before the loop instead of
> > computing them every time.
> >
> > I don't think we will have ASM for all the architectures soon so having a
> > fast C is still relevant for such important code.
> >
>
> But this is used in various lavc templating schemes also, right? These all
> revert back to single instructions, since assembly operates on pointer
> values as bytes, not types, so int16_t *something; something += stride / 2;
> actually becomes "add something, stride" in assembly... Which part do you
> feel will be calculated at runtime inside the loop?
>
If they are able to do that then that's fine. They weren't so smart in the
past.
[...]
> I've uploaded a new version addressing these concerns, adding some
> refactoring and adding SIMD for x86 (SSE2, 64bit only) on github:
> https://github.com/rbultje/ffmpeg/commits/colorspace
> Would you like me to squash everything in a single big patch and re-send?
> Or something else?
I'd say 2 patches if possible; one for the filter, one adding the SIMD. If
too complex, just one is OK.
>
> Ronald
--
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160406/c0ebc809/attachment.sig>
More information about the ffmpeg-devel
mailing list