annotate ffmpeg/libavcodec/diracdsp.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (C) 2009 David Conrad
yading@10 3 *
yading@10 4 * This file is part of FFmpeg.
yading@10 5 *
yading@10 6 * FFmpeg is free software; you can redistribute it and/or
yading@10 7 * modify it under the terms of the GNU Lesser General Public
yading@10 8 * License as published by the Free Software Foundation; either
yading@10 9 * version 2.1 of the License, or (at your option) any later version.
yading@10 10 *
yading@10 11 * FFmpeg is distributed in the hope that it will be useful,
yading@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 14 * Lesser General Public License for more details.
yading@10 15 *
yading@10 16 * You should have received a copy of the GNU Lesser General Public
yading@10 17 * License along with FFmpeg; if not, write to the Free Software
yading@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 19 */
yading@10 20
yading@10 21 #include "dsputil.h"
yading@10 22 #include "diracdsp.h"
yading@10 23 #include "libavcodec/x86/diracdsp_mmx.h"
yading@10 24
yading@10 25 #define FILTER(src, stride) \
yading@10 26 ((21*((src)[ 0*stride] + (src)[1*stride]) \
yading@10 27 -7*((src)[-1*stride] + (src)[2*stride]) \
yading@10 28 +3*((src)[-2*stride] + (src)[3*stride]) \
yading@10 29 -1*((src)[-3*stride] + (src)[4*stride]) + 16) >> 5)
yading@10 30
yading@10 31 static void dirac_hpel_filter(uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, const uint8_t *src,
yading@10 32 int stride, int width, int height)
yading@10 33 {
yading@10 34 int x, y;
yading@10 35
yading@10 36 for (y = 0; y < height; y++) {
yading@10 37 for (x = -3; x < width+5; x++)
yading@10 38 dstv[x] = av_clip_uint8(FILTER(src+x, stride));
yading@10 39
yading@10 40 for (x = 0; x < width; x++)
yading@10 41 dstc[x] = av_clip_uint8(FILTER(dstv+x, 1));
yading@10 42
yading@10 43 for (x = 0; x < width; x++)
yading@10 44 dsth[x] = av_clip_uint8(FILTER(src+x, 1));
yading@10 45
yading@10 46 src += stride;
yading@10 47 dsth += stride;
yading@10 48 dstv += stride;
yading@10 49 dstc += stride;
yading@10 50 }
yading@10 51 }
yading@10 52
yading@10 53 #define PIXOP_BILINEAR(PFX, OP, WIDTH) \
yading@10 54 static void ff_ ## PFX ## _dirac_pixels ## WIDTH ## _bilinear_c(uint8_t *dst, const uint8_t *src[5], int stride, int h) \
yading@10 55 { \
yading@10 56 int x; \
yading@10 57 const uint8_t *s0 = src[0]; \
yading@10 58 const uint8_t *s1 = src[1]; \
yading@10 59 const uint8_t *s2 = src[2]; \
yading@10 60 const uint8_t *s3 = src[3]; \
yading@10 61 const uint8_t *w = src[4]; \
yading@10 62 \
yading@10 63 while (h--) { \
yading@10 64 for (x = 0; x < WIDTH; x++) { \
yading@10 65 OP(dst[x], (s0[x]*w[0] + s1[x]*w[1] + s2[x]*w[2] + s3[x]*w[3] + 8) >> 4); \
yading@10 66 } \
yading@10 67 \
yading@10 68 dst += stride; \
yading@10 69 s0 += stride; \
yading@10 70 s1 += stride; \
yading@10 71 s2 += stride; \
yading@10 72 s3 += stride; \
yading@10 73 } \
yading@10 74 }
yading@10 75
yading@10 76 #define OP_PUT(dst, val) (dst) = (val)
yading@10 77 #define OP_AVG(dst, val) (dst) = (((dst) + (val) + 1)>>1)
yading@10 78
yading@10 79 PIXOP_BILINEAR(put, OP_PUT, 8)
yading@10 80 PIXOP_BILINEAR(put, OP_PUT, 16)
yading@10 81 PIXOP_BILINEAR(put, OP_PUT, 32)
yading@10 82 PIXOP_BILINEAR(avg, OP_AVG, 8)
yading@10 83 PIXOP_BILINEAR(avg, OP_AVG, 16)
yading@10 84 PIXOP_BILINEAR(avg, OP_AVG, 32)
yading@10 85
yading@10 86 #define op_scale1(x) block[x] = av_clip_uint8( (block[x]*weight + (1<<(log2_denom-1))) >> log2_denom)
yading@10 87 #define op_scale2(x) dst[x] = av_clip_uint8( (src[x]*weights + dst[x]*weightd + (1<<(log2_denom-1))) >> log2_denom)
yading@10 88
yading@10 89 #define DIRAC_WEIGHT(W) \
yading@10 90 static void weight_dirac_pixels ## W ## _c(uint8_t *block, int stride, int log2_denom, \
yading@10 91 int weight, int h) { \
yading@10 92 int x; \
yading@10 93 while (h--) { \
yading@10 94 for (x = 0; x < W; x++) { \
yading@10 95 op_scale1(x); \
yading@10 96 op_scale1(x+1); \
yading@10 97 } \
yading@10 98 block += stride; \
yading@10 99 } \
yading@10 100 } \
yading@10 101 static void biweight_dirac_pixels ## W ## _c(uint8_t *dst, const uint8_t *src, int stride, int log2_denom, \
yading@10 102 int weightd, int weights, int h) { \
yading@10 103 int x; \
yading@10 104 while (h--) { \
yading@10 105 for (x = 0; x < W; x++) { \
yading@10 106 op_scale2(x); \
yading@10 107 op_scale2(x+1); \
yading@10 108 } \
yading@10 109 dst += stride; \
yading@10 110 src += stride; \
yading@10 111 } \
yading@10 112 }
yading@10 113
yading@10 114 DIRAC_WEIGHT(8)
yading@10 115 DIRAC_WEIGHT(16)
yading@10 116 DIRAC_WEIGHT(32)
yading@10 117
yading@10 118 #define ADD_OBMC(xblen) \
yading@10 119 static void add_obmc ## xblen ## _c(uint16_t *dst, const uint8_t *src, int stride, \
yading@10 120 const uint8_t *obmc_weight, int yblen) \
yading@10 121 { \
yading@10 122 int x; \
yading@10 123 while (yblen--) { \
yading@10 124 for (x = 0; x < xblen; x += 2) { \
yading@10 125 dst[x ] += src[x ] * obmc_weight[x ]; \
yading@10 126 dst[x+1] += src[x+1] * obmc_weight[x+1]; \
yading@10 127 } \
yading@10 128 dst += stride; \
yading@10 129 src += stride; \
yading@10 130 obmc_weight += 32; \
yading@10 131 } \
yading@10 132 }
yading@10 133
yading@10 134 ADD_OBMC(8)
yading@10 135 ADD_OBMC(16)
yading@10 136 ADD_OBMC(32)
yading@10 137
yading@10 138 static void put_signed_rect_clamped_c(uint8_t *dst, int dst_stride, const int16_t *src, int src_stride, int width, int height)
yading@10 139 {
yading@10 140 int x, y;
yading@10 141 for (y = 0; y < height; y++) {
yading@10 142 for (x = 0; x < width; x+=4) {
yading@10 143 dst[x ] = av_clip_uint8(src[x ] + 128);
yading@10 144 dst[x+1] = av_clip_uint8(src[x+1] + 128);
yading@10 145 dst[x+2] = av_clip_uint8(src[x+2] + 128);
yading@10 146 dst[x+3] = av_clip_uint8(src[x+3] + 128);
yading@10 147 }
yading@10 148 dst += dst_stride;
yading@10 149 src += src_stride;
yading@10 150 }
yading@10 151 }
yading@10 152
yading@10 153 static void add_rect_clamped_c(uint8_t *dst, const uint16_t *src, int stride,
yading@10 154 const int16_t *idwt, int idwt_stride,
yading@10 155 int width, int height)
yading@10 156 {
yading@10 157 int x, y;
yading@10 158
yading@10 159 for (y = 0; y < height; y++) {
yading@10 160 for (x = 0; x < width; x+=2) {
yading@10 161 dst[x ] = av_clip_uint8(((src[x ]+32)>>6) + idwt[x ]);
yading@10 162 dst[x+1] = av_clip_uint8(((src[x+1]+32)>>6) + idwt[x+1]);
yading@10 163 }
yading@10 164 dst += stride;
yading@10 165 src += stride;
yading@10 166 idwt += idwt_stride;
yading@10 167 }
yading@10 168 }
yading@10 169
yading@10 170 #define PIXFUNC(PFX, WIDTH) \
yading@10 171 c->PFX ## _dirac_pixels_tab[WIDTH>>4][0] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _c; \
yading@10 172 c->PFX ## _dirac_pixels_tab[WIDTH>>4][1] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _l2_c; \
yading@10 173 c->PFX ## _dirac_pixels_tab[WIDTH>>4][2] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _l4_c; \
yading@10 174 c->PFX ## _dirac_pixels_tab[WIDTH>>4][3] = ff_ ## PFX ## _dirac_pixels ## WIDTH ## _bilinear_c
yading@10 175
yading@10 176 void ff_diracdsp_init(DiracDSPContext *c)
yading@10 177 {
yading@10 178 c->dirac_hpel_filter = dirac_hpel_filter;
yading@10 179 c->add_rect_clamped = add_rect_clamped_c;
yading@10 180 c->put_signed_rect_clamped = put_signed_rect_clamped_c;
yading@10 181
yading@10 182 c->add_dirac_obmc[0] = add_obmc8_c;
yading@10 183 c->add_dirac_obmc[1] = add_obmc16_c;
yading@10 184 c->add_dirac_obmc[2] = add_obmc32_c;
yading@10 185
yading@10 186 c->weight_dirac_pixels_tab[0] = weight_dirac_pixels8_c;
yading@10 187 c->weight_dirac_pixels_tab[1] = weight_dirac_pixels16_c;
yading@10 188 c->weight_dirac_pixels_tab[2] = weight_dirac_pixels32_c;
yading@10 189 c->biweight_dirac_pixels_tab[0] = biweight_dirac_pixels8_c;
yading@10 190 c->biweight_dirac_pixels_tab[1] = biweight_dirac_pixels16_c;
yading@10 191 c->biweight_dirac_pixels_tab[2] = biweight_dirac_pixels32_c;
yading@10 192
yading@10 193 PIXFUNC(put, 8);
yading@10 194 PIXFUNC(put, 16);
yading@10 195 PIXFUNC(put, 32);
yading@10 196 PIXFUNC(avg, 8);
yading@10 197 PIXFUNC(avg, 16);
yading@10 198 PIXFUNC(avg, 32);
yading@10 199
yading@10 200 if (HAVE_MMX && HAVE_YASM) ff_diracdsp_init_mmx(c);
yading@10 201 }