Author: marco Date: Sun Aug 12 20:02:51 2007 New Revision: 728 Log: Don't calculate these variables in each function, but just once
Modified: dirac/libavcodec/dirac.c Modified: dirac/libavcodec/dirac.c ============================================================================== --- dirac/libavcodec/dirac.c (original) +++ dirac/libavcodec/dirac.c Sun Aug 12 20:02:51 2007 @@ -288,6 +288,9 @@ typedef struct DiracContext { int ybsep; int xblen; int yblen; + int xoffset; + int yoffset; + int total_wt_bits; int *sbsplit; struct dirac_blockmotion *blmotion; @@ -2123,7 +2126,7 @@ static inline int spatial_wt(int i, int } static void motion_comp_block2refs(AVCodecContext *avctx, int16_t *coeffs, - int i, int j, + int i, int j, int xstart, int xstop, int ystart, int ystop, uint8_t *ref1, uint8_t *ref2, struct dirac_blockmotion *currblock, int comp) { @@ -2132,26 +2135,9 @@ static void motion_comp_block2refs(AVCod int16_t *line; int px1, py1; int px2, py2; - int xoffset, yoffset; - int xstart, ystart; - int xstop, ystop; - int hbits, vbits; - int total_wt_bits; int vect1[2]; int vect2[2]; - xoffset = (s->xblen - s->xbsep) / 2; - yoffset = (s->yblen - s->ybsep) / 2; - xstart = FFMAX(0, i * s->xbsep - xoffset); - ystart = FFMAX(0, j * s->ybsep - yoffset); - xstop = FFMIN(xstart + s->xblen, s->width); - ystop = FFMIN(ystart + s->yblen, s->height); - - hbits = av_log2(xoffset) + 2; - vbits = av_log2(yoffset) + 2; - total_wt_bits = hbits + vbits - + s->frame_decoding.picture_weight_precision; - vect1[0] = currblock->ref1[0]; vect1[1] = currblock->ref1[1]; vect2[0] = currblock->ref2[0]; @@ -2198,11 +2184,11 @@ static void motion_comp_block2refs(AVCod val = val1 + val2; val = (val * spatial_wt(i, x, s->xbsep, s->xblen, - xoffset, s->blwidth) + s->xoffset, s->blwidth) * spatial_wt(j, y, s->ybsep, s->yblen, - yoffset, s->blheight)); + s->yoffset, s->blheight)); - val = (val + (1 << (total_wt_bits - 1))) >> total_wt_bits; + val = (val + (1 << (s->total_wt_bits - 1))) >> s->total_wt_bits; line[x] += val; } line += s->padded_width; @@ -2210,7 +2196,7 @@ static void motion_comp_block2refs(AVCod } static void motion_comp_block1ref(AVCodecContext *avctx, int16_t *coeffs, - int i, int j, + int i, int j, int xstart, int xstop, int ystart, int ystop, uint8_t *refframe, int ref, struct dirac_blockmotion *currblock, int comp) { @@ -2218,25 +2204,8 @@ static void motion_comp_block1ref(AVCode int x, y; int16_t *line; int px, py; - int xoffset, yoffset; - int xstart, ystart; - int xstop, ystop; - int hbits, vbits; - int total_wt_bits; int vect[2]; - xoffset = (s->xblen - s->xbsep) / 2; - yoffset = (s->yblen - s->ybsep) / 2; - xstart = FFMAX(0, i * s->xbsep - xoffset); - ystart = FFMAX(0, j * s->ybsep - yoffset); - xstop = FFMIN(xstart + s->xblen, s->width); - ystop = FFMIN(ystart + s->yblen, s->height); - - hbits = av_log2(xoffset) + 2; - vbits = av_log2(yoffset) + 2; - total_wt_bits = hbits + vbits - + s->frame_decoding.picture_weight_precision; - if (ref == 0) { vect[0] = currblock->ref1[0]; vect[1] = currblock->ref1[1]; @@ -2272,11 +2241,11 @@ static void motion_comp_block1ref(AVCode val = (val * spatial_wt(i, x, s->xbsep, s->xblen, - xoffset, s->blwidth) + s->xoffset, s->blwidth) * spatial_wt(j, y, s->ybsep, s->yblen, - yoffset, s->blheight)); + s->yoffset, s->blheight)); - val = (val + (1 << (total_wt_bits - 1))) >> total_wt_bits; + val = (val + (1 << (s->total_wt_bits - 1))) >> s->total_wt_bits; line[x] += val; } line += s->padded_width; @@ -2284,28 +2253,10 @@ static void motion_comp_block1ref(AVCode } static inline void motion_comp_dc_block(AVCodecContext *avctx, uint16_t *coeffs, - int i, int j, int dcval) { + int i, int j, int xstart, int xstop, int ystart, int ystop, int dcval) { DiracContext *s = avctx->priv_data; int x, y; int16_t *line; - int xoffset, yoffset; - int xstart, ystart; - int xstop, ystop; - int hbits, vbits; - int total_wt_bits; - - xoffset = (s->xblen - s->xbsep) / 2; - yoffset = (s->yblen - s->ybsep) / 2; - xstart = FFMAX(0, i * s->xbsep - xoffset); - ystart = FFMAX(0, j * s->ybsep - yoffset); - xstop = FFMIN(xstart + s->xblen, s->width); - ystop = FFMIN(ystart + s->yblen, s->height); - - hbits = av_log2(xoffset) + 2; - vbits = av_log2(yoffset) + 2; - - total_wt_bits = hbits + vbits - + s->frame_decoding.picture_weight_precision; dcval <<= s->frame_decoding.picture_weight_precision; @@ -2315,9 +2266,9 @@ static inline void motion_comp_dc_block( int val; val = dcval; - val *= spatial_wt(i, x, s->xbsep, s->xblen, xoffset, s->blwidth) - * spatial_wt(j, y, s->ybsep, s->yblen, yoffset, s->blheight); - val = (val + (1 << (total_wt_bits - 1))) >> total_wt_bits; + val *= spatial_wt(i, x, s->xbsep, s->xblen, s->xoffset, s->blwidth) + * spatial_wt(j, y, s->ybsep, s->yblen, s->yoffset, s->blheight); + val = (val + (1 << (s->total_wt_bits - 1))) >> s->total_wt_bits; line[x] += val; } line += s->padded_width; @@ -2331,6 +2282,9 @@ static int dirac_motion_compensation(AVC int refidx1, refidx2 = 0; AVFrame *ref1 = 0, *ref2 = 0; struct dirac_blockmotion *currblock; + int xstart, ystart; + int xstop, ystop; + int hbits, vbits; if (comp == 0) { s->width = s->sequence.luma_width; @@ -2348,6 +2302,14 @@ static int dirac_motion_compensation(AVC s->ybsep = s->frame_decoding.chroma_ybsep; } + s->xoffset = (s->xblen - s->xbsep) / 2; + s->yoffset = (s->yblen - s->ybsep) / 2; + hbits = av_log2(s->xoffset) + 2; + vbits = av_log2(s->yoffset) + 2; + + s->total_wt_bits = hbits + vbits + + s->frame_decoding.picture_weight_precision; + refidx1 = reference_frame_idx(avctx, s->ref1); ref1 = &s->refframes[refidx1]; s->ref1width = s->width << 1; @@ -2383,21 +2345,26 @@ static int dirac_motion_compensation(AVC for (i = 0; i < s->blwidth; i++) { struct dirac_blockmotion *block = &currblock[i]; + xstart = FFMAX(0, i * s->xbsep - s->xoffset); + ystart = FFMAX(0, j * s->ybsep - s->yoffset); + xstop = FFMIN(xstart + s->xblen, s->width); + ystop = FFMIN(ystart + s->yblen, s->height); + /* Intra */ if (block->use_ref[0] == 0 && block->use_ref[1] == 0) - motion_comp_dc_block(avctx, coeffs, i, j, + motion_comp_dc_block(avctx, coeffs, i, j, xstart, xstop, ystart, ystop, block->dc[comp]); /* Reference frame 1 only. */ else if (block->use_ref[1] == 0) - motion_comp_block1ref(avctx, coeffs, i, j, s->ref1data, + motion_comp_block1ref(avctx, coeffs, i, j, xstart, xstop, ystart, ystop,s->ref1data, 0, block, comp); /* Reference frame 2 only. */ else if (block->use_ref[0] == 0) - motion_comp_block1ref(avctx, coeffs, i, j, s->ref2data, + motion_comp_block1ref(avctx, coeffs, i, j, xstart, xstop, ystart, ystop,s->ref2data, 1, block, comp); /* Both reference frames. */ else - motion_comp_block2refs(avctx, coeffs, i, j, + motion_comp_block2refs(avctx, coeffs, i, j,xstart, xstop, ystart, ystop, s->ref1data, s->ref2data, block, comp); } currblock += s->blwidth; _______________________________________________ FFmpeg-soc mailing list FFmpeg-soc@mplayerhq.hu http://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc