スポンサード リンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« 基本、デコーダーは無変更 | トップページ | マルチスレッド化と少々 »

デコードの方が苦しい不思議

今は、Windows用AmuseGraphicsの開発フェーズで、まず、次バージョンに実装するAGM形式用の各種処理について検討し、方針は決まったのだが、今回力を入れるAGM-YV12/RGBでは、エンコードは出来てもデコードは苦しい不思議がある。

通常、動画のエンコードとデコードを比べると、エンコードの方が重いのが普通だ。

何故なら、エンコードでは、様々な状況を把握して利用する事で、入力データを圧縮するのに対し、デコードでは、エンコーダーが出力したパラメータに従って圧縮されたデータを展開する事になるので、ある意味、無駄な処理が不要になる分、エンコーダーよりも処理は軽くなるからだ。

例えば、動画圧縮でハフマン圧縮を使う場合、エンコード時には、ワードの出現比率を分析し、各ワードを出現率に従った長さのビットコードに変換する必要があるのだが、デコード時には、どのビットコードがどのワードに対応しているかは、エンコーダーが出力しているデータから判る。

なので、ワードの出現比率の分析だとか、それに従ったビットコードの生成なんて作業が不要になる分、エンコーダーが行う処理に比べると、デコーダーの処理の方が軽くなる訳だ。

しかし、何度か書いた様に、今回、エンコーダーの改良により、AGM-YV12/RGB形式を使った場合、少なくとも4コア8スレッドのMacBook Pro 15インチ 2016モデルでは、TiExtenderを使った4k60fpsキャプチャーが、大体は余裕で、可能になっているのだが、出力されたAGMファイルをAGMPlayerで再生するとギクシャクする。

つまり、エンコードは楽勝だった筈のデータなのに、デコードは間に合わないので、適時、フレームを飛ばしながら再生される格好になっている訳だ。

何故、そんな事になるのか、というと、AGMPlayerでの再生処理は、基本的にはシングルスレッドで行われているから、という事も大きいのだが、問題となるのは、それだけではない。

具体的には、AGM-YV12/RGB形式でも、差分圧縮と、そのデータに対するランレングス/ハフマン圧縮は行われているので、通常は、キーフレーム以外のデータサイズはそれなりに小さくなっている。

しかし、キーフレームについては、多くの場合、実質的には、あまり圧縮率が高いとは言えないハフマン圧縮しか行われていない格好になるので、4k動画の場合、データサイズはかなり大きくなる訳だ。

具体的には、圧縮効果が無かった場合、RGB形式では、3840x2160*3 = 24MB、YV12形式でも、その半分なので、12MB分のデータを処理する必要がある訳だ。

で、普通のHDDの場合、転送速度は100MB/Sec程度である事を鑑みれば、24MBのデータを読み込むのには、約0.25秒かかる計算になるのだが、60fpsの1フレーム時間は1/60 = 0.016なので、ストレージからのデータ読み込みだけで、16フレーム分の時間を要する事になる訳だ。

当然の事ながら、それだけのデータサイズを扱う場合、如何にデコーダーの処理が軽いからといっても、それなりに処理時間は要する事になるので、キーフレームのデコード処理に要する時間は、フレーム表示間隔の20倍程度必要になっても不思議ではない訳だ。

と、言う事なので、普通に鑑みれば、こんなデータを60fpsでリアルタイム再生できる訳がないのだが、キーフレーム以外では、差分圧縮が効く分、そこまでの処理時間は必要とされない。

また、最近は、ストレージとしてHDDではなく、より高速なSSDが使われる事も多く、SSDの場合、読み込み速度は、少なくともHDDの数倍はあるので、ストレージとしてSSDを使った場合には、前述の計算よりも、デコードはかなり楽になる。

つまり、AGM-YV12/RGB形式でエンコードされた4k動画でも、平均すれば、1フレームあたりのデコード処理時間は0.016秒以内に収まる可能性も高くなる訳だ。

しかし、現行のAGMPlayerの再生処理では、デコードは十分軽い、という前提の元に、処理は効率重視でシングルスレッド動作にしているし、デコードの開始タイミングは表示タイミング間近なので、処理時間の平均化にも期待できない。

と、言う事なので、AGMPlayerのデコーダーについては、今回、部分的に、マルチスレッド動作に切り替えたり、再生時には、デコード処理時間の平均化を期待できる様に、表示前の先読みを行なったりする事にしたのだが、AGM-YV12/RGB形式というのは視聴用ではないので、あまり大変な変更は行わないつもりだ。

« 基本、デコーダーは無変更 | トップページ | マルチスレッド化と少々 »

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/534482/65822611

この記事へのトラックバック一覧です: デコードの方が苦しい不思議:

« 基本、デコーダーは無変更 | トップページ | マルチスレッド化と少々 »

2018年9月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google