/*
* VP9 compatible video decoder
*
* Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
* Copyright (C) 2013 Clément Bœsch <u pkh me>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define ROUNDED_DIV_MVx2(a, b) \
(VP9mv) { .x = ROUNDED_DIV(a.x + b.x,
2 ), .y = ROUNDED_DIV(a.y + b.y,
2 ) }
#define ROUNDED_DIV_MVx4(a, b, c, d) \
(VP9mv) { .x = ROUNDED_DIV(a.x + b.x + c.x + d.x,
4 ), \
.y = ROUNDED_DIV(a.y + b.y + c.y + d.y,
4 ) }
static void FN(inter_pred)(VP9TileData *td)
{
static const uint8_t bwlog_tab[
2 ][N_BS_SIZES] = {
{
0 ,
0 ,
1 ,
1 ,
1 ,
2 ,
2 ,
2 ,
3 ,
3 ,
3 ,
4 ,
4 },
{
1 ,
1 ,
2 ,
2 ,
2 ,
3 ,
3 ,
3 ,
4 ,
4 ,
4 ,
4 ,
4 },
};
const VP9Context *s = td->s;
VP9Block *b = td->b;
int row = td->row, col = td->col;
const ProgressFrame *tref1 = &s->s.refs[s->s.h.refidx[b->ref[
0 ]]], *tref2;
const AVFrame *ref1 = tref1->f, *ref2;
int w1 = ref1->width, h1 = ref1->height, w2, h2;
ptrdiff_t ls_y = td->y_stride, ls_uv = td->uv_stride;
int bytesperpixel = BYTES_PER_PIXEL;
if (b->comp) {
tref2 = &s->s.refs[s->s.h.refidx[b->ref[
1 ]]];
ref2 = tref2->f;
w2 = ref2->width;
h2 = ref2->height;
}
// y inter pred
if (b->bs > BS_8x8) {
VP9mv uvmv;
#if SCALED ==
0
if (b->bs == BS_8x4) {
mc_luma_dir(td, mc[
3 ][b->filter][
0 ], td->dst[
0 ], ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
row <<
3 , col <<
3 , &b->mv[
0 ][
0 ],,,,,
8 ,
4 , w1, h1,
0 );
mc_luma_dir(td, mc[
3 ][b->filter][
0 ],
td->dst[
0 ] +
4 * ls_y, ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
(row <<
3 ) +
4 , col <<
3 , &b->mv[
2 ][
0 ],,,,,
8 ,
4 , w1, h1,
0 );
w1 = (w1 + s->ss_h) >> s->ss_h;
if (s->ss_v) {
h1 = (h1 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
0 ], b->mv[
2 ][
0 ]);
mc_chroma_dir(td, mc[
3 + s->ss_h][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
2 , col << (
3 - s->ss_h),
&uvmv,,,,,
8 >> s->ss_h,
4 , w1, h1,
0 );
}
else {
mc_chroma_dir(td, mc[
3 + s->ss_h][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
3 , col << (
3 - s->ss_h),
&b->mv[
0 ][
0 ],,,,,
8 >> s->ss_h,
4 , w1, h1,
0 );
// BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index
// to get the motion vector for the bottom 4x4 block
// https://code.google.com/p/webm/issues/detail?id=993
if (s->ss_h ==
0 ) {
uvmv = b->mv[
2 ][
0 ];
}
else {
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
0 ], b->mv[
2 ][
0 ]);
}
mc_chroma_dir(td, mc[
3 + s->ss_h][b->filter][
0 ],
td->dst[
1 ] +
4 * ls_uv, td->dst[
2 ] +
4 * ls_uv, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
(row <<
3 ) +
4 , col << (
3 - s->ss_h),
&uvmv,,,,,
8 >> s->ss_h,
4 , w1, h1,
0 );
}
if (b->comp) {
mc_luma_dir(td, mc[
3 ][b->filter][
1 ], td->dst[
0 ], ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
row <<
3 , col <<
3 , &b->mv[
0 ][
1 ],,,,,
8 ,
4 , w2, h2,
1 );
mc_luma_dir(td, mc[
3 ][b->filter][
1 ],
td->dst[
0 ] +
4 * ls_y, ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
(row <<
3 ) +
4 , col <<
3 , &b->mv[
2 ][
1 ],,,,,
8 ,
4 , w2, h2,
1 );
w2 = (w2 + s->ss_h) >> s->ss_h;
if (s->ss_v) {
h2 = (h2 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
1 ], b->mv[
2 ][
1 ]);
mc_chroma_dir(td, mc[
3 + s->ss_h][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
2 , col << (
3 - s->ss_h),
&uvmv,,,,,
8 >> s->ss_h,
4 , w2, h2,
1 );
}
else {
mc_chroma_dir(td, mc[
3 + s->ss_h][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
3 , col << (
3 - s->ss_h),
&b->mv[
0 ][
1 ],,,,,
8 >> s->ss_h,
4 , w2, h2,
1 );
// BUG for 4:2:2 bs=8x4, libvpx uses the wrong block index
// to get the motion vector for the bottom 4x4 block
// https://code.google.com/p/webm/issues/detail?id=993
if (s->ss_h ==
0 ) {
uvmv = b->mv[
2 ][
1 ];
}
else {
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
1 ], b->mv[
2 ][
1 ]);
}
mc_chroma_dir(td, mc[
3 + s->ss_h][b->filter][
1 ],
td->dst[
1 ] +
4 * ls_uv, td->dst[
2 ] +
4 * ls_uv, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
(row <<
3 ) +
4 , col << (
3 - s->ss_h),
&uvmv,,,,,
8 >> s->ss_h,
4 , w2, h2,
1 );
}
}
}
else if (b->bs == BS_4x8) {
mc_luma_dir(td, mc[
4 ][b->filter][
0 ], td->dst[
0 ], ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
row <<
3 , col <<
3 , &b->mv[
0 ][
0 ],,,,,
4 ,
8 , w1, h1,
0 );
mc_luma_dir(td, mc[
4 ][b->filter][
0 ], td->dst[
0 ] +
4 * bytesperpixel, ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
row <<
3 , (col <<
3 ) +
4 , &b->mv[
1 ][
0 ],,,,,
4 ,
8 , w1, h1,
0 );
h1 = (h1 + s->ss_v) >> s->ss_v;
if (s->ss_h) {
w1 = (w1 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
0 ], b->mv[
1 ][
0 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row << (
3 - s->ss_v), col <<
2 ,
&uvmv,,,,,
4 ,
8 >> s->ss_v, w1, h1,
0 );
}
else {
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row << (
3 - s->ss_v), col <<
3 ,
&b->mv[
0 ][
0 ],,,,,
4 ,
8 >> s->ss_v, w1, h1,
0 );
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ] +
4 * bytesperpixel,
td->dst[
2 ] +
4 * bytesperpixel, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row << (
3 - s->ss_v), (col <<
3 ) +
4 ,
&b->mv[
1 ][
0 ],,,,,
4 ,
8 >> s->ss_v, w1, h1,
0 );
}
if (b->comp) {
mc_luma_dir(td, mc[
4 ][b->filter][
1 ], td->dst[
0 ], ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
row <<
3 , col <<
3 , &b->mv[
0 ][
1 ],,,,,
4 ,
8 , w2, h2,
1 );
mc_luma_dir(td, mc[
4 ][b->filter][
1 ], td->dst[
0 ] +
4 * bytesperpixel, ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
row <<
3 , (col <<
3 ) +
4 , &b->mv[
1 ][
1 ],,,,,
4 ,
8 , w2, h2,
1 );
h2 = (h2 + s->ss_v) >> s->ss_v;
if (s->ss_h) {
w2 = (w2 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
1 ], b->mv[
1 ][
1 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row << (
3 - s->ss_v), col <<
2 ,
&uvmv,,,,,
4 ,
8 >> s->ss_v, w2, h2,
1 );
}
else {
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row << (
3 - s->ss_v), col <<
3 ,
&b->mv[
0 ][
1 ],,,,,
4 ,
8 >> s->ss_v, w2, h2,
1 );
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ] +
4 * bytesperpixel,
td->dst[
2 ] +
4 * bytesperpixel, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row << (
3 - s->ss_v), (col <<
3 ) +
4 ,
&b->mv[
1 ][
1 ],,,,,
4 ,
8 >> s->ss_v, w2, h2,
1 );
}
}
}
else
#endif
{
#if SCALED ==
0
av_assert2(b->bs == BS_4x4);
#endif
// FIXME if two horizontally adjacent blocks have the same MV,
// do a w8 instead of a w4 call
mc_luma_dir(td, mc[
4 ][b->filter][
0 ], td->dst[
0 ], ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
row <<
3 , col <<
3 , &b->mv[
0 ][
0 ],
0 ,
0 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
mc_luma_dir(td, mc[
4 ][b->filter][
0 ], td->dst[
0 ] +
4 * bytesperpixel, ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
row <<
3 , (col <<
3 ) +
4 , &b->mv[
1 ][
0 ],
4 ,
0 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
mc_luma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
0 ] +
4 * ls_y, ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
(row <<
3 ) +
4 , col <<
3 , &b->mv[
2 ][
0 ],
0 ,
4 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
mc_luma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
0 ] +
4 * ls_y +
4 * bytesperpixel, ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
(row <<
3 ) +
4 , (col <<
3 ) +
4 , &b->mv[
3 ][
0 ],
4 ,
4 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
if (s->ss_v) {
h1 = (h1 +
1 ) >>
1 ;
if (s->ss_h) {
w1 = (w1 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx4(b->mv[
0 ][
0 ], b->mv[
1 ][
0 ],
b->mv[
2 ][
0 ], b->mv[
3 ][
0 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
2 , col <<
2 ,
&uvmv,
0 ,
0 ,
4 ,
4 ,
4 ,
4 , w1, h1,
0 );
}
else {
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
0 ], b->mv[
2 ][
0 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
2 , col <<
3 ,
&uvmv,
0 ,
0 ,
8 ,
4 ,
4 ,
4 , w1, h1,
0 );
uvmv = ROUNDED_DIV_MVx2(b->mv[
1 ][
0 ], b->mv[
3 ][
0 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ] +
4 * bytesperpixel,
td->dst[
2 ] +
4 * bytesperpixel, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
2 , (col <<
3 ) +
4 ,
&uvmv,
4 ,
0 ,
8 ,
4 ,
4 ,
4 , w1, h1,
0 );
}
}
else {
if (s->ss_h) {
w1 = (w1 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
0 ], b->mv[
1 ][
0 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
3 , col <<
2 ,
&uvmv,
0 ,
0 ,
4 ,
8 ,
4 ,
4 , w1, h1,
0 );
// BUG libvpx uses wrong block index for 4:2:2 bs=4x4
// bottom block
// https://code.google.com/p/webm/issues/detail?id=993
uvmv = ROUNDED_DIV_MVx2(b->mv[
1 ][
0 ], b->mv[
2 ][
0 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ] +
4 * ls_uv, td->dst[
2 ] +
4 * ls_uv, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
(row <<
3 ) +
4 , col <<
2 ,
&uvmv,
0 ,
4 ,
4 ,
8 ,
4 ,
4 , w1, h1,
0 );
}
else {
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
3 , col <<
3 ,
&b->mv[
0 ][
0 ],
0 ,
0 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ] +
4 * bytesperpixel,
td->dst[
2 ] +
4 * bytesperpixel, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row <<
3 , (col <<
3 ) +
4 ,
&b->mv[
1 ][
0 ],
4 ,
0 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ] +
4 * ls_uv, td->dst[
2 ] +
4 * ls_uv, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
(row <<
3 ) +
4 , col <<
3 ,
&b->mv[
2 ][
0 ],
0 ,
4 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
mc_chroma_dir(td, mc[
4 ][b->filter][
0 ],
td->dst[
1 ] +
4 * ls_uv +
4 * bytesperpixel,
td->dst[
2 ] +
4 * ls_uv +
4 * bytesperpixel, ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
(row <<
3 ) +
4 , (col <<
3 ) +
4 ,
&b->mv[
3 ][
0 ],
4 ,
4 ,
8 ,
8 ,
4 ,
4 , w1, h1,
0 );
}
}
if (b->comp) {
mc_luma_dir(td, mc[
4 ][b->filter][
1 ], td->dst[
0 ], ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
row <<
3 , col <<
3 , &b->mv[
0 ][
1 ],
0 ,
0 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
mc_luma_dir(td, mc[
4 ][b->filter][
1 ], td->dst[
0 ] +
4 * bytesperpixel, ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
row <<
3 , (col <<
3 ) +
4 , &b->mv[
1 ][
1 ],
4 ,
0 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
mc_luma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
0 ] +
4 * ls_y, ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
(row <<
3 ) +
4 , col <<
3 , &b->mv[
2 ][
1 ],
0 ,
4 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
mc_luma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
0 ] +
4 * ls_y +
4 * bytesperpixel, ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
(row <<
3 ) +
4 , (col <<
3 ) +
4 , &b->mv[
3 ][
1 ],
4 ,
4 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
if (s->ss_v) {
h2 = (h2 +
1 ) >>
1 ;
if (s->ss_h) {
w2 = (w2 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx4(b->mv[
0 ][
1 ], b->mv[
1 ][
1 ],
b->mv[
2 ][
1 ], b->mv[
3 ][
1 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
2 , col <<
2 ,
&uvmv,
0 ,
0 ,
4 ,
4 ,
4 ,
4 , w2, h2,
1 );
}
else {
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
1 ], b->mv[
2 ][
1 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
2 , col <<
3 ,
&uvmv,
0 ,
0 ,
8 ,
4 ,
4 ,
4 , w2, h2,
1 );
uvmv = ROUNDED_DIV_MVx2(b->mv[
1 ][
1 ], b->mv[
3 ][
1 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ] +
4 * bytesperpixel,
td->dst[
2 ] +
4 * bytesperpixel, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
2 , (col <<
3 ) +
4 ,
&uvmv,
4 ,
0 ,
8 ,
4 ,
4 ,
4 , w2, h2,
1 );
}
}
else {
if (s->ss_h) {
w2 = (w2 +
1 ) >>
1 ;
uvmv = ROUNDED_DIV_MVx2(b->mv[
0 ][
1 ], b->mv[
1 ][
1 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
3 , col <<
2 ,
&uvmv,
0 ,
0 ,
4 ,
8 ,
4 ,
4 , w2, h2,
1 );
// BUG libvpx uses wrong block index for 4:2:2 bs=4x4
// bottom block
// https://code.google.com/p/webm/issues/detail?id=993
uvmv = ROUNDED_DIV_MVx2(b->mv[
1 ][
1 ], b->mv[
2 ][
1 ]);
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ] +
4 * ls_uv, td->dst[
2 ] +
4 * ls_uv, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
(row <<
3 ) +
4 , col <<
2 ,
&uvmv,
0 ,
4 ,
4 ,
8 ,
4 ,
4 , w2, h2,
1 );
}
else {
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
3 , col <<
3 ,
&b->mv[
0 ][
1 ],
0 ,
0 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ] +
4 * bytesperpixel,
td->dst[
2 ] +
4 * bytesperpixel, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row <<
3 , (col <<
3 ) +
4 ,
&b->mv[
1 ][
1 ],
4 ,
0 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ] +
4 * ls_uv, td->dst[
2 ] +
4 * ls_uv, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
(row <<
3 ) +
4 , col <<
3 ,
&b->mv[
2 ][
1 ],
0 ,
4 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
mc_chroma_dir(td, mc[
4 ][b->filter][
1 ],
td->dst[
1 ] +
4 * ls_uv +
4 * bytesperpixel,
td->dst[
2 ] +
4 * ls_uv +
4 * bytesperpixel, ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
(row <<
3 ) +
4 , (col <<
3 ) +
4 ,
&b->mv[
3 ][
1 ],
4 ,
4 ,
8 ,
8 ,
4 ,
4 , w2, h2,
1 );
}
}
}
}
}
else {
int bwl = bwlog_tab[
0 ][b->bs];
int bw = ff_vp9_bwh_tab[
0 ][b->bs][
0 ] *
4 ;
int bh = ff_vp9_bwh_tab[
0 ][b->bs][
1 ] *
4 ;
int uvbw = ff_vp9_bwh_tab[s->ss_h][b->bs][
0 ] *
4 ;
int uvbh = ff_vp9_bwh_tab[s->ss_v][b->bs][
1 ] *
4 ;
mc_luma_dir(td, mc[bwl][b->filter][
0 ], td->dst[
0 ], ls_y,
ref1->data[
0 ], ref1->linesize[
0 ], tref1,
row <<
3 , col <<
3 , &b->mv[
0 ][
0 ],
0 ,
0 , bw, bh, bw, bh, w1, h1,
0 );
w1 = (w1 + s->ss_h) >> s->ss_h;
h1 = (h1 + s->ss_v) >> s->ss_v;
mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][
0 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref1->data[
1 ], ref1->linesize[
1 ],
ref1->data[
2 ], ref1->linesize[
2 ], tref1,
row << (
3 - s->ss_v), col << (
3 - s->ss_h),
&b->mv[
0 ][
0 ],
0 ,
0 , uvbw, uvbh, uvbw, uvbh, w1, h1,
0 );
if (b->comp) {
mc_luma_dir(td, mc[bwl][b->filter][
1 ], td->dst[
0 ], ls_y,
ref2->data[
0 ], ref2->linesize[
0 ], tref2,
row <<
3 , col <<
3 , &b->mv[
0 ][
1 ],
0 ,
0 , bw, bh, bw, bh, w2, h2,
1 );
w2 = (w2 + s->ss_h) >> s->ss_h;
h2 = (h2 + s->ss_v) >> s->ss_v;
mc_chroma_dir(td, mc[bwl + s->ss_h][b->filter][
1 ],
td->dst[
1 ], td->dst[
2 ], ls_uv,
ref2->data[
1 ], ref2->linesize[
1 ],
ref2->data[
2 ], ref2->linesize[
2 ], tref2,
row << (
3 - s->ss_v), col << (
3 - s->ss_h),
&b->mv[
0 ][
1 ],
0 ,
0 , uvbw, uvbh, uvbw, uvbh, w2, h2,
1 );
}
}
}
Messung V0.5 in Prozent C=97 H=100 G=98
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet am 2026-06-04)
¤
*© Formatika GbR, Deutschland