LCOV - code coverage report
Current view: top level - libavcodec - vp9_mc_template.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 125 125 100.0 %
Date: 2017-12-12 03:56:30 Functions: 3 4 75.0 %

          Line data    Source code
       1             : /*
       2             :  * VP9 compatible video decoder
       3             :  *
       4             :  * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
       5             :  * Copyright (C) 2013 Clément Bœsch <u pkh me>
       6             :  *
       7             :  * This file is part of FFmpeg.
       8             :  *
       9             :  * FFmpeg is free software; you can redistribute it and/or
      10             :  * modify it under the terms of the GNU Lesser General Public
      11             :  * License as published by the Free Software Foundation; either
      12             :  * version 2.1 of the License, or (at your option) any later version.
      13             :  *
      14             :  * FFmpeg is distributed in the hope that it will be useful,
      15             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      17             :  * Lesser General Public License for more details.
      18             :  *
      19             :  * You should have received a copy of the GNU Lesser General Public
      20             :  * License along with FFmpeg; if not, write to the Free Software
      21             :  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      22             :  */
      23             : 
      24             : #define ROUNDED_DIV_MVx2(a, b) \
      25             :     (VP56mv) { .x = ROUNDED_DIV(a.x + b.x, 2), .y = ROUNDED_DIV(a.y + b.y, 2) }
      26             : #define ROUNDED_DIV_MVx4(a, b, c, d) \
      27             :     (VP56mv) { .x = ROUNDED_DIV(a.x + b.x + c.x + d.x, 4), \
      28             :                .y = ROUNDED_DIV(a.y + b.y + c.y + d.y, 4) }
      29             : 
      30      528478 : static void FN(inter_pred)(VP9TileData *td)
      31             : {
      32             :     static const uint8_t bwlog_tab[2][N_BS_SIZES] = {
      33             :         { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 },
      34             :         { 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 },
      35             :     };
      36      528478 :     VP9Context *s = td->s;
      37      528478 :     VP9Block *b = td->b;
      38      528478 :     int row = td->row, col = td->col;
      39      528478 :     ThreadFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[0]]], *tref2;
      40      528478 :     AVFrame *ref1 = tref1->f, *ref2;
      41      528478 :     int w1 = ref1->width, h1 = ref1->height, w2, h2;
      42      528478 :     ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride;
      43      528478 :     int bytesperpixel = BYTES_PER_PIXEL;
      44             : 
      45      528478 :     if (b->comp) {
      46       27071 :         tref2 = &s->s.refs[s->s.h.refidx[b->ref[1]]];
      47       27071 :         ref2 = tref2->f;
      48       27071 :         w2 = ref2->width;
      49       27071 :         h2 = ref2->height;
      50             :     }
      51             : 
      52             :     // y inter pred
      53      528478 :     if (b->bs > BS_8x8) {
      54             :         VP56mv uvmv;
      55             : 
      56             : #if SCALED == 0
      57       49845 :         if (b->bs == BS_8x4) {
      58       17285 :             mc_luma_dir(td, mc[3][b->filter][0], td->dst[0], ls_y,
      59             :                         ref1->data[0], ref1->linesize[0], tref1,
      60             :                         row << 3, col << 3, &b->mv[0][0],,,,, 8, 4, w1, h1, 0);
      61       17285 :             mc_luma_dir(td, mc[3][b->filter][0],
      62             :                         td->dst[0] + 4 * ls_y, ls_y,
      63             :                         ref1->data[0], ref1->linesize[0], tref1,
      64             :                         (row << 3) + 4, col << 3, &b->mv[2][0],,,,, 8, 4, w1, h1, 0);
      65       17285 :             w1 = (w1 + s->ss_h) >> s->ss_h;
      66       17285 :             if (s->ss_v) {
      67       16783 :                 h1 = (h1 + 1) >> 1;
      68       16783 :                 uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]);
      69       16783 :                 mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0],
      70             :                               td->dst[1], td->dst[2], ls_uv,
      71             :                               ref1->data[1], ref1->linesize[1],
      72             :                               ref1->data[2], ref1->linesize[2], tref1,
      73             :                               row << 2, col << (3 - s->ss_h),
      74             :                               &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0);
      75             :             } else {
      76         502 :                 mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0],
      77             :                               td->dst[1], td->dst[2], ls_uv,
      78             :                               ref1->data[1], ref1->linesize[1],
      79             :                               ref1->data[2], ref1->linesize[2], tref1,
      80             :                               row << 3, col << (3 - s->ss_h),
      81             :                               &b->mv[0][0],,,,, 8 >> s->ss_h, 4, w1, h1, 0);
      82             :                 // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index
      83             :                 // to get the motion vector for the bottom 4x4 block
      84             :                 // https://code.google.com/p/webm/issues/detail?id=993
      85         502 :                 if (s->ss_h == 0) {
      86         243 :                     uvmv = b->mv[2][0];
      87             :                 } else {
      88         259 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]);
      89             :                 }
      90         502 :                 mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][0],
      91             :                               td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv,
      92             :                               ref1->data[1], ref1->linesize[1],
      93             :                               ref1->data[2], ref1->linesize[2], tref1,
      94             :                               (row << 3) + 4, col << (3 - s->ss_h),
      95             :                               &uvmv,,,,, 8 >> s->ss_h, 4, w1, h1, 0);
      96             :             }
      97             : 
      98       17285 :             if (b->comp) {
      99         271 :                 mc_luma_dir(td, mc[3][b->filter][1], td->dst[0], ls_y,
     100             :                             ref2->data[0], ref2->linesize[0], tref2,
     101             :                             row << 3, col << 3, &b->mv[0][1],,,,, 8, 4, w2, h2, 1);
     102         271 :                 mc_luma_dir(td, mc[3][b->filter][1],
     103             :                             td->dst[0] + 4 * ls_y, ls_y,
     104             :                             ref2->data[0], ref2->linesize[0], tref2,
     105             :                             (row << 3) + 4, col << 3, &b->mv[2][1],,,,, 8, 4, w2, h2, 1);
     106         271 :                 w2 = (w2 + s->ss_h) >> s->ss_h;
     107         271 :                 if (s->ss_v) {
     108         168 :                     h2 = (h2 + 1) >> 1;
     109         168 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]);
     110         168 :                     mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1],
     111             :                                   td->dst[1], td->dst[2], ls_uv,
     112             :                                   ref2->data[1], ref2->linesize[1],
     113             :                                   ref2->data[2], ref2->linesize[2], tref2,
     114             :                                   row << 2, col << (3 - s->ss_h),
     115             :                                   &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1);
     116             :                 } else {
     117         103 :                     mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1],
     118             :                                   td->dst[1], td->dst[2], ls_uv,
     119             :                                   ref2->data[1], ref2->linesize[1],
     120             :                                   ref2->data[2], ref2->linesize[2], tref2,
     121             :                                   row << 3, col << (3 - s->ss_h),
     122             :                                   &b->mv[0][1],,,,, 8 >> s->ss_h, 4, w2, h2, 1);
     123             :                     // BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index
     124             :                     // to get the motion vector for the bottom 4x4 block
     125             :                     // https://code.google.com/p/webm/issues/detail?id=993
     126         103 :                     if (s->ss_h == 0) {
     127          47 :                         uvmv = b->mv[2][1];
     128             :                     } else {
     129          56 :                         uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]);
     130             :                     }
     131         103 :                     mc_chroma_dir(td, mc[3 + s->ss_h][b->filter][1],
     132             :                                   td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv,
     133             :                                   ref2->data[1], ref2->linesize[1],
     134             :                                   ref2->data[2], ref2->linesize[2], tref2,
     135             :                                   (row << 3) + 4, col << (3 - s->ss_h),
     136             :                                   &uvmv,,,,, 8 >> s->ss_h, 4, w2, h2, 1);
     137             :                 }
     138             :             }
     139       32560 :         } else if (b->bs == BS_4x8) {
     140       15714 :             mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y,
     141             :                         ref1->data[0], ref1->linesize[0], tref1,
     142             :                         row << 3, col << 3, &b->mv[0][0],,,,, 4, 8, w1, h1, 0);
     143       15714 :             mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y,
     144             :                         ref1->data[0], ref1->linesize[0], tref1,
     145             :                         row << 3, (col << 3) + 4, &b->mv[1][0],,,,, 4, 8, w1, h1, 0);
     146       15714 :             h1 = (h1 + s->ss_v) >> s->ss_v;
     147       15714 :             if (s->ss_h) {
     148       13912 :                 w1 = (w1 + 1) >> 1;
     149       13912 :                 uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]);
     150       13912 :                 mc_chroma_dir(td, mc[4][b->filter][0],
     151             :                               td->dst[1], td->dst[2], ls_uv,
     152             :                               ref1->data[1], ref1->linesize[1],
     153             :                               ref1->data[2], ref1->linesize[2], tref1,
     154             :                               row << (3 - s->ss_v), col << 2,
     155             :                               &uvmv,,,,, 4, 8 >> s->ss_v, w1, h1, 0);
     156             :             } else {
     157        1802 :                 mc_chroma_dir(td, mc[4][b->filter][0],
     158             :                               td->dst[1], td->dst[2], ls_uv,
     159             :                               ref1->data[1], ref1->linesize[1],
     160             :                               ref1->data[2], ref1->linesize[2], tref1,
     161             :                               row << (3 - s->ss_v), col << 3,
     162             :                               &b->mv[0][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0);
     163        1802 :                 mc_chroma_dir(td, mc[4][b->filter][0],
     164             :                               td->dst[1] + 4 * bytesperpixel,
     165             :                               td->dst[2] + 4 * bytesperpixel, ls_uv,
     166             :                               ref1->data[1], ref1->linesize[1],
     167             :                               ref1->data[2], ref1->linesize[2], tref1,
     168             :                               row << (3 - s->ss_v), (col << 3) + 4,
     169             :                               &b->mv[1][0],,,,, 4, 8 >> s->ss_v, w1, h1, 0);
     170             :             }
     171             : 
     172       15714 :             if (b->comp) {
     173         413 :                 mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y,
     174             :                             ref2->data[0], ref2->linesize[0], tref2,
     175             :                             row << 3, col << 3, &b->mv[0][1],,,,, 4, 8, w2, h2, 1);
     176         413 :                 mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y,
     177             :                             ref2->data[0], ref2->linesize[0], tref2,
     178             :                             row << 3, (col << 3) + 4, &b->mv[1][1],,,,, 4, 8, w2, h2, 1);
     179         413 :                 h2 = (h2 + s->ss_v) >> s->ss_v;
     180         413 :                 if (s->ss_h) {
     181         188 :                     w2 = (w2 + 1) >> 1;
     182         188 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]);
     183         188 :                     mc_chroma_dir(td, mc[4][b->filter][1],
     184             :                                   td->dst[1], td->dst[2], ls_uv,
     185             :                                   ref2->data[1], ref2->linesize[1],
     186             :                                   ref2->data[2], ref2->linesize[2], tref2,
     187             :                                   row << (3 - s->ss_v), col << 2,
     188             :                                   &uvmv,,,,, 4, 8 >> s->ss_v, w2, h2, 1);
     189             :                 } else {
     190         225 :                     mc_chroma_dir(td, mc[4][b->filter][1],
     191             :                                   td->dst[1], td->dst[2], ls_uv,
     192             :                                   ref2->data[1], ref2->linesize[1],
     193             :                                   ref2->data[2], ref2->linesize[2], tref2,
     194             :                                   row << (3 - s->ss_v), col << 3,
     195             :                                   &b->mv[0][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1);
     196         225 :                     mc_chroma_dir(td, mc[4][b->filter][1],
     197             :                                   td->dst[1] + 4 * bytesperpixel,
     198             :                                   td->dst[2] + 4 * bytesperpixel, ls_uv,
     199             :                                   ref2->data[1], ref2->linesize[1],
     200             :                                   ref2->data[2], ref2->linesize[2], tref2,
     201             :                                   row << (3 - s->ss_v), (col << 3) + 4,
     202             :                                   &b->mv[1][1],,,,, 4, 8 >> s->ss_v, w2, h2, 1);
     203             :                 }
     204             :             }
     205             :         } else
     206             : #endif
     207             :         {
     208             : #if SCALED == 0
     209             :             av_assert2(b->bs == BS_4x4);
     210             : #endif
     211             : 
     212             :             // FIXME if two horizontally adjacent blocks have the same MV,
     213             :             // do a w8 instead of a w4 call
     214       16846 :             mc_luma_dir(td, mc[4][b->filter][0], td->dst[0], ls_y,
     215             :                         ref1->data[0], ref1->linesize[0], tref1,
     216             :                         row << 3, col << 3, &b->mv[0][0],
     217             :                         0, 0, 8, 8, 4, 4, w1, h1, 0);
     218       16846 :             mc_luma_dir(td, mc[4][b->filter][0], td->dst[0] + 4 * bytesperpixel, ls_y,
     219             :                         ref1->data[0], ref1->linesize[0], tref1,
     220             :                         row << 3, (col << 3) + 4, &b->mv[1][0],
     221             :                         4, 0, 8, 8, 4, 4, w1, h1, 0);
     222       16846 :             mc_luma_dir(td, mc[4][b->filter][0],
     223             :                         td->dst[0] + 4 * ls_y, ls_y,
     224             :                         ref1->data[0], ref1->linesize[0], tref1,
     225             :                         (row << 3) + 4, col << 3, &b->mv[2][0],
     226             :                         0, 4, 8, 8, 4, 4, w1, h1, 0);
     227       16846 :             mc_luma_dir(td, mc[4][b->filter][0],
     228             :                         td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y,
     229             :                         ref1->data[0], ref1->linesize[0], tref1,
     230             :                         (row << 3) + 4, (col << 3) + 4, &b->mv[3][0],
     231             :                         4, 4, 8, 8, 4, 4, w1, h1, 0);
     232       16846 :             if (s->ss_v) {
     233       16069 :                 h1 = (h1 + 1) >> 1;
     234       16069 :                 if (s->ss_h) {
     235       15442 :                     w1 = (w1 + 1) >> 1;
     236       15442 :                     uvmv = ROUNDED_DIV_MVx4(b->mv[0][0], b->mv[1][0],
     237             :                                             b->mv[2][0], b->mv[3][0]);
     238       15442 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     239             :                                   td->dst[1], td->dst[2], ls_uv,
     240             :                                   ref1->data[1], ref1->linesize[1],
     241             :                                   ref1->data[2], ref1->linesize[2], tref1,
     242             :                                   row << 2, col << 2,
     243             :                                   &uvmv, 0, 0, 4, 4, 4, 4, w1, h1, 0);
     244             :                 } else {
     245         627 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[2][0]);
     246         627 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     247             :                                   td->dst[1], td->dst[2], ls_uv,
     248             :                                   ref1->data[1], ref1->linesize[1],
     249             :                                   ref1->data[2], ref1->linesize[2], tref1,
     250             :                                   row << 2, col << 3,
     251             :                                   &uvmv, 0, 0, 8, 4, 4, 4, w1, h1, 0);
     252         627 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[3][0]);
     253         627 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     254             :                                   td->dst[1] + 4 * bytesperpixel,
     255             :                                   td->dst[2] + 4 * bytesperpixel, ls_uv,
     256             :                                   ref1->data[1], ref1->linesize[1],
     257             :                                   ref1->data[2], ref1->linesize[2], tref1,
     258             :                                   row << 2, (col << 3) + 4,
     259             :                                   &uvmv, 4, 0, 8, 4, 4, 4, w1, h1, 0);
     260             :                 }
     261             :             } else {
     262         777 :                 if (s->ss_h) {
     263         502 :                     w1 = (w1 + 1) >> 1;
     264         502 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[0][0], b->mv[1][0]);
     265         502 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     266             :                                   td->dst[1], td->dst[2], ls_uv,
     267             :                                   ref1->data[1], ref1->linesize[1],
     268             :                                   ref1->data[2], ref1->linesize[2], tref1,
     269             :                                   row << 3, col << 2,
     270             :                                   &uvmv, 0, 0, 4, 8, 4, 4, w1, h1, 0);
     271             :                     // BUG libvpx uses wrong block index for 4:2:2 bs=4x4
     272             :                     // bottom block
     273             :                     // https://code.google.com/p/webm/issues/detail?id=993
     274         502 :                     uvmv = ROUNDED_DIV_MVx2(b->mv[1][0], b->mv[2][0]);
     275         502 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     276             :                                   td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv,
     277             :                                   ref1->data[1], ref1->linesize[1],
     278             :                                   ref1->data[2], ref1->linesize[2], tref1,
     279             :                                   (row << 3) + 4, col << 2,
     280             :                                   &uvmv, 0, 4, 4, 8, 4, 4, w1, h1, 0);
     281             :                 } else {
     282         275 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     283             :                                   td->dst[1], td->dst[2], ls_uv,
     284             :                                   ref1->data[1], ref1->linesize[1],
     285             :                                   ref1->data[2], ref1->linesize[2], tref1,
     286             :                                   row << 3, col << 3,
     287             :                                   &b->mv[0][0], 0, 0, 8, 8, 4, 4, w1, h1, 0);
     288         275 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     289             :                                   td->dst[1] + 4 * bytesperpixel,
     290             :                                   td->dst[2] + 4 * bytesperpixel, ls_uv,
     291             :                                   ref1->data[1], ref1->linesize[1],
     292             :                                   ref1->data[2], ref1->linesize[2], tref1,
     293             :                                   row << 3, (col << 3) + 4,
     294             :                                   &b->mv[1][0], 4, 0, 8, 8, 4, 4, w1, h1, 0);
     295         275 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     296             :                                   td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv,
     297             :                                   ref1->data[1], ref1->linesize[1],
     298             :                                   ref1->data[2], ref1->linesize[2], tref1,
     299             :                                   (row << 3) + 4, col << 3,
     300             :                                   &b->mv[2][0], 0, 4, 8, 8, 4, 4, w1, h1, 0);
     301         275 :                     mc_chroma_dir(td, mc[4][b->filter][0],
     302             :                                   td->dst[1] + 4 * ls_uv + 4 * bytesperpixel,
     303             :                                   td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv,
     304             :                                   ref1->data[1], ref1->linesize[1],
     305             :                                   ref1->data[2], ref1->linesize[2], tref1,
     306             :                                   (row << 3) + 4, (col << 3) + 4,
     307             :                                   &b->mv[3][0], 4, 4, 8, 8, 4, 4, w1, h1, 0);
     308             :                 }
     309             :             }
     310             : 
     311       16846 :             if (b->comp) {
     312         208 :                 mc_luma_dir(td, mc[4][b->filter][1], td->dst[0], ls_y,
     313             :                             ref2->data[0], ref2->linesize[0], tref2,
     314             :                             row << 3, col << 3, &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1);
     315         208 :                 mc_luma_dir(td, mc[4][b->filter][1], td->dst[0] + 4 * bytesperpixel, ls_y,
     316             :                             ref2->data[0], ref2->linesize[0], tref2,
     317             :                             row << 3, (col << 3) + 4, &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1);
     318         208 :                 mc_luma_dir(td, mc[4][b->filter][1],
     319             :                             td->dst[0] + 4 * ls_y, ls_y,
     320             :                             ref2->data[0], ref2->linesize[0], tref2,
     321             :                             (row << 3) + 4, col << 3, &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1);
     322         208 :                 mc_luma_dir(td, mc[4][b->filter][1],
     323             :                             td->dst[0] + 4 * ls_y + 4 * bytesperpixel, ls_y,
     324             :                             ref2->data[0], ref2->linesize[0], tref2,
     325             :                             (row << 3) + 4, (col << 3) + 4, &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1);
     326         208 :                 if (s->ss_v) {
     327         154 :                     h2 = (h2 + 1) >> 1;
     328         154 :                     if (s->ss_h) {
     329          74 :                         w2 = (w2 + 1) >> 1;
     330          74 :                         uvmv = ROUNDED_DIV_MVx4(b->mv[0][1], b->mv[1][1],
     331             :                                                 b->mv[2][1], b->mv[3][1]);
     332          74 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     333             :                                       td->dst[1], td->dst[2], ls_uv,
     334             :                                       ref2->data[1], ref2->linesize[1],
     335             :                                       ref2->data[2], ref2->linesize[2], tref2,
     336             :                                       row << 2, col << 2,
     337             :                                       &uvmv, 0, 0, 4, 4, 4, 4, w2, h2, 1);
     338             :                     } else {
     339          80 :                         uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[2][1]);
     340          80 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     341             :                                       td->dst[1], td->dst[2], ls_uv,
     342             :                                       ref2->data[1], ref2->linesize[1],
     343             :                                       ref2->data[2], ref2->linesize[2], tref2,
     344             :                                       row << 2, col << 3,
     345             :                                       &uvmv, 0, 0, 8, 4, 4, 4, w2, h2, 1);
     346          80 :                         uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[3][1]);
     347          80 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     348             :                                       td->dst[1] + 4 * bytesperpixel,
     349             :                                       td->dst[2] + 4 * bytesperpixel, ls_uv,
     350             :                                       ref2->data[1], ref2->linesize[1],
     351             :                                       ref2->data[2], ref2->linesize[2], tref2,
     352             :                                       row << 2, (col << 3) + 4,
     353             :                                       &uvmv, 4, 0, 8, 4, 4, 4, w2, h2, 1);
     354             :                     }
     355             :                 } else {
     356          54 :                     if (s->ss_h) {
     357          29 :                         w2 = (w2 + 1) >> 1;
     358          29 :                         uvmv = ROUNDED_DIV_MVx2(b->mv[0][1], b->mv[1][1]);
     359          29 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     360             :                                       td->dst[1], td->dst[2], ls_uv,
     361             :                                       ref2->data[1], ref2->linesize[1],
     362             :                                       ref2->data[2], ref2->linesize[2], tref2,
     363             :                                       row << 3, col << 2,
     364             :                                       &uvmv, 0, 0, 4, 8, 4, 4, w2, h2, 1);
     365             :                         // BUG libvpx uses wrong block index for 4:2:2 bs=4x4
     366             :                         // bottom block
     367             :                         // https://code.google.com/p/webm/issues/detail?id=993
     368          29 :                         uvmv = ROUNDED_DIV_MVx2(b->mv[1][1], b->mv[2][1]);
     369          29 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     370             :                                       td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv,
     371             :                                       ref2->data[1], ref2->linesize[1],
     372             :                                       ref2->data[2], ref2->linesize[2], tref2,
     373             :                                       (row << 3) + 4, col << 2,
     374             :                                       &uvmv, 0, 4, 4, 8, 4, 4, w2, h2, 1);
     375             :                     } else {
     376          25 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     377             :                                       td->dst[1], td->dst[2], ls_uv,
     378             :                                       ref2->data[1], ref2->linesize[1],
     379             :                                       ref2->data[2], ref2->linesize[2], tref2,
     380             :                                       row << 3, col << 3,
     381             :                                       &b->mv[0][1], 0, 0, 8, 8, 4, 4, w2, h2, 1);
     382          25 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     383             :                                       td->dst[1] + 4 * bytesperpixel,
     384             :                                       td->dst[2] + 4 * bytesperpixel, ls_uv,
     385             :                                       ref2->data[1], ref2->linesize[1],
     386             :                                       ref2->data[2], ref2->linesize[2], tref2,
     387             :                                       row << 3, (col << 3) + 4,
     388             :                                       &b->mv[1][1], 4, 0, 8, 8, 4, 4, w2, h2, 1);
     389          25 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     390             :                                       td->dst[1] + 4 * ls_uv, td->dst[2] + 4 * ls_uv, ls_uv,
     391             :                                       ref2->data[1], ref2->linesize[1],
     392             :                                       ref2->data[2], ref2->linesize[2], tref2,
     393             :                                       (row << 3) + 4, col << 3,
     394             :                                       &b->mv[2][1], 0, 4, 8, 8, 4, 4, w2, h2, 1);
     395          25 :                         mc_chroma_dir(td, mc[4][b->filter][1],
     396             :                                       td->dst[1] + 4 * ls_uv + 4 * bytesperpixel,
     397             :                                       td->dst[2] + 4 * ls_uv + 4 * bytesperpixel, ls_uv,
     398             :                                       ref2->data[1], ref2->linesize[1],
     399             :                                       ref2->data[2], ref2->linesize[2], tref2,
     400             :                                       (row << 3) + 4, (col << 3) + 4,
     401             :                                       &b->mv[3][1], 4, 4, 8, 8, 4, 4, w2, h2, 1);
     402             :                     }
     403             :                 }
     404             :             }
     405             :         }
     406             :     } else {
     407      478633 :         int bwl = bwlog_tab[0][b->bs];
     408      478633 :         int bw = ff_vp9_bwh_tab[0][b->bs][0] * 4;
     409      478633 :         int bh = ff_vp9_bwh_tab[0][b->bs][1] * 4;
     410      478633 :         int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][0] * 4;
     411      478633 :         int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][1] * 4;
     412             : 
     413      478633 :         mc_luma_dir(td, mc[bwl][b->filter][0], td->dst[0], ls_y,
     414             :                     ref1->data[0], ref1->linesize[0], tref1,
     415             :                     row << 3, col << 3, &b->mv[0][0], 0, 0, bw, bh, bw, bh, w1, h1, 0);
     416      478633 :         w1 = (w1 + s->ss_h) >> s->ss_h;
     417      478633 :         h1 = (h1 + s->ss_v) >> s->ss_v;
     418      478633 :         mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][0],
     419             :                       td->dst[1], td->dst[2], ls_uv,
     420             :                       ref1->data[1], ref1->linesize[1],
     421             :                       ref1->data[2], ref1->linesize[2], tref1,
     422             :                       row << (3 - s->ss_v), col << (3 - s->ss_h),
     423             :                       &b->mv[0][0], 0, 0, uvbw, uvbh, uvbw, uvbh, w1, h1, 0);
     424             : 
     425      478633 :         if (b->comp) {
     426       26179 :             mc_luma_dir(td, mc[bwl][b->filter][1], td->dst[0], ls_y,
     427             :                         ref2->data[0], ref2->linesize[0], tref2,
     428             :                         row << 3, col << 3, &b->mv[0][1], 0, 0, bw, bh, bw, bh, w2, h2, 1);
     429       26179 :             w2 = (w2 + s->ss_h) >> s->ss_h;
     430       26179 :             h2 = (h2 + s->ss_v) >> s->ss_v;
     431       26179 :             mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][1],
     432             :                           td->dst[1], td->dst[2], ls_uv,
     433             :                           ref2->data[1], ref2->linesize[1],
     434             :                           ref2->data[2], ref2->linesize[2], tref2,
     435             :                           row << (3 - s->ss_v), col << (3 - s->ss_h),
     436             :                           &b->mv[0][1], 0, 0, uvbw, uvbh, uvbw, uvbh, w2, h2, 1);
     437             :         }
     438             :     }
     439      528478 : }

Generated by: LCOV version 1.13