diff --git a/vp9/decoder/vp9_decoder.c b/vp9/decoder/vp9_decoder.c index fd74478e9ea08a1c92c923082b0c4c2bb4228afb..56dbc99ed1510398760133796a78b45836914ce8 100644 --- a/vp9/decoder/vp9_decoder.c +++ b/vp9/decoder/vp9_decoder.c @@ -361,7 +361,7 @@ int vp9_receive_compressed_data(VP9Decoder *pbi, // If multiple threads are used to decode tiles, then we use those threads // to do parallel loopfiltering. if (pbi->num_tile_workers) { - vp9_loop_filter_frame_mt(pbi, cm, &pbi->mb, cm->lf.filter_level, 0, 0); + vp9_loop_filter_frame_mt(pbi, cm, cm->lf.filter_level, 0, 0); } else { vp9_loop_filter_frame(cm, &pbi->mb, cm->lf.filter_level, 0, 0); } diff --git a/vp9/decoder/vp9_dthread.c b/vp9/decoder/vp9_dthread.c index 9b124c9d9084639b855b4e0674ba1aff1a0e9ca4..9098063ceb8cb4c62276b1d4fcc4fa4a25621b40 100644 --- a/vp9/decoder/vp9_dthread.c +++ b/vp9/decoder/vp9_dthread.c @@ -40,13 +40,13 @@ static INLINE void sync_read(VP9LfSync *const lf_sync, int r, int c) { const int nsync = lf_sync->sync_range; if (r && !(c & (nsync - 1))) { - mutex_lock(&lf_sync->mutex_[r - 1]); + pthread_mutex_t *const mutex = &lf_sync->mutex_[r - 1]; + mutex_lock(mutex); while (c > lf_sync->cur_sb_col[r - 1] - nsync) { - pthread_cond_wait(&lf_sync->cond_[r - 1], - &lf_sync->mutex_[r - 1]); + pthread_cond_wait(&lf_sync->cond_[r - 1], mutex); } - pthread_mutex_unlock(&lf_sync->mutex_[r - 1]); + pthread_mutex_unlock(mutex); } #else (void)lf_sync; @@ -94,21 +94,21 @@ static void loop_filter_rows_mt(const YV12_BUFFER_CONFIG *const frame_buffer, VP9LfSync *const lf_sync, int num_lf_workers) { const int num_planes = y_only ? 1 : MAX_MB_PLANE; int r, c; // SB row and col - LOOP_FILTER_MASK lfm; const int sb_cols = mi_cols_aligned_to_sb(cm->mi_cols) >> MI_BLOCK_SIZE_LOG2; for (r = start; r < stop; r += num_lf_workers) { const int mi_row = r << MI_BLOCK_SIZE_LOG2; - MODE_INFO **mi_8x8 = cm->mi_grid_visible + mi_row * cm->mi_stride; + MODE_INFO **const mi = cm->mi_grid_visible + mi_row * cm->mi_stride; for (c = 0; c < sb_cols; ++c) { const int mi_col = c << MI_BLOCK_SIZE_LOG2; + LOOP_FILTER_MASK lfm; int plane; sync_read(lf_sync, r, c); vp9_setup_dst_planes(xd, frame_buffer, mi_row, mi_col); - vp9_setup_mask(cm, mi_row, mi_col, mi_8x8 + mi_col, cm->mi_stride, &lfm); + vp9_setup_mask(cm, mi_row, mi_col, mi + mi_col, cm->mi_stride, &lfm); for (plane = 0; plane < num_planes; ++plane) { vp9_filter_block_plane(cm, &xd->plane[plane], mi_row, &lfm); @@ -134,9 +134,9 @@ static int loop_filter_row_worker(void *arg1, void *arg2) { // threads. void vp9_loop_filter_frame_mt(VP9Decoder *pbi, VP9_COMMON *cm, - MACROBLOCKD *xd, int frame_filter_level, int y_only, int partial_frame) { + VP9LfSync *const lf_sync = &pbi->lf_row_sync; // Number of superblock rows and cols const int sb_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> MI_BLOCK_SIZE_LOG2; const int tile_cols = 1 << cm->log2_tile_cols; @@ -146,8 +146,6 @@ void vp9_loop_filter_frame_mt(VP9Decoder *pbi, // Allocate memory used in thread synchronization. // This always needs to be done even if frame_filter_level is 0. if (!cm->current_video_frame || cm->last_height != cm->height) { - VP9LfSync *const lf_sync = &pbi->lf_row_sync; - if (cm->last_height != cm->height) { const int aligned_last_height = ALIGN_POWER_OF_TWO(cm->last_height, MI_SIZE_LOG2); @@ -166,8 +164,7 @@ void vp9_loop_filter_frame_mt(VP9Decoder *pbi, vp9_loop_filter_frame_init(cm, frame_filter_level); // Initialize cur_sb_col to -1 for all SB rows. - vpx_memset(pbi->lf_row_sync.cur_sb_col, -1, - sizeof(*pbi->lf_row_sync.cur_sb_col) * sb_rows); + vpx_memset(lf_sync->cur_sb_col, -1, sizeof(*lf_sync->cur_sb_col) * sb_rows); // Set up loopfilter thread data. // The decoder is using num_workers instead of pbi->num_tile_workers @@ -194,7 +191,7 @@ void vp9_loop_filter_frame_mt(VP9Decoder *pbi, lf_data->stop = sb_rows; lf_data->y_only = y_only; // always do all planes in decoder - lf_data->lf_sync = &pbi->lf_row_sync; + lf_data->lf_sync = lf_sync; lf_data->num_lf_workers = num_workers; // Start loopfiltering @@ -253,8 +250,12 @@ void vp9_loop_filter_alloc(VP9_COMMON *cm, VP9LfSync *lf_sync, int rows, // Deallocate lf synchronization related mutex and data void vp9_loop_filter_dealloc(VP9LfSync *lf_sync, int rows) { -#if CONFIG_MULTITHREAD +#if !CONFIG_MULTITHREAD + (void)rows; +#endif // !CONFIG_MULTITHREAD + if (lf_sync != NULL) { +#if CONFIG_MULTITHREAD int i; if (lf_sync->mutex_ != NULL) { @@ -269,17 +270,10 @@ void vp9_loop_filter_dealloc(VP9LfSync *lf_sync, int rows) { } vpx_free(lf_sync->cond_); } - +#endif // CONFIG_MULTITHREAD vpx_free(lf_sync->cur_sb_col); // clear the structure as the source of this call may be a resize in which // case this call will be followed by an _alloc() which may fail. - vpx_memset(lf_sync, 0, sizeof(*lf_sync)); + vp9_zero(*lf_sync); } -#else - (void)rows; - if (lf_sync != NULL) { - vpx_free(lf_sync->cur_sb_col); - vpx_memset(lf_sync, 0, sizeof(*lf_sync)); - } -#endif // CONFIG_MULTITHREAD } diff --git a/vp9/decoder/vp9_dthread.h b/vp9/decoder/vp9_dthread.h index 005bd7bbd55565e5f37a79b9d6fac2b503202823..8738ceebd4167f4a0370d3af9f11ee10a90a2d62 100644 --- a/vp9/decoder/vp9_dthread.h +++ b/vp9/decoder/vp9_dthread.h @@ -12,11 +12,9 @@ #define VP9_DECODER_VP9_DTHREAD_H_ #include "./vpx_config.h" -#include "vp9/common/vp9_loopfilter.h" #include "vp9/decoder/vp9_reader.h" #include "vp9/decoder/vp9_thread.h" -struct macroblockd; struct VP9Common; struct VP9Decoder; @@ -43,16 +41,15 @@ typedef struct VP9LfSyncData { } VP9LfSync; // Allocate memory for loopfilter row synchronization. -void vp9_loop_filter_alloc(struct VP9Common *cm, struct VP9LfSyncData *lf_sync, +void vp9_loop_filter_alloc(struct VP9Common *cm, VP9LfSync *lf_sync, int rows, int width); // Deallocate loopfilter synchronization related mutex and data. -void vp9_loop_filter_dealloc(struct VP9LfSyncData *lf_sync, int rows); +void vp9_loop_filter_dealloc(VP9LfSync *lf_sync, int rows); // Multi-threaded loopfilter that uses the tile threads. void vp9_loop_filter_frame_mt(struct VP9Decoder *pbi, struct VP9Common *cm, - struct macroblockd *xd, int frame_filter_level, int y_only, int partial_frame);