History

Calculate deblock strength per-MB instead of per-row Gives better cache locality, since the VP8Macroblock structs are still in cache. Inspired by the way x264 does it.

Originally committed as revision 24417 to svn://svn.ffmpeg.org/ffmpeg/trunk

Jason Garrett-Glaser committed 16 years ago

Commit 968570d1 parent d1c58fc1 file · +38 −27Browse files

Unified · Split

libavcodec/vp8.c+38−27
@@ -28,6 +28,11 @@ · 27 unmodified lines
28#include "h264pred.h"28#include "h264pred.h"
29#include "rectangle.h"29#include "rectangle.h"
30 30
31typedef struct {
32 uint8_t filter_level;
33 uint8_t inner_limit;
34} VP8FilterStrength;
35
31typedef struct {36typedef struct {
32 uint8_t segment;37 uint8_t segment;
33 uint8_t skip;38 uint8_t skip;
@@ -79,6 +84,7 @@ typedef struct { · 45 unmodified lines
79 84
80 VP8Macroblock *macroblocks;85 VP8Macroblock *macroblocks;
81 VP8Macroblock *macroblocks_base;86 VP8Macroblock *macroblocks_base;
87 VP8FilterStrength *filter_strength;
82 int mb_stride;88 int mb_stride;
83 89
84 uint8_t *intra4x4_pred_mode;90 uint8_t *intra4x4_pred_mode;
@@ -231,11 +237,12 @@ static int update_dimensions(VP8Context *s, int width, int height) · 146 unmodified lines
231 s->b4_stride = 4*s->mb_stride;237 s->b4_stride = 4*s->mb_stride;
232 238
233 s->macroblocks_base = av_mallocz(s->mb_stride*(s->mb_height+1)*sizeof(*s->macroblocks));239 s->macroblocks_base = av_mallocz(s->mb_stride*(s->mb_height+1)*sizeof(*s->macroblocks));
240 s->filter_strength = av_mallocz(s->mb_stride*sizeof(*s->filter_strength));
234 s->intra4x4_pred_mode_base = av_mallocz(s->b4_stride*(4*s->mb_height+1));241 s->intra4x4_pred_mode_base = av_mallocz(s->b4_stride*(4*s->mb_height+1));
235 s->top_nnz = av_mallocz(s->mb_width*sizeof(*s->top_nnz));242 s->top_nnz = av_mallocz(s->mb_width*sizeof(*s->top_nnz));
236 s->top_border = av_mallocz((s->mb_width+1)*sizeof(*s->top_border));243 s->top_border = av_mallocz((s->mb_width+1)*sizeof(*s->top_border));
237 244
238 if (!s->macroblocks_base || !s->intra4x4_pred_mode_base || !s->top_nnz || !s->top_border)245 if (!s->macroblocks_base || !s->filter_strength || !s->intra4x4_pred_mode_base || !s->top_nnz || !s->top_border)
239 return AVERROR(ENOMEM);246 return AVERROR(ENOMEM);
240 247
241 s->macroblocks = s->macroblocks_base + 1 + s->mb_stride;248 s->macroblocks = s->macroblocks_base + 1 + s->mb_stride;
@@ -1212,7 +1219,7 @@ static void idct_mb(VP8Context *s, uint8_t *y_dst, uint8_t *u_dst, uint8_t *v_ds · 970 unmodified lines
1212 }1219 }
1213}1220}
1214 1221
1215static void filter_level_for_mb(VP8Context *s, VP8Macroblock *mb, int *level, int *inner, int *hev_thresh)1222static void filter_level_for_mb(VP8Context *s, VP8Macroblock *mb, VP8FilterStrength *f )
1216{1223{
1217 int interior_limit, filter_level;1224 int interior_limit, filter_level;
1218 1225
@@ -1247,34 +1254,32 @@ static void filter_level_for_mb(VP8Context *s, VP8Macroblock *mb, int *level, in · 28 unmodified lines
1247 }1254 }
1248 interior_limit = FFMAX(interior_limit, 1);1255 interior_limit = FFMAX(interior_limit, 1);
1249 1256
1250 *level = filter_level;1257 f->filter_level = filter_level;
1251 *inner = interior_limit;1258 f->inner_limit = interior_limit;
1252
1253 if (hev_thresh) {
1254 *hev_thresh = filter_level >= 15;
1255
1256 if (s->keyframe) {
1257 if (filter_level >= 40)
1258 *hev_thresh = 2;
1259 } else {
1260 if (filter_level >= 40)
1261 *hev_thresh = 3;
1262 else if (filter_level >= 20)
1263 *hev_thresh = 2;
1264 }
1265 }
1266}1259}
1267 1260
1268static void filter_mb(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, int mb_x, int mb_y)1261static void filter_mb(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, VP8FilterStrength *f, int mb_x, int mb_y)
1269{1262{
1270 int filter_level, inner_limit, hev_thresh, mbedge_lim, bedge_lim;1263 int mbedge_lim, bedge_lim, hev_thresh;
1264 int filter_level = f->filter_level;
1265 int inner_limit = f->inner_limit;
1271 1266
1272 filter_level_for_mb(s, mb, &filter_level, &inner_limit, &hev_thresh);
1273 if (!filter_level)1267 if (!filter_level)
1274 return;1268 return;
1275 1269
1276 mbedge_lim = 2*(filter_level+2) + inner_limit;1270 mbedge_lim = 2*(filter_level+2) + inner_limit;
1277 bedge_lim = 2* filter_level + inner_limit;1271 bedge_lim = 2* filter_level + inner_limit;
1272 hev_thresh = filter_level >= 15;
1273
1274 if (s->keyframe) {
1275 if (filter_level >= 40)
1276 hev_thresh = 2;
1277 } else {
1278 if (filter_level >= 40)
1279 hev_thresh = 3;
1280 else if (filter_level >= 20)
1281 hev_thresh = 2;
1282 }
1278 1283
1279 if (mb_x) {1284 if (mb_x) {
1280 s->vp8dsp.vp8_h_loop_filter16y(dst[0], s->linesize,1285 s->vp8dsp.vp8_h_loop_filter16y(dst[0], s->linesize,
@@ -1319,11 +1324,12 @@ static void filter_mb(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, int mb_ · 38 unmodified lines
1319 }1324 }
1320}1325}
1321 1326
1322static void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8Macroblock *mb, int mb_x, int mb_y)1327static void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8Macroblock *mb, VP8FilterStrength *f, int mb_x, int mb_y)
1323{1328{
1324 int filter_level, inner_limit, mbedge_lim, bedge_lim;1329 int mbedge_lim, bedge_lim;
1330 int filter_level = f->filter_level;
1331 int inner_limit = f->inner_limit;
1325 1332
1326 filter_level_for_mb(s, mb, &filter_level, &inner_limit, NULL);
1327 if (!filter_level)1333 if (!filter_level)
1328 return;1334 return;
1329 1335
@@ -1349,6 +1355,7 @@ static void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8Macroblock *mb, int · 19 unmodified lines
1349 1355
1350static void filter_mb_row(VP8Context *s, int mb_y)1356static void filter_mb_row(VP8Context *s, int mb_y)
1351{1357{
1358 VP8FilterStrength *f = s->filter_strength;
1352 VP8Macroblock *mb = s->macroblocks + mb_y*s->mb_stride;1359 VP8Macroblock *mb = s->macroblocks + mb_y*s->mb_stride;
1353 uint8_t *dst[3] = {1360 uint8_t *dst[3] = {
1354 s->framep[VP56_FRAME_CURRENT]->data[0] + 16*mb_y*s->linesize,1361 s->framep[VP56_FRAME_CURRENT]->data[0] + 16*mb_y*s->linesize,
@@ -1359,7 +1366,7 @@ static void filter_mb_row(VP8Context *s, int mb_y) · 4 unmodified lines
1359 1366
1360 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {1367 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1361 backup_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], s->linesize, s->uvlinesize, 0);1368 backup_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], s->linesize, s->uvlinesize, 0);
1362 filter_mb(s, dst, mb++, mb_x, mb_y);1369 filter_mb(s, dst, mb++, f++, mb_x, mb_y);
1363 dst[0] += 16;1370 dst[0] += 16;
1364 dst[1] += 8;1371 dst[1] += 8;
1365 dst[2] += 8;1372 dst[2] += 8;
@@ -1368,13 +1375,14 @@ static void filter_mb_row(VP8Context *s, int mb_y) · 2 unmodified lines
1368 1375
1369static void filter_mb_row_simple(VP8Context *s, int mb_y)1376static void filter_mb_row_simple(VP8Context *s, int mb_y)
1370{1377{
1371 uint8_t *dst = s->framep[VP56_FRAME_CURRENT]->data[0] + 16*mb_y*s->linesize;1378 VP8FilterStrength *f = s->filter_strength;
1372 VP8Macroblock *mb = s->macroblocks + mb_y*s->mb_stride;1379 VP8Macroblock *mb = s->macroblocks + mb_y*s->mb_stride;
1380 uint8_t *dst = s->framep[VP56_FRAME_CURRENT]->data[0] + 16*mb_y*s->linesize;
1373 int mb_x;1381 int mb_x;
1374 1382
1375 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {1383 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1376 backup_mb_border(s->top_border[mb_x+1], dst, NULL, NULL, s->linesize, 0, 1);1384 backup_mb_border(s->top_border[mb_x+1], dst, NULL, NULL, s->linesize, 0, 1);
1377 filter_mb_simple(s, dst, mb++, mb_x, mb_y);1385 filter_mb_simple(s, dst, mb++, f++, mb_x, mb_y);
1378 dst += 16;1386 dst += 16;
1379 }1387 }
1380}1388}
@@ -1497,6 +1505,9 @@ static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *data_size, · 116 unmodified lines
1497 }1505 }
1498 }1506 }
1499 1507
1508 if (s->deblock_filter)
1509 filter_level_for_mb(s, mb, &s->filter_strength[mb_x]);
1510
1500 dst[0] += 16;1511 dst[0] += 16;
1501 dst[1] += 8;1512 dst[1] += 8;
1502 dst[2] += 8;1513 dst[2] += 8;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t