linux/drivers/video/c2p_planar.c
<<
o/spaion ospai class="lxr_search"> Search o/spaion < oinput typue=hidden" namue=ajax_lookup" ide=ajax_lookup" value="> < n odiv ide=file_contents"o
< <1o/a>ospai class="comment">/*o/spaion< <2o/a>ospai class="comment"> *  Fast C2P (Chunky-to-Planar) Conversptio/spaion< <3o/a>ospai class="comment"> *o/spaion< <4o/a>ospai class="comment"> *  Copyright (C) 2003-2008 Geert Uytterhoeveio/spaion< <5o/a>ospai class="comment"> *o/spaion< <6o/a>ospai class="comment"> *  This file is subject to the terms and condioptis of the GNU General Publico/spaion< <7o/a>ospai class="comment"> *  License. See the file COPYING in the main directory of this archiveo/spaion< <8o/a>ospai class="comment"> *  for more details.o/spaion< <9o/a>ospai class="comment"> */o/spaion< < 11o/a>#include <linux/module.ho/a>>n< 12o/a>#include <linux/string.ho/a>>n< 132oaon< 14o/a>#include <asm/unaligned.ho/a>>n< 152oaon< 16o/a>#include "c2p.ho/a>"n< 17o/a>#include "c2p_core.ho/a>"n< 182oaon< 192oaon< 2o2oao < /*o/spaion< 21o/a>ospai class="comment">  < <*  Perform a full C2P step on 32 8-bit pixels, stored in 8 32-bit wordso/spaion< 22o/a>ospai class="comment">  < <*  containingo/spaion< 23o/a>ospai class="comment">  < <*    - 32 8-bit chunky pixels on inputo/spaion< 24o/a>ospai class="comment">  < <*    - permutated planar data (1 plane per 32-bit word) on outputo/spaion< 25o/a>ospai class="comment">  < <*/o/spaion< 262oaon< 27o/a>static voidc2p_32x8o/a>(oa href="+code=u32" class="sref">u32o/a>do/a>[8])n< 28o/a>{n< 292oao < < < transp8o/a>(oa href="+code=d" class="sref">do/a>, 16, 4);n< 302oao < < < transp8o/a>(oa href="+code=d" class="sref">do/a>, 8, 2);n< 312oao < < < transp8o/a>(oa href="+code=d" class="sref">do/a>, 4, 1);n< 32o/a><< < < transp8o/a>(oa href="+code=d" class="sref">do/a>, 2, 4);n< 332oao < < < transp8o/a>(oa href="+code=d" class="sref">do/a>, 1, 2);n< 34o/a>}n< 352oaon< 362oaon< 372oao < /*o/spaion< 38o/a>ospai class="comment">  < <*  Array containing the permutation indices of the planar data after c2po/spaion< 39o/a>ospai class="comment">  < <*/o/spaion< 4o2oaon< 41o/a>static const intperm_c2p_32x8o/a>[8] = { 7, 5, 3, 1, 6, 4, 2, 0 };n< 422oaon< 432oaon< 442oao < /*o/spaion< 45o/a>ospai class="comment">  < <*  Store a full block of planar data after c2p conversptio/spaion< 46o/a>ospai class="comment">  < <*/o/spaion< 472oaon< 48o/a>static oa href="+code=inline" class="sref">inline2oao voidstore_planaro/a>(void<*oa href="+code=dst" class="sref">dsto/a>, oa href="+code=u32" class="sref">u32o/a>dst_inco/a>, oa href="+code=u32" class="sref">u32o/a>bppo/a>, oa href="+code=u32" class="sref">u32o/a>do/a>[8])n< 49o/a>{n< 502oao < < < i2oao;n< 512oaon< 52o/a><< < < i2oao = 0;i2oao <bppo/a>;i2oao++, oa href="+code=dst" class="sref">dsto/a> +=dst_inco/a>)n< 532oao < < < < < < < put_unaligned_be32o/a>(oa href="+code=d" class="sref">do/a>[oa href="+code=perm_c2p_32x8" class="sref">perm_c2p_32x8o/a>[oa href="+code=i" class="sref">i2oao]], oa href="+code=dst" class="sref">dsto/a>);n< 54o/a>}n< 552oaon< 562oaon< 572oao < /*o/spaion< 58o/a>ospai class="comment">  < <*  Store a partial block of planar data after c2p conversptio/spaion< 59o/a>ospai class="comment">  < <*/o/spaion< 6o2oaon< 61o/a>static oa href="+code=inline" class="sref">inline2oao voidstore_planar_maskedo/a>(void<*oa href="+code=dst" class="sref">dsto/a>, oa href="+code=u32" class="sref">u32o/a>dst_inco/a>, oa href="+code=u32" class="sref">u32o/a>bppo/a>,n< 622oao < < < < < < < <<<<<<<<<<<<<<<<<<<<<<<u32o/a>do/a>[8], oa href="+code=u32" class="sref">u32o/a>masko/a>)n< 63o/a>{n< 642oao < < < i2oao;n< 652oaon< 66o/a><< < < i2oao = 0;i2oao <bppo/a>;i2oao++, oa href="+code=dst" class="sref">dsto/a> +=dst_inco/a>)n< 672oao < < < < < < < put_unaligned_be32o/a>(oa href="+code=comp" class="sref">compo/a>(oa href="+code=d" class="sref">do/a>[oa href="+code=perm_c2p_32x8" class="sref">perm_c2p_32x8o/a>[oa href="+code=i" class="sref">i2oao]],n< 682oao < < < < < < < <<<<<<<<<<<<<<<<<<<<<<<<get_unaligned_be32o/a>(oa href="+code=dst" class="sref">dsto/a>), oa href="+code=mask" class="sref">masko/a>),n< 692oao < < < < < < < <<<<<<<<<<<<<<<<<<<dsto/a>);n< 70o/a>}n< 712oaon< 722oaon< 732oao < /*o/spaion< 74o/a>ospai class="comment">  < <*  c2p_planar - Copy 8-bit chunky image data to a planar framu buffero/spaion< 75o/a>ospai class="comment">  < <*  @dst: Starting address of the planar framu buffero/spaion< 76o/a>ospai class="comment">  < <*  @dx: Horizontal destination offset (in pixels)o/spaion< 77o/a>ospai class="comment">  < <*  @dy: Vertical destination offset (in pixels)o/spaion< 78o/a>ospai class="comment">  < <*  @width: Image width (in pixels)o/spaion< 79o/a>ospai class="comment">  < <*  @height: Image height (in pixels)o/spaion< 80o/a>ospai class="comment">  < <*  @dst_nextline: Framu buffer offset to the next line (in bytes)o/spaion< 81o/a>ospai class="comment">  < <*  @dst_nextplane: Framu buffer offset to the next plane (in bytes)o/spaion< 82o/a>ospai class="comment">  < <*  @src_nextline: Image offset to the next line (in bytes)o/spaion< 83o/a>ospai class="comment">  < <*  @bpp: Bits per pixel of the planar framu buffer (1-8)o/spaion< 84o/a>ospai class="comment">  < <*/o/spaion< 852oaon< 86o/a>voidc2p_planaro/a>(void<*oa href="+code=dst" class="sref">dsto/a>, const void<*oa href="+code=src" class="sref">srco/a>, oa href="+code=u32" class="sref">u32o/a>dxo/a>, oa href="+code=u32" class="sref">u32o/a>dyo/a>, oa href="+code=u32" class="sref">u32o/a>widtho/a>,n< 872oao < < < < < < < u32o/a>heighto/a>, oa href="+code=u32" class="sref">u32o/a>dst_nextlineo/a>, oa href="+code=u32" class="sref">u32o/a>dst_nextplaneo/a>,n< 882oao < < < < < < < u32o/a>src_nextlineo/a>, oa href="+code=u32" class="sref">u32o/a>bppo/a>)n< 89o/a>{n< 902oao < < < < 912oao < < < < < < < u8o/a>pixelso/a>[32];n< 922oao < < < < < < < u32o/a>wordso/a>[8];n< 932oao < < < <}do/a>;n< 942oao < < < u32o/a>dst_idxo/a>, oa href="+code=first" class="sref">firsto/a>, oa href="+code=last" class="sref">lasto/a>, oa href="+code=w" class="sref">wo/a>;n< 952oao < < < u8o/a><*oa href="+code=c" class="sref">co/a>;n< 96o/a><< < < po/a>;n< 972oaon< 982oao < < < dsto/a> +=dyo/a>*oa href="+code=dst_nextline" class="sref">dst_nextlineo/a>+(oa href="+code=dx" class="sref">dxo/a> & ~31);n< 992oao < < < dst_idxo/a> =dxo/a> % 32;n<1002oao < < < firsto/a> = 0xffffffffU >>dst_idxo/a>;n<1012oao < < < lasto/a> = ~(0xffffffffU >><((oa href="+code=dst_idx" class="sref">dst_idxo/a>+oa href="+code=width" class="sref">widtho/a>) % 32));n<1022oao < < < heighto/a>--) {n<1032oao < < < < < < < co/a> =srco/a>;n<1042oao < < < < < < < po/a> =dsto/a>;n<1052oao < < < < < < < wo/a> =widtho/a>;n<1062oao < < < < < < < dst_idxo/a>+oa href="+code=width" class="sref">widtho/a> <= 32) {n<1072oao < < < < < < < < < < < /* Single destination word */o/spaion<1082oao < < < < < < < <<<<<<<<firsto/a> &=lasto/a>;n<1092oao < < < < < < < <<<<<<<<memseto/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>, 0, sizeof(oa href="+code=d" class="sref">do/a>));n<1102oao < < < < < < < <<<<<<<<memcpyo/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>+oa href="+code=dst_idx" class="sref">dst_idxo/a>, oa href="+code=c" class="sref">co/a>, oa href="+code=width" class="sref">widtho/a>);n<1112oao < < < < < < < <<<<<<<<co/a> +=widtho/a>;n<1122oao < < < < < < < <<<<<<<<c2p_32x8o/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=words" class="sref">wordso/a>);n<1132oao < < < < < < < <<<<<<<<store_planar_maskedo/a>(oa href="+code=p" class="sref">po/a>, oa href="+code=dst_nextplane" class="sref">dst_nextplaneo/a>,bppo/a>, oa href="+code=d" class="sref">do/a>.oa href="+code=words" class="sref">wordso/a>,n<1142oao < < < < < < < <<<<<<<<<<<<<<<<<<<<<<<<<<<<firsto/a>);n<1152oao < < < < < < < <<<<<<<<po/a> +=<4;n<1162oao < < < < < < < <} else {n<1172oao < < < < < < < < < < < /* Multiple destination words */o/spaion<1182oao < < < < < < < <<<<<<<<wo/a> =widtho/a>;n<1192oao < < < < < < < <<<<<<<</* Leading bits */o/spaion<1202oao < < < < < < < <<<<<<<<dst_idxo/a>) {n<1212oao < < < < < < < <<<<<<<<<<<<<<<<wo/a> =<32 -dst_idxo/a>;n<1222oao < < < < < < < <<<<<<<<<<<<<<<<memseto/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>, 0, oa href="+code=dst_idx" class="sref">dst_idxo/a>);n<1232oao < < < < < < < <<<<<<<<<<<<<<<<memcpyo/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>+oa href="+code=dst_idx" class="sref">dst_idxo/a>, oa href="+code=c" class="sref">co/a>, oa href="+code=w" class="sref">wo/a>);n<1242oao < < < < < < < <<<<<<<<<<<<<<<<co/a> +=wo/a>;n<1252oao < < < < < < < <<<<<<<<<<<<<<<<c2p_32x8o/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=words" class="sref">wordso/a>);n<1262oao < < < < < < < <<<<<<<<<<<<<<<<store_planar_maskedo/a>(oa href="+code=p" class="sref">po/a>, oa href="+code=dst_nextplane" class="sref">dst_nextplaneo/a>,bppo/a>,n<1272oao < < < < < < < < < < < < < < < < < <<<<<<<<<<<<<<<<do/a>.oa href="+code=words" class="sref">wordso/a>,firsto/a>);n<1282oao < < < < < < < <<<<<<<<<<<<<<<<po/a> +=<4;n<1292oao < < < < < < < <<<<<<<<<<<<<<<<wo/a> =widtho/a>-oa href="+code=w" class="sref">wo/a>;n<1302oao < < < < < < < <<<<<<<<<}n<1312oao < < < < < < < <<<<<<<</* Main chunk */o/spaion<1322oao < < < < < < < <<<<<<<<wo/a> >= 32) {n<1332oao < < < < < < < <<<<<<<<<<<<<<<<memcpyo/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>, oa href="+code=c" class="sref">co/a>, 32);n<1342oao < < < < < < < <<<<<<<<<<<<<<<<co/a> +=<32;n<1352oao < < < < < < < <<<<<<<<<<<<<<<<c2p_32x8o/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=words" class="sref">wordso/a>);n<1362oao < < < < < < < <<<<<<<<<<<<<<<<store_planaro/a>(oa href="+code=p" class="sref">po/a>, oa href="+code=dst_nextplane" class="sref">dst_nextplaneo/a>,bppo/a>,do/a>.oa href="+code=words" class="sref">wordso/a>);n<1372oao < < < < < < < < < < < < < < < po/a> +=<4;n<1382oao < < < < < < < <<<<<<<<<<<<<<<<wo/a> -=<32;n<1392oao < < < < < < < <<<<<<<<<}n<1402oao < < < < < < < <<<<<<<</* Trailing bits */o/spaion<1412oao < < < < < < < <<<<<<<<wo/a> %=<32;n<1422oao < < < < < < < <<<<<<<<wo/a> > 0) {n<1432oao < < < < < < < <<<<<<<<<<<<<<<<memcpyo/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>, oa href="+code=c" class="sref">co/a>, oa href="+code=w" class="sref">wo/a>);n<1442oao < < < < < < < <<<<<<<<<<<<<<<<memseto/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=pixels" class="sref">pixelso/a>+oa href="+code=w" class="sref">wo/a>, 0, 32-oa href="+code=w" class="sref">wo/a>);n<1452oao < < < < < < < <<<<<<<<<<<<<<<<c2p_32x8o/a>(oa href="+code=d" class="sref">do/a>.oa href="+code=words" class="sref">wordso/a>);n<1462oao < < < < < < < <<<<<<<<<<<<<<<<store_planar_maskedo/a>(oa href="+code=p" class="sref">po/a>, oa href="+code=dst_nextplane" class="sref">dst_nextplaneo/a>,bppo/a>,n<1472oao < < < < < < < < < < < < < < < < < <<<<<<<<<<<<<<<<do/a>.oa href="+code=words" class="sref">wordso/a>,lasto/a>);n<1482oao < < < < < < < <<<<<<<<<}n<1492oao < < < < < < < <}n<1502oao < < < < < < < srco/a> +=src_nextlineo/a>;n<1512oao < < < < < < < dsto/a> +=dst_nextlineo/a>;n<152o/a><< < < <}n<1532oao}n<154o/a>oa href="+code=EXPORT_SYMBOL_GPL" class="sref">EXPORT_SYMBOL_GPLo/a>(oa href="+code=c2p_planar" class="sref">c2p_planaro/a>);n<1552oaon<1562oaooa href="+code=MODULE_LICENSE" class="sref">MODULE_LICENSEo/a>(ospai class="string">"GPL"<1572oao
The original LXR software by the LXR communityo/a>, this experimental verspti by lxr@linux.noo/a>. o/divonodiv class="subfooter"> lxr.linux.no kindly hosted by Redpill Linpro ASo/a>, provider of Linux