(57)【特許請求の範囲】
【請求項１】
ホスト型アプリケーションプラットフォームにおいて拡張可能なメディア形式を扱うため、コンピュータによって実行される方法であって、前記方法は、
前記コンピュータ上の少なくとも１つのプロセッサが、前記ホスト型アプリケーションプラットフォームによる実行のためのホスト型アプリケーションを受信するステップであって、前記ホスト型アプリケーションは、メディアを再生する前記ホスト型アプリケーションプラットフォームと対話するように構成される、ステップと、
前記プロセッサが、前記ホスト型アプリケーションを起動するステップであって、前記ホスト型アプリケーションプラットフォームは、コンピュータのシステムへの前記ホスト型アプリケーションのアクセスを制限するように、前記ホスト型アプリケーションのコードを実行サンドボックス内で実行させ、前記実行サンドボックスは、前記ホスト型アプリケーションに対し、前記メディアを復元するのに十分な前記コンピュータのシステムへのアクセスは提供するが、前記コンピュータのシステムに対する直接アクセスは提供しない、ステップと、
前記プロセッサが、前記ホスト型アプリケーションにメディアを要求するステップと、
前記プロセッサが、前記ホスト型アプリケーションから圧縮されていないメディアを受信するステップであって、当該圧縮されていないメディアは、前記ホスト型アプリケーションが前記ホスト型アプリケーションプラットフォームによって理解されない形式のメディアを受信し、前記実行サンドボックス内において前記ホスト型アプリケーションのコーデックを使用することによって、前記ホスト型アプリケーションプラットフォームが再生することができるメディアの形式に復元され、前記復元されたメディアに対して後処理のエフェクトが適用されている、ステップと、
前記プロセッサが、前記ホスト型アプリケーションプラットフォームの制御内において利用可能なハードウェアを使用して、前記圧縮されていないメディアを再生またはレンダリングするステップと
備える、方法。
【請求項２】
前記圧縮されていないメディアを受信するステップは、前記ホスト型アプリケーションから、前記ホスト型アプリケーションプラットフォームがメディアの形式をさらに復号することなく再生することができる、復号された形式のメディアを受信することを含む、請求項１に記載の方法。
【請求項３】
アプリケーションとホスティングプラットフォームとの間で通信を行い、前記アプリケーションを実行し、１または複数の圧縮された形式のメディアを再生またはキャプチャするコンピュータシステムであって、
ソフトウェア命令を実行するよう構成されるプロセッサおよびメモリと、
前記ホスティングプラットフォーム内でアプリケーションコードをロードおよび起動する起動アプリケーションコンポーネントと、
前記アプリケーションが実行可能なアクションを当該コンピュータシステムに有害ではない安全なアクションのセットに制限する実行サンドボックスを提供する実行サンドボックスコンポーネントであって、前記アプリケーションが、当該コンピュータシステムの前記実行サンドボックスの外側にアクセスしないように、前記アプリケーションのコードを前記実行サンドボックス内で実行させ、前記アクションは、前記実行サンドボックス内において前記アプリケーションのコーデックを使用することによって、前記メディアを、前記ホスティングプラットフォームにより再生可能な圧縮されていない形式に復元することを含む、実行サンドボックスコンポーネントと、
前記アプリケーションに、圧縮されていないメディアを前記ホスティングプラットフォームに提供させるためのアプリケーションプログラミングインタフェース（ＡＰＩ）を提供する、未加工メディアインターフェースコンポーネントと、
前記ホスティングプラットフォームの制御下において、前記圧縮されていないメディアをレンダリングするよう構成される、メディア再生コンポーネントと、
前記メディア再生コンポーネントから前記圧縮されていないメディアを受信し、当該コンピュータシステムのコンピュータハードウェア上で再生するハードウェアインターフェースコンポーネントであって、前記復元されたメディアに対して後処理のエフェクトが適用されており、前記アプリケーションは、前記メディアを復元するのに十分な前記コンピュータシステムへのアクセスは有するが、前記コンピュータシステムの前記コンピュータハードウェアに対する直接アクセスは有さず、前記ホスティングプラットフォームを介して前記コンピュータハードウェアに間接的にアクセスする、ハードウェアインターフェースコンポーネントと
を備える、システム。
【請求項４】
前記起動アプリケーションコンポーネントは、ネットワークサーバから、前記アプリケーションとともに、所与の形式のメディアデータを処理する前記コーデックをダウンロードする、請求項３に記載のシステム。
【請求項５】
前記実行サンドボックスコンポーネントは、前記アプリケーションが起動してメディアデータを復元することができる、１または複数の登録済みのコーデックを前記実行サンドボックス内に提供するようさらに構成され、前記登録済みのコーデックは、メディア型に対するサポートを追加するのに前記ホスティングプラットフォームを更新する必要なく更新される、請求項３に記載のシステム。
【請求項６】
前記未加工メディアインターフェースコンポーネントは、前記アプリケーションから、圧縮されていないメディアコンテンツを受信し、前記アプリケーションは、当該メディアコンテンツを後処理してエフェクトを適用し、当該後処理のエフェクトが適用されたメディアコンテンツを、前記圧縮されていないメディアコンテンツとして前記未加工メディアインターフェースコンポーネントに提供し、前記後処理のエフェクトは、映像の再生速度を変更すること、映像の背景又は色を修正すること、映像のオーバレイを追加すること、音声にエコーを追加することのうちの少なくとも１つを含む、請求項３に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、拡張可能なメディア形式を持つホスト型アプリケーションプラットフォームに関する。
【背景技術】
【０００２】
現代のブラウザおよび他のアプリケーションではプラグインが可能にされ、プラグインは一般に、ホスティングブラウザ／アプリケーションと相互作用して追加の機能性を提供するホスト型ソフトウェアコードを備える。プラグインを使用する理由の１つは、セキュリティの向上のためであり、何故ならホスティングブラウザは、ホスト型コード（一般に信頼性が無い）が実行可能なアクションを制限するからである。インターネットは非常に危険なものになっており、ユーザのコンピュータシステムに損傷を与えたり、ユーザのデータを破壊したりする有害なコードを、頻繁にユーザにダウンロードさせ実行させようとする悪意のあるウェブサイトが含まれる。従って、ウェブブラウザは、実行可能なコードと、ユーザのコンピュータシステム上でアクションを実行することが許可されるプラグインと、に対して制限を与えることを含むことが多い。プラグインは、ブラウザにより提供されるサンドボックスの大きさを増大させるが、これは、プラグインがウェブにより多くの機能性を与え、一方で信頼性の無いアプリケーションがインストールされる数を減らすからである。そのようなプラグインの１つに、Microsoft（登録商標）社のSilverlight（商標）があり、これにより、典型的には、アニメーション、ベクタグラフィックス、および／または、メディア（例えば、音声／映像）コンテンツの再生を含む、ブラウザ内でホストされるリッチなウェブアプリケーションをアプリケーションの開発者が作成することを可能にするプラットフォームが提供される。別の例のプラグインには、ＡＤＯＢＥ（登録商標）社のＦｌａｓｈ（商標）がある。
【０００３】
一般に、メディアを再生するために、プラットフォームは、ホスト型アプリケーションのコードが呼び出すアプリケーションプログラミングインターフェース（ＡＰＩ）を提供して、例えば、メディアコンテンツをパッケージ化するサーバ上のファイルまたは他のコンテナを識別するＵＲＬ（Uniform Resource Locator）を特定することにより、特定のメディアコンテンツが記憶される場所を特定する。そして、プラットフォームは、ネットワーク要求を生成してメディアのダウンロードを開始させる。プラットフォームは、メディアコンテンツをアンパックすることにより解析しメディアコンテンツストリームを展開して、これを再生用にメディアパイプラインに提供する。マイクロソフト（登録商標）社のシルバーライト（商標）は、他のプラットフォームと同様に、サポートされる形式の組み合わせを含有するファイルをアプリケーションにダウンロードまたはストリーミングさせることを可能にすることにより、映像および音声を様々な形式（ＷＭＶ、ＷＭＡ、ＭＰ３、Ｈ．２６４、ＡＡＣ）で再生する機能性を提供する。音声および映像の許可される形式のタイプは拡張可能ではなく、サポートされる形式の１つへの変換を実行することは、資源集約的である。
【０００４】
残念ながら、上述したように、そのようなプラットフォームは典型的には、プラットフォーム設計者により見込まれる１またはそれより多くの既知の形式のメディアコンテンツを再生することに限定される。例えば、プラットフォームは、ＭＰＥＧ４もしくはＭＰ４（Motion Picture Experts Group Version ４）、ＤＩＶＸ、または他の形式等の特定のメディア型のためのコンプレッサ、およびデコンプレッサ（コーデック）を含むことができる。メディアコンテンツをさらに圧縮するために新しいアルゴリズムが発見され、メディアコンテンツに関連する追加の情報を伝達するために新しいシナリオが識別されるため、コーデックにおける急激な進化は普通のことである。従って、時間をかけて、プラットフォームは、時代遅れ、かつ、もはや一般的でない、または最も効果的であるわけではないメディア形式をサポートすることになる。プラットフォームの更新は典型的には、新しいメディア形式のサポートを追加する唯一の方法である。
【０００５】
加えて、プラットフォーム設計者は、各メディア形式のサポートを実装するために追加の作業をしなければならず、これにより、プラットフォームの実装が大きなものとなり、新しいメディア型の新しいサポートのプラットフォームへの追加の進み具合が遅くなる。いくつかのコーデックには特許されたものがあり、コーデックのプロバイダからコーデックのライセンスを受けずに、コーデックを使用するメディア型のサポートをプラットフォーム設計者が追加することはしようとしてもできない。アプリケーションがどのコーデックをプラットフォームで使用できるかについて、プラットフォームが頻繁に制御を発揮する理由の１つは、確実にセキュリティをするためである。コーデックは頻繁にコンピュータシステムのハードウェアと密接に相互作用して映像を表示し音声を再生し、ユーザのコンピュータシステムに有害なアクションを実行する可能性がある。現在のシステムは、広範囲なメディア型のサポートと引き換えにセキュリティを得る。さらに、ダウンロードの速度は、プラグインに対する頻繁に精査された測定基準であり、プラットフォームの大きさが増大すると、ダウンロードの速度が減少する。従って、プラットフォーム設計者は、より少ないメディア形式をサポートしてプラットフォームの大きさを小さく維持しようとする動機を有する可能性がある。
【発明の概要】
【０００６】
本明細書において、ホストのセキュリティを維持しながら、ホスト型アプリケーションが、メディアコンテンツの形式とは無関係にリッチなメディアコンテンツを消費および／または制作することが可能にするメディアインタラクションシステムについて記載される。メディアインタラクションシステムは、未加工の、圧縮されていないメディアデータをホスト型アプリケーションから受領し、ホスト型アプリケーションが、それ自身のコーデックを、コーデックが実行できるアクションを、信頼できるアクションのセットに制限する、サンドボックス化されたＡＰＩを通して提供できるようにする。メディアインタラクションシステムは、システムに提供されるアプリケーションを起動させる。アプリケーションは起動し、圧縮されたメディアデータをサーバからダウンロードし、または、メディアデータをオンザフライで生成することができる。メディアインタラクションシステムは、復元されたコードをアプリケーションが安全に実行させることが可能なサンドボックスを提供し、アプリケーションは、圧縮されたメディアデータを再生用の圧縮されていないデータに変換するコードを提供する。次に、アプリケーションは、圧縮されていないデータを再生用にシステムに提供する。従って、メディアインタラクションシステムは、リッチなメディアコンテンツをアプリケーションの開発者がサポートする任意の形式で提供し、およびユーザのコンピュータシステムのセキュリティを維持する。
【０００７】
この要約は、以下の「発明を実施するための形態」でさらに述べる概念を選択して簡略化した形式で紹介するために提供するものである。この要約は、特許請求の範囲の主題の重要な特徴または本質的な特徴を特定することを意図しておらず、特許請求の範囲を制限するものとして使用されることも意図していない。
【図面の簡単な説明】
【０００８】
【図１】一実施形態における、メディアインタラクションシステムのコンポーネントのブロック図を示す図である。
【図２】一実施形態における、メディアを再生するためのプラットフォームレベルでのシステムの処理のフロー図を示す図である。
【図３】一実施形態における、メディアを再生するためのアプリケーションレベルでのシステムの処理のフロー図を示す図である。
【図４】一実施形態における、メディアインタラクションシステムの動作環境のブロック図を示す図である。
【図５】一実施形態における、アプリケーションレベルのコードが抽象型から導き出される、より特別な例のブロック図を示す図である。
【図６】一実施形態における、図５の例に対応する再生のステップのフロー図を示す図である。
【図７】一実施形態における、カスタムコンテナの形式を扱うMediaStreamSourceのサブクラス化のデータフロー図を示す図である。
【発明を実施するための形態】
【０００９】
本明細書において、ホストのセキュリティを維持しながら、ホスト型アプリケーションが、メディアコンテンツの形式とは無関係にリッチなメディアコンテンツを消費および／または制作することを可能にするメディアインタラクションシステムについて記載される。メディアインタラクションシステムは、未加工の、圧縮されていないメディアデータをホスト型アプリケーションから受領し、ホスト型アプリケーションが、それ自身のコーデックを、コーデックが実行可能なアクションを信頼できるアクションのセットに制限する、サンドボックス化されたＡＰＩを通して提供できるようにする。メディアインタラクションシステムは、システムに提供されるアプリケーションを起動させる。例えば、ウェブページには、システムへの参照を埋め込んでも良いし、アプリケーションを特定するパラメータを含めることもできる。アプリケーションは起動し、圧縮されたメディアデータをサーバからダウンロードし、または、メディアデータをオンザフライで生成することができる。例えば、アプリケーションは、映像をインターネットベースのコンテンツサーバからダウンロードすること、または、ローカルな情報に基づき新しい映像を合成すること（例えば、音声ファイル内の拍子に基づく、音声の視覚化）ができる。メディアインタラクションシステムは、復元されたコードをアプリケーションが安全に実行させることができるサンドボックスを提供し、アプリケーションは、圧縮されたメディアデータを再生用の圧縮されていないデータに変換させるコードを提供する。次に、アプリケーションは、圧縮されていないデータを再生用にシステムに提供する。従って、メディアインタラクションシステムは、リッチなメディアコンテンツをアプリケーションの開発者がサポートする任意の形式で提供し、及びユーザのコンピュータシステムのセキュリティを維持する。
【００１０】
未加工のメディアデータは、典型的には圧縮されていない多数の型のメディアデータ、メディアパイプラインがさらなる復元や同様の処理をせずに再生する状態になっている共通の形式、とすることができる。例えば、ビデオデコーダは未加工のＹＶ１２フレームを出力することができ、またはオーディオデコーダはＰＣＭサンプルを出力することができる。メディアコンテンツは、様々な圧縮された、さもなければ符号化された形式（例えば、ＭＰ４またはＤＩＶＸ）でホスト型アプリケーションに到達し、ホスト型アプリケーションにより復元され、そして、再生する状態になっている共通の形式でメディアインタラクションシステムに提供されるものとすることができる。新しいメディア型に対する更新は、プラットフォームに対する更新をせずにアプリケーションを更新することにより生じうる。アプリケーションはまた、音声および映像のデータの制作を、直接組み立てることにより、または、既存の音声および映像のデータを処理する（例えば、効果を加える）ことにより行い、未加工のメディアデータを制作することができる。例えば、ゲームは、音響効果を「オンザフライ」で制作して音響データがインターネットを介して送信および受信されることを避けることができる。別の例として、アプリケーションは、グリーンスクリーンの前で撮影された映像を受け取り、その映像を処理してグリーンの背景を除去し異なる背景を動的に挿入することができる。いくつかのアプリケーションにおいては、プラットフォームは、プラットフォームがサポートする形式の圧縮された映像データおよび圧縮されていない音声データの受け取り、またはその逆を行うことができる。これらのタイプのシナリオは、既存のプラットフォーム上では困難または不可能であるが、メディアインタラクションシステムでは容易にサポートされる。
【００１１】
図１は、一実施形態における、メディアインタラクションシステムのコンポーネントを例示するブロック図である。メディアインタラクションシステム１００には、起動アプリケーションコンポーネント１１０、実行サンドボックスコンポーネント１２０、未加工メディアインターフェースコンポーネント１３０、要求メディアデータコンポーネント１４０、メディア再生コンポーネント１５０、および、ハードウェアインターフェースコンポーネント１６０、が含まれる。
【００１２】
起動アプリケーションコンポーネント１１０は、プラットフォーム内にアプリケーションコードをロードして起動させる。例えば、ウェブページは、プラットフォームを表すオブジェクト参照しても良く、また、プラットフォームが起動させることになるアプリケーションを特定する１つまたは複数のパラメータを含んでも良い。起動アプリケーションコンポーネントは、他のウェブベースのコンテンツのようなアプリケーションを、例えば、インターネット等のネットワーク上のサーバからダウンロードすることができる。例えば、Microsoft（登録商標）社のSilverlight（商標）は、アプリケーションの実行に有用な他のデータ（例えば、依存モジュール、メディアファイル、アプリケーションパラメータなど）を有するパッケージ化されたアプリケーションコード（例えば、ＸＡＰファイル）を受け取る。Microsoft（登録商標）社のInternetexplorer（商標）インターネットエクスプローラ「商標」等のウェブブラウザは、Microsoft（登録商標）社のSilverlight（商標）を起動させ、Microsoft（登録商標）社のSilverlight（商標）はアプリケーションを起動させる。
【００１３】
実行サンドボックスコンポーネント１２０は、アプリケーションが実行できるアクションを制限するアプリケーションコードのための実行環境を提供する。例えば、その環境では、ハードウェアリソース、ユーザのデータ、またはアプリケーションがアクセス可能な他の情報を制限することができる。実行サンドボックスコンポーネント１２０が、安全なサンドボックス内においてアプリケーションコードを実行させるので、ユーザは、そのコードが、サンドボックス内で実行していない任意のコードがなし得る悪意のある動作を行うことができないということを信用することができる。実行サンドボックスコンポーネント１２０を使用して、アプリケーションは、元来はアプリケーションプラットフォームによりサポートされないメディア型を処理するために、コーデックを実装または起動することができる。ネイティブコードを使用して実行するコーデックとは異なり、アプリケーションにより起動されるサンドボックス化されたコーデックは、ユーザのコンピュータシステムに対して害を及ぼすことができない。実行サンドボックスには、アプリケーションコードが実行できる制限された命令のセットまたはライブラリを含むことができ、また、アプリケーションコードを実行可能オブジェクトコードにコンパイルするＪＩＴ（Just in Time）コンパイルを含むことができ、アプリケーションコードが実行可能なアクションをシステム１００が管理することができるようにする。実行サンドボックスはまた、アプリケーションがオペレーティングシステムＡＰＩを呼び出し、種々の機能（例えば、ファイルへのアクセス、リモートサーバへの接続、構成設定へのアクセス、など）を実行するための、安全な方法を提供することができる。
【００１４】
未加工メディアインターフェースコンポーネント１３０は、プラットフォームが再生できる未加工の圧縮されていないメディアコンテンツを、アプリケーションがアプリケーションプラットフォームに提供することができるＡＰＩを提供する。圧縮されたメディアコンテンツをアプリケーションから受け取り、及びプラットフォームの内部のコーデックを使用してメディアコンテンツを圧縮されていない形式に復元する、上述のプラットフォームとは異なり、メディアインタラクションシステム１００では、圧縮されていないメディアコンテンツを再生用にアプリケーションプラットフォームに渡す前に、アプリケーションが任意の数の形式からメディアコンテンツを復元することを可能にする。このように、アプリケーションプラットフォームは、新しいメディア形式に対するサポートを制限せず、むしろ、アプリケーションが復元でき、及びプラットフォームに提供できる任意の形式をサポートする。加えて、復元は１度のみ行われるものであり、アプリケーションが１つのメディア形式を復元して次にメディアコンテンツをプラットフォームによりサポートされる第２のメディア形式に圧縮することができる、前述のプラットフォームに対する潜在的な次善策というわけではない。この次善策では、メディアコンテンツを再生するためにプラットフォーム内にさらなる復元のステップが追加される。
【００１５】
要求メディアデータコンポーネント１４０は選択的に、アプリケーションの中に呼びメディアデータを受け取る。当業者は、ソフトウェア設計者が、コンポーネントにデータを定期的に提供するプッシュモデルと、コンポーネントが新しいデータをポーリングするプルモデルと、の間で選択を行うことが多いことを認識するであろう。メディアインタラクションシステム１００は、メディアパイプラインを通して再生用にアプリケーションから周期的にデータを受け取っても良く、または、システム１００は再生を制御して再生用のメディアデータの次のスライス（例えば、映像フレームまたは音声サンプル）を求めてアプリケーションに周期的に問い合わせても良い。システム１００が再生を制御し、アプリケーションからメディアデータを要求する時に、システム１００は要求メディアデータコンポーネント１４０を使用する（例えば、本明細書においてさらに記載されるGetSampleAsyncのＡＰＩを参照のこと）。
【００１６】
メディア再生コンポーネント１５０は、ハードウェアインターフェースコンポーネント１６０および受け取った圧縮されていないメディアコンテンツを使用して、メディアをレンダリングする。メディア再生コンポーネント１５０は、メディアコンテンツを準備して再生するための複数のステップを含むことができ、メディアパイプラインと呼ばれることがある。例えば、メディア再生コンポーネント１５０には、視聴覚ディスプレイにおいて関連の映像フレームを有する音声サンプルを調整して再生するための同期論理を含むことができる。メディア再生コンポーネント１５０はまた、新しいメディアデータを（例えば、マイクまたは他のソース等のハードウェアを通して）キャプチャする能力を含んでも良く、また、未加工メディアインターフェースコンポーネント１３０を介して圧縮されていないメディアデータをアプリケーションに提供し、アプリケーションがメディアデータを特定のアプリケーションでサポートされる形式に圧縮することができるようにしても良い。
【００１７】
ハードウェアインターフェースコンポーネント１６０は、コンピュータハードウェアと相互作用して、メディアデータを再生および／またはキャプチャする。ハードウェアインターフェースコンポーネント１６０はまた、システム１００を制御するためのユーザインターフェース制御を提供することができる。例えば、ハードウェアインターフェースは、１またはそれより多くのスピーカ、ディスプレイ、入力デバイス、などへのアクセスを提供することができる。ハードウェアインターフェースコンポーネント１６０により、ユーザが、１またはそれより多くのユーザインターフェース制御（例えば、オンスクリーンボタンまたはキーボードショートカット）を通して、メディアデータを一時停止、検索および再生することを可能にする。アプリケーションをコンピュータシステムハードウェアから分離することにより、システム１００は、アプリケーションが、許可されないアクションを実行することおよびコンピュータシステムに害を及ぼすこと、を阻止する。
【００１８】
システムが実装されるコンピュータデバイスは、中央処理装置、メモリ、入力デバイス（例えば、キーボードおよびポインティングデバイス）、出力デバイス（例えば、表示デバイス）、および記憶デバイス（例えば、ディスクドライブまたは他の不揮発性記憶媒体）を含むことができる。メモリおよび記憶デバイスは、システムを実装するまたは有効にするコンピュータ実行可能命令（例えば、ソフトウェア）が符号化されるコンピュータ可読記憶媒体である。加えて、データ構造およびメッセージ構造を、通信リンク上の信号等のデータ伝送媒体を介して記憶または伝送することができる。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、ポイントツーポイントダイアルアップ接続、携帯電話ネットワーク、などの種々の通信リンクを使用することができる。
【００１９】
システムの実施形態を、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能家庭用電化製品、デジタルカメラ、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピュータ環境、などを含む種々の動作環境において実装することができる。コンピュータシステムは、携帯電話、携帯情報端末、スマートフォン、パーソナルコンピュータ、プログラム可能家庭用電化製品、デジタルカメラ、などとすることができる。
【００２０】
システムは、プログラムモジュール等の、１またはそれより多くのコンピュータまたは他のデバイスにより実行されるコンピュータ実行可能命令の一般的文脈で記載され得る。一般に、プログラムモジュールには、特定のタスクを実行するまたは特定の抽象データ型を実装する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造、などが含まれる。典型的には、プログラムモジュールの機能性を、種々の実施形態において所望される通りに組み合わせまたは分散させることができる。
【００２１】
図２は、一実施形態における、メディアを再生するためのプラットフォームレベルでのシステムの処理を示すフロー図である。ブロック２１０にて、プラットフォームはアプリケーションをダウンロードする。例えば、アプリケーションは、インターネット上のサーバに記憶される圧縮されたコンテナ（例えば、ＸＡＰファイル）内に含有させることができる。プラットフォームは、プラットフォームが起動される時にアプリケーションをどこで見つけるべきかを示すリファレンスを受け取る。例えば、プラットフォームがウェブサイト上で使用される場合、ウェブページは、プラットフォームに対する実行させるアプリケーションを共に示してプラットフォームへのリファレンスを含有することができる。続いてブロック２２０にて、プラットフォームは、ダウンロードされたアプリケーションを起動する。例えば、プラットフォームは、アプリケーションをパッケージ化している任意のコンテナ（例えば、ソフトウェアモジュール）およびその依存物（例えば、他のモジュール）を復元し、次に、アプリケーションにより提供される初期化機能を呼びだすことができる。アプリケーションは、それに応答して、ネットワークにアクセスしてメディアコンテンツを検索するなど、多くのことを行う（図３参照）。
【００２２】
続いてブロック２３０にて、プラットフォームは、アプリケーションからメディアを要求する。例えば、プラットフォームは、承諾済みのメディア検索インターフェースを周期的に呼びだして、映像フレームまたは音声サンプルのセットを再生用にアプリケーションから受け取ることができる。いくつかの実施形態において、メディアが利用可能である場合は、プラットフォームがメディア要求を行うのではなく、その代わりに、アプリケーションがプラットフォームを起動することができる。続いてブロック２４０にて、プラットフォームは、圧縮されていないメディアをアプリケーションから受け取る。圧縮されたメディアをネットワークからダウンロードし、アプリケーションが提供するコーデックを使用してメディアを復元すること、一般的なメディア合成技術を使用してメディアを作成すること、または、既存のメディアを（例えば、１またはそれより多くの後処理のエフェクトを適用することにより）変形すること、を含む様々な方法で、アプリケーションはメディアを取得することができる。元のメディアに関係なく、アプリケーションは、プラットフォームが理解する形式で、プラットフォームがメディアのさらなる復元を行うことなく再生可能なメディアを、プラットフォームに提供する。メディアを抽出および復元する責任をアプリケーションに課すことにより、プラットフォームは、アプリケーションの創作者が希望する任意のコンテナおよびメディアの圧縮形式をアプリケーションが使用できるようにする。
【００２３】
続いてブロック２５０にて、プラットフォームは、利用可能なハードウェアを使用して再生用のメディア再生パイプラインを通して圧縮されていないメディアを送る。例えば、メディアパイプラインは、オペレーティングシステムＡＰＩ（例えば、Microsoft（登録商標）社DirectＸ（商標））を使用し、スピーカを使用して音声サンプルを再生すること、または、映像フレームをディスプレイにレンダリングすることができる。ブロック２５０の後、これらのステップは終了する。
【００２４】
図３は、一実施形態における、メディアを再生するためのアプリケーションレベルでのシステムの処理を示すフロー図である。ブロック３１０にて、アプリケーションは、プラットフォームからメディア要求を受け取る。例えば、プラットフォームは、アプリケーションがメディアデータを提供するために実装する所定のインターフェースを起動することができる。続いてブロック３２０にて、アプリケーションは、ネットワークサーバから等圧縮されたメディアをダウンロードする。例えば、メディアコンテンツをＭＰ４等の圧縮された形式で提供するウェブサーバからメディアコンテンツを受け取るよう、アプリケーションを構成しても良い。あるいは、または加えて、アプリケーションは、一連の楽譜を合成すること、または、互いに分離したメディアファイルをつなぎ合わせること、などにより、メディアコンテンツをプログラムで生成することができる。
【００２５】
続いてブロック３３０にて、アプリケーションは圧縮されたメディアを復元する。例えば、アプリケーションは、圧縮されたメディアの特定の形式に対してメディアデータを復元するコーデックを起動することができる。アプリケーションは、コーデックを含んでも良いし、または、コーデックをネットワークサーバからダウンロードしても良い。コーデックは、アプリケーションと同様に、コーデックが実行可能なアクションを制限するプラットフォームにより提供され悪意のあるまたは欠陥のあるコードからユーザのコンピュータシステムを保護する、実行サンドボックス内で実行する。アプリケーションにはメディアを復元する責任があるため、アプリケーションは、プラットフォームの更新をせずに自身のアプリケーションコード内にコーデックを含むことにより、新しいメディア型をサポートすることができる。従って、アプリケーションは、プラットフォーム開発者が新しいメディアサポートを追加するのを待たずに、素早く新しい形式をサポートすることが可能である。
【００２６】
続いてブロック３４０にて、アプリケーションは選択的に、復元されたメディアに後処理のエフェクトを適用する。プラットフォームが復元を実行する従来のシステムにおいては、アプリケーションが後処理のエフェクトをメディアに適用することは不可能である。後処理のエフェクトには、映像の背景を修正する、映像オーバレイを加える（例えば、クローズドキャプションのテキスト）、音声のエコーを追加する、などを含む多様なメディアの変形が含まれる。アプリケーションはまた、同様の資源を後処理に再利用して他の資源を除外することができるので、より少ないメディア資源を含むことによりリソースを節約することができる可能性がある。例えば、５つの背景を有する映像を含むアプリケーションは、従来は５つの異なる映像をダウンロードし、適切な映像を復元用にプラットフォームに提供する。メディアインタラクションシステムを使用すると、アプリケーションはその代わりに、置き換え可能な背景（例えば、グリーンスクリーン）を有する１つの映像を含み、後処理の際に、５つの背景のそれぞれとして挿入するためのより小さいサイズの画像を提供することができる。アプリケーションはまた、後処理を使用して広告または他の情報をメディアストリームに挿入させることができる。
【００２７】
続いてブロック３５０にて、アプリケーションは、復元されたメディアを再生用にプラットフォームに提供する。アプリケーションは、プラットフォーム要求に基づきメディアをチャンクで提供することができ、または、プラットフォームに再生させるために、圧縮されていないメディアを含有する大きなストリームまたはファイルへのリンクを提供することができる。ブロック３５０の後、これらのステップは終了する。
【００２８】
いくつかの実施形態において、メディアインタラクションシステムは、アプリケーションがメディアパイプラインを使用せずにメディアを直接レンダリング可能なハードウェアインターフェースを提供する。例えば、システムは、アプリケーションが画面にデータを直接書き込むことが可能な、書き込み可能ビットマップ領域を提供することができる。メディアパイプラインは、音声と映像の同期を提供する。しかし、映像のみをレンダリングするか、または、それ自身が持つ形式の同期を実行するアプリケーションに対しては、このタイプの直接的なアクセスは、メディアコンテンツをより効率的に処理するには有益である。
【００２９】
いくつかの実施形態において、メディアインタラクションシステムは、アプリケーションがプラグインモデルを介して追加のコーデックのサポートをプラットフォームに追加することができる、拡張性インターフェースを提供する。圧縮されたメディアデータを直接復号／復元するのではなく、アプリケーションは、インストールされたコーデックプラグインを起動して、プラットフォームを通してコーデックへ、または、直接コーデックへ、圧縮されたデータを渡すことができる。
【００３０】
いくつかの実施形態において、メディアインタラクションシステムは、アプリケーションに音声および映像のデータを復元するための高度なハードウェアサポートへのアクセスを提供する。例えば、多くの現代のプロセッサは、ベクトル演算および他の一般的なマルチメディア操作を実行するための命令をサポートする。一例として、ＳＳＥ２命令セットがある。ＳＳＥは、２つのレベルの頭字語で、ＳＳＥは、Streaming SIMD Extensionsの略であり、ＳＩＭＤは、Single Instruction,Multiple Dataの略である。実行サンドボックスでは、アプリケーションがそのような命令を明示的に使用することも、これらの命令を使用する実行可能なコードを生成するようにアプリケーションコードをＪＩＴコンパイルすることにより使用することも、可能にする。別の例として、メディアインタラクションシステムは、アプリケーションにシェーダ論理またはＪＩＴコンパイル実行可能シェーダコードを提供できるようにすることにより、グラフィックスプロセッシングユニット（ＧＰＵ）により提供されるピクセルシェーダまたはバーテックスシェーダへのアクセスを提供することができる。
【００３１】
いくつかの実施形態において、メディアインタラクションシステムは、復号化と同様の方法で符号化をサポートする。システムは、ハードウェアまたは他の入力（例えば、ソフトウェアでエミュレートされたデバイス）を通してメディアをキャプチャし、そのメディアを圧縮されていない形式でアプリケーションに提供する。アプリケーションは、それ自身が有するコーデックを選択および使用して、メディアデータをアプリケーション指定の形式に圧縮する。そして、アプリケーションは、メディアをサーバにアップロードするか、または、アプリケーションに関連する他のステップを実行することができる。システムはまた、本明細書に記載されるプラグインモデルを使用して、アプリケーションに新しい符号化コーデックを登録できるようにし、この新しい符号化コーデックは、システムがメディアコンテンツをアプリケーションにより選択される形式でアプリケーションに提供することに使用できる。
【００３２】
いくつかの実施形態において、メディアインタラクションシステムでは、メディアコンテンツを再生用にシステムに提供する前に、アプリケーションが、復元されたメディアコンテンツを後処理できるようにする。例えば、アプリケーションは、エコー等のエフェクトを音声に加えること、または、再生速度の変更、色の修正、ロゴをオーバレイさせる、などにより映像を変更することができる。アプリケーションはまた、後処理を使用して、イコライザまたは音声の視覚化をユーザに提供することができる。
【００３３】
本明細書に記載される技術の種々の態様は、概して、メディアストリームの処理および再生からメディアコンテンツの復元を切り離すことに向けられる。一般に、プラットフォームではなく、ホスト型アプリケーションのコードが、ダウンロード、アンパック、および復元の操作を実行する。その結果、アプリケーションは、サードパーティにより提供されるような、プラットフォームの帯域外で開発された、新しいおよび／またはプロプライエタリなメディア形式のサポートが可能になり、例えば、独立コードは、それ自身からＷＭＶおよびＷＭＡのメディアストリーム、場合によってはカスタムコンテナ形式を、アンパックおよび復元し、それらのストリームを再生用に注入することができる。別の結果として、メディアデータは、任意のプロトコルおよび／または搬送機構を介して、任意のソース（単数または複数）から生じるものでも良い。それと同時に、ホスト型コードが実行可能なアクションを制御する特定のセットのプラットフォームＡＰＩを通して、セキュリティが維持される。
【００３４】
いくつかの実施形態において、メディアインタラクションシステムは、ブラウザプラグインにおいて実行するアプリケーション環境に、信頼性の無いアプリケーションレベルのコードがアプリケーション環境による再生用にエレメンタリの映像、音声およびスクリプトのストリームの形式でデータを提供することを可能にするインターフェースを提供する。データは任意のソースから生じるもので良く、前述のアプリケーション環境が処理できない形式を含む任意の形式でパッケージ化することができる。なお、本明細書において使用される場合、「アプリケーションレベルのコード」とは、ＡＰＩ呼び出しを通して、任意の実際のレベルに関係なく、少なくとも１つの下位レベルのプラットフォームコンポーネントと通信するコードを言う。
【００３５】
本明細書における例の多くが、ブラウザ／Microsoft（登録商標）社のSilverlight（商標）環境において再生されるメディアコンテンツを参照して記載されるが、これらは単なる例に過ぎないことは理解されるであろう。容易に理解できるように、他のホストプログラムおよび／または環境が、本明細書に記載される技術を使用することができる。このように、メディアインタラクションシステムは、本明細書に記載される任意の特定の実施形態、態様、概念、構造、機能性、または例に限定されない。むしろ、本明細書に記載される実施形態、態様、概念、構造、機能性、または例は、いずれも非制限的であり、また、システムは、コンピューティングおよびコンテンツ処理において概して支援を提供する種々の方法において使用される。
【００３６】
図４は、一実施形態における、メディアインタラクションシステムの動作環境を示すブロック図である。アプリケーションレベル４１２およびプラットフォームレベル４１４内に配置されるパーソナルコンピュータシステム等のメディア再生デバイス４１０が示される。メディア再生デバイスの他の例は、携帯電話または他のデジタルデバイスを含む。ウェブアプリケーションまたは他のコード等のアプリケーションレベルのコード４１６は、アプリケーションレベル４１２にてホストされ、以下に記載されるように、コンテナ４１８からのコンテンツを処理する（例えば、アンパック、抽出、復元、および配信）。アプリケーションレベルのコード４１６は、利用可能なアプリケーション４２２のセットにより表されるような、インターネット等の任意のネットワーク４２０を介してダウンロードされるブラウザプラグイン等の任意のホスト型コードとすることができる。アプリケーション４２２は、任意のタイプの実行可能コードとすることができ、スクリプトもしくはインタプリタされた他の人間が読み取れるコード、または、直接実行されるか、他のやり方で（例えば、ＪＩＴコンパイルを通して）実行される、コンパイルされたバイナリコードもしくは中間コード、が含まれる。なお、コンテナについては、コンテナのオプションの１つに、「コンテナ無し」すなわち未加工の音声（例えば、ＰＣＭサンプル）または映像のみを扱うというものがあり、そのイベントにおいては、アプリケーションは再生用のコンテンツを処理、例えば、暗号解読する、サンプルに分割する、などができる。
【００３７】
アプリケーションレベルのコード４１６がコンテナのコンテンツを処理するため、コンテンツをアプリケーションレベルのコード４１６が理解する任意の形式とすることができ、カスタムアプリケーションおよび／またはコンテナが、例えば、ホストされ、及び何らかの方法で使用され、例えば、メディアとして再生されるそのコンテンツを有することができるようにする。これに含まれるものには、既知のコンテナ／パッケージ／形式、プロプライエタリな形式、既存のパッケージ／形式に対する拡張機能、および、まだ開発されていない将来のコンテナパッケージ／形式がある。
【００３８】
さらに、アプリケーションレベルのコード４１６は、任意の適切なネットワーク搬送、例えば、Ｓｏｃｋｅｔｓ／ＨＴＴＰを介し、任意の適切なプロトコル（単数または複数）を使用して、コンテナ４２４のセットの中からコンテナ４１８等のコンテナをダウンロードすることができる。これにより、コンテンツプロバイダに大幅な柔軟性を与え、例えば、冗長性、ロードバラシング、セキュリティなどのためにも、コンテンツをサーバ間で分散させることができる。例えば、単一のコンテンツが、異なる形式で、異なるパッケージに存在し、異なる部分に分離され、異なるセキュリティ要件を有する、などとすることができる。アプリケーションは、再生用のコンテンツを提供するために、異なるパッケージをダウンロードし、必要があればそれらを統合することができる（または条件に応じて１つを選択することができる）。
【００３９】
コンテナは、多くの異なる型のデータを備えることができる。典型的な例においては、データは音声、映像、または画像メディア等の種々のメディアに対応するが、任意のデータ型をコンテナに記憶することができる。さらに、コンテナは、別個の音声、映像、および静止画データのセット等の２つまたはそれ以上の異なるセットのデータを有すること、および／または、サポートされるデータの各型を異なるコンテナを使用して分散させること、ができる。コンテナには、比較的複雑で、複数の型のデータを含有できるものがある。なお、Silverlight（商標）のコードは、コードライブラリに組み込むことができため、異なる形式をダウンロードおよびアンパックするための異なるライブラリを作成、再利用、および共有することができる。これにより時間をかけて開発される、任意の異なる新しいパーケージングおよびコンテナの形式を共有する方法が提供される。
【００４０】
アプリケーションレベル４１２においてホストされる例示されるアプリケーションレベルのコード４１６等のコードは、ＡＰＩ４３０のセットを通してプラットフォームレベル４１４と通信する。例えば、アプリケーションレベルのコードは、アプリケーション環境４３２（メディア要素に対応する）に対してＡＰＩ呼び出しを行い、再生用のメディアコンテンツを提供し、加えて、検索、一時停止、停止、などの他のメディア関連の操作を実行する。一般に、コンテナ形式とは無関係に、プラットフォームレベル４１４は、無変更のまま、任意の特別なアプリケーションからは独立した状態にある。
【００４１】
アプリケーションレベルのコード４１６はまた、他の理由でアプリケーション環境と通信することもでき、例えば、保護されるメディア（例えば、映像、音声およびスクリプトのストリームデータ）を暗号解読するためのライセンスが必要とされる時にアプリケーションレベルのコードに通知したり、アプリケーションレベルのコードが、アプリケーション環境に、例えば、ストリームを暗号解読するためのライセンスデータを提供することを可能にしたりする。このようにして、デジタル著作権管理（ＤＲＭ）を、外部のＤＲＭプロバイダによるのではなく、内部的に取り扱うことができ、例えば、ＤＲＭライセンス要求が、管理されるウェブ要求またはウェブクライアントＡＰＩを通して再度現れないようにできる。ＤＲＭ初期ベクトルにより、サンプルを暗号解読するためのサンプルについてのデータが提供される。しかし、ＡＰＩが柔軟性を有すると、システムと併せて他の権利の管理システムが使用できるようになる。一例として、コンテンツは、ネットワークを介して暗号化され、本明細書に記載されるMediaStreamSourceを通して渡される前に、解読されても良い。
【００４２】
アプリケーション環境４３２は、プラグイン、またはブラウザをユーザインターフェースとして使用する他のタイプの環境、とすることができる。ブラウザは、例えば、オペレーティングシステムコンポーネント等のウェブブラウザとすることができ、また、ディスプレイとして、および、アプリケーション環境と併せて実行できるアプリケーションレベルのコード（例えば、アプリケーションレベルのコード４１６）のためのヒューマンインターフェース機構として、供給することができる。アプリケーション環境は、ブラウザにプラグインすることができる。プラグインとして、ブラウザは、アプリケーションレベルのコード４１６等のアプリケーションが実行されるのを検出すると、アプリケーション環境４３２を起動することができる。例えば、映像要素は、ブラウザにより表示されるウェブページにおいて作成される。アプリケーションレベルのコード４１６は、種々のアクションを実行して、映像要素の検索、処理、準備を行い、および、プラットフォームに映像要素を表示させる。ユーザは、ユーザインターフェース内で制御を操作して、映像の一時停止、映像を特定のポイントまで検索すること、および、ユーザ入力に基づき他の操作を実行すること、ができる。
【００４３】
図５は、一実施形態における、アプリケーションレベルのコードが抽象型から導き出される、より特別な例を示すブロック図である。アプリケーションレベルのコード４１６は、抽象型MediaStreamSource５３８から導き出され、本明細書においてはCustomMediaStreamSource５４０と呼ばれる、具象型の実装（オブジェクトインスタンス）を得る。本例においては、典型的な実装が表され、アプリケーションレベルのコード４１６に含まれる別個のアセンブリ内に、具象型のCustomMediaStreamSource５４０が提供され、本明細書では、ＤＬＬ（dynamic link library）CustomMediaStreamSource.dllまたは単にＤＬＬ５４２として示される。以下に記載されるように、具象型のCustomMediaStreamSource５４０は、エレメンタリメディアストリームおよび診断を求める要求をメディア要素から受け取り、ＤＬＬ５４２が、エレメンタリメディアストリームおよび診断を含む応答を与える。それらの応答を用いて、メディアストリームを再生用のメディアパイプライン５４４に提供ことを含むメディア要素は、適切なアクションを行う。
【００４４】
図６は、一実施形態における、図５の例に対応する再生のステップを例示するフロー図である。ブロック６０２は、アプリケーションレベルのコード４１６がMediaStreamSourceをメディア要素に関連付けることを表す。例えば、アプリケーションは、セットされたソースメソッドを呼び出すことができ、コンテナのＵＲＩにソースプロパティを示し、具象型CustomMediaStreamSource５４０の実装へのリファレンスを渡す。このアクションにより、メディア要素と具象型CustomMediaStreamSource５４０との間の対話が開始される。
【００４５】
メディア要素は、現在メディアが再生されているかどうかをチェックし、再生されている場合は、ブロック６０６により表されるようにその再生を停止させる。任意のイベントにおいて、ブロック６０８にて、メディア要素は、CustomMediaStreamSource５４０にそのメディアを開くように依頼する。ブロック６１０にて、CustomMediaStreamSource（ＭＳＳ）がエラーに遭遇した場合、例えば、メディアが開かない、破損している、などの場合、ブロック６１０にて処理は終了し、及び例えば、CustomMediaStreamSource５４０は選択的に、メッセージなどを提供してメディア要素に問題を報告し、さらにアプリケーションにも報告してユーザに問題を通知するなど、を行うことができる。
【００４６】
問題が無い場合は、ブロック６１２にて、CustomMediaStreamSource５４０は、どの型（単数または複数）のメディア、例えば、ＷＭＡ、ＷＭＶ、ＭＰ３、またはＲＡＷ、を表しているのかをメディア要素に通知する。ブロック６１６により表されるように、メディア要素は次に、サンプルの要求を開始する。メディアがブロック６１８にて利用可能であり、及びエラーが無い場合（ブロック６２０）、メディア要素は、ブロック６２２にてメディアのサンプルを再生し、例えば、メディアのサンプルをメディアパイプライン５４４に注入し、パイプライン再生バッファへの注入などを行う。次に処理は利用可能なメディアが無くなるまで、すなわち、メディアが使い果たされるまで継続され、その時、ブロック６１８はブロック６２４に分岐し、メディア要素がCustomMediaStreamSource５４０にメディアを閉じるように依頼する。サンプルの再生ループ中にエラーが起こった場合は、ブロック６２０は、再生ループを出て、上述したように選択的なメッセージを与えて（ブロック６２６）メディアの処理を停止させる。
【００４７】
別の可能性としては、概してブロック６１４にて表されるが、CustomMediaStreamSource５４０が、検索、一時停止、停止、などの別の再生操作を要求する場合がある。ブロック６１６にて表されるように、メディア要素は、CustomMediaStreamSource５４０が適切にアクションを行うように要求することにより、応答する。なお、そのような機構を用いると、プラットフォームレベルは再生操作の種々の態様の制御内に置かれたままとなる。アプリケーションレベルは、サンプルのアンパック、抽出、復元、選択、および、プラットフォームにコンテンツを提供すること、を含む、コンテナのコンテンツを処理する責任がある。
【００４８】
例示のＡＰＩ
本明細書に記載される処理の実装に適切な例示のＡＰＩを以下に示す。
【００４９】
namespace System.windows.Media
{
public abstract class MediaStreamSource
{
public MediaStreamSource(){}
protected abstract void openMediaAsync();
protected void ReportOpenMediaCompleted( IEnumerable<
MediaStreamDescription> availableMediaStreams,
IDictionary< 
MediaSourceAttributeskeys, string>
mediaSourceAttributes);
protected abstract void SeekAsync(Int64 seekToTime);
protected void ReportSeekCompleted(Int64 timeSeekedTo) { }
protected abstract void GetSampleAsync( MediaStreamType
mediaStreamType ) ;
protected void ReportGetSampleCompleted( Mediastreamsample
mediaSampleDescription ) { }
protected void ReportGetSampleProgress(double
bufferingprogress ) { }
protected abstract void SwitchMediaStreamAsync(
MediaStreamDescription mediaStreamDescription ) ;
protected void ReportSwitchMediaStreamCompleted(
MediaStreamDescription mediaStreamDescription) { }
protected abstract void GetDiagnosticAsync(
MediaStreamSourceDiagnosticKind diagnosticKind) ;
protected void ReportGetDiagnosticCompleted(
MediaStreamSourceDiagnosticKind diagnosticKind, double
diagnosticValue) { }
protected abstract void CloseMedia();
protected void ErrorOccurred( string errorDescription ) {
}
}
public class MediaElement
{
public int AudioStreamIndex { get; set; }
public void SetSource(MediaStreamSource mediaSource) { }
}
public enum MediaStreamSourceDiagnosticKind 
{
DownloadProgressAsPercent
}
public class MediaStreamDescription
{
public MediaStreamDescription(MediaStreamType streamType, 
IDictionary<MediaStreamAttributeKeys, string>
mediaStreamAttributes){ }
public MediaStreamType MediaStreamType { get; }
public IDictionary<MediaStreamAttributeKeys, string>
MediaStreamAttributes { get; }
}
public class MediaStreamSample 
{
public MediaStreamSample (Stream stream,
MediaStreamDescription
mediaStreamDescription, Int64 offset, Int64 count, 
Int64
timestamp, IDictionary< MediaSampleAttributeKeys,
string> 
MediaSampleAttributes) { } 
public Stream Stream { get; }
public MediaStreamDescription MediaStreamDescription {
get; }
public Int64 Offset { get; }
public Int64 Count { get; }
public IDictionary< MediaSampleAttributeKeys, string> 
MediaSampleAttributes { get; } 
public Int64 Timestamp { get; } 
}
public enum MediaStreamType 
{
Audio, 
Video, 
} 
public enum MediaStreamAttributeKeys 
{
FourCC, // Accepts YV12 and RGBA raw media types 
CodecPrivateData, 
Width, 
Height 
}
public enum MediaSampleAttributeKeys 
{ 
KeyFrameFlag, 
DRMInitializationVector , 
Bufferwidth, // For raw media types 
BufferHeight // For raw media types 
} 
public enum MediaSourceAttributesKeys 
{ 
CanSeek, 
Duration, 
DRMHeader 
} 
}
【００５０】
未加工のメディアサンプルを提供するアプリケーション内での上記のＡＰＩの例示の使用を以下に示す。
【００５１】
// code used inside a MediaStreamSource 
IDictionary<MediaStreamAttributeKeys, string> sampleAttributes = 
new Dictionary<MediaStreamAttributeKeys, string>() ;
sampleAttributes.Add(MediaSampleAttributeKeys.BufferWidth, "10") ;
sampleAttributes.Add(MediaSampleAttributeKeys.BufferHeight, "10") ;
MediaStreamSample rawSample = 
new MediaStreamSample(msd, rawVideoFrame, 0 ,
rawVideoFrame.Length , 
0 , sampleAttributes); 
this.ReportSampleCompleted (rawSample) ; 
【００５２】
MediaStreamAttributeKeys.FourＣＣ属性は、未加工の圧縮されていない映像のＹＶ１２型、および、未加工の色情報（Red（赤）、Green（緑）、Blue（青）およびAlpha（アルファ：透明度））のＲＧＢＡ型、を受け入れる。MediaSampleAttributeKeysは、アプリケーションが再生用のプラットフォームに渡しているサンプルバッファの実際の幅と高さをプラットフォームに記述するための、バッファの幅と高さの値を受け入れる。
【００５３】
ＹＶ１２の構造は、３つの色平面を含有する配列と考えることができ、各平面内のサンプルのサイズは８ビットで、サイズ（Ｘ，Ｙ）を有するＹ平面と、それに続くサイズ（Ｘ／２，Ｙ／２）のＵ平面とそれに続くサイズ（Ｘ／２，Ｙ／２）のＶ平面を持つ。例えば、１０×１０の画像を想定すると以下のとおりである。
【００５４】
byte [] yv12Sample = new byte [150]; // Total size 
byte [] yplane = new byte [100]; // X * Y 
byte [] uplane = new byte[25] ; // x/2 * Y/2 
byte [] vplane = new byte[25] ; // x/2 * Y/2 
// Copy ( SourceArray, SourceIndex, DestinationArray, 
DesintationIndex, 
// Size) 
// Planes are back to back 
Array. Copy(yvl2Sample, 0, yPlane, 0, 100); //Y 0 to 100 bytes 
Array.Copy(yvl2Sample, 100, uPlane, 0, 25); //U 100 to 125 bytes
Array.Copy(yvl2Sample, 125, vPlane, 0, 25); //V 125 to 150 bytes 
// From the MediaStreamSource API. Samples are actually in 
streams, 
// not arrays. 
MemoryStream yvl2SampleStream = new MemoryStream(yvl2Sample) ; 
【００５５】
ＲＧＢＡサンプルは、４バイトのサンプルを含有する配列と考えることができ、各サンプルは、４つの１バイトチャネルをアルファ、赤、緑、青の順で含有する。上記と同じ１０×１０の画像を想定すると以下のとおりである。
【００５６】
byte [] argbSample = new byte [400] ; // Total size 
// In ARGB format, channels are interleaved (contrast with YV12 
where 
// channels Y, U , and V are separate). 
for (long i = 0; i < argbSample.Length; i ++ ) 
{
switch (i % 4) 
{
case 0: // Alpha 
argbSample[i]; 
break; 
case 1: // Red 
argbSample[i]; 
break; 
case 2: // Green 
argbSample[i]; 
break; 
case 3: // Blue 
argbSample[i]; 
break; 
default: 
break; 
}
}
【００５７】
未加工の音声（例えば、ＰＣＭサンプル）が、１６進数列にシリアル化され、かつ、上記で定義されるCodecPrivateData属性を使用してMediaStreamSourceに渡される、WaveFormatEx構造として表現される。ＰＣＭ音声サンプルは、バイトのストリームとして表される。ランタイムでは、８ビットサンプルの場合はバイトを１つずつ扱い、または、１６ビットサンプルの場合は２つ１組で扱う。例示のWaveFormatExの値は以下の通りである。
【００５８】
FormatTag: 1 
Channels: {1, 2} 
SamplesPerSec: {8k, 11.025k, 12k, 16k, 22.05k, 24k, 32k, 33.075k, 
40k, 
44.1k, 48k, 55.125k, 56k, 60k, 64k, 66.15k, 72k, 77.175k, 80k, 
84k, 
88k, 88.2k. 96k} 
AverageBytesPerSec: SamplesPerSec * BlockAlign 
BlockAlign: Channels * BitsPerSample / 8 
BitsPerSample: {8, 16} 
Size : 0 // if nonzero, custom wave data follows the structure 
【００５９】
例示のＡＰＩベースの実装
上述のように、エレメンタリメディアストリーム（例えば、ＷＭＶ、ＷＭＡ、ＭＰ３、およびＲＡＷ）および診断を取得するなどが行われる等、メディア要素４３２の交渉相手である抽象基本クラスが提供される。アプリケーションの開発者は、抽象基本クラスの具象型の実装を提供する（例えば、CustomMediaStreamSource５４０は、MediaStreamSource５３８抽象基本クラスの具象型の例である）。
【００６０】
ＡＰＩ４３０を介して、アプリケーションレベルのコード４１６が、具象型CustomMediaStreamSource５４０をインスタンス化し、メソッドをメディア要素４３２に対して呼び出すことによりメディア要素４３２に関連付け、本例においては、メソッドは、MediaElement.SetSource（MediaStreamSource）である。その呼び出しの後、エレメンタリメディアストリームを求める通常のメディアパイプライン要求が、具象型CustomMediaStreamSource５４０に対してルーティングされる。提示されたＡＰＩを通して、上述のように、CustomMediaStreamSource５４０は、メディアパイプラインに、これらのエレメンタリメディアストリームと、メディア要素４３２が使用する任意の診断情報とを提供する。
【００６１】
本例では、MediaStreamSourceが設定されるメディア要素４３２について、メディア要素４３２およびCustomMediaStreamSource５４０が作成されると、アプリケーション４１６は、新しいMediaStreamSourceを用いてMediaElement.SetSourceを呼び出す。メディア要素４３２は次に、MediaStreamSourceのOpenMediaAsyncイベントを発生させる。
【００６２】
CustomMediaStreamSource５４０等のMediaStreamSourceは、メディアが閉じられた後に廃棄され、必要があれば再現される。メディアが閉じられるのは、メディア要素４３２がそのソースプロパティを新しいソースに設定した場合、メディア要素４３２がSetSource（ヌル）をメディア要素４３２に呼び出しそのソースプロパティもヌルである場合、または、エラーが起きた場合、である。なお、本例の実装においては、メディア要素４３２を既に閉じているMediaStreamSourceに設定しようとすると、例外が起こる。
【００６３】
メディア要素４３２が開かれ、MediaStreamSourceがブロードキャストを示すと、メディア要素４３２はMediaStreamSourceのOpenMediaAsyncイベントを発生させる。CustomMediaStreamSource５４０は、その音声と映像のストリームを収集し、ストリーム毎にMediaStreamDescriptionを提供する。CustomMediaStreamSource５４０は、Durationにゼロ(0)を設定し、かつ、CanSeekを偽に設定して、新しいMediaSourceAttributesコレクションを作成する。CustomMediaStreamSource５４０は、ReportMediaCompleted（メディアストリーム，属性）を呼び出す。
【００６４】
例示の実装において、メディア要素４３２を開き、CustomMediaStreamSource５４０が「オンデマンド」のコンテンツを示すと、メディア要素４３２は、MediaStreamSourceのOpenMediaAsyncイベントを発生させる。CustomMediaStreamSource５４０は、その音声と映像のストリームを収集し、ストリーム毎にMediaStreamDescriptionsを作成する。CustomMediaStreamSource５４０は、Durationに期間を設定し、及びCanSeekに真を設定して、新しいMediaSourceAttributesコレクションを作成する。CustomMediaStreamSource５４０は、ReportMediaCompleted（メディアストリーム，属性）を呼び出す。
【００６５】
CustomMediaStreamSource５４０は、マルチビットレートストリームに対応することができる。なお、一例の実装において、MultipleBitRateの実装について、勧告されることは、最高許容ビットレートを宣言する１つの音声と１つの映像のストリームを（ReportMediaCompletedを介して）と提示させること、および、必要に応じて異なるビットレートのサンプルをReportGetSampleCompletedで渡すことのみである。例えば、コンテンツは、異なるビットレートで複数回符号化されても良く、それぞれが、ファイルからＵＲＩアドレス可能なチャンクに切り崩されたコンテナに対応する。クライアントおよび／またはサーバは、どのチャンクをダウンロードするかを条件、例えば、ネットワーク負荷、クライアント負荷、サーバ負荷、などの条件に基づいて変更することができ、再生を一時停止するのではなく負荷条件に基づき、異なる映像の品質／解像度を提供することなどを行う。
【００６６】
CustomMediaStreamSource５４０が複数の音声ストリームに対応する時は、メディア要素４３２は、MediaStreamSourceのOpenMediaAsyncイベントを発生させる。CustomMediaStreamSource５４０は、その音声ストリームと映像ストリームとを収集し、ストリーム毎にMediaStreamDescriptionを作成する。CustomMediaStreamSource５４０は、ReportMediaCompleted（音声ストリーム、および映像のMediaStreamDescription）を呼び出す。
【００６７】
なお、MediaStreamSourceは、複数の映像ストリームを含有することができ、例えば、開発者は、複数の映像ストリーム間で切替えを試みることが可能であるが、一実装において結果は保証されない。スクリプトコマンドおよびマーカを容易にするために、一実装において、開発者はメディア要素４３２のTimelineMarkersコレクションを使用する。
【００６８】
メディア要素４３２が、Stopをメディア要素４３２に呼び出すと、典型的な一例において、メディア要素４３２は、MediaStreamSourceGetSampleAsync（メディア型）イベントの起動を停止させる。アプリケーションの開発者は、メディア要素のCurrentStateChangedイベントとCurrentStateプロパティとを、CustomMediaStreamSource５４０と併せて使用してこれを実装する。ライブラリの開発者は、アプリケーションの開発者がメディア要素４３２からのCurrentStateの変更をアプリケーションのCustomMediaStreamSourceのStopロジックに連結させるための方法を提示することができる。
【００６９】
メディア要素４３２がPauseをメディア要素４３２に呼び出すと、典型的な一例において、メディア要素４３２は、MediaStreamSourceGetSampleAsync（メディア型）イベントの起動を停止させる。状態変更の通知を取得するために、アプリケーションの開発者は、メディア要素のCurrentStateChangedイベントとCurrentStateプロパティとを、CustomMediaStreamSourceと併せて使用する。ライブラリ開発者は、アプリケーションの開発者がメディア要素１３２からのCurrentStateの変更をライブラリ開発者のMediaStreamSourceのPauseロジックに連結させるための方法を提示することができる。
【００７０】
Playをメディア要素４３２に呼び出すことにより一時停止の状態から再開される時、例えば、映像再生アプリケーションがMediaElement.Playが呼び出されるようにする時、メディア要素４３２は、MediaStreamSourceのGetSampleAsync（メディア型）イベントの起動を開始させる。停止状態から再開される時、映像再生器はMediaElement.Playが呼び出されるようにし、及びメディア要素４３２がMediaStreamSourceのSeekAsync（ストリームの開始）イベントを発生させる。CustomMediaStreamSource５４０は、ReportSeekCompleted（ストリームの開始に非常に近い）を呼び出し、及びメディア要素４３２が、MediaStreamSourceのGetSampleAsync（メディア型）イベントの起動を開始させる。
【００７１】
検索については、通常の検索では、映像再生アプリケーションが、MediaElement.Positionを設定する。これに応じて、メディア要素４３２は、MediaStreamSource.SeekAsync（１００ナノ秒ティックでの新しい位置）を発生させる。CustomMediaStreamSource５４０は、そのストリームを新しい場所に最も近いサンプルに調整する。CustomMediaStreamSource５４０は、ReportSeekCompleted（１００ナノ秒ティックで最も近いサンプルの位置）を呼び出す。メディア要素４３２は、MediaStreamSource.GetSampleAsync（１００ナノ秒ティックで新しい位置）を発生させる。CustomMediaStreamSource５４０は、要求されたサンプルをMediaStreamSource.ReportGetSampleCompletedにおいて返す。
【００７２】
ストリームの最後へのＳｅｅｋについては、映像再生アプリケーションが、MediaElement.Positionを設定し、メディア要素４３２がMediaStreamSource.SeekAsync（１００ナノ秒ティックで新しい位置）を発生させる。CustomMediaStreamSource５４０は、そのストリームを新しい場所に最も近いサンプルに調整する。CustomMediaStreamSource５４０は、ReportSeekCompleted（１００ナノ秒ティックで最も近いサンプルの位置）を呼び出す。メディア要素４３２は、MediaStreamSource.GetSampleAsync（１００ナノ秒ティックで新しい位置）を発生させる。CustomMediaStreamSource５４０は、ReportGetSampleCompleted（ヌル）を返す。
【００７３】
メディア要素４３２が、エラー状態に入った時、例えば、メディア要素４３２が復帰できないエラー状態になった時、メディア要素４３２は、MediaStreamSource.CloseAsyncを発生させる。CustomMediaStreamSource５４０は、必要に応じてその内部状態を廃棄し、及び内部的にそのSourceをヌルに設定することによりCustomMediaStreamSource５４０との関連付けを解除する。CustomMediaStreamSource５４０は、閉じた状態に遷移する。
【００７４】
メディア要素４３２が音声ストリームを切替える時、例えば、多言語トラックを有するようなシナリオに対して、メディア再生器は、MediaElement.AudioStreamIndexが設定されるようにする。メディア要素４３２は、MediaStreamSource.SwtichMediaStreamAsync（切替え先のストリーム）を引き起こす。CustomMediaStreamSource５４０はストリームを切替え、新しいストリーム上でオフセットを正しい時間に調整し、必要であればバッファリングを開始する。CustomMediaStreamSource５４０は、ReportSwitchMediaStreamCompleted（切替え元のストリーム）を呼び出す。
【００７５】
CustomMediaStreamSource５４０がメディア要素の要求を達成できない時、または、メディア要素の要求とは別に復帰できないエラーになった時、は常に、CustomMediaStreamSource５４０はエラー状態に入り、ErrorOccuredを呼び出すことによりメディア要素４３２に通知する。CustomMediaStreamSource５４０が復帰できない内部エラーになった場合は、CustomMediaStreamSource５４０はErrorOccured（エラーの記述）を呼び出す。それに応じて、メディア要素４３２は、メッセージを受け取り、内部シャットダウンを開始し、エラーの記述を用いてMediaFailedイベントを発生させ、CloseMediaAsyncを発生させる。メディア要素４３２はさらに、任意の構造を廃棄し、クリーンアップを行い、また、内部ソースをヌルに設定することにより、CustomMediaStreamSource５４０との関連付けを解除する。
【００７６】
MediaStreamSourceのバッファリングについては、メディア要素４３２が、GetSampleAsyncを発生させることによりサンプルを要求する。CustomMediaStreamSource５４０は、要求されるサンプルを持っておらず、バッファリングに入る（バッファが完全に空であると仮定する）。CustomMediaStreamSource５４０は、メディアファイルからサンプルを集めることを試み、ReportGetSampleProgress(0)を用いてバッファリング中であることを報告する。ある時間が経過すると、メディア要素４３２はバッファリング状態に入り、それにより、CustomMediaStreamSource５４０は、最終的にそのバッファのある部分（例えば、半分）を満たすことになる。半分が満たされたと仮定する場合、CustomMediaStreamSource５４０は、ReportGetSampleProgress(0.5)を呼び出す。さらにある時間が経過すると、CustomMediaStreamSource５４０はバッファを９０％まで満たし、ReportGetSampleProgress(0.9)を呼び出す。またさらにある時間が経過すると、CustomMediaStreamSource５４０はバッファを完全に満たし、ReportGetSampleCompleted（次のサンプル）を呼び出すことにより、サンプルを返す。サンプルを受け取った少し後に、メディア要素４３２は再び再生状態に遷移する。
【００７７】
典型的なＰｌａｙｂａｃｋ操作については、メディア要素４３２は、GetSampleAsync（映像）を発生させ、それにより、CustomMediaStreamSource５４０がサンプルを集め、それをReportGetSampleCompleted（映像サンプル）を介して返す。システムは、音声および／または映像の各サンプルの型毎にこの処理を繰り返す。
【００７８】
メディア要素４３２とCustomMediaStreamSource５４０との間の規定は、MediaStreamSourceが最初にメディア要素４３２に渡すMediaStreamDescriptionのセットにより決まる。メディア要素４３２からCustomMediaStreamSource５４０への通信、及びCustomMediaStreamSource５４０からメディア要素４３２への通信は、このMediaStreamDescriptionのセットに対応する。換言すれば、メディア要素４３２がCustomMediaStreamSource５４０に渡すことができる各MediaStreamDescriptionには制約があり、すなわち、CustomMediaStreamSource５４０が含有するMediaStreamDescriptionの少なくとも１つに等しい。逆に言えば、CustomMediaStreamSource５４０は、メディア要素４３２に伝えてあるものよりも多くの余剰のストリームについて分かっていても良いが、メディア要素４３２にそれらの余剰のストリームについて問うことはない。そのような規定上の問題を避けるための１つの方法は、CustomMediaStreamSource５４０が、利用されている間、ReportMediaCompletedへの呼び出しの最中に渡される記述の同じコレクションを保持することである。
【００７９】
図７は、一実施形態における、カスタムコンテナの形式を扱うMediaStreamSourceのサブクラス化を示すデータフロー図である。開発者は、MediaStreamSourceをサブクラス化して開発者独自のコンテナ形式を扱うことができる。MediaStreamSource  ＡＰＩのほとんどは対になって機能し、図７に表される呼び出しパターンに追随する。すなわち、メディア要素４３２は、情報を受け入れる準備ができている時に、CustomMediaStreamSource５４０において内部メソッドに対する要求を行う。CustomMediaStreamSourceの内部メソッドは、保護される「Async」メソッドに直接呼び出しを行う。CustomMediaStreamSource５４０は何らかの処理を行い、そして、CustomMediaStreamSource５４０は、保護される「Completed」メソッドを呼び出して、要求される情報を持っていることを信号伝達する。「Completed」メソッドは、メディア要素４３２上に内部メソッドを呼び出して、その情報をCustomMediaStreamSource５４０が持っていることを信号伝達し、かつ、その情報をメディア要素４３２に渡す。
【００８０】
なお、メソッドの名称は「Async」であっても、コードは「Async」メソッド内からの対応する「Completed」の呼び出しと同期して応答することができる。「Async」という名称は、メディア要素４３２がこのメソッドをどのように呼び出すかについて暗示すること以上のためのものである。さらに、一例の実装において、MediaStreamSourceのサブクラスは、適合する「Async」メソッドの呼び出しに応答して「Completed」メソッドを呼び出すことしかできない。これについての例外は、GetSampleAsyncとReportGetSampleCompletedである。この場合、CustomMediaStreamSource５４０は、バッファリング中でも良く、また、１またはそれより多くのReportGetSampleProgress呼び出しで応答し、続いて、ReportGetSampleCompleted呼び出しを行うことができる。本例において、メディア要素４３２が最初に、適合する「Async」メソッドを呼び出さずに、「Completed」メソッドがCustomMediaStreamSource５４０により呼び出されると、「Async」からの呼び出しに応答して「呼び出しのみ完了」のメッセージと共に、InvalidOperationExceptionが発生される。メディア要素４３２は、１回に１つの「Async」呼び出しを行うだけで、別の要求を発行する前に、CustomMediaStreamSource５４０からの「Completed」の応答を待つことになる。これについての例外は、CloseAsyncであり、これは、メディア要素４３２がエラーのため閉じたい場合、または、メディア要素４３２が閉じられている最中である場合、任意の他のAsync呼び出しの後に発生される。
【００８１】
上記の記載より、メディアインタラクションシステムの特定の実施形態が、例示の目的で本明細書に記載されたが、本発明の趣旨および範囲を逸脱することなく種々の変形を行うことができることは理解されるであろう。従って、本発明は、添付の請求項による以外は制限されない。
【図１】
0005781497.tif 000002
【図２】
0005781497.tif 000003
【図３】
0005781497.tif 000004
【図４】
0005781497.tif 000005
【図５】
0005781497.tif 000006
【図６】
0005781497.tif 000007
【図７】
0005781497.tif 000008