デブロッキングフィルタの内部しかわかりません。
外部についてはわかりません。
前提として、4x4ブロックが2個横に並んでいるとします。
2個並んだブロックの境界から、水平左方向の画素をp0,p1,p2,p3
水平右方向の画素をq0,q1,q2,q3とします。
さらに、出力後のp0-p3,q0-q3をそれぞれ、p'0-p'3,q'0-q'3とします。
垂直についても同じですが、今は簡単のために水平方向だけ考える事にします。
まず、bS(Boundary Strength)値と言うのを入力します。
デブロッキングフィルタでは、このbS値によって3つの場合分けが
できます。
(1)bS=0の時
フィルターはかけません。すなわち、p0-p3,q0-q3は全てスルーです。
(2)bS=4の時
フィルターは次のようなフィルターをかけます。
まず、ap = Abs(p2 - p0),aq = Abs(q2 - q0)です。
(2-1)ap < β < Abs(p0-q0) < ((α >> 2) + 2)の時
p'0 = (p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4) >> 3
p'1 = (p2 + p1 + p0 + q0 + 2) >> 2
p'2 = (2*p3 + 3*p2 + p1 + p0 + q0 + 4) >> 3
(2-2)(2-1)以外の時
p'0 = (2*p1 + p0 + q1 + 2) >> 2
p'1 = p1
p'2 = p2
(2-3)aq < β < Abs(p0-q0) < ((α >> 2) + 2)の時
q'0 = (p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4)
q'1 = (p0 + q0 + q1 + q2 + 2) >> 2
q'2 = (2*q3 + 3*q2 + q1 + q0 + p0 + 4) >> 3
(2-4)(2-3)以外の時
q'0 = (2*q1 + q0 + p1 + 2) >> 2
q'1 = q1
q'2 = q2
となります。(2-1)(2-2)の処理は、p0-p3の処理で、
(2-3)(2-4)の処理は、q0-q3の処理です。
α,βに関しては後で説明します。
p3,q3に関してはスルーです。
(3)bS < 4の時
(3-1)chromaStyleFilteringが0の時
tc = tc0 + (ap < β) ? 1 : 0) + ((aq < β) ? : 0)
(3-2)chromaStyleFilteringが1の時
tc = tc0 + 1
(3-3)chromaEdgeFlagが0の時
tc0 = t'c0 * (1 << BitDepthy - 8)
(3-4)chromaEdgeFlagが1の時
tc0 = t'c0 * (1 << BitDepthc - 8)
となります。
ここで、(3-1)(3-2)がペアの処理で(3-3)(3-4)がペアの処理です
t'c0の求め方は後述します。BitDepthy,BitDepthcはデブロッキングフィルタの
外部から値を貰います。
(3-5)p'0,q'0
Δ = Clip3(-tc,tc,((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3))
(Clip3(a,b,c)は、cの範囲がa <= c <= bとなるようにクリップします)
p'0 = Clip1(p0 + Δ)
q'0 = Clip1(q0 + Δ)
(うろ覚えですが、Clip1(a)は、0 <= a <= 255となるようにクリップするのだったと思います)
(3-6)p'1(chromaStyleFilteringが0かつap < βの時)
p'1 = p1 + Clip3(-tc0,tc0,(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1)
(3-7)p'1(chromaStyleFilteringが1またはap >= βの時)
p'1 = p1
(3-8)q'1(chromaStyleFilteringが0かつaq < βの時)
q'1 = q1 + Clip3(-tc0,tc0,(q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1)
(3-9)p'1(chromaStyleFilteringが1またはaq >= βの時)
q'1 = q1
(3-10)p'2,q'2
p'2 = p2
q'2 = q2
となります。
補足
回答ありがとうございます。 この式の中にでてくる>>や<<は何を表しているのでしょうか? ビットシフトということですか?