diff --git a/src/intra_edge.rs b/src/intra_edge.rs index d1785672c..774e9517c 100644 --- a/src/intra_edge.rs +++ b/src/intra_edge.rs @@ -74,73 +74,82 @@ struct ModeSelMem { } unsafe fn init_edges(node: *mut EdgeNode, bl: BlockLevel, edge_flags: EdgeFlags) { - (*node).o = edge_flags; - if bl == BL_8X8 { let nt = &mut *(node as *mut EdgeTip); - let node = &mut nt.node; - - node.h[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - node.h[1] = - edge_flags & (EdgeFlags::ALL_LEFT_HAS_BOTTOM | EdgeFlags::EDGE_I420_TOP_HAS_RIGHT); - - node.v[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; - node.v[1] = edge_flags - & (EdgeFlags::ALL_TOP_HAS_RIGHT - | EdgeFlags::EDGE_I420_LEFT_HAS_BOTTOM - | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM); - - nt.split[0] = EdgeFlags::ALL_TOP_HAS_RIGHT | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nt.split[1] = - (edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT) | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM; - nt.split[2] = edge_flags | EdgeFlags::EDGE_I444_TOP_HAS_RIGHT; - nt.split[3] = edge_flags - & (EdgeFlags::EDGE_I420_TOP_HAS_RIGHT - | EdgeFlags::EDGE_I420_LEFT_HAS_BOTTOM - | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM); + init_edges_tip(nt, edge_flags) } else { let nwc = &mut *(node as *mut EdgeBranch); - let node = &mut nwc.node; + init_edges_branch(nwc, bl, edge_flags) + } +} - node.h[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - node.h[1] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; +fn init_edges_tip(nt: &mut EdgeTip, edge_flags: EdgeFlags) { + let node = &mut nt.node; - node.v[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; - node.v[1] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; + node.o = edge_flags; - nwc.h4[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.h4[1] = EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.h4[2] = nwc.h4[1]; - nwc.h4[3] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; - if bl == BL_16X16 { - nwc.h4[1] |= edge_flags & EdgeFlags::EDGE_I420_TOP_HAS_RIGHT; - } + node.h[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + node.h[1] = edge_flags & (EdgeFlags::ALL_LEFT_HAS_BOTTOM | EdgeFlags::EDGE_I420_TOP_HAS_RIGHT); - nwc.v4[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; - nwc.v4[1] = EdgeFlags::ALL_TOP_HAS_RIGHT; - nwc.v4[2] = nwc.v4[1]; - nwc.v4[3] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; - if bl == BL_16X16 { - nwc.v4[1] |= edge_flags - & (EdgeFlags::EDGE_I420_LEFT_HAS_BOTTOM | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM); - } + node.v[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; + node.v[1] = edge_flags + & (EdgeFlags::ALL_TOP_HAS_RIGHT + | EdgeFlags::EDGE_I420_LEFT_HAS_BOTTOM + | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM); - nwc.tls[0] = EdgeFlags::ALL_TOP_HAS_RIGHT | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.tls[1] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.tls[2] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; + nt.split[0] = EdgeFlags::ALL_TOP_HAS_RIGHT | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nt.split[1] = + (edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT) | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM; + nt.split[2] = edge_flags | EdgeFlags::EDGE_I444_TOP_HAS_RIGHT; + nt.split[3] = edge_flags + & (EdgeFlags::EDGE_I420_TOP_HAS_RIGHT + | EdgeFlags::EDGE_I420_LEFT_HAS_BOTTOM + | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM); +} - nwc.trs[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; - nwc.trs[1] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.trs[2] = EdgeFlags::empty(); +fn init_edges_branch(nwc: &mut EdgeBranch, bl: BlockLevel, edge_flags: EdgeFlags) { + let node = &mut nwc.node; - nwc.tts[0] = EdgeFlags::ALL_TOP_HAS_RIGHT | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.tts[1] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; - nwc.tts[2] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; + node.o = edge_flags; - nwc.tbs[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; - nwc.tbs[1] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; - nwc.tbs[2] = EdgeFlags::empty(); - }; + node.h[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + node.h[1] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; + + node.v[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; + node.v[1] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; + + nwc.h4[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.h4[1] = EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.h4[2] = nwc.h4[1]; + nwc.h4[3] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; + if bl == BL_16X16 { + nwc.h4[1] |= edge_flags & EdgeFlags::EDGE_I420_TOP_HAS_RIGHT; + } + + nwc.v4[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; + nwc.v4[1] = EdgeFlags::ALL_TOP_HAS_RIGHT; + nwc.v4[2] = nwc.v4[1]; + nwc.v4[3] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; + if bl == BL_16X16 { + nwc.v4[1] |= edge_flags + & (EdgeFlags::EDGE_I420_LEFT_HAS_BOTTOM | EdgeFlags::EDGE_I422_LEFT_HAS_BOTTOM); + } + + nwc.tls[0] = EdgeFlags::ALL_TOP_HAS_RIGHT | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.tls[1] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.tls[2] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; + + nwc.trs[0] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; + nwc.trs[1] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.trs[2] = EdgeFlags::empty(); + + nwc.tts[0] = EdgeFlags::ALL_TOP_HAS_RIGHT | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.tts[1] = edge_flags & EdgeFlags::ALL_TOP_HAS_RIGHT; + nwc.tts[2] = edge_flags & EdgeFlags::ALL_LEFT_HAS_BOTTOM; + + nwc.tbs[0] = edge_flags | EdgeFlags::ALL_LEFT_HAS_BOTTOM; + nwc.tbs[1] = edge_flags | EdgeFlags::ALL_TOP_HAS_RIGHT; + nwc.tbs[2] = EdgeFlags::empty(); } unsafe fn init_mode_node(