diff options
author | Christophe Gisquet <christophe.gisquet@gmail.com> | 2014-07-19 10:30:06 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-07-19 14:20:10 +0200 |
commit | 5e55c7e1bcb767e6af17c29f6aaebff4d6fd0703 (patch) | |
tree | d77a4f60f831041112d604f7070be445c28f8afd | |
parent | 7bdbd2653fddde6504644455dae4804daa8b393e (diff) | |
download | ffmpeg-5e55c7e1bcb767e6af17c29f6aaebff4d6fd0703.tar.gz |
hevc: report more precise progress
There's a lag of one CTB line for SAO behind deblocking filter, except for
last line. However, once SAO has been completed on a line, all its pixels,
i.e. up to y+ctb_size are filtered and ready to be used as reference.
Without SAO, when deblocking filter finishes a CTB line, only the bottom
bottom 4 pixels may be filtered when next CTB is process by the deblocing.
The await_progess for hevc then checks whether the bottom pixels of a PU
requires access beyond that point, so the reporting should effectively
report up to the the above limits.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/hevc_filter.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/libavcodec/hevc_filter.c b/libavcodec/hevc_filter.c index c17e1dd9ea..809c333fdb 100644 --- a/libavcodec/hevc_filter.c +++ b/libavcodec/hevc_filter.c @@ -705,9 +705,9 @@ void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, void ff_hevc_hls_filter(HEVCContext *s, int x, int y, int ctb_size) { + int x_end = x >= s->sps->width - ctb_size; deblocking_filter_CTB(s, x, y); if (s->sps->sao_enabled) { - int x_end = x >= s->sps->width - ctb_size; int y_end = y >= s->sps->height - ctb_size; if (y && x) sao_filter_CTB(s, x - ctb_size, y - ctb_size); @@ -716,18 +716,15 @@ void ff_hevc_hls_filter(HEVCContext *s, int x, int y, int ctb_size) if (y && x_end) { sao_filter_CTB(s, x, y - ctb_size); if (s->threads_type & FF_THREAD_FRAME ) - ff_thread_report_progress(&s->ref->tf, y - ctb_size, 0); + ff_thread_report_progress(&s->ref->tf, y, 0); } if (x_end && y_end) { sao_filter_CTB(s, x , y); if (s->threads_type & FF_THREAD_FRAME ) - ff_thread_report_progress(&s->ref->tf, y, 0); + ff_thread_report_progress(&s->ref->tf, y + ctb_size, 0); } - } else { - if (y && x >= s->sps->width - ctb_size) - if (s->threads_type & FF_THREAD_FRAME ) - ff_thread_report_progress(&s->ref->tf, y, 0); - } + } else if (s->threads_type & FF_THREAD_FRAME && x_end) + ff_thread_report_progress(&s->ref->tf, y + ctb_size - 4, 0); } void ff_hevc_hls_filters(HEVCContext *s, int x_ctb, int y_ctb, int ctb_size) |