[FFmpeg-devel] [RFC][PATCH] Add support for 12-bit color mode.
Janusz Krzysztofik
jkrzyszt
Sat Feb 27 12:41:32 CET 2010
Saturday 27 February 2010 05:23:38 compn wrote:
> On Sat, 27 Feb 2010 03:31:35 +0100, Janusz Krzysztofik wrote:
> >@@ -1462,37 +1494,54 @@ static int rgbToRgbWrapper(SwsContext *c
> > if ( (isBGRinInt(srcFormat) && isBGRinInt(dstFormat))
> >
> > || (isRGBinInt(srcFormat) && isRGBinInt(dstFormat))) {
> >
> > switch(srcId | (dstId<<4)) {
> >- case 0x34: conv= rgb16to15; break;
> >- case 0x36: conv= rgb24to15; break;
> >- case 0x38: conv= rgb32to15; break;
> >- case 0x43: conv= rgb15to16; break;
> >- case 0x46: conv= rgb24to16; break;
> >- case 0x48: conv= rgb32to16; break;
> >- case 0x63: conv= rgb15to24; break;
> >- case 0x64: conv= rgb16to24; break;
> >- case 0x68: conv= rgb32to24; break;
> >- case 0x83: conv= rgb15to32; break;
> >- case 0x84: conv= rgb16to32; break;
> >- case 0x86: conv= rgb24to32; break;
> >+ case 0x56: conv= rgb15to12; break;
> >+ case 0x57: conv= rgb16to12; break;
> >+ case 0x5B: conv= rgb24to12; break;
> >+ case 0x5F: conv= rgb32to12; break;
> >+ case 0x65: conv= rgb12to15; break;
> >+ case 0x67: conv= rgb16to15; break;
> >+ case 0x6B: conv= rgb24to15; break;
> >+ case 0x6F: conv= rgb32to15; break;
> >+ case 0x75: conv= rgb12to16; break;
> >+ case 0x76: conv= rgb15to16; break;
> >+ case 0x7B: conv= rgb24to16; break;
> >+ case 0x7F: conv= rgb32to16; break;
> >+ case 0xB5: conv= rgb12to24; break;
> >+ case 0xB6: conv= rgb15to24; break;
> >+ case 0xB7: conv= rgb16to24; break;
> >+ case 0xBF: conv= rgb32to24; break;
> >+ case 0xF5: conv= rgb12to32; break;
> >+ case 0xF6: conv= rgb15to32; break;
> >+ case 0xF7: conv= rgb16to32; break;
> >+ case 0xFB: conv= rgb24to32; break;
> > }
> > } else if ( (isBGRinInt(srcFormat) && isRGBinInt(dstFormat))
> >
> > || (isRGBinInt(srcFormat) && isBGRinInt(dstFormat))) {
> >
> > switch(srcId | (dstId<<4)) {
> >- case 0x33: conv= rgb15tobgr15; break;
> >- case 0x34: conv= rgb16tobgr15; break;
> >- case 0x36: conv= rgb24tobgr15; break;
> >- case 0x38: conv= rgb32tobgr15; break;
> >- case 0x43: conv= rgb15tobgr16; break;
> >- case 0x44: conv= rgb16tobgr16; break;
> >- case 0x46: conv= rgb24tobgr16; break;
> >- case 0x48: conv= rgb32tobgr16; break;
> >- case 0x63: conv= rgb15tobgr24; break;
> >- case 0x64: conv= rgb16tobgr24; break;
> >- case 0x66: conv= rgb24tobgr24; break;
> >- case 0x68: conv= rgb32tobgr24; break;
> >- case 0x83: conv= rgb15tobgr32; break;
> >- case 0x84: conv= rgb16tobgr32; break;
> >- case 0x86: conv= rgb24tobgr32; break;
> >+ case 0x55: conv= rgb12tobgr12; break;
> >+ case 0x56: conv= rgb15tobgr12; break;
> >+ case 0x57: conv= rgb16tobgr12; break;
> >+ case 0x5B: conv= rgb24tobgr12; break;
> >+ case 0x5F: conv= rgb32tobgr12; break;
> >+ case 0x65: conv= rgb12tobgr15; break;
> >+ case 0x66: conv= rgb15tobgr15; break;
> >+ case 0x67: conv= rgb16tobgr15; break;
> >+ case 0x6B: conv= rgb24tobgr15; break;
> >+ case 0x6F: conv= rgb32tobgr15; break;
> >+ case 0x75: conv= rgb12tobgr16; break;
> >+ case 0x76: conv= rgb15tobgr16; break;
> >+ case 0x77: conv= rgb16tobgr16; break;
> >+ case 0x7B: conv= rgb24tobgr16; break;
> >+ case 0x7F: conv= rgb32tobgr16; break;
> >+ case 0xB5: conv= rgb12tobgr24; break;
> >+ case 0xB6: conv= rgb15tobgr24; break;
> >+ case 0xB7: conv= rgb16tobgr24; break;
> >+ case 0xBB: conv= rgb24tobgr24; break;
> >+ case 0xBF: conv= rgb32tobgr24; break;
> >+ case 0xF5: conv= rgb12tobgr32; break;
> >+ case 0xF6: conv= rgb15tobgr32; break;
> >+ case 0xF7: conv= rgb16tobgr32; break;
> >+ case 0xFB: conv= rgb24tobgr32; break;
>
> why the change in case numbers?
Hi,
This is because several lines above the srcId and dstId values computation
algorithm has been changed from:
- ? ?const int srcId= fmt_depth(srcFormat) >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */
- ? ?const int dstId= fmt_depth(dstFormat) >> 2;
to:
+ /* 1:0, 4:1, 8:3, 12:5, 15:6, 16:7, 24:B, 32:F */
+ const int srcId= ((((fmt_depth(srcFormat)&0x1C)>>1)|(fmt_depth(srcFormat)&0x01))-1)&0x0F;
+ const int dstId= ((((fmt_depth(dstFormat)&0x1C)>>1)|(fmt_depth(dstFormat)&0x01))-1)&0x0F;
in order to accomodate a new mode. This way or another, there was no room
for a new 12:x between 8:2 and 15:3.
> > #if COMPILE_TEMPLATE_MMX
> >- c->blueDither= ff_dither8[dstY&1];
> >- if (c->dstFormat == PIX_FMT_RGB555 || c->dstFormat == PIX_FMT_BGR555)
> >- c->greenDither= ff_dither8[dstY&1];
> >- else
> >- c->greenDither= ff_dither4[dstY&1];
> >- c->redDither= ff_dither8[(dstY+1)&1];
> >+ if (c->dstFormat == PIX_FMT_RGB444 || c->dstFormat == PIX_FMT_BGR444) {
> >+ c->blueDither= ff_dither16[dstY&1];
> >+ c->greenDither= ff_dither16[dstY&1];
> >+ c->redDither= ff_dither16[(dstY+1)&1];
> >+ } else {
> >+ c->blueDither= ff_dither8[dstY&1];
> >+ if (c->dstFormat == PIX_FMT_RGB555 || c->dstFormat == PIX_FMT_BGR555)
> >+ c->greenDither= ff_dither8[dstY&1];
> >+ else
> >+ c->greenDither= ff_dither4[dstY&1];
> >+ c->redDither= ff_dither8[(dstY+1)&1];
> >+ }
>
> should the (more common) rgb/bgr555 be before the (rare) rgb/bgr444 or
> is this not speed critical?
Critical or not, it makes sense to negate the condition and revert the
order :).
Thanks,
Janusz
> -compn
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list