JP2015029309A - 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション - Google Patents

単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション Download PDF

Info

Publication number
JP2015029309A
JP2015029309A JP2014184067A JP2014184067A JP2015029309A JP 2015029309 A JP2015029309 A JP 2015029309A JP 2014184067 A JP2014184067 A JP 2014184067A JP 2014184067 A JP2014184067 A JP 2014184067A JP 2015029309 A JP2015029309 A JP 2015029309A
Authority
JP
Japan
Prior art keywords
processor
image
pixels
data
instructions
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2014184067A
Other languages
English (en)
Other versions
JP5968384B2 (ja
Inventor
ワイ.アブド ナディム
A Abboud Nadim
ワイ.アブド ナディム
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JP2015029309A publication Critical patent/JP2015029309A/ja
Application granted granted Critical
Publication of JP5968384B2 publication Critical patent/JP5968384B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N1/00Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
    • H04N1/46Colour picture communication systems
    • H04N1/64Systems for the transmission or the storage of the colour picture signal; Details therefor, e.g. coding or decoding means therefor
    • H04N1/646Transmitting or storing colour television type signals, e.g. PAL, Lab; Their conversion into additive or subtractive colour signals or vice versa therefor

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)
  • Image Processing (AREA)
  • Compression Of Band Width Or Redundancy In Fax (AREA)
  • Advance Control (AREA)

Abstract

【課題】ベクトルプロセッサ上で利用可能な並列命令を使用して画像データを圧縮するための技術を提供する。
【解決手段】RGBAフォーマットのソース画像が受信され、一連のベクトルプロセッサ命令を使用して、その画像を個々のR、G、B、Aチャネルに分割する並列処理ステップを行って、次に、それをYCoCg色空間に変換してY、Co、Cgチャネルにそれぞれ圧縮して、次に、そのソース画像の圧縮バージョンに対応する出力画像を記録する。
【選択図】図2

Description

コンピュータは以前、独立型で他のコンピュータとのインタラクションを最小限またはほとんど行わなかったが、現在のコンピュータは、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、ダイアルアップ接続などを通じて幅広い種類のコンピュータとインタラクトする。インターネットの普及によって、コンピュータ間の接続性がますます重要になり、多くの新しいアプリケーションおよび技術が開発されている。大規模ネットワークの普及、および低コストのパーソナルコンピュータの可用性の拡大によって、多くの人々の仕事、交流(interact)、通信および遊びのやり方が抜本的に変わった。
人気の高まっているネットワーキングの一つの形態は、一般的にバーチャルコンピューティングシステムと呼ばれ、リモートデスクトッププロトコル(RDP)、独立型コンピューティングアーキテクチャ(ICA)、およびデスクトップと他のアプリケーションとをリモートクライアントと共有する他のものなどのプロトコルを使用することができる。このようなコンピューティングシステムは、典型的には、クライアントからのキーボード押下およびマウスクリックまたはマウス選択をサーバに伝送して、ネットワーク接続(例えば、インターネット)を介してスクリーンの更新を反対方向に送り返す。このように、現実にはアプリケーションのスクリーンショットがサーバ側で表示される際にクライアントデバイスにそのスクリーンショットが送信されるにすぎないが、ユーザは、あたかもユーザのマシンがLANの一部として動作しているかのような体験をする。
ビットマップは、ネットワーク接続(例えば、インターネット)を介して伝送される時の帯域幅消費(bandwidth consumption)という観点から、すべてのビットマップを送信するよりも費用がかかるために、ほとんどの仮想システムは最近、グラフィックプリミティブおよび他の動作を送信して、何をどうやって描画するかをクライアント側のサブルーチンに教える。例えば、クライアントに、矩形が描画されるべき場所、サイズ、色などについての情報に沿って矩形を描画するように教えることができる。例えば、矩形を使用して、ユーザインタフェース用の押しボタンやドキュメントの境界線を描画できる、または矩形が役立ちそうなその他の用途に使用できる。もちろん、他の形および動作も多くあり、それらをより高性能で、リモートクライアント上に転送して動作を行うのにするべきより多くの処理を要求できるプリミティブとして使用することができる。
アプリケーションがより高性能なグラフィカルユーザインタフェースを獲得し続けるにつれて、上記のプリミティブの使用による処理がますます増える。例えば、ビットマップ画像は、基本的に各ピクセルと関連付けられた透明度の所望のレベルを示すアルファチャネルを含むように拡張されている。この透明度レベルは、ビットマップの各ピクセルを、そのビットマップが表示されている場所にすでに存在している色と調和させる(blend)方法をクライアントに命令する。高性能なプリミティブの更新の処理と関連付けられた手間のさらによい例は、動画オブジェクトまたは要素であり、そこではコマンドのシーケンスは動画の各ステージにおいて動画の描画方法をクライアントに命令しなければならない。プリミティブのシーケンスが複雑すぎる時、より複雑な他のプリミティブ動作の潜在的に長いシーケンスよりはむしろ、簡素に表示することができるビットマップ表示を送信するほうが時には理にかなう場合がある。しかしながら以前に述べたように、ほとんどのビットストリーム圧縮の限界がネットワーク帯域幅を伴うために、スクリーンの完全なビットマップ表示を継続的に送信するのには費用がかかりすぎる場合がある。
ベクトルプロセッサとして知られるプロセッサのクラスが存在し、ベクトルプロセッサは、その命令セットアーキテクチャ(ISA)内に単一命令複数データ(SIMD)命令を有する。ネハレム(商標)プロセッサのような、いくつかのインテル(商標)×86ISAプロセッサ内のSSE4.2命令などのストリーミングSIMD拡張命令(SSE)は、このようなSIMD命令の形式である。これらのプロセッサは、あるタイプのデータの高速処理が可能である。なぜならば、それらのプロセッサは、大きなデータの塊に瞬時に動作することができるからである。例えば、画像が処理される場合、SIMDプロセッサは、単一のピクセルに一度で動作する代わりに、単一の命令と並列する数個のピクセルに動作できる。これにより命令自体を処理する性能が向上するだけでなく、メモリからデータをフェッチするのにかかる時間も短縮できる。
SIMD命令は、圧縮用画像データの処理などの、いくつかのタイプのプロセッサの性能を向上させる機会を提供するが、その処理を実装するのに必要なアルゴリズムおよび技術は、ベクトルプロセッサでないものを用いるよりもかなり難解である。データフロー、およびそれを並列で動作できる方法でデータを組織化することに対して特別な注意を払わなければならない。そのため、画像データに対する動作において並列処理を増加させる新しい技術によって利益を得るであろう。
本発明の実施形態は、ベクトルプロセッサ上で画像を圧縮する方法を備える。その方法は、単一の命令を64ビットで動作する一連の動作を使用して、R、G、B、A情報のそれぞれに対して各ピクセルが8ビットを備える赤−緑−青−アルファ(RBGA)ソース画像を必要とする。それは、各チャネルを16ビット配列し、次にソース画像を平坦化して個々のR、G、Bベクトルを作り出す。次に、各ベクトルが解凍されて、8つのゼロを1ピクセルが8ビット値の各ベクトルの前に配置する。それは、これらの解凍ベクトルを必要とし、その解凍ベクトルをRGB色空間からY、CoおよびCgベクトルを備える輝度−オレンジ−緑(YCoCg)色空間に変換する。それは、次にCoおよびCgベクトルにロッシー圧縮を使用して、次に各ベクトルをランレングス符号化して最終的にソース画像の圧縮バージョンに対応する出力画像を記憶する。
上記および同様の処理を行うシステム、方法、およびコンピュータ可読記憶媒体が開示される。
本開示の1または複数のさまざまな態様は、本開示の本明細書で示す態様を達成するための回路および/またはプログラミングを含むことができるがこれに限定されず、その回路および/またはプログラミングは、システム設計者の設計上の選択に依存しながら本明細書で示す態様を達成するように構成されたハードウェア、ソフトウェア、および/またはファームウェアの実質的な任意の組み合わせとすることができることを当業者は認識することができる。
前述のものは概要であるので、必然的に詳細の簡略化、一般化および省略を含む。当業者は、本概要は単なる例証であり決して限定を意図するものではないことを認識するであろう。
本開示の態様を実装することができる例示的なコンピュータシステムを示す図である。 本開示の例示的なオペレーティングプロシージャを示す図である。 図2の動作可能なプロシージャによって作り出される出力画像をサブサンプリングするための動作可能なプロシージャを示す図である。
本明細書の実施形態では、ピクセル用の色チャネルを平面データソースに分割または分離することによって画像のデータ圧縮を強化するための前処理ステージまたは機構を提供する。典型的には、画像データは、画像(ビットマップなど)内の各ピクセルが色チャネルごとに1つのコンポーネントを有するように、色空間用にインタリーブされたチャネルタイプのセットとして表示される。例えば、赤、緑および青(RGB)の色空間を有するピクセルは、赤用に1つの色チャネル、緑用に1つの色チャネル、および青用に1つの色チャネルを有する。それにより、例示的な実施形態は、同様のコンポーネントが同じ平面内で示されるように、各チャネル用のコンポーネントを平面データソースに分離する。インタリーブされたビットマップまたはデジタル画像を平面表示に分離することによって、各平面を独立して圧縮し、しばしば高い圧縮比を実現することができる。これは、特に、大抵の場合ビットマップ全体でほとんど変わらないと見込まれるチャネル(例えば、ビットマップ内の要素の透明度を記述するアルファチャネル)に当てはまる。
言い換えれば、例示的な実施形態は、しばしばあるチャネルが遷移され得る一方で、別のチャネルはほとんど変わらないという事実を利用する。チャネルデータの操作を通じてまたは色空間をRGBのため以外の何かに変換することを通じて、上記の実施形態の利用をさらに強化することができる。例えば、照明およびクロミナンスという観点からピクセルを定義する(例えば、YUV、YCoCgなど)他の色空間は、典型的には人間の目がどのように色を認識するかという観点から色空間をより多く記述する。言い換えれば、このようなタイプの色空間は、目がより敏感である色コンポーネントをその目があまり敏感でないチャネルから分離する。これによって、人間の目の知覚の違いを利用することによって、色チャネル内の情報を落として(degrade)圧縮モデルがより効率的に対処することができるパターンを強化することが可能であり、さらにその画像が知覚的にロスレスのままにすることが可能である。
本明細書で説明したように、圧縮比を強化するために、特定の色空間またはデジタル画像用の色情報を修正可能にするいくつかの方法があり得る。例えば、特定の色スキームのクロミナンスチャネルを、その特定のチャネルと関連付けられたすべてのビットカウントを減少させることによって量子化できることによって、その色パレットの忠実度が低下するが、必ずしも色スキームの範囲が減少するわけではない。代替的または併用して、さまざまなクロミネンス値のサンプルピクセル空間またはサブサンプリングを全体値のある平均に修正する、およびまたはその値を公分母(common denominator)にもってくる他の同様の修正を行うことができる。以下により詳細に説明するように、圧縮用画像データを前処理する時にパターン認識を強化するようにデータを修正するための他の機構もあり得る。
ひとたびデジタル画像またはビットマップが論理的に分離したデジタル画像、即ちチャネル情報の各プレーン用のデジタル画像に分割される、およびひとたびデータのすべての操作または修正が行われると、例示的な実施形態は、二次元ランレングス符号化スキームなどの、標準または周知の符号化モジュールを使用してその値を符号化することができる。各走査線のビットマップを、走査線の前に置いて(precede)その走査線と区別して取り扱うことができ、次に、以下により詳細に説明するように、そのような区別を符号化することができる。
本開示の実施形態は、1または複数のコンピュータ上で実行できる。図1および以下の考察は、本開示を実装できる適切なコンピューティング環境の簡潔な概説を提供することを意図する。当業者は、図1のコンピュータシステムの一部またはすべてのコンポーネントを使用して、図3および図4のコンピュータを達成(effectuate)することができることを認識することができる。
本開示を通じて使用される用語、回路は、例えば、ハードウェア割り込みコントローラ、ハードドライブ、ネットワークアダプタ、グラフィックプロセッサ、および音声コーデックなどの専用ハードウェアコンポーネント含むことができる。同じまたは他の実施形態において、回路は、ファームウェアによってまたはセットスイッチによって機能(複数可)を行うように構成されたマイクロプロセッサを含むことができる。同じまたは他の例示的な実施形態において、回路は、例えば、マルチコア汎用処理ユニットの1または複数のコアなどの、1または複数の論理プロセッサを含むことができる。この例の論理プロセッサ(複数可)を、例えば、RAM、ROM、ファームウェア、および/または仮想メモリなどのメモリからロードされる機能(複数可)を行うのに動作可能なロジックを実施するソフトウェア命令によって構成することができる。回路がハードウェアとソフトウェアとの組み合わせを含む例示的実施形態において、メーカー(implementer)は、論理プロセッサによって処理することができるマシン可読コードに後でコンパイルされるロジックを実施するソースコードを書き込むことができる。当業者は、技術の最先端がハードウェア、ソフトウェア、またはハードウェア/ソフトウェアの組み合わせにおいてほとんど区別がつかない所まで進歩していることを認識することができるので、特定の機能を達成するハードウェアかソフトウェアかの選択は、メーカーに任された設計上の選択である。より詳細には、当業者は、ソフトウェア処理は同等のハードウェア構造に転換することができ、ハードウェア構造自体は同等のソフトウェア処理に転換することができることを認識することができる。従って、ハードウェア実装かソフトウェア実装かの選択は、設計上の選択の一つであり、メーカーに任される。
図1を参照すると、例示的な汎用コンピューティングシステムが示されている。汎用コンピューティングシステムは、1または複数の論理プロセッサ、システムメモリ22、およびシステムメモリを含むさまざまなシステムコンポーネントを処理ユニット21に接続するシステムバス23を含むことができる汎用処理ユニット21を含む、従来型コンピュータ20などを含むことができる。システムバス23は、メモリバスまたはメモリコントローラ、周辺バス、およびさまざまなバスアーキテクチャを任意に使用したローカルバスを含む、いくつかのタイプのバス構造のいずれにもすることができる。システムメモリは、リードオンリーメモリ(ROM)24およびランダムアクセスメモリ(RAM)25を含む。起動時などの、コンピュータ20内の要素間で情報を転送するのに役立つ基本ルーチンを含む、基本入力/出力システム26(BIOS)は、ROM24に記憶される。コンピュータ20は、図示されないハードディスクの読み取りおよび書き込み用ハードディスクドライブ27、リムーバブル磁気ディスク29の読み取りおよび書き込み用磁気ディスクドライブ28、およびCD−ROMまたは他の光媒体などのリムーバブル光ディスク31の読み取りおよび書き込み用光ディスクドライブ30をさらに含むことができる。ある例示的な実施形態において、本開示の態様を実施するコンピュータ実行可能命令を、ROM24、ハードディスク(図示せず)、RAM25、リムーバブル磁気ディスク29、光ディスク31、および/または汎用処理ユニット21のキャッシュに記憶できる。ハードディスクドライブ27、磁気ディスクドライブ28、および光ディスクドライブ30は、ハードディスクドライブインタフェース32、磁気ディスクドライブインタフェース33、および光ドライブインタフェース34によってそれぞれシステムバス23に接続される。ドライブおよびそれらに関連付けられたコンピュータ可読媒体は、コンピュータ20用のコンピュータ可読命令、データ構造、プログラムモジュールおよび他のデータの不揮発性記憶を提供する。本明細書で説明される例示的な環境は、ハードディスク、リムーバブル磁気ディスク29およびリムーバブル光ディスク31を用いるが、磁気カセット、フラッシュメモリカード、デジタルビデオディスク、ベルヌーイカートリッジ、ランダムアクセスメモリ(RAM)、リードオンリーメモリ(ROM)などのコンピュータによってアクセス可能なデータを記憶することができる他のタイプのコンピュータ可読媒体も例示的なオペレーティング環境に使用できることを当業者は認識されたい。
オペレーティングシステム35、1または複数のアプリケーションプログラム36、他のプログラムモジュール37およびプログラムデータ38を含む多数のプログラムモジュールを、ハードディスク、磁気ディスク29、光ディスク31、ROM24またはRAM25上で記憶できる。ユーザは、キーボード40およびポインティングデバイス42などの入力デバイスを通じてコマンドおよび情報をコンピュータ20に入力できる。他の入力デバイス(図示せず)は、マイクロフォン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナなどを含むことができる。これらと他の入力デバイスは、システムバスに接続されたシリアルポートインタフェース46を通じて汎用処理ユニット21に接続されることが多いが、パラレルポート、ゲームポートまたはユニバーサルシリアルバス(USB)などの他のインタフェースによっても接続できる。ディスプレイ47または他のタイプのディスプレイデバイスも、ビデオアダプタ48などのインタフェース経由でシステムバス23に接続することができる。ディスプレイ47に加えて、コンピュータは、典型的には、スピーカおよびプリンタなどの他の周辺出力デバイス(図示せず)を含む。図1の例示的なシステムは、ホストアダプタ55、小型計算機システムインタフェース(SCSI)バス56およびSCSIバス56に接続される外部記憶デバイス62も含む。
コンピュータ20は、リモートコンピュータ49などの、1または複数のリモートコンピュータへの論理接続を使用するネットワーク化環境において動作できる。リモートコンピュータ49は、別のコンピュータの、サーバ、ルータ、ネットワークPC、ピアデバイスまたは他の共有ネットワークノードにすることができ、メモリ記憶デバイス50のみが図1に図示されているが。典型的には、コンピュータ20に対して上述した要素の多くまたはすべてを含むことができる。図1に示された論理接続は、ローカルエリアネットワーク(LAN)51およびワイドエリアネットワーク(WAN)52を含むことができる。このようなネットワーキング環境は、オフィス、企業規模のコンピュータネットワーク、イントラネットおよびインターネットにおいて当たり前となっている。
LANネットワーキング環境に使用される時、コンピュータ20を、ネットワークインタフェースまたはアダプタ53を通じてLAN51に接続することができる。WANネットワーキング環境に使用される時、コンピュータ20は、典型的には、モデム54またはインターネットなどのワイドエリアネットワーク52に通信を確立するための他の手段を含むことができる。モデム54は、内部モデムまたは外部モデムとしてもよく、シリアルポートインタフェース46経由でシステムバス23に接続することができる。ネットワーク化環境において、コンピュータ20またはその一部に対して示されたプログラムモジュールを、リモートメモリ記憶デバイスに記憶できる。図示されたネットワーク接続は例示的であり、コンピュータ間で通信リンクを確立する他の手段も使用できることが認識されよう。さらに、本開示の多数の実施形態は、特にコンピュータ化されたシステムによく適していることが想定されるが、本文書において本開示をそのような実施形態に限定する意図はまったくない。
前述の詳細な説明では、例示および/または動作可能な図を介してシステムおよび/またはプロセスのさまざまな実施形態を説明した。その限りにおいてブロック図、および/または例は、1または複数の機能および/または動作を含むが、そのようなブロック図における各機能および/または動作、または例を、広範囲にわたるハードウェア、ソフトウェア、ファームウェア、またはその実質的な任意の組み合わせによって個々におよび/または集合的に実装することができることを当業者には理解されよう。
本明細書に説明した本発明の対象の特定の態様について説明してきたが、当業者には当然ながら、本明細書の教示に基づいて、本明細書に説明した本発明の対象およびその幅広い態様から逸脱せずに変更および修正を行うことができるので、添付の特許請求の範囲は、本明細書に説明した本発明の対象の真の精神および範囲と同様に、それらの範囲においてそのようなすべての変更および修正を網羅するものである。
図2は、ソース画像を、単一命令複数データ(SIMD)命令セットを備えるプロセッサ上で圧縮するための例示的なオペレーティングプロシージャを示している。SIMD命令セット用いたプロセッサは、一般にベクトルプロセッサとして知られる。ネハレム(商標)プロセッサのような、いくつかのインテル(商標)x86ISAプロセッサ内のSSE4.2命令などのストリーミングSIMD拡張命令(SSE)は、このようなSIMD命令の形式である。このようなプロセッサは、並列形式でデータの大部分に瞬時に動作できる。例えば、このような64ビットプロセッサは、2つの整数を2つの64ビットワードにそれぞれ入れることによって、符号付き32ビット整数の2つのセットを同時に和し、次に各64ビットワードに加えることができる。各ローワードが2∧31を含む場合など、通常ローワードからハイワードへオーバーフローがある場合、その命令は、一般にこれを把握し、ハイワードにオーバーフローしない。このような動作可能なプロシージャを使用して、リモートデスクトッププロトコル(RDP)などを経由して、ネットワークに送信する画像を圧縮できる。このような実施形態において、ソース画像および出力画像は、動作するプロシージャが実行されるコンピュータにおいてローカルの場合でもユーザが体験するなどで表示されたユーザセッションに対応できる。その表示されたユーザセッションは、コンピュータデスクトップだけでなくユーザがそのコンピュータにおいて見るような方法でタイル表示された任意のオープンアプリケーションウィンドウも含むことができる。
実施形態において、ソース画像は、ピクセルの行および列を備え、各ピクセルは、ピクセル用の赤(R)色値、緑(G)色値、青(B)色値およびアルファ(A)(または透明度)値のそれぞれに8ビットが当てられるように、RGBA色空間内に32ビットを備える。
動作200は、その方法から開始する。例えば、その画像を圧縮する命令に沿ってソース画像を受信すると、それを実行できる。
動作202は、ソース画像の各チャネルを16ビット配列することを示しており、ソース画像は少なくとも1ピクセルを備え、各ピクセルは赤(R)値、緑(G)値、青(B)値およびアルファ(A)値を備える。これは、そのソース画像のメモリ内の位置が16バイトの倍数であるアドレス内にあるか確認し、次に、すべてのピクセルが8ビットであるか、次に、メモリ空間内に8ビット配列されているかを確認することを備える。
動作204は、ソース画像を平坦化してRベクトル、GベクトルおよびBベクトルを作り出すことを示しており、Rベクトルは各ピクセルのR値を備え、Gベクトルは各ピクセルのG値を備え、Bベクトルは各ピクセルのB値を備える。1番目のピクセルの赤値がR(1)になるようにピクセルの色値が表されている場合、n個のピクセルのソース画像は、初めのうちはR(1)G(1)B(1)A(1)R(2)G(2)B(2)A(2)...R(n)G(n)B(n)A(n)の形をとると考えることができる。ソース画像の平坦化において、そのような各ピクセルの色コンポーネントは、R(1)R(2)...R(n)、G(1)G(2)...G(n)、B(1)B(2)...B(n)、A(1)A(2)...A(n)の形に再配列される。この再配列を作り出するための効率的なアルゴリズムは、1番目の128ビットの画像を4つの32ビットピクセルを備えるようにロードすることである。次に、1番目、5番目、9番目および13番目の8ビットセクションにRバッファを加え、2番目、6番目、10番目および14番目の8ビットセクションにGバッファを加え、3番目、7番目、11番目および15番目の8ビットセクションにBバッファを加える。次に、連続する128ビット画像ごとにそのプロセスを繰り返す。実施形態において、Aチャネルは平坦化されるわけでも後で使用されるわけでもなく、計算時間を節約して画像を圧縮するために廃棄される。
動作206は、Rベクトル、Gベクトル、およびBベクトルのそれぞれを解凍して、8つのゼロのシーケンスを8ビットのベクトルの前にそれぞれ入れるようにすることを示している。ピクセルの各チャネルが8ビットを備える実施形態において、これは、2つの係数によってすべてのベクトルサイズが増加するだけでなく、2つの係数によって各ピクセルが占める有効空間(effective space)も増加する。RベクトルがR(0)R(1)...R(n)として表されて8つのゼロのストリングが0x00として表される場合、解凍ベクトルは、それらのゼロが各ピクセルの赤値の前に置かれて、0×00、R(0)、0x00、R(1)、...0x00、R(n)となる。
動作208は、Coベクトルを、RベクトルからBベクトルを引いた値に等しくなるように設定することを示している。実施形態において、これは、128ビットのRベクトルおよびBベクトルに一度で動作される。これは、128ビットのデータに一度で動作できるプロセッサへの単一の命令を用いて、128ビットのRベクトルおよびBベクトルに一度でロードして、RベクトルからBベクトルを引くことを備える。ゼロを用いてベクトルが解凍された場合、各ベクトルの128ビットは、8ビットチャネル値を合計で64ビット、および8つのゼロから成る8グループを別に合計64ビット備える。ベクトルがゼロを介入して解凍されたので、オーバーフローの懸念がない。つまりどのオーバーフローもその8つのゼロのセットにあふれて次の数字まで行かない。例えば、圧縮値を0x11および0x1Fにしてそれらが和された場合、その結果は0x30となる。しかしながら、そのような値の解凍バージョンは0x0101および0x010Fであり、その結果は0x0210となる。右から8ビットのオーバーフローは、実データの左から8ビットになるのではなくゼロになる。この方法において同様のロジックを他の動作に適用し、特に動作210−214に適用する。
動作210は、Yベクトルを、等差級数的に右に1回シフトしてBベクトルとCoベクトルとの和に等しくなるように設定して、次に、等差級数的に右に1回シフトしてCgベクトルと和されることを示している。擬似コードにおいて、この動作をY=B+(Co>>1)と表すことができる。実施形態において、単一のプロセッサ命令を用いてCoをシフトして、それを一時的な値に記録して、次に2番目の単一のプロセッサ命令を用いてYをBとその一時的な値との和に設定する。実施形態において、これは、128ビットの各ベクトルに一度で行われる。Coが0x1111 1111 1111 1101に等しく、それが右に1回シフトされたビットの場合、各ビットは右の場所に移動されて、右端のビットが廃棄されて、次に左端から2番目のビットがゼロ値を割り当てられる(左端のビットは、その数字が正の数か負の数かどうか示すのに使用されて、保存される)。こうして、0x1101 1111 1111 1110が作り出される。
動作212は、Cgベクトルを、YベクトルからGベクトルを引いた値に等しくなるように設定することを示している。実施形態において、これは、128ビットの各ベクトルに一度で行われる。
動作214は、Yベクトルを、等差級数的に右に1回シフトしてYベクトルをCgベクトルに加えた値に等しくなるように設定することを示している。実施形態において、これは、128ビットの各ベクトルに一度で行われる。擬似コードにおいて、この動作をY=Y+(Cg>>1)と表すことができる。
128ビットのベクトルに一度で動作する実施形態において、その方法は、次に連続する128ビットの各ベクトルに対して、各ベクトルがすべてこのように操作されるまで動作208−214を繰り返す。これらの動作がすべての画像上で動作するようにループされた実施形態において、その命令は、各ループ内に2回表示される。これは、単一の動作を用いて、平坦化された128のベクトルがメモリ内にロードされる場合に有利である。1番目の64ビットが解凍されて、次に動作されて、次に付加的なメモリアクセスなしで2番目の64ビットを解凍して動作できる。すべての128ビットが動作される時、別のメモリアクセスが要求されてそのループが再度開始される。
動作216は、Coベクトルを、Coベクトルを色損失レベルで割った値に等しくなるように設定し、次にクロムマスクに加えられることを示している。実施形態において、色損失レベルは、各16ビットピースのCoベクトルを右にシフトするために事前に決められたビット数であり(上記のように、値が符号化される場合に符号を保存する)、画像を圧縮する量に対応する。これによって、色情報の精度がいくらか低下する(最も重要でないビットが廃棄される)だけでなく、さらに多くのピクセルが同じ色値を有するので画像が最終的に圧縮され得る量も増加する(ランレングス符号化アルゴリズムの有効性が増加する)。同様に、クロムマスクは、クロム損失レベルによって16ビットごとをビット単位にして右にシフトされる128のセットを表す。クロムマスクレベルの和において、1番目のレベルの圧縮が行われる。
動作218は、Cgベクトルを、Cgベクトルを色損失レベルで割った値に等しくなるように設定し、次にクロムマスクに加えられることを示している。実施形態において、色損失レベルは、各16ビットピースのCoベクトルを右にシフトするために事前に決められたビット数であり(上記のように、値が符号化される場合に符号を保存する)。これによって、色情報の精度がいくらか低下する(最も重要でないビットが廃棄される)だけでなく、さらに多くのピクセルが同じ色値を有するので画像が最終的に圧縮され得る量も増加する(ランレングス符号化アルゴリズムの有効性が増加する)。同様に、クロムマスクは、クロム損失レベルによって16ビットごとをビット単位にして右にシフトされる128のセットを表す。クロムマスクレベルの和において、1番目のレベルの圧縮が行われる。実施形態において、クロムマスクは2進数列を備え、それらは、ピクセルの赤値のビット数の2倍に対応するビットグループ内の色損失レベルによって右にシフトされたビットを、プロセッサが同時に等差級数的に動作できるビット数に等しい。
動作220は、CoおよびCgベクトルをサブサンプリングする任意のステップを示している。これを、例えば、いくつかの隣接ピクセルの色値を平均化して、その平均値を各ピクセルの色値に割り当てることによって完了できる。これによって、多くの値が反復されるので、圧縮アルゴリズムが出力画像となる記憶空間をさらに削減することが可能になるであろう。図3の考察においてこの動作の実施形態のさらなる詳細が与えられる。
動作222は、Yベクトルをランレングス符号化することを示している。実施形態において、Yベクトルは、他の2つのベクトルが動作216および218で行われるように圧縮される。これは、人間の目がYベクトルで表される輝度に最も敏感であるので、この情報を保存する際、人間は他の2つのチャネルに対するロッシー圧縮があまり目立たないと思うであろう。ランレングス符号化は、同じデータ値が単回に分かれて連続したデータ値を、その回数によって表されるデータ値の数をカウントしながら記憶することによってベクトルを圧縮することを備えるロスレス圧縮スキームである。例えば、文字ストリングAAAAAAABBBBAAAAAがあるとして、このストリングのランレングスの符号化バージョンを(A7)(B3)(A5)と表現できる。実施形態において、このランレングス符号化は、レンペルジフ(LZ)アルゴリズムに従って行われる。LZアルゴリズムは、典型的には、圧縮されるオブジェクトとLZアルゴリズムによって保持されるデータ構造(しばしば辞書と呼ばれる)内に含まれるストリングのセットとの間で一致を検索することによって動作する。LZアルゴリズムが一致を見つける時、それは、データ構造内の一致する位置の参照と一致自体とを置き換える。実施形態において、他のランレングス符号化技術を使用して、反復実行を探して、そしてその反復実行を、反復される連長およびバイトパターンを表示するコードと置き換える順方向検索を行うことができる。実施形態において、二次元ランレングス符号化技術は、圧縮効率を高めるのに使用される。これは、ランレングス符号化をさらに容易にすることができる垂直反復が存在するゼロの「垂直」ストリップを実現するために、現在のピクセル行と以前のピクセル行との排他的論理和(XOR‘ing)によって実現される。
動作224は、Coベクトルをランレングス符号化することを示している。この符号化形態は、ごくわずかの異なるタイプの色を使用する画像上で最も効果がある(色調または色相の非常にわずかな変化であってもランレングス符号化の付加的な記憶空間を要求する)ので、その技術には、上記のベクトルに適用されるクロマ損失レベルが有効である。
動作226は、Cgベクトルをランレングス符号化することを示している。これを、動作222または224と同様にして行うことができる。
動作228は、出力画像の記憶を示しており、その出力画像はYベクトル、CoベクトルおよびCgベクトルを備え、その出力画像はそのソース画像に対応する。実施形態において、これは、YCoCg画像を非平坦化することを備える。実施形態において、記憶は、RAMなどのメモリに記憶して、次にクライアントによって使用されるリモートデスクトッププロトコル(RDP)に従ってコンピュータネットワークに画像を伝送することを備える。
図3は、図2の動作可能なプロシージャによって作り出されるような出力画像をサブサンプリングするための動作可能なプロシージャを示している。それを図2の動作220の実施形態とすることができる。
動作302は、出力画像を少なくとも1クアッド(quad)にセグメント化するステップを示しており、クアッドは、クアッド内の各ピクセルが出力画像の列をそのクアッド内のもう1つのピクセルと共有およびクアッド内の各ピクセルが出力画像の行をそのクアッド内のもう1つのピクセルと共有できるように4ピクセルを備え、各クワッドは、上部行(top row)および下部行(bottom row)を有し、しかもピクセルは最大でも1クワッドしか対応しない。この実施形態において、画像をサブサンプリングすることによってさらなる圧縮が生成され、CoおよびCgベクトルをランレングス符号化する前に、圧縮を高めるための画像の前処理を行うことできる。このような動作は、(画像忠実度の損失において)ピクセルによって表される色値の均一性を高めるので、ランレングス符号化を使用した圧縮の増加が可能になる。
動作304は、各クワッドの各行を16ビット値に解凍して、各行をゼロで配置するステップを示している。ピクセルの各チャネルが8ビットを備える実施形態において、これは、2つの係数によってすべてのベクトルサイズが増加するだけでなく、2つの係数によって各ピクセルが占める有効空間も増加する。RベクトルがR(0)R(1)...R(n)として表されて8つのゼロのストリングが0x00として表される場合、解凍ベクトルは、それらのゼロが各ピクセルの赤値の前に置かれて、0x00、R(0)、0x00、R(1)、...0x00、R(n)となる。
動作306は、各クワッドの上部行と下部行とを和して合わされた行を作り出すステップを示しており、そこでは各行内の各ピクセルが飽和値を有していて、上部行内のピクセルと下部行内のピクセルとの和が飽和値を越える時、上部行内のピクセルと下部行内のピクセルとの和をその飽和値に設定する。つまり、ピクセルの各チャネルが8ビットの情報を備えていて、そのチャネルの値が8ビットの符号なし整数として表されている場合、そのチャネルが有し得る最大値は、2^8−1すなわち255である。この255は、それより大きい値を記憶できないので、この例での飽和値である。2つの数字の和が255を超えるようでも、その和は255に設定される。つまり、100と150との和は、合わせて250の値を有する行になるが、通常350になるであろう100と250との和は、飽和値に限定され、その合わされた行は255の値を有する。この動作は、動作234−238と同様に画像のサブサンプリング部を備えることができる。
動作308は、合わされた各クワッドの行を、合わされたそのクワッドの行のワードシャッフルバージョン(word−shuffled version)と和すステップを示している。行を左から右にピクセル値0、1、2、3として表し得る場合、最初の2つの値が入れ替わることおよび最後の2つの値が入れ替わることによって、行1、0、3、2が作り出される。これは、次に、元行(original row)に加えられて、0+1、1+0、2+3、3+2の値を作り出す。そこで、最初の2つの値が互いに等しいおよび2番目の値が互いに等しいので、それらを冗長として無視できる。
動作310は、和して合わされた各クワッドの行を4で割るステップを示している。実施形態において、これは、2つの行の場所を等差級数的に右にシフトすることによって完了する。実施形態において、これは、128ビットの各ベクトルに一度で行われ、そのシフトは、上記の等差級数的シフティングの考察と同様に、128ビットストリングの4つの32ビット部で個々に発生する。4で割ることによって、クワッドの平均値が決定される。平均値を使用する際、ロッシー圧縮が実現される。4つの係数によって精度が低下するが、記憶される1つの値がクワッド内の4つのすべてのピクセルに対応するので、以前と比較してわずか4分の1の値を記憶すればよい。実施形態において、現在のクワッド内の冗長値は廃棄される。
動作312は、和して合わされた各クワッドの行を再圧縮するステップを示している。
実施形態において、これは、解凍動作と同類(sibling)である。つまり、その解凍動作中に導入された8つのゼロのグループを廃棄する。
<サンプルコード>
以下は、ハイレベルなC言語プログラミングのシンタックスにおけるサンプル擬似コードを備え、ベクトルプロセッサ上で実行される時、図2の詳細な説明で説明したのと同様に本開示の実施形態の方法において、ソース画像“srcImage”に動作する。
ULONG
NSTestCompress(
NSBitmap& srcImage,
PBYTE pOutputBuf,
ULONG cbMaxOutbufSize,
PBYTE pYBuffer,
PBYTE pCoBuffer,
PBYTE pCgBuffer,
ULONG cbPlaneOutputSize,
PBYTE pWorkBuf,
ULONG cbWorkBuf)
{
BOOL bSubSample = NS_SUBSAMPLE;
// We operate 4 pixels at a time
//
// P0 = R0G0B0A0
// P1 = R1G1B1A1
// P2 = R2G2B2A2
// P3 = R3G3B3A3
//
// First we planarize as follows using CPU
// Rn = R0R1R2R3
// Gn = G0G1G2G3
// Gn
//
//
//
// 16-byte align the output buffer
pYBuffer = (PBYTE)(XROUND_UP_16((ULONG)pYBuffer));
pCoBuffer = (PBYTE)(XROUND_UP_16((ULONG)pCoBuffer));
pCgBuffer = (PBYTE)(XROUND_UP_16((ULONG)pCgBuffer));
PBYTE pYBufferOrig = pYBuffer;
PBYTE pCoBufferOrig = pCoBuffer;
PBYTE pCgBufferOrig = pCgBuffer;

//
// 1) Prep the data by splitting planes
//
PBYTE pRbuffer, pGbuffer, pBbuffer;

//
// 16-byte align channels for SSE perf
//
ULONG cbColorChannelSpace = XROUND_UP_16(srcImage._height * srcImage._width);
if (cbColorChannelSpace * 3 > cbWorkBuf) {
return 0;
}
pRbuffer = pWorkBuf;
pGbuffer = pRbuffer + cbColorChannelSpace;
pBbuffer = pGbuffer + cbColorChannelSpace;
PBYTE pSrcPixel;
PBYTE pEndPixel;
ULONG* pRBufferDWORD = (ULONG*)XROUND_UP_16((ULONG)pRbuffer);
ULONG* pGBufferDWORD = (ULONG*)XROUND_UP_16((ULONG)pGbuffer);
ULONG* pBBufferDWORD = (ULONG*)XROUND_UP_16((ULONG)pBbuffer);

//
// 1) PLANARIZE - EFFICIENT
//
pSrcPixel = srcImage._pImgBits;
pEndPixel = pSrcPixel + srcImage._height* srcImage._stride;
while (pSrcPixel < pEndPixel) {
*pRBufferDWORD++ = X_MAKE_DWORD(pSrcPixel[0], pSrcPixel[4], pSrcPixel[8], pSrcPixel[12]);
*pGBufferDWORD++ = X_MAKE_DWORD(pSrcPixel[1+0], pSrcPixel[1+4], pSrcPixel[1+8], pSrcPixel[1+12]);
*pBBufferDWORD++ = X_MAKE_DWORD(pSrcPixel[2+0], pSrcPixel[2+4], pSrcPixel[2+8], pSrcPixel[2+12]);

pSrcPixel+=16;

}
//
// 2 Compute Y Coefficients
//
__m128i xmmZero = _mm_setzero_si128();
__m128i xmmRvect, xmmGvect, xmmBvect;
__m128i xmmYFirstQWORD, xmmCoFirstQWORD;
PBYTE pRbufferReader = pRbuffer;
PBYTE pGbufferReader = pGbuffer;
PBYTE pBbufferReader = pBbuffer;
PBYTE pBbufferReaderEnd = (pRbuffer + cbColorChannelSpace);
__m128i xmm1, xmm2, xmm3, xmmCo, xmmY, xmmCg;
__m128i xmmCo2, xmmY2, xmmCg2;

__m128i xmmChromaMask = _mm_set_epi16(0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL,
0x1ff >> X_COLOR_LOSS_LEVEL);
while (pRbufferReader < pBbufferReaderEnd) {

//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// First 64-bits in parallel
//

//
// Read color vectors
//
xmmRvect = _mm_loadl_epi64((__m128i*)pRbufferReader);
xmmGvect = _mm_loadl_epi64((__m128i*)pGbufferReader);
xmmBvect = _mm_loadl_epi64((__m128i*)pBbufferReader);
pRbufferReader += 8;
pGbufferReader += 8;
pBbufferReader += 8;
// unpack to R 0 G 0 B 0 (16 bits per channel to make math per
//16 bit possible)
xmmRvect = _mm_unpacklo_epi8(xmmRvect, xmmZero);
xmmGvect = _mm_unpacklo_epi8(xmmGvect, xmmZero);
xmmBvect = _mm_unpacklo_epi8(xmmBvect, xmmZero); i
// NOTE 3
// co = r - b;
// y = b + (co >> 1);
// cg = g - y;
// y += (cg >> 1);
xmmCo = _mm_subs_epi16(xmmRvect, xmmBvect);// co = R - B
xmm1 = _mm_srai_epi16(xmmCo, 1); // co >> 1
xmmY = _mm_adds_epi16(xmmBvect, xmm1); // y = b + co >> 1
xmmCg = _mm_subs_epi16(xmmGvect, xmmY); // cg = g - y
xmm1 = _mm_srai_epi16(xmmCg, 1); // cg >> 1
xmmY = _mm_adds_epi16(xmmY, xmm1); // y += cg >> 1
// Now do masks on Co and Cg
xmmCo = _mm_srai_epi16(xmmCo, X_COLOR_LOSS_LEVEL);
xmmCo = _mm_and_si128(xmmCo, xmmChromaMask);
xmmCg = _mm_srai_epi16(xmmCg, X_COLOR_LOSS_LEVEL);
xmmCg = _mm_and_si128(xmmCg, xmmChromaMask);

//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Second 64-bits
//
//
// Read color vectors
//
xmmRvect = _mm_loadl_epi64((__m128i*)pRbufferReader);
xmmGvect = _mm_loadl_epi64((__m128i*)pGbufferReader);
xmmBvect = _mm_loadl_epi64((__m128i*)pBbufferReader);
pRbufferReader += 8;
pGbufferReader += 8;
pBbufferReader += 8;
// unpack to R 0 G 0 B 0 (16 bits per channel to make math per
//16 bit possible)
xmmRvect = _mm_unpacklo_epi8(xmmRvect, xmmZero);
xmmGvect = _mm_unpacklo_epi8(xmmGvect, xmmZero);
xmmBvect = _mm_unpacklo_epi8(xmmBvect, xmmZero);
//
// co = r - b;
// y = b + (co >> 1);
// cg = g - y;
// y += (cg >> 1);
xmmCo2 = _mm_subs_epi16(xmmRvect, xmmBvect);// co = R - B
xmm1 = _mm_srai_epi16(xmmCo2, 1); // co >> 1
xmmY2 = _mm_adds_epi16(xmmBvect, xmm1); // y = b + co >> 1
xmmCg2 = _mm_subs_epi16(xmmGvect, xmmY2); // cg = g - y
xmm1 = _mm_srai_epi16(xmmCg2, 1); // cg >> 1
xmmY2 = _mm_adds_epi16(xmmY2, xmm1); // y += cg >> 1
// Now do masks on Co and Cg

xmmCo2 = _mm_srai_epi16(xmmCo2, X_COLOR_LOSS_LEVEL);
xmmCo2 = _mm_and_si128(xmmCo2, xmmChromaMask);
xmmCg2 = _mm_srai_epi16(xmmCg2, X_COLOR_LOSS_LEVEL);
xmmCg2 = _mm_and_si128(xmmCg2, xmmChromaMask);
//
// Now do storage
//
// Y component - pack into 16-bytes
xmmY = _mm_packs_epi16(xmmY, xmmY2);
_mm_store_si128((__m128i*)pYBuffer, xmmY); //stores in one shot
pYBuffer += 16;
// Co component - pack into 16-bytes
xmmCo = _mm_packs_epi16(xmmCo, xmmCo2);
_mm_store_si128((__m128i*)pCoBuffer, xmmCo);
pCoBuffer += 16;
// Cg component - pack into 16-bytes
xmmCg = _mm_packs_epi16(xmmCg, xmmCg2);
_mm_store_si128((__m128i*)pCgBuffer, xmmCg);
pCgBuffer += 16;
}
//
// Now do the ACRUSH magic on each channel!;
//

ULONG retVal;
if (!g_pACContext) {
g_cbACContextSize = RDPCompress_GetContextSize(PACKET_COMPR_TYPE_ACRUSH);
g_pACContext = malloc(g_cbACContextSize);
RDPCompress_InitSendContext(g_pACContext, g_cbACContextSize, PACKET_COMPR_TYPE_ACRUSH);
}
ULONG cbCompressedSize;
ULONG cbOrigSize;
//
// Do Y Channel
//
cbCompressedSize = cbColorChannelSpace;
ULONG cbOutSizeTotal = 0;
PBYTE pCurWriteOutput = pOutputBuf;
//
// ~~~~~~~~~~~~~~~~~~ Y component ~~~~~~~~~~~~~
//
retVal = XRDPCompress(PACKET_COMPR_TYPE_ACRUSH,
pYBufferOrig,
pCurWriteOutput,
&cbCompressedSize,
g_pACContext);
/// printf("Y: run=%d compr=%d\n", cbRunLength, cbCompressedSize);
if (retVal & PACKET_COMPRESSED) {
cbOutSizeTotal += cbCompressedSize;
}
else {
memcpy(pCurWriteOutput, pYBufferOrig, cbColorChannelSpace);
cbOutSizeTotal += cbColorChannelSpace;
}
pCurWriteOutput += cbOutSizeTotal;

//
// ~~~~~~~~~~~~~~~~~~ Co component ~~~~~~~~~~~~~
//
//
// Downsample CO
//
if (bSubSample) {
ULONG cbSubSampleSize;

cbSubSampleSize = NSSubSample2xColorChannelSSE(pCoBufferOrig, cbColorChannelSpace, srcImage._width, srcImage._height,
pWorkBuf, cbWorkBuf);
pCoBufferOrig = pWorkBuf;
cbCompressedSize = cbSubSampleSize;

}
else {
cbCompressedSize = cbColorChannelSpace;
}
retVal = XRDPCompress(PACKET_COMPR_TYPE_ACRUSH,
pCoBufferOrig,
pCurWriteOutput,
&cbCompressedSize,
g_pACContext);

if (retVal & PACKET_COMPRESSED) {
cbOutSizeTotal += cbCompressedSize;
}
else {
memcpy(pCurWriteOutput, pCoBufferOrig, cbColorChannelSpace);
cbOutSizeTotal += cbColorChannelSpace;
}
pCurWriteOutput += cbCompressedSize;

//
// ~~~~~~~~~~~~~~~~~~ Cg component ~~~~~~~~~~~~~ //exactly same as Co
//
// Downsample CO
//
if (bSubSample) {
ULONG cbSubSampleSize;

cbSubSampleSize = NSSubSample2xColorChannelSSE(pCgBufferOrig, cbColorChannelSpace, srcImage._width, srcImage._height,
pWorkBuf, cbWorkBuf);
pCgBufferOrig = pWorkBuf;
cbCompressedSize = cbSubSampleSize;

}
else {
cbCompressedSize = cbColorChannelSpace;
}

retVal = XRDPCompress(PACKET_COMPR_TYPE_ACRUSH,
pCgBufferOrig,
pCurWriteOutput,
&cbCompressedSize,
g_pACContext);
if (retVal & PACKET_COMPRESSED) {
cbOutSizeTotal += cbCompressedSize;
}
else {
memcpy(pCurWriteOutput, pCgBufferOrig, cbColorChannelSpace);
cbOutSizeTotal += cbColorChannelSpace;
}
pCurWriteOutput += cbCompressedSize;
return cbOutSizeTotal;
}
以下は、ハイレベルなC言語プログラミングのシンタックスにおけるサンプル擬似コードを備え、ベクトルプロセッサ上で実行される時、図3の詳細な説明で説明したのと同様に本開示の実施形態の方法において、パラメータNSSubSample2xColorChannelSSE()によって定義された画像に動作する。
ULONG
NSSubSample2xColorChannelSSE(
PBYTE pSrcBytes,
ULONG cbLength,
ULONG width,
ULONG height,
PBYTE pOutputBytes,
ULONG cbMaxOutputLen
)
{
PBYTE pEndData = pSrcBytes + width*height;
__m128i xmmZero = _mm_setzero_si128();
ULONG* pOutputWriter = (ULONG*)pOutputBytes;

//
// Fix fix no uniform row
//
for (ULONG i=0; i<height-1; i++) {
PBYTE pCurrentRow = pSrcBytes + width * i;
PBYTE pRowEnd = pCurrentRow + width;
__m128i srcDataRow0;
__m128i xmm1;
__m128i srcDataRow1;

while (pCurrentRow < pRowEnd) {
srcDataRow0 = _mm_loadl_epi64((__m128i*)pCurrentRow);
srcDataRow1 = _mm_loadl_epi64((__m128i*)(pCurrentRow+width));
pCurrentRow += 8;
//
// Unpack to 16-bit values
//
srcDataRow0 = _mm_unpacklo_epi8(srcDataRow0, xmmZero);
srcDataRow1 = _mm_unpacklo_epi8(srcDataRow1, xmmZero);
//
// Add with saturate row1+row2
//
srcDataRow0 = _mm_adds_epi16(srcDataRow0, srcDataRow1);
//
//make a copy shuffled to swap each WORD
//
xmm1 = _mm_shufflehi_epi16(srcDataRow0, _MM_SHUFFLE(2,3,0,1));
xmm1 = _mm_shufflelo_epi16(srcDataRow0, _MM_SHUFFLE(2,3,0,1));
//
// Now add the alternating cols
//
xmm1 = _mm_adds_epi16(xmm1, srcDataRow0);
xmm1 = _mm_srai_epi16(xmm1, 2);
xmm1 = _mm_shufflehi_epi16(xmm1, _MM_SHUFFLE(3,1,2,0));
xmm1 = _mm_shufflelo_epi16(xmm1, _MM_SHUFFLE(3,1,2,0));
// bring together the unique values in the 2-LOWDWORDS
xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0));

//
// We now have
// (P00+P01+P10+P11) (P00+P01+P10+P11)
// (P02+P03+P12+P13)(P02+P03+P12+P13)
// net every other 16-bit value is redundant - pack away now
//
xmm1 = _mm_packs_epi16(xmm1, xmmZero);
// low 4 bytes are the averages we want
*pOutputWriter++ = *((ULONG*)&xmm1);


}
}

return cbLength / 4;

}

Claims (16)

  1. ベクトル処理をサポートするプロセッサ上で各ピクセルが赤―緑―青(RGB)画像データを備えるピクセルを含むソース画像を圧縮するための方法であって、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記画像をそのR、G、およびBコンポーネントに分離するステップであって、8つのゼロのシーケンスを前記R、G、およびBコンポーネントのそれぞれの8ビットの前に挿入することを含み、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記分離された画像を輝度―オレンジ―緑(YCoCg)画像データに変換するステップであって、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記YCoCg画像のCoおよびCgコンポーネントを圧縮するステップであって、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    前記圧縮画像データを記憶するステップと
    を備えることを特徴とする方法。
  2. 前記圧縮画像データのCoおよびCgコンポーネントをサブサンプリングするステップをさらに備えることを特徴とする請求項1に記載の方法。
  3. 前記サブサンプリングは、
    前記圧縮画像データを、4ピクセルからなる少なくとも1つのクアッドにセグメント化するステップと、
    各クワッドの各行を解凍するステップと、
    各クワッドの上部行と下部行とを和することによって、合わされた行を作り出すステップであって、前記上部行内のピクセルと前記下部行内のピクセルとの和が飽和値を越える時、前記上部行内のピクセルと前記下部行内のピクセルとの和を前記飽和値に設定するステップと、
    各クワッドの前記合わされた行を、当該クワッドの前記合わされた行のワードシャッフルバージョンと和すステップと、
    前記和して合わされた各クワッドの行を4で割るステップと、
    前記和して合わされた各クワッドの行を再圧縮するステップと
    を備えることを特徴とする請求項2に記載の方法。
  4. 前記ピクセルは、それぞれが8ビットから成る4つのチャネルを備えるステップを特徴とする請求項1に記載の方法。
  5. 前記Yコンポーネントは前記ソース画像の輝度に対応し、前記Coコンポーネントは前記ソース画像のオレンジに対応し、前記Cgコンポーネントは前記ソース画像の緑に対応することを特徴とする請求項1に記載の方法。
  6. リモートデスクトッププロトコル(RDP)プロトコル経由で前記圧縮画像データをネットワークに送信するステップをさらに備えることを特徴とする請求項1に記載の方法。
  7. ピクセルの各チャネルは8ビットを備え、前記ソース画像の各チャネルを配列することは各チャネルを16ビット配列することを備えることを特徴とする請求項1に記載の方法。
  8. 前記プロセッサは128ビットで同時に動作することを特徴とする請求項1に記載の方法。
  9. 前記分離するステップ、前記変換するステップ、および前記記憶するステップのうちの少なくとも1つの動作は、SIMD命令を前記プロセッサに送信して、少なくとも1つのチャネルのそれぞれが複数のピクセルを同時に動作することを備えることを特徴とする請求項1に記載の方法。
  10. 前記ソース画像は表示されるユーザセッションに対応することを特徴とする請求項1に記載の方法。
  11. 前記ソース画像および前記圧縮画像データのうちの少なくとも1つは、ビットマップ画像を備えることを特徴とする請求項1に記載の方法。
  12. 前記CoおよびCgコンポーネントを圧縮するステップは、前記画像を圧縮する量に対応する前記色損失レベルを用いて前記CoおよびCgコンポーネントを圧縮することを備えることを特徴とする請求項1に記載の方法。
  13. 前記CoおよびCgコンポーネントを圧縮するステップは、レンペルジフ(LZ)アルゴリズムに従ってランレングス符号化を行うことを備えることを特徴とする請求項1に記載の方法。
  14. ベクトル処理をサポートするプロセッサ上でソース画像を圧縮するためのシステムであって、
    プロセッサと、
    前記システムが動作可能である時に前記プロセッサと通信可能に接続され、プロセッサ実行可能命令を保持するメモリと、を備え、
    前記プロセッサ実行可能命令は、前記プロセッサ上で実行されると、前記システムに少なくとも、
    ピクセルを備える前記ソース画像を受信するステップであって、各ピクセルは赤―緑―青(RGB)画像データを備えるステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記画像をそのR、G、およびBコンポーネントに分離するステップであって、8つのゼロのシーケンスを前記R、G、およびBコンポーネントのそれぞれの8ビットの前に挿入することを含み、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記分離された画像を輝度―オレンジ―緑(YCoCg)画像データに変換するステップであって、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記YCoCg画像のCoおよびCgコンポーネントを圧縮するステップであって、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    前記圧縮画像データを記憶するステップと
    を行わせることを特徴とする方法。
  15. 前記プロセッサ上で実行されると、少なくとも、前記圧縮画像データを4ピクセルから成る少なくとも1つのグループに分け、4ピクセルから成る各グループをサブサンプリングするステップを前記システムに行わせるプロセッサ実行可能命令を、前記メモリがさらに保持することを特徴とする請求項14に記載のシステム。
  16. ベクトル処理をサポートするプロセッサ上でピクセルを含むソース画像を圧縮するための、コンピュータ可読命令を備えるコンピュータ可読記憶媒体であって、
    前記コンピュータ可読命令は、コンピュータ上で実行されると、前記コンピュータに、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記画像をそのコンポーネントカラーに分離するステップであって、8つのゼロのシーケンスを前記R、G、およびBコンポーネントのそれぞれの8ビットの前に挿入することを含み、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記分離された画像を第2の色空間における画像データに変換するステップであって、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    一連のプロセッサ命令を前記プロセッサに送信することによって前記第2の色空間における前記画像データのコンポーネントを圧縮するステップであって、各プロセッサ命令は複数のピクセルのデータに同時に動作するステップと、
    前記圧縮画像データを記憶するステップと
    を備える動作を行わせることを特徴とするプロセッサ。
JP2014184067A 2008-12-09 2014-09-10 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション Active JP5968384B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US12/331,170 2008-12-09
US12/331,170 US8194977B2 (en) 2008-12-09 2008-12-09 Remote desktop protocol compression acceleration using single instruction, multiple dispatch instructions

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP2011540749A Division JP2012511870A (ja) 2008-12-09 2009-11-11 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション

Publications (2)

Publication Number Publication Date
JP2015029309A true JP2015029309A (ja) 2015-02-12
JP5968384B2 JP5968384B2 (ja) 2016-08-10

Family

ID=42231125

Family Applications (2)

Application Number Title Priority Date Filing Date
JP2011540749A Pending JP2012511870A (ja) 2008-12-09 2009-11-11 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション
JP2014184067A Active JP5968384B2 (ja) 2008-12-09 2014-09-10 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション

Family Applications Before (1)

Application Number Title Priority Date Filing Date
JP2011540749A Pending JP2012511870A (ja) 2008-12-09 2009-11-11 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション

Country Status (5)

Country Link
US (1) US8194977B2 (ja)
EP (1) EP2374277A4 (ja)
JP (2) JP2012511870A (ja)
CN (1) CN102246524B (ja)
WO (1) WO2010077444A1 (ja)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8572251B2 (en) * 2008-11-26 2013-10-29 Microsoft Corporation Hardware acceleration for remote desktop protocol
US8194977B2 (en) * 2008-12-09 2012-06-05 Microsoft Corporation Remote desktop protocol compression acceleration using single instruction, multiple dispatch instructions
US8768067B2 (en) * 2010-04-15 2014-07-01 Microsoft Corporation Accelerating bitmap remoting by identifying and extracting patterns from source bitmaps through parallel processing techniques
JP5842357B2 (ja) * 2011-03-25 2016-01-13 富士ゼロックス株式会社 画像処理装置及び画像処理プログラム
US10564966B2 (en) 2011-12-22 2020-02-18 Intel Corporation Packed data operation mask shift processors, methods, systems, and instructions
EP2798480B1 (en) * 2011-12-30 2018-09-26 Intel Corporation Vector frequency compress instruction
US20130222411A1 (en) * 2012-02-28 2013-08-29 Brijesh Tripathi Extended range color space
US20130279882A1 (en) * 2012-04-23 2013-10-24 Apple Inc. Coding of Video and Audio with Initialization Fragments
US9613394B2 (en) * 2013-08-28 2017-04-04 Intel Corporation Lossy color compression using adaptive quantization
US9633451B2 (en) * 2014-02-12 2017-04-25 Mediatek Singapore Pte. Ltd. Image data processing method of multi-level shuffles for multi-format pixel and associated apparatus
US10269326B2 (en) 2015-12-19 2019-04-23 Intel Corporation Method and apparatus for color buffer compression
US10747819B2 (en) 2018-04-20 2020-08-18 International Business Machines Corporation Rapid partial substring matching
US10782968B2 (en) * 2018-08-23 2020-09-22 International Business Machines Corporation Rapid substring detection within a data element string
US10732972B2 (en) 2018-08-23 2020-08-04 International Business Machines Corporation Non-overlapping substring detection within a data element string
US11042371B2 (en) 2019-09-11 2021-06-22 International Business Machines Corporation Plausability-driven fault detection in result logic and condition codes for fast exact substring match
US10996951B2 (en) 2019-09-11 2021-05-04 International Business Machines Corporation Plausibility-driven fault detection in string termination logic for fast exact substring match
CN114461371B (zh) * 2022-04-13 2023-02-28 苏州浪潮智能科技有限公司 一种服务器***中断优化方法、装置、设备及介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1093961A (ja) * 1996-08-19 1998-04-10 Samsung Electron Co Ltd ビデオデータ処理方法及び装置
JP2003348360A (ja) * 2002-04-25 2003-12-05 Microsoft Corp 文書エンコーディングシステム、文書デコーディングシステムおよびその方法
US20070250683A1 (en) * 1997-10-09 2007-10-25 Mips Technologies, Inc. Alignment and ordering of vector elements for single instruction multiple data processing
JP2008009253A (ja) * 2006-06-30 2008-01-17 Seiko Epson Corp 画像表示システム、画像供給装置および画像表示装置
WO2008103774A2 (en) * 2007-02-21 2008-08-28 Microsoft Corporation Signaling and use of chroma sample positioning information

Family Cites Families (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05347758A (ja) * 1992-06-15 1993-12-27 Ricoh Co Ltd フレーム間予測符号化方式
GB2288520B (en) * 1994-03-24 1998-10-14 Discovision Ass Pipeline
US5801977A (en) * 1995-01-17 1998-09-01 Hewlett-Packard Company System and method for clipping integers
EP0753283A1 (en) * 1995-07-14 1997-01-15 Hewlett-Packard Company Method and apparatus for comparing a sample with a reference using a spider diagram
US5973628A (en) * 1997-10-03 1999-10-26 Cisco Technology, Inc. Parallel variable bit encoder
US6148111A (en) 1998-04-27 2000-11-14 The United States Of America As Represented By The Secretary Of The Navy Parallel digital image compression system for exploiting zerotree redundancies in wavelet coefficients
US6788303B2 (en) * 2001-02-27 2004-09-07 3Dlabs Inc., Ltd Vector instruction set
US6650784B2 (en) * 2001-07-02 2003-11-18 Qualcomm, Incorporated Lossless intraframe encoding using Golomb-Rice
US7171444B2 (en) 2001-11-14 2007-01-30 Sharp Laboratories Of America, Inc. Remote desktop protocol compression system
US7187383B2 (en) * 2002-03-01 2007-03-06 3D Labs Inc., Ltd Yield enhancement of complex chips
US7227556B2 (en) * 2002-03-01 2007-06-05 O'driscoll Gerard High quality antialiased lines with dual sampling pattern
US7006699B2 (en) * 2002-03-27 2006-02-28 Microsoft Corporation System and method for progressively transforming and coding digital data
US7174047B2 (en) * 2002-03-29 2007-02-06 Matsushita Electric Industrial Co., Ltd. Single-instruction multiple-data (SIMD)-based algorithms for processing video data
KR100601944B1 (ko) 2004-03-08 2006-07-14 삼성전자주식회사 색 변환 방법 및 장치
JP2005218055A (ja) * 2004-02-02 2005-08-11 Toshiba Corp 画像処理装置、画像処理方法および画像処理プログラム
US7689051B2 (en) * 2004-04-15 2010-03-30 Microsoft Corporation Predictive lossless coding of images and video
US7480417B2 (en) 2004-10-19 2009-01-20 Microsoft Corp. System and method for encoding mosaiced image data employing a reversible color transform
US8423673B2 (en) 2005-03-14 2013-04-16 Citrix Systems, Inc. Method and apparatus for updating a graphical display in a distributed processing environment using compression
JP4627670B2 (ja) * 2005-03-17 2011-02-09 株式会社リコー 画像形成装置、画像形成方法、その方法を実行させるプログラムが格納されたコンピュータ読み取り可能な記憶媒体
GB2425423A (en) * 2005-04-07 2006-10-25 British Broadcasting Corp Variable quantising for compression encoding
JP4789148B2 (ja) * 2005-09-06 2011-10-12 株式会社メガチップス 圧縮符号化装置、圧縮符号化方法およびプログラム
US7956930B2 (en) * 2006-01-06 2011-06-07 Microsoft Corporation Resampling and picture resizing operations for multi-resolution video coding and decoding
US8243340B2 (en) * 2006-02-23 2012-08-14 Microsoft Corporation Pre-processing of image data for enhanced compression
US7676582B2 (en) 2006-06-30 2010-03-09 Microsoft Corporation Optimized desktop sharing viewer join
US8565519B2 (en) * 2007-02-09 2013-10-22 Qualcomm Incorporated Programmable pattern-based unpacking and packing of data channel information
US7827237B2 (en) 2007-03-12 2010-11-02 Citrix Systems, Inc. Systems and methods for identifying long matches of data in a compression history
US8194977B2 (en) * 2008-12-09 2012-06-05 Microsoft Corporation Remote desktop protocol compression acceleration using single instruction, multiple dispatch instructions

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH1093961A (ja) * 1996-08-19 1998-04-10 Samsung Electron Co Ltd ビデオデータ処理方法及び装置
US20070250683A1 (en) * 1997-10-09 2007-10-25 Mips Technologies, Inc. Alignment and ordering of vector elements for single instruction multiple data processing
JP2003348360A (ja) * 2002-04-25 2003-12-05 Microsoft Corp 文書エンコーディングシステム、文書デコーディングシステムおよびその方法
JP2008009253A (ja) * 2006-06-30 2008-01-17 Seiko Epson Corp 画像表示システム、画像供給装置および画像表示装置
WO2008103774A2 (en) * 2007-02-21 2008-08-28 Microsoft Corporation Signaling and use of chroma sample positioning information

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN6015040361; 牟田 英正 ほか: 'Cell/B.E.を搭載したゲーム機による家庭内分散処理' コンピュータシステム・シンポジウム論文集 第2007巻 第14号, 20071127, p.49〜58 *

Also Published As

Publication number Publication date
US8194977B2 (en) 2012-06-05
CN102246524B (zh) 2014-03-26
JP2012511870A (ja) 2012-05-24
EP2374277A1 (en) 2011-10-12
EP2374277A4 (en) 2013-09-11
CN102246524A (zh) 2011-11-16
WO2010077444A1 (en) 2010-07-08
JP5968384B2 (ja) 2016-08-10
US20100142813A1 (en) 2010-06-10

Similar Documents

Publication Publication Date Title
JP5968384B2 (ja) 単一命令複数ティスパッチ命令を使用するリモートデスクトッププロトコル圧縮アクセラレーション
US8837006B2 (en) Pre-processing of image data for enhanced compression
US7873212B2 (en) Compression of images for computer graphics
US8761528B2 (en) Compression of image data
US20070076971A1 (en) Compression of images for computer graphics
JP6703032B2 (ja) 後方互換性拡張画像フォーマット
US5872965A (en) System and method for performing multiway branches using a visual instruction set
CN1210943C (zh) 彩色图象数据处理和压缩方法及装置
CA2750195A1 (en) Rdp bitmap hash acceleration using simd instructions
CN113452993A (zh) 图像数据解压缩
US20180097527A1 (en) 32-bit hdr pixel format with optimum precision
JP4189443B2 (ja) グラフィックス画像の圧縮及び逆圧縮方法
CN114882149A (zh) 动画渲染方法、装置、电子设备和存储介质
JP2000049618A (ja) 90°回転と組合わせたhvq圧縮方法
TWI502550B (zh) Differential layered image compression method
KR100834357B1 (ko) 영상 데이터의 압축 장치 및 방법
JP2002540685A (ja) 画像圧縮及び圧縮解除
WO2023177447A1 (en) Methods and systems for high bit depth and high dynamic range image compression

Legal Events

Date Code Title Description
A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20150512

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20150924

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20151007

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160107

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160606

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160705

R150 Certificate of patent or registration of utility model

Ref document number: 5968384

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250