summaryrefslogtreecommitdiff
path: root/libavcodec/hevc_filter.c
diff options
context:
space:
mode:
authorChristophe Gisquet <christophe.gisquet@gmail.com>2015-02-03 14:06:39 +0100
committerMichael Niedermayer <michaelni@gmx.at>2015-02-07 18:04:25 +0100
commit97996eff4f2631fa5fdb6bc76a32b58d8b9f7611 (patch)
tree8eeef164ec195f6f392b6b2b0d32612c8b2ee2bb /libavcodec/hevc_filter.c
parented450d4acfc9fea0dae2df2b0a543ec0d602d31a (diff)
downloadffmpeg-97996eff4f2631fa5fdb6bc76a32b58d8b9f7611.tar.gz
hevc/sao: do in-place band filtering when possible
The copies are only needed when data must be restored, so skip them when it must not be. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/hevc_filter.c')
-rw-r--r--libavcodec/hevc_filter.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c
index 54dc708e2c..855a619b96 100644
--- a/libavcodec/hevc_filter.c
+++ b/libavcodec/hevc_filter.c
@@ -319,16 +319,23 @@ static void sao_filter_CTB(HEVCContext *s, int x, int y)
switch (sao->type_idx[c_idx]) {
case SAO_BAND:
+ copy_CTB_to_hv(s, src, stride_src, x0, y0, width, height, c_idx,
+ x_ctb, y_ctb);
+ if (s->pps->transquant_bypass_enable_flag ||
+ (s->sps->pcm.loop_filter_disable_flag && s->sps->pcm_enabled_flag)) {
dst = lc->edge_emu_buffer;
stride_dst = 2*MAX_PB_SIZE;
copy_CTB(dst, src, width << s->sps->pixel_shift, height, stride_dst, stride_src);
- copy_CTB_to_hv(s, src, stride_src, x0, y0, width, height, c_idx,
- x_ctb, y_ctb);
s->hevcdsp.sao_band_filter[tab](src, dst, stride_src, stride_dst,
sao->offset_val[c_idx], sao->band_position[c_idx],
width, height);
restore_tqb_pixels(s, src, dst, stride_src, stride_dst,
x, y, width, height, c_idx);
+ } else {
+ s->hevcdsp.sao_band_filter[tab](src, src, stride_src, stride_src,
+ sao->offset_val[c_idx], sao->band_position[c_idx],
+ width, height);
+ }
sao->type_idx[c_idx] = SAO_APPLIED;
break;
case SAO_EDGE: