Monday, November 27, 2006

手環王 - 遼西小戟 ★★★☆


老套的開始,嶄新的創意

書名還蠻俗的,照理來說是根本不會拿起來看的那種類型,
我也不知道那跟筋錯亂了才會把他拿起來,
翻了一下,嗯...還好有把他拿起來,
不然就錯失一本不錯的小說了,
故事的開頭很老套,跟他的書名有得拼,
就是一個小乞兒-凱西洛洛 揀到一個神奇的手環,
然後就開始他神奇的一生,
唉~要不是實在沒有什東西可以看了,
一定會把他放回原位。

不過他接下來的設定不錯,
手環裡面住著一個五百年前令人聞之色變的盜賊-老鬼莫飛斯,
因為去偷這個手環而被封印在裡面,
衝著這個被封印進去的靈魂(?)是個老頭子,
不是個年輕貌美的小姑娘,
心理瞬間對他的評價迅速提升,
我最討厭那種寄宿個劍靈之類的設定,
天天主人長,主人短的叫來叫去,
搞的那麼西斯...

反正老鬼就一心想把凱西洛洛培養成小偷,
還不斷的告誡他一些行規,
例如小偷遇到另外一個小偷,
要請他吃飯一定不能用身上的錢,
不然就是瞧不起對方,
要用扒來的錢包裡面的錢來付賬。
這些設定都還蠻有趣的,
目前出到第二集,
有越來越好的趨勢。

Thursday, November 23, 2006

褻瀆 - 煙雨江南 ★★★★☆


一本可以隨之起舞的小說,拙者認為是最近以來網路小說最優秀的


褻瀆是我非常喜歡的一本小說,
不過這本小說倒是毀譽參半,
喜歡的人很喜歡,不喜歡他的人非常排斥,
因為他的內容並不是那麼的光明面,
不是那種正義必勝的熱血內容,
也不是無腦式暴強的幸運主角。

主角的性格簡單的來說就是世儈,
然後就是非常的死心眼,
就是一般的雜魚腳色的性格,
不過整個世界的設定非常的好,
不像許多小說單純的為了好掰,
或是讓主角無限的爽而去架空世界,
他的故事有意思就在於他的世界觀,
探討神、信仰、空間與普羅大眾之間的關係,
非常的有意思。

作者的文筆也非常的好,
不是那種拼命記流水帳的小說,
常常一小段文章中就有一些比較飄逸(或是抽象)的詩句??
加深了許多想像。
至於量的部分我覺得還蠻洽當的,
不會太多會讓我覺得只是單純的在玩詞藻堆積。
非常推薦,目前已經全部完結。

Renderman ribgen & remote render

最近因為在寫毛的ribgen,
通常毛隨便也是幾十萬幾百萬根,
所以gen rib要花很久的時間,
因此就把腦筋動到remote gen rib & render,
然後慘劇就發生,一直render失敗。

我本還還以為remote不支援ribgen DSO,
可是看他原本的mtorFur又可以正常的work,
結果今天下午就在debug中度過了,
最後發現,我在這個ribgen中有呼叫一個自己寫的maya command plugin,
我在裡面有印一些訊息在standard output,
然後這些訊息,被寫入到alfred的script中,
當 alfred想去執行這個script時就會執行這些debug message,
把他當作command處理。

後來我把他都mark起來,就可以跑了,
確記,以後不要在把訊息輸出到stardard output,
丟到standard error,
這樣才不會在renderman remote render才不會有問題。

Friday, June 23, 2006

[PRMAN]Curve: Segments and nvertices

Linear, nonperiodic: segments = nvertices -1;
Linear, periodic: segments = nvertices;
Cubic, nonperiodic: segments = (nvertices-4)/step +1;
Cubic, periodic: segments = nvertices/step;

Friday, June 16, 2006

[PRMAN]Basis


RtBasis spline = {
{ -1/6.0, 0.5, -0.5, 1/6.0},
{ 0.5, -1, 0.5, 0},
{ -0.5, 0, 0.5, 0},
{ 1/6.0, 2/3.0, 1/6.0, 0}
};


RtBasis hermite = {
{ 2, -2, 1, 1 },
{ -3, 3, -2, -1 },
{ 0, 0, 1, 0 },
{ 1, 0, 0, 0 }
};

RtBasis bezier = {
{ -1, 3, -3, 1 },
{ 3, -6, 3, 0 },
{ -3, 3, 0, 0 },
{ 1, 0, 0, 0 }
};



RtBasis catmullRom = {
{ -0.5, 1.5, -1.5, 0.5 },
{ 1.0, -2.5, 2.0, -0.5 },
{ -0.5, 0.0, 0.5, 0.0 },
{ 0.0, 1.0, 0.0, 0.0 }
};









BasisStep
RiBezierBasis3
RiBSplineBasis1
RiCatmullRomBasis1
RiHermiteBasis2
RiPowerBasis4

一定要裝的firefox extensions

Thursday, March 23, 2006

[PRMAN]RIBContext->ReadArchive

最後面要加一個RI_NULL當作輸入結尾

Tuesday, March 21, 2006

[PRMAN]RIBContext method整理


void GetRenderingPass(RenderingPass *p, RtBoolean *declarePhase) = 0;
RtBoolean GetMotionBlur() = 0;
int GetFrame() = 0;
void GetShutter(RtFloat *open, RtFloat *close) = 0;
const char * GetJobName() = 0;
const char * GetObjName() = 0;
void GetCamBasis( RtMatrix m, int inverse = 0 ) = 0;
void ReportError( RenderingError e, const char *fmt, ... ) = 0;
void GetMotionInfo( RtFloat *shutterAngle, RtFloat *fps,
RtBoolean *subframeMotion, RtBoolean *blurCamera=0L,
ShutterTiming *shutterTiming=0L,ShutterConfig *shutterConfig=0L) = 0;
const RIBContextResult *
ExecuteHostCmd( const char *cmd, std::string &errstr ) = 0;
const RIBContextResult *
ExecuteHostCmd( const char *cmd, char** errstr ) = 0;
RtBasis * GetBasis( BasisFunction ) = 0;
void SetDefaultFilterFunction( FilterFunction ) = 0;
RtFilterFunc GetFilterFunction( FilterFunction ) = 0;
RtFilterFunc GetFilterFunction( const char *nm ) = 0;
RtProcSubdivFunc GetProcSubdivFunc( ProceduralSubdivFunction ) = 0;
RtProcFreeFunc GetProcFreeFunc() = 0;
const char *GetOutputDir(OutDirCategory) = 0;

RtVoid Begin( RtToken name ) = 0;
RtVoid End() = 0;
RtContextHandle GetContext() = 0;
RtVoid Context( RtContextHandle ) = 0;

RtVoid RIBBox(const RtString) = 0;
RtToken Declare(char *, char *) = 0;
RtVoid AttributeBegin() = 0;
RtVoid AttributeEnd() = 0;
RtVoid Color(RtColor) = 0;
RtVoid Opacity(RtColor) = 0;
RtVoid TextureCoordinates(RtFloat s1, RtFloat t1, RtFloat s2,
RtFloat t2, RtFloat s3, RtFloat t3,
RtFloat s4, RtFloat t4) = 0;
RtLightHandle LightSource(RtToken name, ...) = 0;
RtLightHandle LightSourceV(RtToken name, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtLightHandle AreaLightSource(RtToken name, ...) = 0;
RtLightHandle AreaLightSourceV(RtToken name, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Illuminate(RtLightHandle light, RtBoolean onoff) = 0;
RtVoid Surface(RtToken name, ...) = 0;
RtVoid SurfaceV(RtToken name, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Atmosphere(RtToken name, ...) = 0;
RtVoid AtmosphereV(RtToken name, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Interior(RtToken name, ...) = 0;
RtVoid InteriorV(RtToken name, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Exterior(RtToken name, ...) = 0;
RtVoid ExteriorV(RtToken name, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid ShadingRate(RtFloat) = 0;
RtVoid ShadingInterpolation(RtToken type) = 0;
RtVoid Matte(RtBoolean onoff) = 0;
RtVoid Bound(RtBound bound) = 0;
RtVoid Detail(RtBound bound) = 0;
RtVoid DetailRange(RtFloat minvis, RtFloat lowtran, RtFloat uptran, RtFloat maxvis) = 0;
RtVoid RelativeDetail(RtFloat) = 0;
RtVoid GeometricApproximation(RtToken type, RtFloat value) = 0;
RtVoid Orientation(RtToken orientation) = 0;
RtVoid ReverseOrientation(void) = 0;
RtVoid Sides(RtInt sides) = 0;
RtVoid Identity(void) = 0;
RtVoid Transform(RtMatrix transform) = 0;
RtVoid ConcatTransform(RtMatrix transform) = 0;
RtVoid Perspective(RtFloat fov) = 0;
RtVoid Translate(RtFloat dx, RtFloat dy, RtFloat dz) = 0;
RtVoid Rotate(RtFloat angle, RtFloat dx, RtFloat dy, RtFloat dz) = 0;
RtVoid Scale(RtFloat sx, RtFloat sy, RtFloat sz) = 0;
RtVoid Skew(RtFloat angle, RtFloat dx1, RtFloat dy1, RtFloat dz1,
RtFloat dx2, RtFloat dy2, RtFloat dz2) = 0;
RtVoid Displacement(RtToken name, ...) = 0;
RtVoid DisplacementV(RtToken name, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid CoordinateSystem(RtToken space) = 0;
RtVoid ScopedCoordinateSystem(RtToken space) = 0;
RtVoid CoordSysTransform(RtToken space) = 0;
RtVoid TransformBegin(void) = 0;
RtVoid TransformEnd(void) = 0;
RtVoid Attribute(RtToken name, ...) = 0;
RtVoid AttributeV(RtToken name, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Polygon(RtInt nverts, ...) = 0;
RtVoid PolygonV(RtInt nverts, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid GeneralPolygon(RtInt nloops, RtInt nverts[], ...) = 0;
RtVoid GeneralPolygonV(RtInt nloops, RtInt nverts[], RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid PointsPolygons(RtInt npolys, RtInt nverts[], RtInt verts[], ...) = 0;
RtVoid PointsPolygonsV(RtInt npolys,RtInt nverts[], RtInt verts[], RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid PointsGeneralPolygons(RtInt npolys, RtInt nloops[],
RtInt nverts[], RtInt verts[], ...) = 0;
RtVoid PointsGeneralPolygonsV(RtInt npolys, RtInt nloops[], RtInt nverts[],
RtInt verts[], RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Basis(RtBasis ubasis, RtInt ustep, RtBasis vbasis, RtInt vstep) = 0;
RtVoid Patch(RtToken type, ...) = 0;
RtVoid PatchV(RtToken type, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid PatchMesh(RtToken type, RtInt nu, RtToken uwrap, RtInt nv, RtToken vwrap, ...) = 0;
RtVoid PatchMeshV(RtToken type, RtInt nu, RtToken uwrap, RtInt nv, RtToken vwrap,
RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid NuPatch(RtInt nu, RtInt uorder, RtFloat uknot[], RtFloat umin, RtFloat umax,
RtInt nv, RtInt vorder, RtFloat vknot[], RtFloat vmin, RtFloat vmax, ...) = 0;
RtVoid NuPatchV(RtInt nu, RtInt uorder, RtFloat uknot[], RtFloat umin, RtFloat umax,
RtInt nv, RtInt vorder, RtFloat vknot[],RtFloat vmin, RtFloat vmax, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid TrimCurve(RtInt nloops, RtInt ncurves[], RtInt order[], RtFloat knot[],
RtFloat min[], RtFloat max[], RtInt n[], RtFloat u[], RtFloat v[], RtFloat w[]) = 0;
RtVoid Sphere(RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, ...) = 0;
RtVoid SphereV(RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Cone(RtFloat height, RtFloat radius, RtFloat tmax, ...) = 0;
RtVoid ConeV(RtFloat height, RtFloat radius,RtFloat tmax, RtInt n, RtToken tokens[],
RtPointer parms[]) = 0;
RtVoid Cylinder(RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, ...) = 0;
RtVoid CylinderV(RtFloat radius, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Hyperboloid(RtPoint point1, RtPoint point2, RtFloat tmax, ...) = 0;
RtVoid HyperboloidV(RtPoint point1, RtPoint point2, RtFloat tmax, RtInt n, RtToken
tokens[], RtPointer parms[]) = 0;
RtVoid Paraboloid(RtFloat rmax, RtFloat zmin, RtFloat zmax, RtFloat tmax, ...) = 0;
RtVoid ParaboloidV(RtFloat rmax, RtFloat zmin, RtFloat zmax, RtFloat tmax, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Disk(RtFloat height, RtFloat radius, RtFloat tmax, ...) = 0;
RtVoid DiskV(RtFloat height, RtFloat radius, RtFloat tmax, RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Torus(RtFloat majrad, RtFloat minrad, RtFloat phimin, RtFloat phimax,
RtFloat tmax, ...) = 0;
RtVoid TorusV(RtFloat majrad, RtFloat minrad, RtFloat phimin, RtFloat phimax,
RtFloat tmax, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Geometry(RtToken type, ...) = 0;
RtVoid GeometryV(RtToken type, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid SolidBegin(RtToken operation) = 0;
RtVoid SolidEnd(void) = 0;
RtVoid MotionBegin(RtInt n, ...) = 0;
RtVoid MotionBeginV(RtInt n, RtFloat times[]) = 0;
RtVoid MotionEnd(void) = 0;
RtVoid ArchiveRecord(RtToken type, char *format, ...) = 0;
RtVoid ReadArchive(RtToken name, RtVoid (*callback)(RtToken,char*,...), ...) = 0;
RtVoid ReadArchiveV(RtToken name, RtVoid (*callback)(RtToken,char*,...), RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Procedural(RtPointer data, RtBound bound,
RtVoid (*subdivfunc)(RtPointer, RtFloat), RtVoid (*freefunc)(RtPointer)) = 0;
RtVoid Curves(RtToken type, RtInt ncurves, RtInt nvertices[], RtToken wrap, ...) = 0;
RtVoid CurvesV(RtToken type, RtInt ncurves, RtInt nvertices[], RtToken wrap,
RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid Points(RtInt nverts,...) = 0;
RtVoid PointsV(RtInt nverts, RtInt nargs, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid SubdivisionMesh(RtToken scheme, RtInt nf, RtInt nverts[], RtInt verts[],
RtInt nt, RtToken tags[], RtInt numargs[], RtInt intargs[], RtFloat floatargs[], ...) = 0;
RtVoid SubdivisionMeshV(RtToken scheme, RtInt nf, RtInt nverts[], RtInt verts[], RtInt nt,
RtToken tags[], RtInt numargs[], RtInt intargs[], RtFloat floatargs[], RtInt n,
RtToken tokens[], RtPointer parms[]) = 0;
RtVoid HierarchicalSubdivisionMesh(RtToken scheme, RtInt nf, RtInt nverts[],
RtInt verts[], RtInt ntags, RtToken tags[], RtInt numargs[], RtInt intargs[],
RtFloat floatargs[], RtToken stringargs[], ...) = 0;
RtVoid HierarchicalSubdivisionMeshV(RtToken scheme, RtInt nf, RtInt nverts[],
RtInt verts[], RtInt nt, RtToken tags[], RtInt numargs[], RtInt intargs[],
RtFloat floatargs[], RtToken stringargs[], RtInt n, RtToken tokens[],
RtPointer parms[]) = 0;
RtVoid Blobby(RtInt, RtInt, RtInt [], RtInt, RtFloat [], RtInt, RtToken [], ...) = 0;
RtVoid BlobbyV(RtInt, RtInt, RtInt [], RtInt, RtFloat [], RtInt, RtToken [],
RtInt, RtToken [], RtPointer []) = 0;
RtVoid ClippingPlane( RtFloat x, RtFloat y, RtFloat z, RtFloat nx, RtFloat ny, RtFloat nz) = 0;
RtVoid Resource(RtToken handle, RtToken type, ...) = 0;
RtVoid ResourceV(RtToken handle, RtToken type, RtInt n, RtToken tokens[], RtPointer parms[]) = 0;
RtVoid ResourceBegin() = 0;
RtVoid ResourceEnd() = 0;
RtVoid System(char *) = 0;
RtVoid IfBegin(char *) = 0;
RtVoid Else() = 0;
RtVoid ElseIf(char *) = 0;
RtVoid IfEnd() = 0;

[PRMAN]寫RibGen的注意事項

  • 當編譯成一個so檔,還要附上一個slim檔描述該so,檔頭為
    slim 1 appearance toslim {
    instance dso "particleGen" $SLIMMASTER {
    description {A RIB Generator that adds stubble to Maya nurbs.}
    subtype ribgen
    eval [slimDSOMacro ribgen]

  • Monday, March 20, 2006

    GenRIB

  • 檢查目前的render pass, 如果是 declare pass, return 0.然後依照不同的render path作不同的事
    RIBContext->GetRenderingPass(&p, &decl);
    // RIBContext::RenderingPass p;
    // RtBoolean decl;

  • RIBContext->ExecuteHostCmd(cmd, errorString) 來執行maya的mel command,以取得maya內的資訊

  • 將想要的資訊產生為rib (c->AttributeBegin(); ...; c->AttributeEnd();)
  • [PRMAN]Renderman notes

    get render path:
    RIBContext::RenderingPass pass;
    RtBoolean decl;
    context->GetRenderingPass(&pass, &decl);
    pass = {
    rpFinal,
    rpShadow,
    rpReflection,
    rpEnvironment,
    rpTraverseOnly
    }

    北國性騷擾

    最近想說要看點有藝術氣質,有提名的那種得獎片,
    所以就跟IC去看"北國性騷擾",
    這種非好萊屋的片子撥的地方實在不多,
    整個西門町就只有日新有在上映,
    雖然有以前去看魔戒實有著不好印像,
    但是也沒得選擇,就GO了。

    這次的廳在一樓,改變了我對日新的看法,
    就以位子的高低差和大小,算是不錯了。
    廢話就到此,開始切入電影了,
    在我看到第一個高潮,就是巴比脅迫女主角的時候,
    忽然 "翁"的一聲,螢幕整個黑掉啦!!
    人群開始騷動起來,不過工作人馬上跑了進來說台電跳電,
    那... 人家也是打工的,也不要太為難他,
    就等電來吧!

    過了一會,隔壁的情侶檔起身去上廁所,
    想說也好,趁著空檔去上個廁所,
    想不到剛要跨出門口,一道光束從我的身旁掠過,
    "~~~~"電來了,電影又開始了,
    回頭一看,巴比已經放過女主角。
    漏了一小段沒看到....。

    好不容易又融入電影情節的時候,
    哇糙,又黑了。
    不滿的情緒開始醞釀,
    不過IC大爺很乾脆的說,去上剛剛未完成的廁所吧!
    正當IC要起身的時候,"翁~~"電影又開始了,
    IC還是乖乖坐下了。

    正所謂無三不成禮,一定要再來一次的阿。
    不過這次我不會讓IC專美於前,
    正當我躍過了隔壁的情侶檔,
    面前忽然一道光芒,XD!電影又開始了。

    折騰了這麼多次最後電影也沒看成,
    不過日新有補我們一張票,還算可以接受,
    我想下次還是看好萊塢的片子吧。

    Monday, March 13, 2006

    捷運站不可以吃口香糖

    今天在台北車站看到看到一個女生跟一個穿制服的警察在講話,
    直覺就認為應該是問路的,可是走近一看,
    警察手裡拿著黃色的單子叫那位小姐填,
    這不禁激起我的好奇心,就走過去偷聽到底在幹麼,
    結果聽到一句:"等一下去後面的垃圾筒吐掉"。
    一切的謎底都解開了,原來是吃口香糖被抓包!
    以後不能抱持僥倖的心態在捷運站吃口香糖。

    至少在台北車站的時候不要嚼。
    (除了台北車站外應該都沒有警察吧!?)

    Wednesday, March 08, 2006

    轉mpeg1


    mencoder -oac lavc -ovc lavc -of mpeg -mpegopts format=vcd -vf scale=320:-2,harddup -srate 44100 -af lavcresample=44100 -lavcopts vcodec=mpeg1video:keyint=18:vrc_buf_size=327:vrc_minrate=1152:vbitrate=1152:vrc_maxrate=1152:acodec=mp2:abitrate=224 -ofps 30000/1001 -o movie_vcd.mpg input.mpg

    Thursday, March 02, 2006

    Gamma, bias and gain

    gamma:


    float gamma(float val, gam){
    return pow(val, 1 / gam);
    }

    bias:


    float bias (float x, val){
    return (val > 0) ? pow(x,log(val) / log(0.5)) : 0;
    }


    gain:


    float gain (float x, val ) {
    return 0.5 * ((x < 0.5) ? bias (2*x, 1-val): (2 - bias(2-2*x,1-val)));
    }


    Link: rendermanacademy

    Wednesday, February 15, 2006

    Mount CUE/BIN in Linux

    Convert CUE/BIN to iso.
    Install bchunk
    bchunk foo.bin foo.cue foo

    Tuesday, February 07, 2006

    `AM_PROG_AS' not found

    set automake version
    ACLOCAL=aclocal-1.8 AUTOMAKE=automake-1.8 autoreconf -f -i -s

    FFmpeg compile error

    Replace transpose4x4() in libavcodec/i386/dsputil_mmx.c as follows:


    static inline void transpose4x4(uint8_t *dst, uint8_t *src, int dst_stride, int src_stride){
    asm volatile( //FIXME could save 1 instruction if done as 8x4 ...
    "movd %4, %%mm0 \n\t"
    "movd %5, %%mm1 \n\t"
    "movd %6, %%mm2 \n\t"
    "movd %7, %%mm3 \n\t"
    "punpcklbw %%mm1, %%mm0 \n\t"
    "punpcklbw %%mm3, %%mm2 \n\t"
    "movq %%mm0, %%mm1 \n\t"
    "punpcklwd %%mm2, %%mm0 \n\t"
    "punpckhwd %%mm2, %%mm1 \n\t"
    "movd %%mm0, %0 \n\t"
    "punpckhdq %%mm0, %%mm0 \n\t"
    "movd %%mm0, %1 \n\t"
    "movd %%mm1, %2 \n\t"
    "punpckhdq %%mm1, %%mm1 \n\t"
    "movd %%mm1, %3 \n\t"

    : "=m" (*(uint32_t*)(dst + 0*dst_stride)),
    "=m" (*(uint32_t*)(dst + 1*dst_stride)),
    "=m" (*(uint32_t*)(dst + 2*dst_stride)),
    "=m" (*(uint32_t*)(dst + 3*dst_stride))
    : "m" (*(uint32_t*)(src + 0*src_stride)),
    "m" (*(uint32_t*)(src + 1*src_stride)),
    "m" (*(uint32_t*)(src + 2*src_stride)),
    "m" (*(uint32_t*)(src + 3*src_stride))
    );
    }