2016-12-08 3 views
1

私は、イントラ予測部分の何かを改善するためにしばらくの間、HM参照ソフトウェアで作業してきました。新しいイントラ予測アルゴリズムがコードに追加され、私はエンコーダに私のアルゴリズムとHMのデフォルトアルゴリズム(もちろんRDCostによる)の中から選択させます。HM(HEVCテストモデル)に新しい構文要素を追加する方法

私は今必要なものは、デコーダは、エンコーダがレート歪みループで決定するのと同じアルゴリズムを実行することができるであろうように、各PUのためのフラグをシグナリングすることです。

私は適切にコード内で何を壊すことなく、ストリームにこの1ビットのフラグを追加するために行う必要があります正確に何を知りたいです。

、私は私の旗の統計情報を追跡するために、CABACコンテキストモデルを使用することを私は他に何をすべきと仮定:

  1. TEncSbac.hファイルにContextModel3DBuffer m_cCUIntraAlgorithmSCModelのような新しいコンテキストモデルを追加します。
  2. HMが他のコンテキストモデルをどのように初期化するかを見て、(エンコーダ側とデコーダ側の両方で)モデルを適切に初期化する。
  3. それぞれ、エンコーダ側とデコーダ側で機能m_pcBinIf->encodeBin(myFlag, cCUIntraAlgorithmSCModel)m_pcTDecBinIfdecodeBin(myFlag, cCUIntraAlgorithmSCModel)を呼び出します。

私はこれらの3つの手順を取ることが、明らかにそれが何かを壊します。

PS:同等の可能性のあるシグナリング(すなわち、CABACコンテキストを使用しない)さえも有用であろう。私はこの旗を平和的に送りたいだけです!

ありがとうございます。

答えて

0

私はこの問題を最終的に解決できました。それはCABACコンテキスト初期化のバグでした。

しかし、この経験を共有したいのは、多くの人が同じことをしたいことがあるからです。

私が説明した三つのステップは、本質的に新しい構文要素を追加する必要がありますが、1は以下と非常に慎重であるかもしれない:初めに

  1. 、あなたが使用したいのいずれかを決定する必要がありますあなたの構文要素のための別のコンテキストモデル?または、既存のものを使用したいですか? CABAC分離の場合は、ContextModel3DBufferを定義する必要があります。そのための最良の方法は、です。コード内に同様の構文要素があります。 `` ContextModel3DBuffer ''定義とそれに含まれるすべての発生をコードに複製します。この方法は、あなたがすべてを検討していることを保証します。各構文要素の
  2. 符号化は2つの異なる場所で起こる:最初、RDOループ内の実際の符号化位相と決定が符号化されている(例えばencodeCtu機能)中、「決定」、および第二を作ります。
  3. シンタックス要素のエンコード/デコードの順序は、エンコーダ/デコーダ側で同じにする必要があります。たとえば、あなたの新しい構文要素がsplitFlag後にエンコードされている場合と、エンコーダ側でpredMode前に、あなたは、デコーダ側でsplitFlagpredModeの間で正確にそれをデコードする必要があります。
  4. 文脈モデルは、異なるブロックサイズ、成分などについて構文要素の統計を別々に追跡するために、3D行列として実装されています。つまり、関数encodeBinを呼び出すときに、正しいインデックスが使用されていることを確認することができます。私はこの部分で愚かな間違いを犯しました!

上記の説明とは別に、getStateはデバッグに非常に便利です。この関数は、コードにアクセスしたときにコードの任意の場所にCABACコンテキストモデルの状態を返します。不一致がある場合、エンコーダとデコーダの同じ場所で状態を比較することは非常に便利です。たとえば、多くの場合、1をエンコードしますが、0をデコードします。この場合、エンコードとデコードの前にCABACコンテキストの状態をチェックする必要があります。彼らは同じでなければなりません。同じでない場合は、エラーを追跡して、最初の不一致箇所を見つけます。

私はそれが役に立ちましたと思います。

関連する問題