lavc: introduce VideoDSPContext
Move some functions from dsputil. The idea is that videodsp contains functions that are useful for a large and varied set of video decoders. Currently, it contains emulated_edge_mc() and prefetch(). Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:

committed by
Luca Barbato

parent
a925f723a9
commit
8c53d39e7f
@@ -59,7 +59,7 @@ static void gmc1_motion(MpegEncContext *s,
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x >= FFMAX(s->h_edge_pos - 17, 0)
|
||||
|| (unsigned)src_y >= FFMAX(s->v_edge_pos - 17, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
|
||||
ptr= s->edge_emu_buffer;
|
||||
}
|
||||
}
|
||||
@@ -98,7 +98,7 @@ static void gmc1_motion(MpegEncContext *s,
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x >= FFMAX((s->h_edge_pos>>1) - 9, 0)
|
||||
|| (unsigned)src_y >= FFMAX((s->v_edge_pos>>1) - 9, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
ptr= s->edge_emu_buffer;
|
||||
emu=1;
|
||||
}
|
||||
@@ -107,7 +107,7 @@ static void gmc1_motion(MpegEncContext *s,
|
||||
|
||||
ptr = ref_picture[2] + offset;
|
||||
if(emu){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
ptr= s->edge_emu_buffer;
|
||||
}
|
||||
s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
|
||||
@@ -195,7 +195,7 @@ static inline int hpel_motion(MpegEncContext *s,
|
||||
if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
|
||||
if( (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&1) - 8, 0)
|
||||
|| (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y&1) - 8, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, 9, 9,
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, 9, 9,
|
||||
src_x, src_y, s->h_edge_pos, s->v_edge_pos);
|
||||
src= s->edge_emu_buffer;
|
||||
emu=1;
|
||||
@@ -285,19 +285,19 @@ if(s->quarter_sample)
|
||||
"MPEG motion vector out of boundary (%d %d)\n", src_x, src_y);
|
||||
return;
|
||||
}
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
|
||||
17, 17+field_based,
|
||||
src_x, src_y<<field_based,
|
||||
s->h_edge_pos, s->v_edge_pos);
|
||||
ptr_y = s->edge_emu_buffer;
|
||||
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
|
||||
uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
|
||||
s->dsp.emulated_edge_mc(uvbuf ,
|
||||
s->vdsp.emulated_edge_mc(uvbuf ,
|
||||
ptr_cb, s->uvlinesize,
|
||||
9, 9+field_based,
|
||||
uvsrc_x, uvsrc_y<<field_based,
|
||||
s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
s->dsp.emulated_edge_mc(uvbuf+16,
|
||||
s->vdsp.emulated_edge_mc(uvbuf+16,
|
||||
ptr_cr, s->uvlinesize,
|
||||
9, 9+field_based,
|
||||
uvsrc_x, uvsrc_y<<field_based,
|
||||
@@ -498,17 +498,17 @@ static inline void qpel_motion(MpegEncContext *s,
|
||||
|
||||
if( (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&3) - 16, 0)
|
||||
|| (unsigned)src_y > FFMAX( v_edge_pos - (motion_y&3) - h , 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
|
||||
17, 17+field_based, src_x, src_y<<field_based,
|
||||
s->h_edge_pos, s->v_edge_pos);
|
||||
ptr_y= s->edge_emu_buffer;
|
||||
if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
|
||||
uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
|
||||
s->dsp.emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize,
|
||||
s->vdsp.emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize,
|
||||
9, 9 + field_based,
|
||||
uvsrc_x, uvsrc_y<<field_based,
|
||||
s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
s->dsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize,
|
||||
s->vdsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize,
|
||||
9, 9 + field_based,
|
||||
uvsrc_x, uvsrc_y<<field_based,
|
||||
s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
@@ -577,7 +577,7 @@ static void chroma_4mv_motion(MpegEncContext *s,
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x > FFMAX((s->h_edge_pos>>1) - (dxy &1) - 8, 0)
|
||||
|| (unsigned)src_y > FFMAX((s->v_edge_pos>>1) - (dxy>>1) - 8, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
|
||||
9, 9, src_x, src_y,
|
||||
s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
ptr= s->edge_emu_buffer;
|
||||
@@ -588,7 +588,7 @@ static void chroma_4mv_motion(MpegEncContext *s,
|
||||
|
||||
ptr = ref_picture[2] + offset;
|
||||
if(emu){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
|
||||
9, 9, src_x, src_y,
|
||||
s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
ptr= s->edge_emu_buffer;
|
||||
@@ -603,9 +603,9 @@ static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir){
|
||||
const int mx= (s->mv[dir][0][0]>>shift) + 16*s->mb_x + 8;
|
||||
const int my= (s->mv[dir][0][1]>>shift) + 16*s->mb_y;
|
||||
int off= mx + (my + (s->mb_x&3)*4)*s->linesize + 64;
|
||||
s->dsp.prefetch(pix[0]+off, s->linesize, 4);
|
||||
s->vdsp.prefetch(pix[0]+off, s->linesize, 4);
|
||||
off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
|
||||
s->dsp.prefetch(pix[1]+off, pix[2]-pix[1], 2);
|
||||
s->vdsp.prefetch(pix[1]+off, pix[2]-pix[1], 2);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -757,7 +757,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&3) - 8, 0)
|
||||
|| (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y&3) - 8, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr,
|
||||
s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr,
|
||||
s->linesize, 9, 9,
|
||||
src_x, src_y,
|
||||
s->h_edge_pos, s->v_edge_pos);
|
||||
|
Reference in New Issue
Block a user