2012-04-24 14 views
1

レンダスクリプトにいくつかのより大きなビデオコーデックを移植します。私はlibx264を移植して、生のH.264ストリームにエンコードするように管理しています。私は、CILを使ってライブラリをマージし、グローバルを静的にし、Androids自身のlibc文字列といくつかのstdio関数(マージ)と、あらかじめ割り当てられたバッファを使うヒープ割り当て関数を移植することでそれを行いました。レンダスクリプトの可変引数リスト

今、libvpxを移植します。このライブラリは、libx264よりも多くの中心的な機能に可変引数を使用しています(基本的に、libx264でコメントする必要があったのは、残りのロギングは正しく設定されていました。

私の質問は、どのようにレンダスクリプトで静的関数の可変引数リストを使用する方法のヒントを誰も持っていますか? Googleは、RenderscriptはC99に準拠しているため、何らかの方法で可能でなければならないと述べています。誰かがこれについてのハックの提案を持っているなら、それが現在サポートされていないかどうかを知らせてください。

/ハラルド

答えて

0

あなたのSDKディレクトリで、あなたはヘッダーSTDARG.Hが、実際に./android-sdks/platform-tools/renderscript/clang-include/stdarg.hに含まれていることを見つけることができます。あなたが普通のインクルードステートメントと一緒に追加すると、

#include "stdarg.h" 

とコンパイラがあなたの話を理解しているようです。私はコンパイルを超えてこれをテストする実用的な方法はありません。

[編集] Windowsで「llvm-rs-cc.exeが動作を停止しました」というメッセージが表示されました。コンソールからのスタックダンプは、私がvarargsがコンパイルされるかどうかを調べるために追加したサンプル関数を解析するときに失敗したと言います。ここにスタックダンプがあります。コンパイラは毎回クラッシュします。私の推測では、理論的にはサポートされているが、コンパイラはそれを適切に処理しないということだ。機能を削除することが、含まヘッダを出た後、次のことが(クラッシュせずに)コンソールにそれを作る

Stack dump: 
0. engine.rs:882:32: current parser token ';' 
1. engine.rs:876:1: parsing function body 'average' 
2. engine.rs:876:1: in compound statement ('{}') 

C:\android-sdks\platform-tools\renderscript\clang-include\stdarg.h:30:9: error: unknown type name '__builtin_va_list' 
C:\android-sdks\platform-tools\renderscript\clang-include\stdarg.h:48:9: error: unknown type name '__builtin_va_list' 
+0

おかげで、その約限り私も得るようです。 __builtin_va_ *関数を処理して* = {start、end、arg、list}と入力するのを忘れてしまったようです。非常にターゲットに依存しているので、これを行うことは容易ではないことが分かっています。例えば、__builtin_va_startは "..."の直前の変数を入力として受け取ります。これがスタック上にあり、スタックがどの方向に成長するかを知っていれば、これを使って最初のargへのポインタを得ることができますが、それはターゲットとコンパイラによって異なります。通常、いくつかの引数はレジスタに渡されます。しかし、私は、LLVM IR /ビットコードがこれに関するいくつかの情報を持っていると仮定します。 –

+0

はい。 RenderScriptはまだ非常に初期段階です。ドキュメントが指摘しているように、意図された目標は、多くの異なるプロセッサタイプで実行されるようにすることです。ターゲットに依存するターゲットを使用すると、達成するのが非常に難しい可能性があります。 Googleは、コードがすべてのターゲットで実行されることを保証できないため、特定の機能が既に組み込まれていないことを指摘しています。おそらく、環境が成長するにつれて、この機能が追加されますが、少なくとも今のところは可能性はありません。 – Jared

関連する問題