ATI CE Device Dependent Interface - IMAGEON 3200/4200

ace_ddi.dllからエクスポートされている関数の一覧。 IMAGEON 100の解析 とは全く異なりますね。ベースとなっているチップが違うのか…
MPEG2デコード関連の関数調査はだいたい終了しました。 とりあえずソース公開されているPocketMVPでも対応してみる?って誰が?
AtiVersion                     01da.2130
SrmInit                        01da.2140
SrmTerm                        01da.22b8
SrmAsicGetPhysDev              01da.23c4
SrmCfgSetProperty              01da.2ce4
SrmCfgGetProperty              01da.2d18
SrmCfgSetPropertyEx            01da.2d4c
SrmCfgGetPropertyEx            01da.2ec8
SrmClkSet                      01da.3534
SrmIntrClientHook              01da.3928
SrmIntrClientUnhook            01da.39f8
SrmIntrEnable                  01da.3a70
SrmIntrDisable                 01da.3a84
SrmIntrWait                    01da.3a98
SrmIntrWaitEx                  01da.3af0
SrmIntrSignal                  01da.3b54
SrmIntrProcessed               01da.3ba4
SrmIntrGetStatus               01da.3c1c
SrmLoadLcdInit                 01da.5474
SrmMemInit                     01da.5644
SrmMemTerm                     01da.57c8
SrmSurfGetLargestFreeBlockSize 01da.5818
SrmMemAlloc                    01da.58f0
SrmMemAllocLock                01da.5b64
SrmMemAllocEx                  01da.5ba8
SrmMemFree                     01da.5bb0
SrmMemLock                     01da.5d74
SrmMemUnlock                   01da.5e9c
SrmPwrInit                     01da.6404
SrmPwrTerm                     01da.647c
SrmPwrSetState                 01da.64d8
SrmPwrGetState                 01da.66e4
SrmPwrSet                      01da.6bf0
SrmRGBGammaValueSet            01da.74a0
SrmRGBGammaValueGet            01da.74d8
SrmRGBGammaSelectionSet        01da.7510
SrmRGBGammaSelectionGet        01da.7548
SrmUserCtxObtain               01da.767c
SrmUserCtxRelease              01da.78c0
SrmUserCtxQuery                01da.7b90
SrmUserCtxActive               01da.7bf8
AhiDevRegRead                  01da.a5b4
AhiDevRegWrite                 01da.a630
AhiDevMemRead                  01da.a6ac
AhiDevMemWrite                 01da.a71c
AhiDevCfgRead                  01da.a784
AhiDevCfgWrite                 01da.a7ac
AhiDrawIsIdle                  01da.a7cc
AhiDrawIdle                    01da.a814
AhiDrawPM4                     01da.a838
AhiInit                        01da.a9d4
AhiTerm                        01da.a9e4
AhiDevEnum                     01da.a9f4
AhiDevOpen                     01da.aae4
AhiDevClose                    01da.abf0
AhiDevClientVersion            01da.ac6c
AhiDispModeEnum                01da.ada4
AhiDispModeSet                 01da.ae04
AhiDispModeGet                 01da.b34c
AhiDispModeClip                01da.b388
AhiDispSurfSet                 01da.b470
AhiDispSurfGet                 01da.b540
AhiDispState                   01da.b584
AhiDispIsInVBlank              01da.ba4c
AhiDispWaitVBlank              01da.ba80
AhiDispCursorState             01da.baac
AhiDispCursorPos               01da.bb2c
AhiDispCursorSet               01da.bba8
AhiDispOverlayCaps             01da.bd70
AhiDispOverlayState            01da.be54
AhiDispOverlaySurf             01da.befc
AhiDispOverlayPos              01da.c574
AhiDrawAlphaBlt                01da.d610
AhiDrawFgColorSet              01da.dd68
AhiDrawBgColorSet              01da.dd98
AhiDrawBrushFgColorSet         01da.ddc8
AhiDrawBrushBgColorSet         01da.ddf8
AhiDrawBrushSet                01da.de28
AhiDrawClipSrcSet              01da.e5c0
AhiDrawClipDstSet              01da.e630
AhiDrawSurfSrcSet              01da.e6f0
AhiDrawSurfDstSet              01da.e854
AhiDrawRopSet                  01da.e9c4
AhiDrawPixelOrderSet           01da.ea60
AhiDrawLineStyleSet            01da.eabc
AhiDrawAlphaSet                01da.eafc
AhiDrawBitBlt                  01da.ebac
AhiDrawBitBltMulti             01da.ee00
AhiDrawTransBlt                01da.f160
AhiDrawRotateBlt               01da.f44c
AhiDrawMaskBlt                 01da.f8bc
AhiDrawSwapBlt                 01da.fb8c
AhiDrawMonoBltMulti            01da.fe14
AhiDrawTileBlt                 01db.00b0
AhiDrawBitmapBlt               01db.06a4
AhiDrawChar                    01db.1474
AhiDrawGlyph                   01db.1720
AhiDrawLines                   01db.19c4
AhiDrawSpans                   01db.1cb4
AhiDrawStretchBlt              01db.1ee0
AhiGpioSet                     01db.3338
AhiGpioGet                     01db.3384
AhiIDCTOpen                    01db.37e8
AhiIDCTClose                   01db.39c4
AhiIDCTPropGet                 01db.39dc
AhiIDCTPropSet                 01db.3b08
AhiIDCTFrameEnd                01db.3ca4
AhiIDCTFrameStart              01db.3d1c
AhiIDCT8x8                     01db.3f9c
AhiIDCTMComp8x8                01db.4084
AhiIDCTMComp                   01db.41f8
AhiPropertySet                 01db.480c
AhiPropertyGet                 01db.4948
AhiPwrModeSet                  01db.4ab0
AhiSurfGetLargestFreeBlockSize 01db.4ad0
AhiSurfAlloc                   01db.4bac
AhiSurfReuse                   01db.4f54
AhiSurfFree                    01db.5230
AhiSurfInfo                    01db.5330
AhiSurfPlaneInfo               01db.53ec
AhiSurfLock                    01db.5488
AhiSurfUnlock                  01db.5570
AhiSurfCopy                    01db.55a0
DrvEnableDriver                01db.6ef4

AhiInit(int 0x11)

初期化します。 システムで最初に呼び出された場合は以下の関数群で用いられる 共有メモリの確保及びatihwtbl0.txtを読み取って初期化が行われます。 共有メモリを介して動作するのでgwes.exeと同じプロセス空間になくても ace_ddi.dllを利用し画面にアクセスできます。
戻り値はすべての関数で成功=0です。

AhiDevEnum(out Asic **, out info*, int asicnumber=0)

指定番号のASIC(IMAGEON4200)の諸元を取得します。asicnumberは0です。 Asic*には0x13424バイトの共有メモリ上のstructへのポインタが帰ります。 infoには呼び出し側で確保した0x14cバイトの領域を渡します。

AhiDevOpen(out Ctx**, Asic*, const char* name, int 0)

デバイスを開いてそのコンテキストを返します。 nameは適当な文字列、何でもいいです。 Ctx*はAsic*の一部で0x168バイトのstructです。 1400.0000から16MB空間のVirtualAlloc/Copyも行われます。

AhiDevClose(Ctx*)

デバイスを閉じます。DevOpenしたプロセスが終了すると自動的にCloseします。

AhiDispSurfGet(Ctx*, out Surf**)

表示しているサーフェスを返します。Surf*はAsic*の一部で0x50バイトのstructです。 表示サーフェスをAhiSurfLockに渡すと直接アクセスできるポインタが返ります。

AhiSurfAlloc(Ctx*, out Surf**, int size[2], int type, int mode)

サーフェスを作成します。typeは種別で0=1bpp/2=8bpp/5=16bpp/9=YCbCr(420)、 modeは0x20で外部メモリ、0x40で内部メモリ(320KB)、0でどちらでも、 +1で下位アドレスから確保します。

AhiSurfFree(Ctx*, Surf*)

サーフェスを破棄します。SurfAllocしたCtxを閉じてもSurfは破棄されませんので 確保したプロセスが死ぬと領域は確保されたままになります。

AhiSurfInfo(Ctx*, Surf*, out info*)

サーフェスの諸元を取得します。infoは呼び出し側で確保した0x1cバイトの領域で、 { int 幅,高,アドレス(1400.0000基準),行バイト数,総バイト数,種別,1 } が返ります。

AhiSurfPlaneInfo(Ctx*, Surf*, out info*, DWORD plane)

サーフェスのplaneの諸元を取得します。Surfの種別が9の場合のみ取得できます。 planeはビットマスク値の1000.0000(Y)か2000.0000(Cb)か4000.0000(Cr)です。 infoは呼び出し側で確保した0x14バイトの領域で、 { int 幅,高,アドレス(1400.0000基準),行バイト数,1 } が返ります。

AhiSurfLock(Ctx*, Surf*, out void **addr, int plane)

サーフェスの仮想メモリアドレスを返します。 planeは0か、種別=9ならビットマスク値です。 +1されている場合は描画終了(DrawIdle)を待ちません。 返されたアドレスを使って直接描画できます。

AhiSurfUnlock(Ctx*, Surf*)

何もしません。

AhiDrawSurfSrcSet, AhiDrawSurfDstSet(Ctx*, Surf*, int plane)

Ctxに描画対象サーフェスをセットします。 planeは0か、種別=9ならビットマスク値を指定します。

AhiDrawRopSet(Ctx*, int rop)

CtxにROP(ラスターオペレーションコード)をセットします。 0xccccで通常のコピーです。

AhiDrawIdle(Ctx*, int 0)

描画終了まで待ちます。

AhiDrawBitBlt(Ctx*, int dstrect[4], int srcpos[2])

BitBltします。rectは左上右下、posは左上です。 種別=9同士の各成分毎のコピーも可能です。
#define ATI(A) (*(int(*)(...))GetProcAddress(ati_dll, A))
HINSTANCE ati_dll= LoadLibrary(L"ace_ddi.dll");
ATI(L"AhiInit")(0x11);
void* asic;
char info[0x14c];
ATI(L"AhiDevEnum")(&asic, info, 0);
void* ctx;
ATI(L"AhiDevOpen")(&ctx, asic, "test", 0);
void* disp;
ATI(L"AhiDispSurfGet")(ctx, &disp);
void* surf;
int siz[2]= {256,256};
ATI(L"AhiSurfAlloc")(ctx, &surf, siz, 5, 0);
WORD* pix;
ATI(L"AhiSurfLock")(ctx, surf, &pix, 0);
for(int i= 0; i<256*256; i++) pix[i]= i;
ATI(L"AhiDrawSurfSrcSet")(ctx, surf, 0);
ATI(L"AhiDrawSurfDstSet")(ctx, disp, 0);
ATI(L"AhiDrawRopSet")(ctx, 0xcccc);
int pos[2]= {0,0};
int rect[4]= {10,10,10+256,10+256};
ATI(L"AhiDrawBitBlt")(ctx, rect, pos);
ATI(L"AhiDrawIdle")(ctx, 0);
ATI(L"AhiSurfFree")(ctx, surf);
ATI(L"AhiDevClose")(ctx);

AhiDrawStretchBlt(Ctx*, int dstrect[4], int srcrect[4], int mode)

拡大縮小BitBltします。rectは左上右下です。modeは通常2、 4だとバイリニア補間しますが使えません。

AhiDrawRotateBlt(Ctx*, int dstrect[4], int srcpos[2], int rot, int mir)

回転BitBltします。dstrectは左上右下、srcposは常にsrcでの左上です。 mirでsrcを+1で上下、+2で左右に反転した後、rotの0123で∪→∪⊂∩⊃と回転します。

AhiIDCTOpen(Ctx*, out IDctx**)

IDCT演算用のコンテキストをオープンします。 IDctx*はAsic*の一部で0x29bcバイトのstructです。 ここで使ったCtxは描画用には使えません。

AhiIDCTClose(IDctx*)

IDCT演算用コンテキストを閉じます。 システムで高々2つのコンテキストしかないのに IDCTOpenしたCtxを閉じても自動的に開放されません。

AhiIDCTPropSet(IDCtx*, int sel, const int* data, int datasize=4)

プロパティを設定します。
sel=0はジグザグスキャン、 0(デフォルト)でx0y0(DC)-x1y0-x0y1-x0y2-x1y1-x2y0…、 1でx0y0(DC)-x1y0-x2y0-x3y0-x0y1-…、 2でx0y0(DC)-x0y1-x0y2-x0y3-x1y0-…です。
sel=2はIDCT8x8の基底値、1(デフォルト)で0x80、0で0x00です。
sel=4は現在のフレーム番号(frameNum)を設定します。

AhiIDCTPropGet(IDCtx*, int sel, out int* data, int datasize=4)

プロパティを取得します。

AhiIDCTFrameStart(IDCtx*, Surf* dst, Surf* back, Surf* fwd, int frameNum)

FrameStart→macroBlocks*( 6*(IDCT8x8 か MComp8x8) か MComp )→FrameEndで1枚の画像をデコードします。 dstは出力サーフェスで種別=9(YCbCr)でなければなりません。 back、fwdには0か、MCompを用いる場合は種別=9を渡します。 frameNumはPropSetで設定した値か、直前のFrameEndの次の番号です。

AhiIDCTFrameEnd(IDCtx*, int frameNum)

1枚のデコードを終了します。frameNumはFrameStartに渡した値と同じにします。 指定されなかったマクロブロックの内容は前のままです。
結果のYCbCr→RGBへの変換関数は不明ですが、 YCbCrを直接オーバレイとして表示できます。 これも描画系の関数なので、デコード結果を直接サーフェスから読み出す場合は DrawIdleで待ち合わせてから行います。

AhiIDCT8x8(IDCtx*, strcut data*, int len, int macroNum)

逆離散コサイン演算します。 1マクロブロックのデコードには、Y左上、Y右上、Y左下、Y右下、Cb、Crの6回、 必ず同じmacroNumで呼び出します。 macroNumは左上16x16が0でその右隣が1…です。
struct data { char skip3, skip2, skip1, skip0; short data1, data0, data3, data2; }の12バイトのデータの配列で、この数(0〜16)をlenに渡します。
DCTのジグザグスキャンした元データ、 x0y0(DC)、x1y0、x0y1、x0y2、x1y1、x2y0… のうち、 skipには0の連続数をセットし、dataに0以外の値をセットしていきます。 終わりはlenまでか、skipを残り0xffにします。
例えばx0y0(DC)=100、x0y2=-200、他の成分=0の場合は、len=1、 data={ 0xff,0xff,2,0, -200,100,0,0 }を渡します。
倍率はDCで1/8で、それ以外は√2/8、出力の基底値は0x80です。

AhiIDCTMComp8x8(IDCtx*, struct data*, int len, short back[2], short fwd[2], int macroNum)

IDCT8x8の代わりに呼び出し、動き補償及びIDCTから当該成分を作成します。 back、fwdはdx,dyの1/4ピクセル単位の配列か、NULLです。 正でback画像等を左上方向へ移動します。CbCrに関しては半分の値を指定します。

AhiIDCTMComp(IDCtx*, short back[2], short fwd[2], int macroNum)

動き補償ベクトルから当該マクロブロックすべてのブロック成分を作成します。 この関数は6回呼び出す必要はありません。 CbCrにも同じ移動量を適用してしまうというバグのため、 移動量=0の単純コピーにしか使えません。

AhiDispOverlaySurf(Ctx*, Surf*, int param[13], int mode)

オーバレイサーフェスを設定します。 Sig3で正常に表示できるのは種別=9のYCbCrサーフェスです。 modeは0か1で色空間の指定(YCbCr/YUV)だと思いますが不明です。 paramは、{ dstleft, top, right, bottom, srcleft, top, right, bottom, chromakey, chromask, rot, mir, 0 }です。 1、2、4倍拡大表示が可能です。 rot、mirはRotateBltのそれと同じですが、 種別=9ではmirのみ指定できます。 ベース画面のピクセル値とchromaskとのandがchromakeyと等しいところのみ オーバレイ表示されますので、chromask=0で全部が表示されます。

AhiDispOverlayPos(Ctx*, int dstrect[4])

オーバレイ表示位置を設定します。dstrectは左上右下です。

AhiDispOverlayState(Ctx*, int disp)

オーバレイ表示を設定します。disp=1で表示、0で非表示です。