}
for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
+ TileInfo tile;
+ vp9_tile_set_row(&tile, cm, tile_row);
for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
- TileInfo tile;
- vp9_tile_set_row(&tile, cm, tile_row);
vp9_tile_set_col(&tile, cm, tile_col);
for (mi_row = tile.mi_row_start; mi_row < tile.mi_row_end;
pbi->mb.corrupted |= tile_data->xd.corrupted;
}
}
+#if !CONFIG_INTRABC
+ // Loopfilter one row.
+ if (!pbi->mb.corrupted && cm->lf.filter_level) {
+ const int lf_start = tile.mi_row_start - MI_BLOCK_SIZE;
+ LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
+
+ // delay the loopfilter by 1 macroblock row.
+ if (lf_start < 0) continue;
+
+ // decoding has completed: finish up the loop filter in this thread.
+ if (tile.mi_row_end >= cm->mi_rows) continue;
+
+ winterface->sync(&pbi->lf_worker);
+ lf_data->start = lf_start;
+ lf_data->stop = tile.mi_row_end - MI_BLOCK_SIZE;;
+ if (pbi->max_threads > 1) {
+ winterface->launch(&pbi->lf_worker);
+ } else {
+ winterface->execute(&pbi->lf_worker);
+ }
+ }
+#endif // !CONFIG_INTRABC
}
-#if !CONFIG_INTRABC
- if (cm->lf.filter_level > 0)
- vp9_loop_filter_frame(get_frame_new_buffer(cm), cm,
- &pbi->mb, cm->lf.filter_level, 0, 0);
-#endif
+ // Loopfilter remaining rows in the frame.
+ if (!pbi->mb.corrupted && cm->lf.filter_level) {
+ LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
+ winterface->sync(&pbi->lf_worker);
+ lf_data->start = lf_data->stop;
+ lf_data->stop = cm->mi_rows;
+ winterface->execute(&pbi->lf_worker);
+ }
// Get last tile data.
tile_data = pbi->tile_data + tile_cols * tile_rows - 1;