vp8_loopfilter.c 21.3 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
 */


Attila Nagy's avatar
Attila Nagy committed
12
#include "vpx_config.h"
13
#include "vp8_rtcd.h"
John Koleszar's avatar
John Koleszar committed
14
15
#include "loopfilter.h"
#include "onyxc_int.h"
Attila Nagy's avatar
Attila Nagy committed
16
#include "vpx_mem/vpx_mem.h"
John Koleszar's avatar
John Koleszar committed
17
18


Attila Nagy's avatar
Attila Nagy committed
19
static void lf_init_lut(loop_filter_info_n *lfi)
John Koleszar's avatar
John Koleszar committed
20
{
Attila Nagy's avatar
Attila Nagy committed
21
    int filt_lvl;
John Koleszar's avatar
John Koleszar committed
22

Attila Nagy's avatar
Attila Nagy committed
23
    for (filt_lvl = 0; filt_lvl <= MAX_LOOP_FILTER; filt_lvl++)
John Koleszar's avatar
John Koleszar committed
24
    {
Attila Nagy's avatar
Attila Nagy committed
25
        if (filt_lvl >= 40)
John Koleszar's avatar
John Koleszar committed
26
        {
Attila Nagy's avatar
Attila Nagy committed
27
28
29
30
31
32
33
34
35
36
37
38
            lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 2;
            lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 3;
        }
        else if (filt_lvl >= 20)
        {
            lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 1;
            lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 2;
        }
        else if (filt_lvl >= 15)
        {
            lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 1;
            lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 1;
John Koleszar's avatar
John Koleszar committed
39
40
41
        }
        else
        {
Attila Nagy's avatar
Attila Nagy committed
42
43
            lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 0;
            lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 0;
John Koleszar's avatar
John Koleszar committed
44
        }
Attila Nagy's avatar
Attila Nagy committed
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    }

    lfi->mode_lf_lut[DC_PRED] = 1;
    lfi->mode_lf_lut[V_PRED] = 1;
    lfi->mode_lf_lut[H_PRED] = 1;
    lfi->mode_lf_lut[TM_PRED] = 1;
    lfi->mode_lf_lut[B_PRED]  = 0;

    lfi->mode_lf_lut[ZEROMV]  = 1;
    lfi->mode_lf_lut[NEARESTMV] = 2;
    lfi->mode_lf_lut[NEARMV] = 2;
    lfi->mode_lf_lut[NEWMV] = 2;
    lfi->mode_lf_lut[SPLITMV] = 3;

}

void vp8_loop_filter_update_sharpness(loop_filter_info_n *lfi,
                                      int sharpness_lvl)
{
    int i;

    /* For each possible value for the loop filter fill out limits */
    for (i = 0; i <= MAX_LOOP_FILTER; i++)
    {
        int filt_lvl = i;
        int block_inside_limit = 0;
John Koleszar's avatar
John Koleszar committed
71

72
        /* Set loop filter paramaeters that control sharpness. */
John Koleszar's avatar
John Koleszar committed
73
74
75
76
77
78
79
80
81
82
83
84
        block_inside_limit = filt_lvl >> (sharpness_lvl > 0);
        block_inside_limit = block_inside_limit >> (sharpness_lvl > 4);

        if (sharpness_lvl > 0)
        {
            if (block_inside_limit > (9 - sharpness_lvl))
                block_inside_limit = (9 - sharpness_lvl);
        }

        if (block_inside_limit < 1)
            block_inside_limit = 1;

James Zern's avatar
James Zern committed
85
86
87
88
        memset(lfi->lim[i], block_inside_limit, SIMD_WIDTH);
        memset(lfi->blim[i], (2 * filt_lvl + block_inside_limit), SIMD_WIDTH);
        memset(lfi->mblim[i], (2 * (filt_lvl + 2) + block_inside_limit),
               SIMD_WIDTH);
John Koleszar's avatar
John Koleszar committed
89
    }
Attila Nagy's avatar
Attila Nagy committed
90
}
John Koleszar's avatar
John Koleszar committed
91

Attila Nagy's avatar
Attila Nagy committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
void vp8_loop_filter_init(VP8_COMMON *cm)
{
    loop_filter_info_n *lfi = &cm->lf_info;
    int i;

    /* init limits for given sharpness*/
    vp8_loop_filter_update_sharpness(lfi, cm->sharpness_level);
    cm->last_sharpness_level = cm->sharpness_level;

    /* init LUT for lvl  and hev thr picking */
    lf_init_lut(lfi);

    /* init hev threshold const vectors */
    for(i = 0; i < 4 ; i++)
John Koleszar's avatar
John Koleszar committed
106
    {
James Zern's avatar
James Zern committed
107
        memset(lfi->hev_thr[i], i, SIMD_WIDTH);
John Koleszar's avatar
John Koleszar committed
108
109
110
    }
}

Attila Nagy's avatar
Attila Nagy committed
111
112
void vp8_loop_filter_frame_init(VP8_COMMON *cm,
                                MACROBLOCKD *mbd,
Johann's avatar
Johann committed
113
                                int default_filt_lvl)
John Koleszar's avatar
John Koleszar committed
114
{
Attila Nagy's avatar
Attila Nagy committed
115
116
117
    int seg,  /* segment number */
        ref,  /* index in ref_lf_deltas */
        mode; /* index in mode_lf_deltas */
John Koleszar's avatar
John Koleszar committed
118

Attila Nagy's avatar
Attila Nagy committed
119
120
121
    loop_filter_info_n *lfi = &cm->lf_info;

    /* update limits if sharpness has changed */
Johann's avatar
Johann committed
122
    if(cm->last_sharpness_level != cm->sharpness_level)
John Koleszar's avatar
John Koleszar committed
123
    {
Johann's avatar
Johann committed
124
125
        vp8_loop_filter_update_sharpness(lfi, cm->sharpness_level);
        cm->last_sharpness_level = cm->sharpness_level;
Attila Nagy's avatar
Attila Nagy committed
126
    }
John Koleszar's avatar
John Koleszar committed
127

Attila Nagy's avatar
Attila Nagy committed
128
129
130
131
132
133
134
    for(seg = 0; seg < MAX_MB_SEGMENTS; seg++)
    {
        int lvl_seg = default_filt_lvl;
        int lvl_ref, lvl_mode;

        /* Note the baseline filter values for each segment */
        if (mbd->segmentation_enabled)
John Koleszar's avatar
John Koleszar committed
135
        {
Attila Nagy's avatar
Attila Nagy committed
136
137
138
139
140
141
142
143
144
145
            /* Abs value */
            if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA)
            {
                lvl_seg = mbd->segment_feature_data[MB_LVL_ALT_LF][seg];
            }
            else  /* Delta Value */
            {
                lvl_seg += mbd->segment_feature_data[MB_LVL_ALT_LF][seg];
                lvl_seg = (lvl_seg > 0) ? ((lvl_seg > 63) ? 63: lvl_seg) : 0;
            }
John Koleszar's avatar
John Koleszar committed
146
147
        }

Attila Nagy's avatar
Attila Nagy committed
148
        if (!mbd->mode_ref_lf_delta_enabled)
John Koleszar's avatar
John Koleszar committed
149
        {
Attila Nagy's avatar
Attila Nagy committed
150
151
152
            /* we could get rid of this if we assume that deltas are set to
             * zero when not in use; encoder always uses deltas
             */
James Zern's avatar
James Zern committed
153
            memset(lfi->lvl[seg][0], lvl_seg, 4 * 4 );
Attila Nagy's avatar
Attila Nagy committed
154
            continue;
John Koleszar's avatar
John Koleszar committed
155
156
        }

Attila Nagy's avatar
Attila Nagy committed
157
158
        /* INTRA_FRAME */
        ref = INTRA_FRAME;
John Koleszar's avatar
John Koleszar committed
159

160
        /* Apply delta for reference frame */
161
        lvl_ref = lvl_seg + mbd->ref_lf_deltas[ref];
John Koleszar's avatar
John Koleszar committed
162

Attila Nagy's avatar
Attila Nagy committed
163
164
165
        /* Apply delta for Intra modes */
        mode = 0; /* B_PRED */
        /* Only the split mode BPRED has a further special case */
166
167
168
        lvl_mode = lvl_ref + mbd->mode_lf_deltas[mode];
        /* clamp */
        lvl_mode = (lvl_mode > 0) ? (lvl_mode > 63 ? 63 : lvl_mode) : 0;
Attila Nagy's avatar
Attila Nagy committed
169
170
171
172

        lfi->lvl[seg][ref][mode] = lvl_mode;

        mode = 1; /* all the rest of Intra modes */
173
174
        /* clamp */
        lvl_mode = (lvl_ref > 0) ? (lvl_ref > 63 ? 63 : lvl_ref) : 0;
Attila Nagy's avatar
Attila Nagy committed
175
176
177
178
        lfi->lvl[seg][ref][mode] = lvl_mode;

        /* LAST, GOLDEN, ALT */
        for(ref = 1; ref < MAX_REF_FRAMES; ref++)
John Koleszar's avatar
John Koleszar committed
179
        {
Attila Nagy's avatar
Attila Nagy committed
180
            /* Apply delta for reference frame */
181
            lvl_ref = lvl_seg + mbd->ref_lf_deltas[ref];
John Koleszar's avatar
John Koleszar committed
182

Attila Nagy's avatar
Attila Nagy committed
183
184
185
186
            /* Apply delta for Inter modes */
            for (mode = 1; mode < 4; mode++)
            {
                lvl_mode = lvl_ref + mbd->mode_lf_deltas[mode];
187
188
                /* clamp */
                lvl_mode = (lvl_mode > 0) ? (lvl_mode > 63 ? 63 : lvl_mode) : 0;
John Koleszar's avatar
John Koleszar committed
189

Attila Nagy's avatar
Attila Nagy committed
190
191
192
                lfi->lvl[seg][ref][mode] = lvl_mode;
            }
        }
John Koleszar's avatar
John Koleszar committed
193
194
195
    }
}

Scott LaVarnway's avatar
Scott LaVarnway committed
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255

void vp8_loop_filter_row_normal(VP8_COMMON *cm, MODE_INFO *mode_info_context,
                         int mb_row, int post_ystride, int post_uvstride,
                         unsigned char *y_ptr, unsigned char *u_ptr,
                         unsigned char *v_ptr)
{
    int mb_col;
    int filter_level;
    loop_filter_info_n *lfi_n = &cm->lf_info;
    loop_filter_info lfi;
    FRAME_TYPE frame_type = cm->frame_type;

    for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
    {
        int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
                        mode_info_context->mbmi.mode != SPLITMV &&
                        mode_info_context->mbmi.mb_skip_coeff);

        const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
        const int seg = mode_info_context->mbmi.segment_id;
        const int ref_frame = mode_info_context->mbmi.ref_frame;

        filter_level = lfi_n->lvl[seg][ref_frame][mode_index];

        if (filter_level)
        {
            const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level];
            lfi.mblim = lfi_n->mblim[filter_level];
            lfi.blim = lfi_n->blim[filter_level];
            lfi.lim = lfi_n->lim[filter_level];
            lfi.hev_thr = lfi_n->hev_thr[hev_index];

            if (mb_col > 0)
                vp8_loop_filter_mbv
                (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi);

            if (!skip_lf)
                vp8_loop_filter_bv
                (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi);

            /* don't apply across umv border */
            if (mb_row > 0)
                vp8_loop_filter_mbh
                (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi);

            if (!skip_lf)
                vp8_loop_filter_bh
                (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi);
        }

        y_ptr += 16;
        u_ptr += 8;
        v_ptr += 8;

        mode_info_context++;     /* step to next MB */
    }

}

void vp8_loop_filter_row_simple(VP8_COMMON *cm, MODE_INFO *mode_info_context,
256
                         int mb_row, int post_ystride, int post_uvstride,
Scott LaVarnway's avatar
Scott LaVarnway committed
257
258
259
260
261
262
                         unsigned char *y_ptr, unsigned char *u_ptr,
                         unsigned char *v_ptr)
{
    int mb_col;
    int filter_level;
    loop_filter_info_n *lfi_n = &cm->lf_info;
Johann's avatar
Johann committed
263
    (void)post_uvstride;
Scott LaVarnway's avatar
Scott LaVarnway committed
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304

    for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
    {
        int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
                        mode_info_context->mbmi.mode != SPLITMV &&
                        mode_info_context->mbmi.mb_skip_coeff);

        const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
        const int seg = mode_info_context->mbmi.segment_id;
        const int ref_frame = mode_info_context->mbmi.ref_frame;

        filter_level = lfi_n->lvl[seg][ref_frame][mode_index];

        if (filter_level)
        {
            if (mb_col > 0)
                vp8_loop_filter_simple_mbv
                (y_ptr, post_ystride, lfi_n->mblim[filter_level]);

            if (!skip_lf)
                vp8_loop_filter_simple_bv
                (y_ptr, post_ystride, lfi_n->blim[filter_level]);

            /* don't apply across umv border */
            if (mb_row > 0)
                vp8_loop_filter_simple_mbh
                (y_ptr, post_ystride, lfi_n->mblim[filter_level]);

            if (!skip_lf)
                vp8_loop_filter_simple_bh
                (y_ptr, post_ystride, lfi_n->blim[filter_level]);
        }

        y_ptr += 16;
        u_ptr += 8;
        v_ptr += 8;

        mode_info_context++;     /* step to next MB */
    }

}
305
306
307
void vp8_loop_filter_frame(VP8_COMMON *cm,
                           MACROBLOCKD *mbd,
                           int frame_type)
John Koleszar's avatar
John Koleszar committed
308
309
{
    YV12_BUFFER_CONFIG *post = cm->frame_to_show;
Attila Nagy's avatar
Attila Nagy committed
310
311
312
    loop_filter_info_n *lfi_n = &cm->lf_info;
    loop_filter_info lfi;

John Koleszar's avatar
John Koleszar committed
313
314
    int mb_row;
    int mb_col;
Scott LaVarnway's avatar
Scott LaVarnway committed
315
316
    int mb_rows = cm->mb_rows;
    int mb_cols = cm->mb_cols;
John Koleszar's avatar
John Koleszar committed
317
318
319
320
321

    int filter_level;

    unsigned char *y_ptr, *u_ptr, *v_ptr;

Attila Nagy's avatar
Attila Nagy committed
322
323
    /* Point at base of Mb MODE_INFO list */
    const MODE_INFO *mode_info_context = cm->mi;
Scott LaVarnway's avatar
Scott LaVarnway committed
324
325
    int post_y_stride = post->y_stride;
    int post_uv_stride = post->uv_stride;
John Koleszar's avatar
John Koleszar committed
326

327
    /* Initialize the loop filter for this frame. */
Johann's avatar
Johann committed
328
    vp8_loop_filter_frame_init(cm, mbd, cm->filter_level);
John Koleszar's avatar
John Koleszar committed
329

330
    /* Set up the buffer pointers */
John Koleszar's avatar
John Koleszar committed
331
332
333
334
    y_ptr = post->y_buffer;
    u_ptr = post->u_buffer;
    v_ptr = post->v_buffer;

335
    /* vp8_filter each macro block */
Scott LaVarnway's avatar
Scott LaVarnway committed
336
    if (cm->filter_type == NORMAL_LOOPFILTER)
John Koleszar's avatar
John Koleszar committed
337
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
338
        for (mb_row = 0; mb_row < mb_rows; mb_row++)
John Koleszar's avatar
John Koleszar committed
339
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
340
341
342
343
344
            for (mb_col = 0; mb_col < mb_cols; mb_col++)
            {
                int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
                                mode_info_context->mbmi.mode != SPLITMV &&
                                mode_info_context->mbmi.mb_skip_coeff);
John Koleszar's avatar
John Koleszar committed
345

Scott LaVarnway's avatar
Scott LaVarnway committed
346
347
348
                const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
                const int seg = mode_info_context->mbmi.segment_id;
                const int ref_frame = mode_info_context->mbmi.ref_frame;
John Koleszar's avatar
John Koleszar committed
349

Scott LaVarnway's avatar
Scott LaVarnway committed
350
                filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
John Koleszar's avatar
John Koleszar committed
351

Scott LaVarnway's avatar
Scott LaVarnway committed
352
                if (filter_level)
Attila Nagy's avatar
Attila Nagy committed
353
354
355
356
357
358
359
360
                {
                    const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level];
                    lfi.mblim = lfi_n->mblim[filter_level];
                    lfi.blim = lfi_n->blim[filter_level];
                    lfi.lim = lfi_n->lim[filter_level];
                    lfi.hev_thr = lfi_n->hev_thr[hev_index];

                    if (mb_col > 0)
John Koleszar's avatar
John Koleszar committed
361
                        vp8_loop_filter_mbv
Scott LaVarnway's avatar
Scott LaVarnway committed
362
                        (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
Attila Nagy's avatar
Attila Nagy committed
363
364

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
365
                        vp8_loop_filter_bv
Scott LaVarnway's avatar
Scott LaVarnway committed
366
                        (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
Attila Nagy's avatar
Attila Nagy committed
367
368
369

                    /* don't apply across umv border */
                    if (mb_row > 0)
John Koleszar's avatar
John Koleszar committed
370
                        vp8_loop_filter_mbh
Scott LaVarnway's avatar
Scott LaVarnway committed
371
                        (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
Attila Nagy's avatar
Attila Nagy committed
372
373

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
374
                        vp8_loop_filter_bh
Scott LaVarnway's avatar
Scott LaVarnway committed
375
                        (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi);
Attila Nagy's avatar
Attila Nagy committed
376
                }
Scott LaVarnway's avatar
Scott LaVarnway committed
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407

                y_ptr += 16;
                u_ptr += 8;
                v_ptr += 8;

                mode_info_context++;     /* step to next MB */
            }
            y_ptr += post_y_stride  * 16 - post->y_width;
            u_ptr += post_uv_stride *  8 - post->uv_width;
            v_ptr += post_uv_stride *  8 - post->uv_width;

            mode_info_context++;         /* Skip border mb */

        }
    }
    else /* SIMPLE_LOOPFILTER */
    {
        for (mb_row = 0; mb_row < mb_rows; mb_row++)
        {
            for (mb_col = 0; mb_col < mb_cols; mb_col++)
            {
                int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
                                mode_info_context->mbmi.mode != SPLITMV &&
                                mode_info_context->mbmi.mb_skip_coeff);

                const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
                const int seg = mode_info_context->mbmi.segment_id;
                const int ref_frame = mode_info_context->mbmi.ref_frame;

                filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
                if (filter_level)
Attila Nagy's avatar
Attila Nagy committed
408
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
409
410
411
                    const unsigned char * mblim = lfi_n->mblim[filter_level];
                    const unsigned char * blim = lfi_n->blim[filter_level];

Attila Nagy's avatar
Attila Nagy committed
412
                    if (mb_col > 0)
John Koleszar's avatar
John Koleszar committed
413
                        vp8_loop_filter_simple_mbv
Scott LaVarnway's avatar
Scott LaVarnway committed
414
                        (y_ptr, post_y_stride, mblim);
Attila Nagy's avatar
Attila Nagy committed
415
416

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
417
                        vp8_loop_filter_simple_bv
Scott LaVarnway's avatar
Scott LaVarnway committed
418
                        (y_ptr, post_y_stride, blim);
Attila Nagy's avatar
Attila Nagy committed
419
420
421

                    /* don't apply across umv border */
                    if (mb_row > 0)
John Koleszar's avatar
John Koleszar committed
422
                        vp8_loop_filter_simple_mbh
Scott LaVarnway's avatar
Scott LaVarnway committed
423
                        (y_ptr, post_y_stride, mblim);
Attila Nagy's avatar
Attila Nagy committed
424
425

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
426
                        vp8_loop_filter_simple_bh
Scott LaVarnway's avatar
Scott LaVarnway committed
427
                        (y_ptr, post_y_stride, blim);
Attila Nagy's avatar
Attila Nagy committed
428
                }
John Koleszar's avatar
John Koleszar committed
429

Scott LaVarnway's avatar
Scott LaVarnway committed
430
431
432
                y_ptr += 16;
                u_ptr += 8;
                v_ptr += 8;
John Koleszar's avatar
John Koleszar committed
433

Scott LaVarnway's avatar
Scott LaVarnway committed
434
435
436
437
438
                mode_info_context++;     /* step to next MB */
            }
            y_ptr += post_y_stride  * 16 - post->y_width;
            u_ptr += post_uv_stride *  8 - post->uv_width;
            v_ptr += post_uv_stride *  8 - post->uv_width;
John Koleszar's avatar
John Koleszar committed
439

Scott LaVarnway's avatar
Scott LaVarnway committed
440
            mode_info_context++;         /* Skip border mb */
John Koleszar's avatar
John Koleszar committed
441

Scott LaVarnway's avatar
Scott LaVarnway committed
442
        }
John Koleszar's avatar
John Koleszar committed
443
444
445
446
447
448
449
    }
}

void vp8_loop_filter_frame_yonly
(
    VP8_COMMON *cm,
    MACROBLOCKD *mbd,
Johann's avatar
Johann committed
450
    int default_filt_lvl
John Koleszar's avatar
John Koleszar committed
451
452
453
454
455
456
457
458
)
{
    YV12_BUFFER_CONFIG *post = cm->frame_to_show;

    unsigned char *y_ptr;
    int mb_row;
    int mb_col;

Attila Nagy's avatar
Attila Nagy committed
459
460
461
    loop_filter_info_n *lfi_n = &cm->lf_info;
    loop_filter_info lfi;

John Koleszar's avatar
John Koleszar committed
462
    int filter_level;
463
    FRAME_TYPE frame_type = cm->frame_type;
John Koleszar's avatar
John Koleszar committed
464

Attila Nagy's avatar
Attila Nagy committed
465
466
    /* Point at base of Mb MODE_INFO list */
    const MODE_INFO *mode_info_context = cm->mi;
John Koleszar's avatar
John Koleszar committed
467

Attila Nagy's avatar
Attila Nagy committed
468
469
470
471
#if 0
    if(default_filt_lvl == 0) /* no filter applied */
        return;
#endif
John Koleszar's avatar
John Koleszar committed
472

473
    /* Initialize the loop filter for this frame. */
Johann's avatar
Johann committed
474
    vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl);
John Koleszar's avatar
John Koleszar committed
475

476
    /* Set up the buffer pointers */
John Koleszar's avatar
John Koleszar committed
477
478
    y_ptr = post->y_buffer;

479
    /* vp8_filter each macro block */
John Koleszar's avatar
John Koleszar committed
480
481
482
483
    for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
    {
        for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
        {
Attila Nagy's avatar
Attila Nagy committed
484
485
486
            int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
                            mode_info_context->mbmi.mode != SPLITMV &&
                            mode_info_context->mbmi.mb_skip_coeff);
487

Attila Nagy's avatar
Attila Nagy committed
488
489
490
            const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
            const int seg = mode_info_context->mbmi.segment_id;
            const int ref_frame = mode_info_context->mbmi.ref_frame;
John Koleszar's avatar
John Koleszar committed
491

Attila Nagy's avatar
Attila Nagy committed
492
            filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
John Koleszar's avatar
John Koleszar committed
493
494
495

            if (filter_level)
            {
Attila Nagy's avatar
Attila Nagy committed
496
497
498
499
500
501
502
503
504
                if (cm->filter_type == NORMAL_LOOPFILTER)
                {
                    const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level];
                    lfi.mblim = lfi_n->mblim[filter_level];
                    lfi.blim = lfi_n->blim[filter_level];
                    lfi.lim = lfi_n->lim[filter_level];
                    lfi.hev_thr = lfi_n->hev_thr[hev_index];

                    if (mb_col > 0)
John Koleszar's avatar
John Koleszar committed
505
                        vp8_loop_filter_mbv
Attila Nagy's avatar
Attila Nagy committed
506
507
508
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
509
                        vp8_loop_filter_bv
Attila Nagy's avatar
Attila Nagy committed
510
511
512
513
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);

                    /* don't apply across umv border */
                    if (mb_row > 0)
John Koleszar's avatar
John Koleszar committed
514
                        vp8_loop_filter_mbh
Attila Nagy's avatar
Attila Nagy committed
515
516
517
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
518
                        vp8_loop_filter_bh
Attila Nagy's avatar
Attila Nagy committed
519
520
521
522
523
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);
                }
                else
                {
                    if (mb_col > 0)
John Koleszar's avatar
John Koleszar committed
524
                        vp8_loop_filter_simple_mbv
Attila Nagy's avatar
Attila Nagy committed
525
526
527
                        (y_ptr, post->y_stride, lfi_n->mblim[filter_level]);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
528
                        vp8_loop_filter_simple_bv
Attila Nagy's avatar
Attila Nagy committed
529
530
531
532
                        (y_ptr, post->y_stride, lfi_n->blim[filter_level]);

                    /* don't apply across umv border */
                    if (mb_row > 0)
John Koleszar's avatar
John Koleszar committed
533
                        vp8_loop_filter_simple_mbh
Attila Nagy's avatar
Attila Nagy committed
534
535
536
                        (y_ptr, post->y_stride, lfi_n->mblim[filter_level]);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
537
                        vp8_loop_filter_simple_bh
Attila Nagy's avatar
Attila Nagy committed
538
539
                        (y_ptr, post->y_stride, lfi_n->blim[filter_level]);
                }
John Koleszar's avatar
John Koleszar committed
540
541
542
            }

            y_ptr += 16;
Attila Nagy's avatar
Attila Nagy committed
543
            mode_info_context ++;        /* step to next MB */
John Koleszar's avatar
John Koleszar committed
544
545
546
547

        }

        y_ptr += post->y_stride  * 16 - post->y_width;
Attila Nagy's avatar
Attila Nagy committed
548
        mode_info_context ++;            /* Skip border mb */
John Koleszar's avatar
John Koleszar committed
549
550
551
552
553
554
555
556
    }

}

void vp8_loop_filter_partial_frame
(
    VP8_COMMON *cm,
    MACROBLOCKD *mbd,
Johann's avatar
Johann committed
557
    int default_filt_lvl
John Koleszar's avatar
John Koleszar committed
558
559
560
561
562
563
564
)
{
    YV12_BUFFER_CONFIG *post = cm->frame_to_show;

    unsigned char *y_ptr;
    int mb_row;
    int mb_col;
565
566
    int mb_cols = post->y_width >> 4;
    int mb_rows = post->y_height >> 4;
John Koleszar's avatar
John Koleszar committed
567

568
    int linestocopy;
Attila Nagy's avatar
Attila Nagy committed
569
570
571

    loop_filter_info_n *lfi_n = &cm->lf_info;
    loop_filter_info lfi;
John Koleszar's avatar
John Koleszar committed
572
573

    int filter_level;
574
    FRAME_TYPE frame_type = cm->frame_type;
John Koleszar's avatar
John Koleszar committed
575

Attila Nagy's avatar
Attila Nagy committed
576
577
    const MODE_INFO *mode_info_context;

578
579
580
581
582
583
584
#if 0
    if(default_filt_lvl == 0) /* no filter applied */
        return;
#endif

    /* Initialize the loop filter for this frame. */
    vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl);
Attila Nagy's avatar
Attila Nagy committed
585

586
587
588
    /* number of MB rows to use in partial filtering */
    linestocopy = mb_rows / PARTIAL_FRAME_FRACTION;
    linestocopy = linestocopy ? linestocopy << 4 : 16;     /* 16 lines per MB */
John Koleszar's avatar
John Koleszar committed
589

590
591
592
    /* Set up the buffer pointers; partial image starts at ~middle of frame */
    y_ptr = post->y_buffer + ((post->y_height >> 5) * 16) * post->y_stride;
    mode_info_context = cm->mi + (post->y_height >> 5) * (mb_cols + 1);
John Koleszar's avatar
John Koleszar committed
593

594
    /* vp8_filter each macro block */
John Koleszar's avatar
John Koleszar committed
595
596
597
598
    for (mb_row = 0; mb_row<(linestocopy >> 4); mb_row++)
    {
        for (mb_col = 0; mb_col < mb_cols; mb_col++)
        {
Attila Nagy's avatar
Attila Nagy committed
599
600
601
            int skip_lf = (mode_info_context->mbmi.mode != B_PRED &&
                           mode_info_context->mbmi.mode != SPLITMV &&
                           mode_info_context->mbmi.mb_skip_coeff);
602

603
604
605
606
607
608
            const int mode_index =
                lfi_n->mode_lf_lut[mode_info_context->mbmi.mode];
            const int seg = mode_info_context->mbmi.segment_id;
            const int ref_frame = mode_info_context->mbmi.ref_frame;

            filter_level = lfi_n->lvl[seg][ref_frame][mode_index];
John Koleszar's avatar
John Koleszar committed
609
610
611

            if (filter_level)
            {
Attila Nagy's avatar
Attila Nagy committed
612
613
614
615
616
617
618
619
620
                if (cm->filter_type == NORMAL_LOOPFILTER)
                {
                    const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level];
                    lfi.mblim = lfi_n->mblim[filter_level];
                    lfi.blim = lfi_n->blim[filter_level];
                    lfi.lim = lfi_n->lim[filter_level];
                    lfi.hev_thr = lfi_n->hev_thr[hev_index];

                    if (mb_col > 0)
John Koleszar's avatar
John Koleszar committed
621
                        vp8_loop_filter_mbv
Attila Nagy's avatar
Attila Nagy committed
622
623
624
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
625
                        vp8_loop_filter_bv
Attila Nagy's avatar
Attila Nagy committed
626
627
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);

John Koleszar's avatar
John Koleszar committed
628
                    vp8_loop_filter_mbh
Attila Nagy's avatar
Attila Nagy committed
629
630
631
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
632
                        vp8_loop_filter_bh
Attila Nagy's avatar
Attila Nagy committed
633
634
635
636
637
                        (y_ptr, 0, 0, post->y_stride, 0, &lfi);
                }
                else
                {
                    if (mb_col > 0)
John Koleszar's avatar
John Koleszar committed
638
                        vp8_loop_filter_simple_mbv
Attila Nagy's avatar
Attila Nagy committed
639
640
641
                        (y_ptr, post->y_stride, lfi_n->mblim[filter_level]);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
642
                        vp8_loop_filter_simple_bv
Attila Nagy's avatar
Attila Nagy committed
643
644
                        (y_ptr, post->y_stride, lfi_n->blim[filter_level]);

John Koleszar's avatar
John Koleszar committed
645
                    vp8_loop_filter_simple_mbh
Attila Nagy's avatar
Attila Nagy committed
646
647
648
                        (y_ptr, post->y_stride, lfi_n->mblim[filter_level]);

                    if (!skip_lf)
John Koleszar's avatar
John Koleszar committed
649
                        vp8_loop_filter_simple_bh
Attila Nagy's avatar
Attila Nagy committed
650
651
                        (y_ptr, post->y_stride, lfi_n->blim[filter_level]);
                }
John Koleszar's avatar
John Koleszar committed
652
653
654
            }

            y_ptr += 16;
Attila Nagy's avatar
Attila Nagy committed
655
            mode_info_context += 1;      /* step to next MB */
John Koleszar's avatar
John Koleszar committed
656
657
658
        }

        y_ptr += post->y_stride  * 16 - post->y_width;
Attila Nagy's avatar
Attila Nagy committed
659
        mode_info_context += 1;          /* Skip border mb */
John Koleszar's avatar
John Koleszar committed
660
661
    }
}