annotate ffmpeg/libavfilter/deshake_kernel.h @ 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) 2013 Wei Gao <weigao@multicorewareinc.com>
yading@10 3 *
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #ifndef AVFILTER_DESHAKE_KERNEL_H
yading@10 23 #define AVFILTER_DESHAKE_KERNEL_H
yading@10 24
yading@10 25 #include "libavutil/opencl.h"
yading@10 26
yading@10 27 const char *ff_kernel_deshake_opencl = AV_OPENCL_KERNEL(
yading@10 28
yading@10 29 inline unsigned char pixel(global const unsigned char *src, float x, float y,
yading@10 30 int w, int h,int stride, unsigned char def)
yading@10 31 {
yading@10 32 return (x < 0 || y < 0 || x >= w || y >= h) ? def : src[(int)x + (int)y * stride];
yading@10 33 }
yading@10 34 unsigned char interpolate_nearest(float x, float y, global const unsigned char *src,
yading@10 35 int width, int height, int stride, unsigned char def)
yading@10 36 {
yading@10 37 return pixel(src, (int)(x + 0.5), (int)(y + 0.5), width, height, stride, def);
yading@10 38 }
yading@10 39
yading@10 40 unsigned char interpolate_bilinear(float x, float y, global const unsigned char *src,
yading@10 41 int width, int height, int stride, unsigned char def)
yading@10 42 {
yading@10 43 int x_c, x_f, y_c, y_f;
yading@10 44 int v1, v2, v3, v4;
yading@10 45
yading@10 46 if (x < -1 || x > width || y < -1 || y > height) {
yading@10 47 return def;
yading@10 48 } else {
yading@10 49 x_f = (int)x;
yading@10 50 x_c = x_f + 1;
yading@10 51
yading@10 52 y_f = (int)y;
yading@10 53 y_c = y_f + 1;
yading@10 54
yading@10 55 v1 = pixel(src, x_c, y_c, width, height, stride, def);
yading@10 56 v2 = pixel(src, x_c, y_f, width, height, stride, def);
yading@10 57 v3 = pixel(src, x_f, y_c, width, height, stride, def);
yading@10 58 v4 = pixel(src, x_f, y_f, width, height, stride, def);
yading@10 59
yading@10 60 return (v1*(x - x_f)*(y - y_f) + v2*((x - x_f)*(y_c - y)) +
yading@10 61 v3*(x_c - x)*(y - y_f) + v4*((x_c - x)*(y_c - y)));
yading@10 62 }
yading@10 63 }
yading@10 64
yading@10 65 unsigned char interpolate_biquadratic(float x, float y, global const unsigned char *src,
yading@10 66 int width, int height, int stride, unsigned char def)
yading@10 67 {
yading@10 68 int x_c, x_f, y_c, y_f;
yading@10 69 unsigned char v1, v2, v3, v4;
yading@10 70 float f1, f2, f3, f4;
yading@10 71
yading@10 72 if (x < - 1 || x > width || y < -1 || y > height)
yading@10 73 return def;
yading@10 74 else {
yading@10 75 x_f = (int)x;
yading@10 76 x_c = x_f + 1;
yading@10 77 y_f = (int)y;
yading@10 78 y_c = y_f + 1;
yading@10 79
yading@10 80 v1 = pixel(src, x_c, y_c, width, height, stride, def);
yading@10 81 v2 = pixel(src, x_c, y_f, width, height, stride, def);
yading@10 82 v3 = pixel(src, x_f, y_c, width, height, stride, def);
yading@10 83 v4 = pixel(src, x_f, y_f, width, height, stride, def);
yading@10 84
yading@10 85 f1 = 1 - sqrt((x_c - x) * (y_c - y));
yading@10 86 f2 = 1 - sqrt((x_c - x) * (y - y_f));
yading@10 87 f3 = 1 - sqrt((x - x_f) * (y_c - y));
yading@10 88 f4 = 1 - sqrt((x - x_f) * (y - y_f));
yading@10 89 return (v1 * f1 + v2 * f2 + v3 * f3 + v4 * f4) / (f1 + f2 + f3 + f4);
yading@10 90 }
yading@10 91 }
yading@10 92
yading@10 93 inline const float clipf(float a, float amin, float amax)
yading@10 94 {
yading@10 95 if (a < amin) return amin;
yading@10 96 else if (a > amax) return amax;
yading@10 97 else return a;
yading@10 98 }
yading@10 99
yading@10 100 inline int mirror(int v, int m)
yading@10 101 {
yading@10 102 while ((unsigned)v > (unsigned)m) {
yading@10 103 v = -v;
yading@10 104 if (v < 0)
yading@10 105 v += 2 * m;
yading@10 106 }
yading@10 107 return v;
yading@10 108 }
yading@10 109
yading@10 110 kernel void avfilter_transform(global unsigned char *src,
yading@10 111 global unsigned char *dst,
yading@10 112 global float *matrix,
yading@10 113 global float *matrix2,
yading@10 114 int interpolate,
yading@10 115 int fillmethod,
yading@10 116 int src_stride_lu,
yading@10 117 int dst_stride_lu,
yading@10 118 int src_stride_ch,
yading@10 119 int dst_stride_ch,
yading@10 120 int height,
yading@10 121 int width,
yading@10 122 int ch,
yading@10 123 int cw)
yading@10 124 {
yading@10 125 int global_id = get_global_id(0);
yading@10 126
yading@10 127 global unsigned char *dst_y = dst;
yading@10 128 global unsigned char *dst_u = dst_y + height * dst_stride_lu;
yading@10 129 global unsigned char *dst_v = dst_u + ch * dst_stride_ch;
yading@10 130
yading@10 131 global unsigned char *src_y = src;
yading@10 132 global unsigned char *src_u = src_y + height * src_stride_lu;
yading@10 133 global unsigned char *src_v = src_u + ch * src_stride_ch;
yading@10 134
yading@10 135 global unsigned char *tempdst;
yading@10 136 global unsigned char *tempsrc;
yading@10 137
yading@10 138 int x;
yading@10 139 int y;
yading@10 140 float x_s;
yading@10 141 float y_s;
yading@10 142 int tempsrc_stride;
yading@10 143 int tempdst_stride;
yading@10 144 int temp_height;
yading@10 145 int temp_width;
yading@10 146 int curpos;
yading@10 147 unsigned char def = 0;
yading@10 148 if (global_id < width*height) {
yading@10 149 y = global_id/width;
yading@10 150 x = global_id%width;
yading@10 151 x_s = x * matrix[0] + y * matrix[1] + matrix[2];
yading@10 152 y_s = x * matrix[3] + y * matrix[4] + matrix[5];
yading@10 153 tempdst = dst_y;
yading@10 154 tempsrc = src_y;
yading@10 155 tempsrc_stride = src_stride_lu;
yading@10 156 tempdst_stride = dst_stride_lu;
yading@10 157 temp_height = height;
yading@10 158 temp_width = width;
yading@10 159 } else if ((global_id >= width*height)&&(global_id < width*height + ch*cw)) {
yading@10 160 y = (global_id - width*height)/cw;
yading@10 161 x = (global_id - width*height)%cw;
yading@10 162 x_s = x * matrix2[0] + y * matrix2[1] + matrix2[2];
yading@10 163 y_s = x * matrix2[3] + y * matrix2[4] + matrix2[5];
yading@10 164 tempdst = dst_u;
yading@10 165 tempsrc = src_u;
yading@10 166 tempsrc_stride = src_stride_ch;
yading@10 167 tempdst_stride = dst_stride_ch;
yading@10 168 temp_height = ch;
yading@10 169 temp_width = cw;
yading@10 170 } else {
yading@10 171 y = (global_id - width*height - ch*cw)/cw;
yading@10 172 x = (global_id - width*height - ch*cw)%cw;
yading@10 173 x_s = x * matrix2[0] + y * matrix2[1] + matrix2[2];
yading@10 174 y_s = x * matrix2[3] + y * matrix2[4] + matrix2[5];
yading@10 175 tempdst = dst_v;
yading@10 176 tempsrc = src_v;
yading@10 177 tempsrc_stride = src_stride_ch;
yading@10 178 tempdst_stride = dst_stride_ch;
yading@10 179 temp_height = ch;
yading@10 180 temp_width = cw;
yading@10 181 }
yading@10 182 curpos = y * tempdst_stride + x;
yading@10 183 switch (fillmethod) {
yading@10 184 case 0: //FILL_BLANK
yading@10 185 def = 0;
yading@10 186 break;
yading@10 187 case 1: //FILL_ORIGINAL
yading@10 188 def = tempsrc[y*tempsrc_stride+x];
yading@10 189 break;
yading@10 190 case 2: //FILL_CLAMP
yading@10 191 y_s = clipf(y_s, 0, temp_height - 1);
yading@10 192 x_s = clipf(x_s, 0, temp_width - 1);
yading@10 193 def = tempsrc[(int)y_s * tempsrc_stride + (int)x_s];
yading@10 194 break;
yading@10 195 case 3: //FILL_MIRROR
yading@10 196 y_s = mirror(y_s,temp_height - 1);
yading@10 197 x_s = mirror(x_s,temp_width - 1);
yading@10 198 def = tempsrc[(int)y_s * tempsrc_stride + (int)x_s];
yading@10 199 break;
yading@10 200 }
yading@10 201 switch (interpolate) {
yading@10 202 case 0: //INTERPOLATE_NEAREST
yading@10 203 tempdst[curpos] = interpolate_nearest(x_s, y_s, tempsrc, temp_width, temp_height, tempsrc_stride, def);
yading@10 204 break;
yading@10 205 case 1: //INTERPOLATE_BILINEAR
yading@10 206 tempdst[curpos] = interpolate_bilinear(x_s, y_s, tempsrc, temp_width, temp_height, tempsrc_stride, def);
yading@10 207 break;
yading@10 208 case 2: //INTERPOLATE_BIQUADRATIC
yading@10 209 tempdst[curpos] = interpolate_biquadratic(x_s, y_s, tempsrc, temp_width, temp_height, tempsrc_stride, def);
yading@10 210 break;
yading@10 211 default:
yading@10 212 return;
yading@10 213 }
yading@10 214 }
yading@10 215 );
yading@10 216
yading@10 217 #endif /* AVFILTER_DESHAKE_KERNEL_H */