Originally committed as revision 24417 to svn://svn.ffmpeg.org/ffmpeg/trunk
Unified · Split
| @@ -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 | ||
| 31 | typedef struct { | ||
| 32 | uint8_t filter_level; | ||
| 33 | uint8_t inner_limit; | ||
| 34 | } VP8FilterStrength; | ||
| 35 | |||
| 31 | typedef struct { | 36 | typedef 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 | ||
| 1215 | static void filter_level_for_mb(VP8Context *s, VP8Macroblock *mb, int *level, int *inner, int *hev_thresh) | 1222 | static 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 | ||
| 1268 | static void filter_mb(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb, int mb_x, int mb_y) | 1261 | static 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 | ||
| 1322 | static void filter_mb_simple(VP8Context *s, uint8_t *dst, VP8Macroblock *mb, int mb_x, int mb_y) | 1327 | static 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 | ||
| 1350 | static void filter_mb_row(VP8Context *s, int mb_y) | 1356 | static 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 | ||
| 1369 | static void filter_mb_row_simple(VP8Context *s, int mb_y) | 1376 | static 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; |