mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-01-12 00:06:51 +08:00
avcodec/h264qpel: Move Snow-only code to snow.c
Blocksize 2 is Snow-only, so move all the code pertaining to it to snow.c. Also make the put array in H264QpelContext smaller -- it only needs three sets of 16 function pointers. This continues6eb8bc4217andb0c91c2fba. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@@ -26,65 +26,6 @@
|
||||
#define pixeltmp int16_t
|
||||
#define BIT_DEPTH 8
|
||||
#include "h264qpel_template.c"
|
||||
|
||||
static void put_h264_qpel2_h_lowpass_8(uint8_t *dst, const uint8_t *restrict src, int dstStride, int srcStride)
|
||||
{
|
||||
const int h = 2;
|
||||
for (int i = 0; i < h; ++i) {
|
||||
dst[0] = av_clip_uint8(((src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]) + 16) >> 5);
|
||||
dst[1] = av_clip_uint8(((src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]) + 16) >> 5);
|
||||
dst += dstStride;
|
||||
src += srcStride;
|
||||
}
|
||||
}
|
||||
|
||||
static void put_h264_qpel2_v_lowpass_8(uint8_t *dst, const uint8_t *restrict src, int dstStride, int srcStride)
|
||||
{
|
||||
const int w = 2;
|
||||
for (int i = 0; i < w; ++i) {
|
||||
const int srcB = src[-2*srcStride];
|
||||
const int srcA = src[-1*srcStride];
|
||||
const int src0 = src[0 *srcStride];
|
||||
const int src1 = src[1 *srcStride];
|
||||
const int src2 = src[2 *srcStride];
|
||||
const int src3 = src[3 *srcStride];
|
||||
const int src4 = src[4 *srcStride];
|
||||
dst[0*dstStride] = av_clip_uint8(((src0+src1)*20 - (srcA+src2)*5 + (srcB+src3) + 16) >> 5);
|
||||
dst[1*dstStride] = av_clip_uint8(((src1+src2)*20 - (src0+src3)*5 + (srcA+src4) + 16) >> 5);
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
static void put_h264_qpel2_hv_lowpass_8(uint8_t *dst, pixeltmp *tmp, const uint8_t *restrict src, int dstStride, int tmpStride, int srcStride)
|
||||
{
|
||||
const int h = 2;
|
||||
const int w = 2;
|
||||
src -= 2*srcStride;
|
||||
for (int i = 0; i < h + 5; ++i) {
|
||||
tmp[0] = (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);
|
||||
tmp[1] = (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);
|
||||
tmp += tmpStride;
|
||||
src += srcStride;
|
||||
}
|
||||
tmp -= tmpStride*(h+5-2);
|
||||
for (int i = 0; i < w; ++i) {
|
||||
const int tmpB = tmp[-2*tmpStride];
|
||||
const int tmpA = tmp[-1*tmpStride];
|
||||
const int tmp0 = tmp[0 *tmpStride];
|
||||
const int tmp1 = tmp[1 *tmpStride];
|
||||
const int tmp2 = tmp[2 *tmpStride];
|
||||
const int tmp3 = tmp[3 *tmpStride];
|
||||
const int tmp4 = tmp[4 *tmpStride];
|
||||
dst[0*dstStride] = av_clip_uint8(((tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3) + 512) >> 10);
|
||||
dst[1*dstStride] = av_clip_uint8(((tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4) + 512) >> 10);
|
||||
dst++;
|
||||
tmp++;
|
||||
}
|
||||
}
|
||||
|
||||
H264_MC(put_, 2)
|
||||
|
||||
#undef BIT_DEPTH
|
||||
|
||||
#define BIT_DEPTH 9
|
||||
@@ -140,7 +81,6 @@ av_cold void ff_h264qpel_init(H264QpelContext *c, int bit_depth)
|
||||
switch (bit_depth) {
|
||||
default:
|
||||
SET_QPEL(8);
|
||||
dspfunc2(put_h264_qpel, 3, 2, 8); // only used by Snow
|
||||
break;
|
||||
case 9:
|
||||
SET_QPEL(9);
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "qpeldsp.h"
|
||||
|
||||
typedef struct H264QpelContext {
|
||||
qpel_mc_func put_h264_qpel_pixels_tab[4][16];
|
||||
qpel_mc_func put_h264_qpel_pixels_tab[3][16];
|
||||
qpel_mc_func avg_h264_qpel_pixels_tab[3][16];
|
||||
} H264QpelContext;
|
||||
|
||||
|
||||
@@ -304,134 +304,134 @@ static void FUNC(OPNAME ## h264_qpel16_hv_lowpass)(uint8_t *dst, pixeltmp *tmp,
|
||||
FUNC(OPNAME ## h264_qpel8_hv_lowpass)(dst+8*sizeof(pixel), tmp+8, src+8*sizeof(pixel), dstStride, tmpStride, srcStride);\
|
||||
}\
|
||||
|
||||
#define H264_MC(OPNAME, SIZE) \
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc00)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
#define H264_MC(OPNAME, NAME, SIZE) \
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc00)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
FUNCC(OPNAME ## pixels ## SIZE)(dst, src, stride, SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc10)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc10)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t half[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(half, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(half, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, src, half, stride, stride, SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc20)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc20)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
FUNC(OPNAME ## h264_qpel ## SIZE ## _h_lowpass)(dst, src, stride, stride);\
|
||||
FUNC(OPNAME ## NAME ## _qpel ## SIZE ## _h_lowpass)(dst, src, stride, stride);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc30)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc30)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t half[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(half, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(half, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, src+sizeof(pixel), half, stride, stride, SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc01)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc01)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
uint8_t half[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2, SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(half, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(half, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, full_mid, half, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc02)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc02)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2, SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(OPNAME ## h264_qpel ## SIZE ## _v_lowpass)(dst, full_mid, stride, SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## NAME ## _qpel ## SIZE ## _v_lowpass)(dst, full_mid, stride, SIZE*sizeof(pixel));\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc03)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc03)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
uint8_t half[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2, SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(half, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(half, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, full_mid+SIZE*sizeof(pixel), half, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc11)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc11)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
uint8_t halfH[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(halfH, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(halfH, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2, SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfH, halfV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc31)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc31)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
uint8_t halfH[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(halfH, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(halfH, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2 + sizeof(pixel), SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfH, halfV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc13)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc13)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
uint8_t halfH[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(halfH, src + stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(halfH, src + stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2, SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfH, halfV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc33)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc33)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
uint8_t halfH[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(halfH, src + stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(halfH, src + stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2 + sizeof(pixel), SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfH, halfV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc22)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc22)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
pixeltmp tmp[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
FUNC(OPNAME ## h264_qpel ## SIZE ## _hv_lowpass)(dst, tmp, src, stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## NAME ## _qpel ## SIZE ## _hv_lowpass)(dst, tmp, src, stride, SIZE*sizeof(pixel), stride);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc21)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc21)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
pixeltmp tmp[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t halfH[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfHV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(halfH, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(halfH, src, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfH, halfHV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc23)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc23)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
pixeltmp tmp[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t halfH[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfHV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(put_h264_qpel ## SIZE ## _h_lowpass)(halfH, src + stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _h_lowpass)(halfH, src + stride, SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfH, halfHV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc12)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc12)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
@@ -439,12 +439,12 @@ static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc12)(uint8_t *dst, const uint
|
||||
uint8_t halfV[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfHV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2, SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_h264_qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfV, halfHV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
\
|
||||
static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc32)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
static void FUNCC(OPNAME ## NAME ## _qpel ## SIZE ## _mc32)(uint8_t *dst, const uint8_t *restrict src, ptrdiff_t stride)\
|
||||
{\
|
||||
uint8_t full[SIZE*(SIZE+5)*sizeof(pixel)];\
|
||||
uint8_t * const full_mid= full + SIZE*2*sizeof(pixel);\
|
||||
@@ -452,8 +452,8 @@ static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc32)(uint8_t *dst, const uint
|
||||
uint8_t halfV[SIZE*SIZE*sizeof(pixel)];\
|
||||
uint8_t halfHV[SIZE*SIZE*sizeof(pixel)];\
|
||||
FUNC(copy_block ## SIZE )(full, src - stride*2 + sizeof(pixel), SIZE*sizeof(pixel), stride, SIZE + 5);\
|
||||
FUNC(put_h264_qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_h264_qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _v_lowpass)(halfV, full_mid, SIZE*sizeof(pixel), SIZE*sizeof(pixel));\
|
||||
FUNC(put_ ## NAME ## _qpel ## SIZE ## _hv_lowpass)(halfHV, tmp, src, SIZE*sizeof(pixel), SIZE*sizeof(pixel), stride);\
|
||||
FUNC(OPNAME ## pixels ## SIZE ## _l2)(dst, halfV, halfHV, stride, SIZE*sizeof(pixel), SIZE*sizeof(pixel), SIZE);\
|
||||
}\
|
||||
|
||||
@@ -463,14 +463,16 @@ static void FUNCC(OPNAME ## h264_qpel ## SIZE ## _mc32)(uint8_t *dst, const uint
|
||||
#define op2_avg(a, b) a = (((a)+CLIP(((b) + 512)>>10)+1)>>1)
|
||||
#define op2_put(a, b) a = CLIP(((b) + 512)>>10)
|
||||
|
||||
#ifndef SNOW
|
||||
H264_LOWPASS(put_ , op_put, op2_put)
|
||||
H264_LOWPASS(avg_ , op_avg, op2_avg)
|
||||
H264_MC(put_, 4)
|
||||
H264_MC(put_, 8)
|
||||
H264_MC(put_, 16)
|
||||
H264_MC(avg_, 4)
|
||||
H264_MC(avg_, 8)
|
||||
H264_MC(avg_, 16)
|
||||
H264_MC(put_, h264, 4)
|
||||
H264_MC(put_, h264, 8)
|
||||
H264_MC(put_, h264, 16)
|
||||
H264_MC(avg_, h264, 4)
|
||||
H264_MC(avg_, h264, 8)
|
||||
H264_MC(avg_, h264, 16)
|
||||
#endif
|
||||
|
||||
#undef op_avg
|
||||
#undef op_put
|
||||
|
||||
@@ -66,7 +66,7 @@ static inline void FUNCC(OPNAME ## _pixels8)(uint8_t *block, \
|
||||
block += line_size; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
av_unused \
|
||||
CALL_2X_PIXELS(FUNCC(OPNAME ## _pixels16), \
|
||||
FUNCC(OPNAME ## _pixels8), \
|
||||
8 * sizeof(pixel))
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "libavutil/log.h"
|
||||
#include "libavutil/mem.h"
|
||||
#include "libavutil/thread.h"
|
||||
@@ -26,6 +28,91 @@
|
||||
#include "snow.h"
|
||||
#include "snowdata.h"
|
||||
|
||||
#define pixeltmp int16_t
|
||||
#define BIT_DEPTH 8
|
||||
#define SNOW
|
||||
#include "h264qpel_template.c"
|
||||
|
||||
static void put_snow_qpel2_h_lowpass_8(uint8_t *dst, const uint8_t *restrict src, int dstStride, int srcStride)
|
||||
{
|
||||
const int h = 2;
|
||||
for (int i = 0; i < h; ++i) {
|
||||
dst[0] = av_clip_uint8(((src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]) + 16) >> 5);
|
||||
dst[1] = av_clip_uint8(((src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]) + 16) >> 5);
|
||||
dst += dstStride;
|
||||
src += srcStride;
|
||||
}
|
||||
}
|
||||
|
||||
static void put_snow_qpel2_v_lowpass_8(uint8_t *dst, const uint8_t *restrict src, int dstStride, int srcStride)
|
||||
{
|
||||
const int w = 2;
|
||||
for (int i = 0; i < w; ++i) {
|
||||
const int srcB = src[-2*srcStride];
|
||||
const int srcA = src[-1*srcStride];
|
||||
const int src0 = src[0 *srcStride];
|
||||
const int src1 = src[1 *srcStride];
|
||||
const int src2 = src[2 *srcStride];
|
||||
const int src3 = src[3 *srcStride];
|
||||
const int src4 = src[4 *srcStride];
|
||||
dst[0*dstStride] = av_clip_uint8(((src0+src1)*20 - (srcA+src2)*5 + (srcB+src3) + 16) >> 5);
|
||||
dst[1*dstStride] = av_clip_uint8(((src1+src2)*20 - (src0+src3)*5 + (srcA+src4) + 16) >> 5);
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
static void put_snow_qpel2_hv_lowpass_8(uint8_t *dst, pixeltmp *tmp, const uint8_t *restrict src, int dstStride, int tmpStride, int srcStride)
|
||||
{
|
||||
const int h = 2;
|
||||
const int w = 2;
|
||||
src -= 2*srcStride;
|
||||
for (int i = 0; i < h + 5; ++i) {
|
||||
tmp[0] = (src[0]+src[1])*20 - (src[-1]+src[2])*5 + (src[-2]+src[3]);
|
||||
tmp[1] = (src[1]+src[2])*20 - (src[0 ]+src[3])*5 + (src[-1]+src[4]);
|
||||
tmp += tmpStride;
|
||||
src += srcStride;
|
||||
}
|
||||
tmp -= tmpStride*(h+5-2);
|
||||
for (int i = 0; i < w; ++i) {
|
||||
const int tmpB = tmp[-2*tmpStride];
|
||||
const int tmpA = tmp[-1*tmpStride];
|
||||
const int tmp0 = tmp[0 *tmpStride];
|
||||
const int tmp1 = tmp[1 *tmpStride];
|
||||
const int tmp2 = tmp[2 *tmpStride];
|
||||
const int tmp3 = tmp[3 *tmpStride];
|
||||
const int tmp4 = tmp[4 *tmpStride];
|
||||
dst[0*dstStride] = av_clip_uint8(((tmp0+tmp1)*20 - (tmpA+tmp2)*5 + (tmpB+tmp3) + 512) >> 10);
|
||||
dst[1*dstStride] = av_clip_uint8(((tmp1+tmp2)*20 - (tmp0+tmp3)*5 + (tmpA+tmp4) + 512) >> 10);
|
||||
dst++;
|
||||
tmp++;
|
||||
}
|
||||
}
|
||||
|
||||
H264_MC(put_, snow, 2)
|
||||
|
||||
static av_cold void init_qpel(SnowContext *const s)
|
||||
{
|
||||
static_assert(offsetof(H264QpelContext, put_h264_qpel_pixels_tab) == 0,
|
||||
"put_h264_qpel_pixels_tab not at start of H264QpelContext");
|
||||
ff_h264qpel_init(&s->h264qpel, 8);
|
||||
s->put_snow_qpel_pixels_tab[3][0] = put_snow_qpel2_mc00_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][1] = put_snow_qpel2_mc10_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][2] = put_snow_qpel2_mc20_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][3] = put_snow_qpel2_mc30_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][4] = put_snow_qpel2_mc01_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][5] = put_snow_qpel2_mc11_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][6] = put_snow_qpel2_mc21_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][7] = put_snow_qpel2_mc31_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][8] = put_snow_qpel2_mc02_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][9] = put_snow_qpel2_mc12_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][10] = put_snow_qpel2_mc22_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][11] = put_snow_qpel2_mc32_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][12] = put_snow_qpel2_mc03_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][13] = put_snow_qpel2_mc13_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][14] = put_snow_qpel2_mc23_8_c;
|
||||
s->put_snow_qpel_pixels_tab[3][15] = put_snow_qpel2_mc33_8_c;
|
||||
}
|
||||
|
||||
void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_t * * block, int b_w, int b_h,
|
||||
int src_x, int src_y, int src_stride, slice_buffer * sb, int add, uint8_t * dst8){
|
||||
@@ -354,18 +441,18 @@ void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t st
|
||||
else if(b_w==32){
|
||||
int y;
|
||||
for(y=0; y<b_h; y+=16){
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 3 + (y+3)*stride,stride);
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 19 + (y+3)*stride,stride);
|
||||
s->put_snow_qpel_pixels_tab[0][dy+(dx>>2)](dst + y*stride, src + 3 + (y+3)*stride,stride);
|
||||
s->put_snow_qpel_pixels_tab[0][dy+(dx>>2)](dst + 16 + y*stride, src + 19 + (y+3)*stride,stride);
|
||||
}
|
||||
}else if(b_w==b_h)
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride);
|
||||
s->put_snow_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst,src + 3 + 3*stride,stride);
|
||||
else if(b_w==2*b_h){
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 3 + 3*stride,stride);
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride);
|
||||
s->put_snow_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst ,src + 3 + 3*stride,stride);
|
||||
s->put_snow_qpel_pixels_tab[tab_index+1][dy+(dx>>2)](dst+b_h,src + 3 + b_h + 3*stride,stride);
|
||||
}else{
|
||||
av_assert2(2*b_w==b_h);
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 3 + 3*stride ,stride);
|
||||
s->h264qpel.put_h264_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 3 + 3*stride+b_w*stride,stride);
|
||||
s->put_snow_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst ,src + 3 + 3*stride ,stride);
|
||||
s->put_snow_qpel_pixels_tab[tab_index ][dy+(dx>>2)](dst+b_w*stride,src + 3 + 3*stride+b_w*stride,stride);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -404,7 +491,8 @@ av_cold int ff_snow_common_init(AVCodecContext *avctx){
|
||||
|
||||
ff_videodsp_init(&s->vdsp, 8);
|
||||
ff_dwt_init(&s->dwt);
|
||||
ff_h264qpel_init(&s->h264qpel, 8);
|
||||
|
||||
init_qpel(s);
|
||||
|
||||
#define mcfh(dx,dy)\
|
||||
s->hdsp.put_pixels_tab [0][dy/4+dx/8]=\
|
||||
|
||||
@@ -116,7 +116,11 @@ typedef struct SnowContext{
|
||||
RangeCoder c;
|
||||
HpelDSPContext hdsp;
|
||||
VideoDSPContext vdsp;
|
||||
H264QpelContext h264qpel;
|
||||
union {
|
||||
/// everything except size 2 are from H.264
|
||||
qpel_mc_func put_snow_qpel_pixels_tab[4][16];
|
||||
H264QpelContext h264qpel;
|
||||
};
|
||||
SnowDWTContext dwt;
|
||||
AVFrame *input_picture; ///< new_picture with the internal linesizes
|
||||
AVFrame *current_picture;
|
||||
|
||||
@@ -64,7 +64,7 @@ void checkasm_check_h264qpel(void)
|
||||
|
||||
for (bit_depth = 8; bit_depth <= 10; bit_depth++) {
|
||||
ff_h264qpel_init(&h, bit_depth);
|
||||
for (i = 0; i < (op || bit_depth != 8 ? 3 : 4); i++) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
int size = 16 >> i;
|
||||
for (j = 0; j < 16; j++)
|
||||
if (check_func(tab[i][j], "%s_h264_qpel_%d_mc%d%d_%d", op_name, size, j & 3, j >> 2, bit_depth)) {
|
||||
|
||||
Reference in New Issue
Block a user