mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
Move filter_luma_intra into dsputil for later addition of asm.
Originally committed as revision 16228 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
b9fe706305
commit
712ca84c21
@ -2987,6 +2987,63 @@ static void h264_h_loop_filter_luma_c(uint8_t *pix, int stride, int alpha, int b
|
||||
h264_loop_filter_luma_c(pix, 1, stride, alpha, beta, tc0);
|
||||
}
|
||||
|
||||
static inline void h264_loop_filter_luma_intra_c(uint8_t *pix, int xstride, int ystride, int alpha, int beta)
|
||||
{
|
||||
int d;
|
||||
for( d = 0; d < 16; d++ ) {
|
||||
const int p2 = pix[-3*xstride];
|
||||
const int p1 = pix[-2*xstride];
|
||||
const int p0 = pix[-1*xstride];
|
||||
|
||||
const int q0 = pix[ 0*xstride];
|
||||
const int q1 = pix[ 1*xstride];
|
||||
const int q2 = pix[ 2*xstride];
|
||||
|
||||
if( FFABS( p0 - q0 ) < alpha &&
|
||||
FFABS( p1 - p0 ) < beta &&
|
||||
FFABS( q1 - q0 ) < beta ) {
|
||||
|
||||
if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
|
||||
if( FFABS( p2 - p0 ) < beta)
|
||||
{
|
||||
const int p3 = pix[-4*xstride];
|
||||
/* p0', p1', p2' */
|
||||
pix[-1*xstride] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
|
||||
pix[-2*xstride] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
|
||||
pix[-3*xstride] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
|
||||
} else {
|
||||
/* p0' */
|
||||
pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
|
||||
}
|
||||
if( FFABS( q2 - q0 ) < beta)
|
||||
{
|
||||
const int q3 = pix[3*xstride];
|
||||
/* q0', q1', q2' */
|
||||
pix[0*xstride] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
|
||||
pix[1*xstride] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
|
||||
pix[2*xstride] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
|
||||
} else {
|
||||
/* q0' */
|
||||
pix[0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
|
||||
}
|
||||
}else{
|
||||
/* p0', q0' */
|
||||
pix[-1*xstride] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
|
||||
pix[ 0*xstride] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
|
||||
}
|
||||
}
|
||||
pix += ystride;
|
||||
}
|
||||
}
|
||||
static void h264_v_loop_filter_luma_intra_c(uint8_t *pix, int stride, int alpha, int beta)
|
||||
{
|
||||
h264_loop_filter_luma_intra_c(pix, stride, 1, alpha, beta);
|
||||
}
|
||||
static void h264_h_loop_filter_luma_intra_c(uint8_t *pix, int stride, int alpha, int beta)
|
||||
{
|
||||
h264_loop_filter_luma_intra_c(pix, 1, stride, alpha, beta);
|
||||
}
|
||||
|
||||
static inline void h264_loop_filter_chroma_c(uint8_t *pix, int xstride, int ystride, int alpha, int beta, int8_t *tc0)
|
||||
{
|
||||
int i, d;
|
||||
@ -4500,6 +4557,8 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
|
||||
|
||||
c->h264_v_loop_filter_luma= h264_v_loop_filter_luma_c;
|
||||
c->h264_h_loop_filter_luma= h264_h_loop_filter_luma_c;
|
||||
c->h264_v_loop_filter_luma_intra= h264_v_loop_filter_luma_intra_c;
|
||||
c->h264_h_loop_filter_luma_intra= h264_h_loop_filter_luma_intra_c;
|
||||
c->h264_v_loop_filter_chroma= h264_v_loop_filter_chroma_c;
|
||||
c->h264_h_loop_filter_chroma= h264_h_loop_filter_chroma_c;
|
||||
c->h264_v_loop_filter_chroma_intra= h264_v_loop_filter_chroma_intra_c;
|
||||
|
@ -351,6 +351,8 @@ typedef struct DSPContext {
|
||||
void (*h264_v_loop_filter_luma)(uint8_t *pix/*align 16*/, int stride, int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_h_loop_filter_luma)(uint8_t *pix/*align 4 */, int stride, int alpha, int beta, int8_t *tc0);
|
||||
/* v/h_loop_filter_luma_intra: align 16 */
|
||||
void (*h264_v_loop_filter_luma_intra)(uint8_t *pix, int stride, int alpha, int beta);
|
||||
void (*h264_h_loop_filter_luma_intra)(uint8_t *pix, int stride, int alpha, int beta);
|
||||
void (*h264_v_loop_filter_chroma)(uint8_t *pix/*align 8*/, int stride, int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_h_loop_filter_chroma)(uint8_t *pix/*align 4*/, int stride, int alpha, int beta, int8_t *tc0);
|
||||
void (*h264_v_loop_filter_chroma_intra)(uint8_t *pix/*align 8*/, int stride, int alpha, int beta);
|
||||
|
@ -5854,53 +5854,7 @@ static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int16_t b
|
||||
tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
|
||||
h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc);
|
||||
} else {
|
||||
/* 16px edge length, because bS=4 is triggered by being at
|
||||
* the edge of an intra MB, so all 4 bS are the same */
|
||||
for( d = 0; d < 16; d++ ) {
|
||||
const int p0 = pix[-1];
|
||||
const int p1 = pix[-2];
|
||||
const int p2 = pix[-3];
|
||||
|
||||
const int q0 = pix[0];
|
||||
const int q1 = pix[1];
|
||||
const int q2 = pix[2];
|
||||
|
||||
if( FFABS( p0 - q0 ) < alpha &&
|
||||
FFABS( p1 - p0 ) < beta &&
|
||||
FFABS( q1 - q0 ) < beta ) {
|
||||
|
||||
if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
|
||||
if( FFABS( p2 - p0 ) < beta)
|
||||
{
|
||||
const int p3 = pix[-4];
|
||||
/* p0', p1', p2' */
|
||||
pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
|
||||
pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
|
||||
pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
|
||||
} else {
|
||||
/* p0' */
|
||||
pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
|
||||
}
|
||||
if( FFABS( q2 - q0 ) < beta)
|
||||
{
|
||||
const int q3 = pix[3];
|
||||
/* q0', q1', q2' */
|
||||
pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
|
||||
pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
|
||||
pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
|
||||
} else {
|
||||
/* q0' */
|
||||
pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
|
||||
}
|
||||
}else{
|
||||
/* p0', q0' */
|
||||
pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
|
||||
pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
|
||||
}
|
||||
tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, p2, p1, p0, q0, q1, q2, pix[-2], pix[-1], pix[0], pix[1]);
|
||||
}
|
||||
pix += stride;
|
||||
}
|
||||
h->s.dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta);
|
||||
}
|
||||
}
|
||||
static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
|
||||
@ -6083,50 +6037,7 @@ static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int16_t b
|
||||
tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
|
||||
h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc);
|
||||
} else {
|
||||
/* 16px edge length, see filter_mb_edgev */
|
||||
for( d = 0; d < 16; d++ ) {
|
||||
const int p0 = pix[-1*pix_next];
|
||||
const int p1 = pix[-2*pix_next];
|
||||
const int p2 = pix[-3*pix_next];
|
||||
const int q0 = pix[0];
|
||||
const int q1 = pix[1*pix_next];
|
||||
const int q2 = pix[2*pix_next];
|
||||
|
||||
if( FFABS( p0 - q0 ) < alpha &&
|
||||
FFABS( p1 - p0 ) < beta &&
|
||||
FFABS( q1 - q0 ) < beta ) {
|
||||
|
||||
const int p3 = pix[-4*pix_next];
|
||||
const int q3 = pix[ 3*pix_next];
|
||||
|
||||
if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
|
||||
if( FFABS( p2 - p0 ) < beta) {
|
||||
/* p0', p1', p2' */
|
||||
pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
|
||||
pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
|
||||
pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
|
||||
} else {
|
||||
/* p0' */
|
||||
pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
|
||||
}
|
||||
if( FFABS( q2 - q0 ) < beta) {
|
||||
/* q0', q1', q2' */
|
||||
pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
|
||||
pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
|
||||
pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
|
||||
} else {
|
||||
/* q0' */
|
||||
pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
|
||||
}
|
||||
}else{
|
||||
/* p0', q0' */
|
||||
pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
|
||||
pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
|
||||
}
|
||||
tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, qp, index_a, alpha, beta, bS[i], p2, p1, p0, q0, q1, q2, pix[-2*pix_next], pix[-pix_next], pix[0], pix[pix_next]);
|
||||
}
|
||||
pix++;
|
||||
}
|
||||
h->s.dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user