このクラスの関数はアプリケーションまたは他のnodeからは呼び出されません。buffer consumerを制御し情報を得るために、Media Kitから排他的に呼び出されます。
BBufferConsumerはcertain_inputを発行します。それはmedia_destination構造体によって識別され、クライアントアプリケーションによって接続が要求されます。
Hook Functions
Constructor and Destructor
BBufferConsumer()
protected:
|
|
|
BBufferConsumer(media_type consumerType)
| |
BBufferConsumerのコンストラクタ。BBufferConsumerが受け入れるデータの型をconsumerType に指定します。
|
|
BeOS Release 4.5.2及びそれ以前のconsumerTypeはデフォルト値を持っています。現在は違います。今後は、media typeを実際に指定しなければなりません。
|
|
~BBufferConsumer
protected:
BBufferConsumerのデストラクタ。consumer nodeが必要とする終了時の動作を扱うために、これを増やすことができます。
もしnodeが生成され、任意のproducerに対してBBufferGroupを設定するならば、それらをデストラクタ中で削除して下さい。
Member Functions
AcceptFormat()
|
|
|
virtual status_t AcceptFormat(const media_destination &destination,
media_format *format) = 0
| |
指定されたformatが指定されたdestinationに対して妥当であるかチェックし、あなたのBBufferConsumerが持つ特定の要求に対するワイルドカードフィールドを満たすように、このフック関数を実装して下さい。
もしformatが妥当でなければ(あるいはdestとして不適当なクラスであれば)、B_MEDIA_BAD_FORMATを返します。
AcceptFormat()がB_OKを返すとき、Media Kitは、フォーマットの不適合による失敗なしに、指定されたformatによるdestinationへの接続が要求されると予想します。
|
|
フォーマットに関して上流のproducerに問い合わせないで下さい。producerは同期的にあなたの反応を待ち、それはデッドロックの原因となります。
|
|
BufferReceived()
protected:
|
|
|
virtual void BufferReceived(BBuffer *buffer) = 0
| |
BBufferProducerがBBufferConsumerの入力の一つにバッファを送ったとき、バッファは結局ここ、(HandleMessage()によって通常最初にディスパッチされる)BufferReceived()関数に辿り着きます。
内部的なキューの再生を行うためにbufferを追加したり、あるいはなんであれバッファを消費する必要がある場合、このフック関数をオーバーライドして下さい。もしBBufferProducer及びBBufferConsumerの両方を実装した場合、bufferのデータを検証して改変した後、なにか他のものにそれを送るためBBufferProducer::SendBuffer()を呼び出します。
bufferの内容とtiming要求に関する情報は、バッファのBBuffer::Header()を呼び出すことで得られます。
|
|
もしあなたがnodeを書いて、バッファにB_SMALL_BUFFERフラグをセットするなら、関数が戻る前にバッファを再利用(recycle)しなければなりません。
|
|
Connected()
protected:
|
|
|
virtual status_t Connected(const media_source &source,
const media_destination &destination,
const media_format *format,
media_input *outInput) = 0
| |
このフック関数は、指定されたsource producerからdestinationの入力へ接続が確立される時に呼び出されます。接続は指定されたformat(以前にAcceptFormat()経由で受け取ったもの)によって形作られます。
Connected()には、接続のデータ入力を扱うのに必要となる準備を全て実装し、またoutInputバッファをnodeの視点による接続の情報で埋めるよう実装して下さい。もしdestinationが接続の交渉に使用され、その後実際のデータストリームを扱う新しい入力を作りだす様な接続を確立している広域の入力なら、destinationとは異ったoutInputフィールドを設定することができます。
|
|
BBufferConsumerにはすでに指定されたformatを拒絶する機会が与えられているため、この関数でエラーを返すのは貧弱なやり方です。エラーを返すのは、接続を確立するのに必要なリソースがConnected()の呼び出しより前に使用できなくなった場合だけにして下さい。
|
|
エントリでは、outInputの name fieldには、producerによって接続に与えられた名前が収められています(もしproducerが名前を割り当てていなければ、空の文字列となります)。名付けられていない接続があることは悪いことであり、またproducerがこれに書込むという保証がないため、consumerは常に正しい名前があることを確認しなければなりません。もし接続がよい、記述可能な名前を持っていなければ、名前は最小限、(「MyNode Input 1」や「MyNode Output 3」といった)接続の名前をユニークにするnodeの名前と番号を含むべきです。
もし指定されたBBufferGroupを使用するproducerが必要であれば(例えば、もしvideo producerが必要ならBDirectWindowを満たすような)、ここでBBufferGroupを作成し、producerのバッファグループを設定するためにBMediaRoster::SetOutputBuffersFor()を呼び出して下さい :
BBufferGroup *buffers = new BBufferGroup;
BMediaRoster::Roster()->SetOutputBuffersFor(producer, buffers);
もし接続が安全に開始されたならB_OKを返し、そうでなければ適切なエラーコードを返して下さい。
ConsumerType()
|
|
|
media_type ConsumerType(const void)
| |
Returns the type of media the BBufferConsumer consumes.
Disconnected()
protected:
|
|
|
virtual void Disconnected(const media_source &producer,
const media_destination &whichInput) = 0
| |
このフック関数は、接続が終了する時に呼び出されます。将来whichInputによって示されるmedia_inputに接続されたmedia_sourceの問い合わせがmedia_source::nullを参照すると保証するために必要なことを全て実装して下さい(または、もし後に他の接続がその入力に確立されたら、そのproducerを)。
もしconsumer nodeがproducerに対してBBufferGroupを生成して設定するならば、ここでそれを削除または改善しないで下さい。なぜなら、producerは、同じバッファを参照するBBufferGroupの複製を持っているからです。つまり、BBufferGroupを削除すると、これらのバッファが自由になり、producerがデッドロックの状態に置かれます。そうする代りに、デストラクタ中でConnected()が再度呼び出されたときにそれを削除し、かならず残りのBBufferGroupを削除して下さい。
DisposeInputCookie()
protected:
|
|
|
virtual void DisposeInputCookie(int32 cookie) = 0
| |
もしGetNextInput()で返されるcookieの値が、反復処理が完了する際に削除を必要とするオブジェクトのポインタであれば、かならずそれを行うためにDisposeInputCookie()を実装して下さい。
RequestFormatChange()
GetLatencyFor()
protected:
|
|
|
virtual status_t GetLatencyFor(const media_destination &forWhom,
bigtime_t *outLatency,
media_node_id *outTimeSource) = 0
| |
forWhomで指定されるmedia_destinationのlatency(遅延時間)の合計を計算し、その結果をoutLatencyに入れるには、このフック関数を実装して下さい。そして、outTimeSourceにはnodeが従属するtime sourceを返して下さい。
もしnodeがBBufferProducerをBBufferConsumerと同様にRequestFormatChange()されたら、計算済みのlatencyに対して同じtime sourceに従属し、下流に存在する指定された任意の接続の遅延時間を含めて下さい。
もしlatencyの計算がうまくいけばB_OKを返し、そうでなければ適切なエラーを返して下さい。
GetNextInput()
|
|
|
virtual status_t GetNextInput(int32 *cookie, media_input *outInput) = 0
| |
最初にクライアントがこの関数を呼び出すとき、cookieによって示される値は0です。outInputによってポインタの示されるバッファに最初の入力に関する情報を格納し、cookieの値を、次回GetNextInput()が呼び出された時に何が返されるか追跡できる(ゼロ以外の)なんらかの値を設定して下さい。
GetNextInput()を連続して呼び出すと、cookieに、最後にそのクライアントによって関数が呼び出された際にcookieに返した値が返されます。outInputに次の入力に関する情報を収め、入力を通して進行の追跡を継続するためにcookieに新しい値を入れて下さい。
|
|
この関数がcookieがゼロの値で呼び出されたときはいつでも、最初の入力から開始しなければなりません。
|
|
最後の入力に辿り着いた時、もう入力がないことを示すためにB_BAD_INDEXを返して下さい。
HandleMessage()
protected:
|
|
|
virtual status_t HandleMessage(int32 message, const void *data, size_t size)
| |
BBufferConsumerから派生しているnodeが制御ポートにメッセージを受け取ったら、BBufferConsumer::HandleMessage()を呼び出してディスパッチを試みて下さい。もしBBufferConsumerがそのメッセージを理解できなければB_ERRORを返すか、nodeが派生している他のクラスのためにディスパッチを試みるか、あるいはそれを自分自身で扱うことができます。
もしこの関数がB_OKを返したら、メッセージは取り扱われたことになります。
こちらもご覧下さい: BMediaNode::HandleMessage(), "About Multiple Virtual Inheritance"の21ページ目
NotifyLateProducer()
static:
|
|
|
void NotifyLateProducer(const media_source &source, bigtime_t howLate,
bigtime_t performanceTime)
| |
howLateマイクロ秒遅れて動作し、sourceによって指定されるBBufferProducerを通知します。通知は指定されたperformanceTimeの調子を整えます。データの到着が遅くなりすぎていることを検知し、実行モード(run mode)がB_DECREASE_PRECISION、B_INCREASE_LATENCYまたはB_DROP_DATA(いずれも適切な時間を維持するためにメディアの再生を調節することが許されている)の時、この関数を呼び出して下さい。
producerは、この通知を直ちに処理し、適切な動作を取るべきです。
ProducerDataStatus()
protected:
|
|
|
virtual void ProducerDataStatus(const media_destination &destination,
int32 status, bigtime_t atPerformanceTime) = 0
| |
このフック関数は、入力であるdestinationに接続されたproducerからのバッファの能力の変化をconsumerに報告するために呼び出されます。引数statusはどんな変更が生じたかを指定し、atPerformanceTimeはいつ変化が起こったか(あるいはいつ起こるか)を示します。
これによって、データを待っている入力がバッファの追跡を維持できるようにします。例えば、もしconsumerが4つのproducerから到着したデータを処理しており、そのうちの一つがconsumerに対してバッファの送信を停止したとすると、停止したproducerはもはやバッファを待つ必要がないということをconsumerに知らせるためにProducerDataStatus()を呼び出します。この方法により、consumerは他の3つの入力からバッファがいつ到着するかを知り、バッファの処理を開始することができます。
Constant |
Meaning |
B_DATA_NOT_AVAILABLE |
producerが使用可能なデータを全く持っていない。 |
B_DATA_AVAILABLE |
producerが使用可能なデータを持っている。 |
B_PRODUCER_STOPPED |
producerは停止した。 |
RegionToClipData()
protected:
|
|
|
static status_t RegionToClipData(const BRegion *region, int32 *format,
int32 *ioSize, void *data)
| |
BRegionを、Media Kitで内部的に使用されるクリッピングフォーマットに変換します。RegionToClipData()を呼ぶより前に、dataポインタによって指定されるバッファのサイズにioSizeが設定されます。戻る際には、formatがクリップされているデータのフォーマットになり、ioSizeが返されたデータの実際のバイト長に変更され、そしてdataには実際のクリッピングデータが格納されます。
クリップされたデータのフォーマットは、セクション "Video Clipping"の85ページに記載されています。
RETURN CODES
B_OK.
クリップされたデータがエラーなしに返された。
こちらもご覧下さい: "Video Clipping" 85ページ目
RequestAdditionalBuffer()
protected:
|
|
|
status_t RequestAdditionalBuffer(const media_source &source,
BBuffer *previousBuffer,
void *_reserved_ = NULL)
|
status_t RequestAdditionalBuffer(const media_source &source,
bigtime_t startTime,
void *_reserved_ = NULL)
| |
sourceによって指定される上流のproducerに対して、適切な時間まで待つかわりに、直ちに次のバッファを送るよう要請します。この関数が最も明確に使用されるのは、出力のフレームをデコードするために、codecが複数のバッファを要求する場合です(MPEGがよい例です)。
要求されたバッファは、バッファが要求された時間を示すstartTimeパラメータでも、要求されているバッファより以前のバッファを指定するpreviousBufferでも識別することができます。
この関数は、producerのAdditionalBufferRequested()関数が呼ばれる原因となります。
RETURN CODES
B_OK.
変更の要求はうまくいった。
RequestFormatChange
,
FormatChanged()
protected:
|
|
|
status_t RequestFormatChange(const media_source &source,
const media_destination &destination,
media_format &toFormat,
void *userData,
int32 *changeTag,
void *_reserved_ = NULL)
|
virtual status_t FormatChanged(const media_source &source,
const media_destination &destination,
int32 changeTag,
media_format &newFormat) = 0
| |
RequestFormatChange()は、consumer destinationに接続しているproducer sourceに対して、それが提供するフォーマットをtoFormatで指定されるフォーマットに変更するよう要求します。Media Kitは、変更が有効になる際にRequestCompleted()が受け取るタグの値をchangeTagに返します。つまり変更タグはこの要求によって、RequestCompleted()呼び出しをうまく調和させます。この関数は、userData及びchangeTagによって示されるmedia_request_infoを受け取ります。
FormatChanged()は、nodeが変更を受け取っているメディアフォーマットに変化が生じた際、上流のproducerによって呼び出されます。そしてnewFormatに新しいフォーマットを、changeTagに新しいフォーマットが有効になる変更タグの値を示します。
|
|
FormatChanged()がproducerによって呼び出されるため、新しいフォーマットが受け入れられるかどうかを尋ねる必要はありません。
|
|
もしフォーマットの変化が不可能であれば、FormatChanged()から適切なエラーが返されます。このエラーは、新しいフォーマットの交渉を最初に行ったproducerに返されます。
RETURN CODES
B_OK.
エラーなし。
SeekTagRequested()
protected:
|
|
|
virtual status_t SeekTagRequested(const media_destination &destination,
bigtime_t inTargetTime, uint32 inFlags,
media_seek_tag *outSeekTag, bigtime_t *outTaggedTime,
uint32 *outFlags)
| |
この関数は、タイミング情報を供給しない外部のカプセル化されたレイヤーのメディアフォーマットのサポートを援助するために提供されます。producerはseekタグによって生成されるバッファにタグをつけます。これらのタグは、メディアデータのキーフレームを見つけだすために使用できます。
performance timeでseekタグを協調させることはconsumerの仕事です。consumerは、入ってきたバッファをそれぞれ処理しつつ、(バッファにタグがあれば)seekタグと、それが起こったperformance timeをキャッシュします。producerがseekタグ及びそれに対応する与えられたperformance timeに最も近い時間を知る必要がある時、この関数はその情報を返すことで反応します。
RETURN CODES
B_OK.
エラーなし。
こちらもご覧下さい: "Seek Tags"
SendLatencyChange()
protected:
|
|
|
status_t SendLatencyChange(const media_source &source,
media_destination &destination,
bigtime_t newLatency,
uint32 flags = 0)
| |
上流のproducerに、consumer nodeのlatencyが変更になったことを知らせます。newLatencyは、新しいlatencyをマイクロ秒単位で示します。flagsは現在のところ使用されておらず、常に0となります。
latencyが変化する原因となるなにかが起こったときは、かならずこの関数を呼び出して下さい。
RETURN CODES
B_OK.
エラーなし。
SetOutputBuffersFor()
protected:
|
|
|
status_t SetOutputBuffersFor(const media_source &source,
const media_destination &destination,
BBufferGroup *group,
void *userData,
int32 *changeTag,
bool willReclaim = false,
void *_reserved_ = NULL)
| |
sourceとdestinationとの間の接続のためのバッファを供給するBBufferGroup groupを指定します。もしwillReclaimがfalseなら、Media Kitはそのグループを処分します。つまり一旦この呼び出しが返ったら、そのことを忘れてよいのです。trueなら、グループを取り戻したり、それを使い終わったら削除したりすることを、Media Serverに対して報告します。
Media Kitは、一旦変更が有効になったら、RequestCompleted()関数によって受け取られるタグの値を、changeTagに返します。変更タグによって、この要求とRequestCompleted()呼び出しを協調させることができます。この関数は、指定されたuserData及びchangeTagとともにmedia_request_info構造体を受け取ります。
特定のバッファが特別な出力によって使用されるように要求する能力によって、不必要な複製を演奏する必要がなくなります。例えば、グラフィックカードのフレームバッファを表すBBufferを使用することにより、video producerの出力をビデオメモリに直接描画できるようになります。
|
|
バッファを再要求する前に、Media Kitに対して、producerにはもはやそれらを使用する許可がないことを知らせるために、必ずSetOutputBuffersFor(output, NULL)を呼び出して下さい。もしこのステップを忘れたら、producerはそれが削除されるまでバッファの上を彷徨うことになります。そしてBMediaRoster::ReclaimAllBuffers()呼び出しは、ひょっとしたら永遠に彷徨うことになるかも知れません。
|
|
RETURN CODES
B_OK.
変更は問題なく要求された。
SetOutputEnabled()
protected:
|
|
|
static status_t SetOutputEnabled(const media_source &source,
const media_destination &destination,
bool enabled,
void *userData,
int32 *changeTag,
void *_reserved_ = NULL)
| |
指定されたoutputが、destinationにバッファを送るかどうか指定します。もしenabledがtrueなら、producerはバッファを送出します。そうでなければ、送出しません。
Media Kitは、一旦変更が有効になるとRequestCompleted()関数によって受け取られるタグの値を、changeTagに返します。変更タグは、この要求とRequestCompleted()の呼び出しを協調させます。この関数は、指定されたuserData及びchangeTagとともにmedia_request_info構造体を受け取ります。
RETURN CODES
B_OK.
変更は問題なく要求された。
SetVideoClippingFor()
protected:
|
|
|
status_t SetVideoClippingFor(const media_source &output,
const media_destination &destination,
const int16 *shortsList,
int32 shortCount,
const media_video_display_info &display,
void *userData,
int32 *changeTag,
void *_reserved_ = NULL)
| |
この関数は、指定されたoutputにより、指定されたdestinationに送出されるビデオバッファが、shortsList及びshortCountによって記述されるクリッピング領域に、BBufferConsumerに送られるバッファに書かれたもの全てをクリップするよう要求します。
Media Kitは、一旦変更が有効になるとRequestCompleted()関数によって受け取られるタグの値を、changeTagに返します。変更タグは、この要求とRequestCompleted()の呼び出しを協調させます。この関数は、指定されたuserData及びchangeTagとともにmedia_request_info構造体を受け取ります。
displayに参照されるmedia_video_display_info構造体は、色空間(color space)、解像度などを記述します。
RETURN CODES
B_OK.
クリッピング要求は、エラーなしに送信された。
こちらもご覧下さい: "Video Clipping" 85ページ目
|