Commit 01386d4c authored by Ronald S. Bultje's avatar Ronald S. Bultje Committed by Jean-Baptiste Kempf

Move emu_edge() from recon_tmpl.c to Dav1dMCDSPContext in mc_tmpl.c

parent 17426a6a
......@@ -86,6 +86,12 @@ void (name)(pixel *dst, ptrdiff_t dst_stride, \
const uint8_t *mask, ptrdiff_t mstride)
typedef decl_blend_fn(*blend_fn);
#define decl_emu_edge_fn(name) \
void (name)(pixel *dst, ptrdiff_t dst_stride, \
const pixel *src, ptrdiff_t src_stride, \
int bw, int bh, int iw, int ih, int x, int y)
typedef decl_emu_edge_fn(*emu_edge_fn);
typedef struct Dav1dMCDSPContext {
mc_fn mc[N_2D_FILTERS];
mct_fn mct[N_2D_FILTERS];
......@@ -96,6 +102,7 @@ typedef struct Dav1dMCDSPContext {
blend_fn blend;
warp8x8_fn warp8x8;
warp8x8t_fn warp8x8t;
emu_edge_fn emu_edge;
} Dav1dMCDSPContext;
void dav1d_mc_dsp_init_8bpc(Dav1dMCDSPContext *c);
......
......@@ -27,6 +27,7 @@
#include "config.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
......@@ -520,6 +521,55 @@ static void warp_affine_8x8t_c(coef *tmp, const ptrdiff_t tmp_stride,
}
}
static void emu_edge_c(pixel *dst, const ptrdiff_t dst_stride,
const pixel *ref, const ptrdiff_t ref_stride,
const int bw, const int bh,
const int iw, const int ih,
const int x, const int y)
{
// find offset in reference of visible block to copy
ref += iclip(y, 0, ih - 1) * PXSTRIDE(ref_stride) + iclip(x, 0, iw - 1);
// number of pixels to extend (left, right, top, bottom)
const int left_ext = iclip(-x, 0, bw - 1);
const int right_ext = iclip(x + bw - iw, 0, bw - 1);
assert(left_ext + right_ext < bw);
const int top_ext = iclip(-y, 0, bh - 1);
const int bottom_ext = iclip(y + bh - ih, 0, bh - 1);
assert(top_ext + bottom_ext < bh);
// copy visible portion first
pixel *blk = dst + top_ext * PXSTRIDE(dst_stride);
const int center_w = bw - left_ext - right_ext;
const int center_h = bh - top_ext - bottom_ext;
for (int y = 0; y < center_h; y++) {
pixel_copy(blk + left_ext, ref, center_w);
// extend left edge for this line
if (left_ext)
pixel_set(blk, blk[left_ext], left_ext);
// extend right edge for this line
if (right_ext)
pixel_set(blk + left_ext + center_w, blk[left_ext + center_w - 1],
right_ext);
ref += PXSTRIDE(ref_stride);
blk += PXSTRIDE(dst_stride);
}
// copy top
blk = dst + top_ext * PXSTRIDE(dst_stride);
for (int y = 0; y < top_ext; y++) {
pixel_copy(dst, blk, bw);
dst += PXSTRIDE(dst_stride);
}
// copy bottom
dst += center_h * PXSTRIDE(dst_stride);
for (int y = 0; y < bottom_ext; y++) {
pixel_copy(dst, &dst[-PXSTRIDE(dst_stride)], bw);
dst += PXSTRIDE(dst_stride);
}
}
void bitfn(dav1d_mc_dsp_init)(Dav1dMCDSPContext *const c) {
#define init_mc_fns(type, name) do { \
c->mc [type] = put_##name##_c; \
......@@ -546,6 +596,7 @@ void bitfn(dav1d_mc_dsp_init)(Dav1dMCDSPContext *const c) {
c->w_mask[2] = w_mask_420_c;
c->warp8x8 = warp_affine_8x8_c;
c->warp8x8t = warp_affine_8x8t_c;
c->emu_edge = emu_edge_c;
#if HAVE_ASM
#if ARCH_AARCH64 || ARCH_ARM
......
......@@ -454,55 +454,6 @@ void bytefn(dav1d_read_coef_blocks)(Dav1dTileContext *const t,
}
}
static void emu_edge(pixel *dst, const ptrdiff_t dst_stride,
const pixel *ref, const ptrdiff_t ref_stride,
const int bw, const int bh,
const int iw, const int ih,
const int x, const int y)
{
// find offset in reference of visible block to copy
ref += iclip(y, 0, ih - 1) * PXSTRIDE(ref_stride) + iclip(x, 0, iw - 1);
// number of pixels to extend (left, right, top, bottom)
const int left_ext = iclip(-x, 0, bw - 1);
const int right_ext = iclip(x + bw - iw, 0, bw - 1);
assert(left_ext + right_ext < bw);
const int top_ext = iclip(-y, 0, bh - 1);
const int bottom_ext = iclip(y + bh - ih, 0, bh - 1);
assert(top_ext + bottom_ext < bh);
// copy visible portion first
pixel *blk = dst + top_ext * PXSTRIDE(dst_stride);
const int center_w = bw - left_ext - right_ext;
const int center_h = bh - top_ext - bottom_ext;
for (int y = 0; y < center_h; y++) {
pixel_copy(blk + left_ext, ref, center_w);
// extend left edge for this line
if (left_ext)
pixel_set(blk, blk[left_ext], left_ext);
// extend right edge for this line
if (right_ext)
pixel_set(blk + left_ext + center_w, blk[left_ext + center_w - 1],
right_ext);
ref += PXSTRIDE(ref_stride);
blk += PXSTRIDE(dst_stride);
}
// copy top
blk = dst + top_ext * PXSTRIDE(dst_stride);
for (int y = 0; y < top_ext; y++) {
pixel_copy(dst, blk, bw);
dst += PXSTRIDE(dst_stride);
}
// copy bottom
dst += center_h * PXSTRIDE(dst_stride);
for (int y = 0; y < bottom_ext; y++) {
pixel_copy(dst, &dst[-PXSTRIDE(dst_stride)], bw);
dst += PXSTRIDE(dst_stride);
}
}
static void mc(Dav1dTileContext *const t,
pixel *const dst8, coef *const dst16, const ptrdiff_t dst_stride,
const int bw4, const int bh4,
......@@ -536,9 +487,10 @@ static void mc(Dav1dTileContext *const t,
dx + bw4 * h_mul + !!mx * 4 > w ||
dy + bh4 * v_mul + !!my * 4 > h)
{
emu_edge(t->emu_edge, 160 * sizeof(pixel), refp->p.data[pl], ref_stride,
bw4 * h_mul + !!mx * 7, bh4 * v_mul + !!my * 7, w, h,
dx - !!mx * 3, dy - !!my * 3);
f->dsp->mc.emu_edge(t->emu_edge, 160 * sizeof(pixel),
refp->p.data[pl], ref_stride,
bw4 * h_mul + !!mx * 7, bh4 * v_mul + !!my * 7,
w, h, dx - !!mx * 3, dy - !!my * 3);
ref = &t->emu_edge[160 * !!my * 3 + !!mx * 3];
ref_stride = 160 * sizeof(pixel);
} else {
......@@ -666,8 +618,9 @@ static void warp_affine(Dav1dTileContext *const t,
dav1d_thread_picture_wait(refp, dy + 4 + 8,
PLANE_TYPE_Y + !!pl);
if (dx < 3 || dx + 8 + 4 > width || dy < 3 || dy + 8 + 4 > height) {
emu_edge(t->emu_edge, 160 * sizeof(pixel), refp->p.data[pl],
ref_stride, 15, 15, width, height, dx - 3, dy - 3);
f->dsp->mc.emu_edge(t->emu_edge, 160 * sizeof(pixel),
refp->p.data[pl], ref_stride,
15, 15, width, height, dx - 3, dy - 3);
ref_ptr = &t->emu_edge[160 * 3 + 3];
ref_stride = 160 * sizeof(pixel);
} else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment