History

avfilter/vf_geq: add float formats support

Paul B Mahol committed 4 years ago

Commit d607af51 parent 352a01c1 file · +48 −9Browse files

Unified · Split

libavfilter/vf_geq.c+48−9
@@ -52,6 +52,7 @@ typedef struct GEQContext { · 51 unmodified lines
52 AVFrame *picref; ///< current input buffer52 AVFrame *picref; ///< current input buffer
53 uint8_t *dst; ///< reference pointer to the 8bits output53 uint8_t *dst; ///< reference pointer to the 8bits output
54 uint16_t *dst16; ///< reference pointer to the 16bits output54 uint16_t *dst16; ///< reference pointer to the 16bits output
55 float *dst32; ///< reference pointer to the 32bits output
55 double values[VAR_VARS_NB]; ///< expression values56 double values[VAR_VARS_NB]; ///< expression values
56 int hsub, vsub; ///< chroma subsampling57 int hsub, vsub; ///< chroma subsampling
57 int planes; ///< number of planes58 int planes; ///< number of planes
@@ -114,13 +115,19 @@ static inline double getpix(void *priv, double x, double y, int plane) · 56 unmodified lines
114 x -= xi;115 x -= xi;
115 y -= yi;116 y -= yi;
116 117
117 if (geq->bps > 8) {118 if (geq->bps > 8 && geq->bps <= 16) {
118 const uint16_t *src16 = (const uint16_t*)src;119 const uint16_t *src16 = (const uint16_t*)src;
119 linesize /= 2;120 linesize /= 2;
120 121
121 return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xi + 1 + yi * linesize])122 return (1-y)*((1-x)*src16[xi + yi * linesize] + x*src16[xi + 1 + yi * linesize])
122 + y *((1-x)*src16[xi + (yi+1) * linesize] + x*src16[xi + 1 + (yi+1) * linesize]);123 + y *((1-x)*src16[xi + (yi+1) * linesize] + x*src16[xi + 1 + (yi+1) * linesize]);
123 } else {124 } else if (geq->bps == 32) {
125 const float *src32 = (const float*)src;
126 linesize /= 4;
127
128 return (1-y)*((1-x)*src32[xi + yi * linesize] + x*src32[xi + 1 + yi * linesize])
129 + y *((1-x)*src32[xi + (yi+1) * linesize] + x*src32[xi + 1 + (yi+1) * linesize]);
130 } else if (geq->bps == 8) {
124 return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xi + 1 + yi * linesize])131 return (1-y)*((1-x)*src[xi + yi * linesize] + x*src[xi + 1 + yi * linesize])
125 + y *((1-x)*src[xi + (yi+1) * linesize] + x*src[xi + 1 + (yi+1) * linesize]);132 + y *((1-x)*src[xi + (yi+1) * linesize] + x*src[xi + 1 + (yi+1) * linesize]);
126 }133 }
@@ -128,15 +135,22 @@ static inline double getpix(void *priv, double x, double y, int plane) · 1 unmodified line
128 xi = av_clipd(x, 0, w - 1);135 xi = av_clipd(x, 0, w - 1);
129 yi = av_clipd(y, 0, h - 1);136 yi = av_clipd(y, 0, h - 1);
130 137
131 if (geq->bps > 8) {138 if (geq->bps > 8 && geq->bps <= 16) {
132 const uint16_t *src16 = (const uint16_t*)src;139 const uint16_t *src16 = (const uint16_t*)src;
133 linesize /= 2;140 linesize /= 2;
134 141
135 return src16[xi + yi * linesize];142 return src16[xi + yi * linesize];
136 } else {143 } else if (geq->bps == 32) {
144 const float *src32 = (const float*)src;
145 linesize /= 4;
146
147 return src32[xi + yi * linesize];
148 } else if (geq->bps == 8) {
137 return src[xi + yi * linesize];149 return src[xi + yi * linesize];
138 }150 }
139 }151 }
152
153 return 0;
140}154}
141 155
142static int calculate_sums(GEQContext *geq, int plane, int w, int h)156static int calculate_sums(GEQContext *geq, int plane, int w, int h)
@@ -150,10 +164,12 @@ static int calculate_sums(GEQContext *geq, int plane, int w, int h) · 7 unmodified lines
150 geq->pixel_sums[plane] = av_malloc_array(w, h * sizeof (*geq->pixel_sums[plane]));164 geq->pixel_sums[plane] = av_malloc_array(w, h * sizeof (*geq->pixel_sums[plane]));
151 if (!geq->pixel_sums[plane])165 if (!geq->pixel_sums[plane])
152 return AVERROR(ENOMEM);166 return AVERROR(ENOMEM);
153 if (geq->bps > 8)167 if (geq->bps == 32)
168 linesize /= 4;
169 else if (geq->bps > 8 && geq->bps <= 16)
154 linesize /= 2;170 linesize /= 2;
155 for (yi = 0; yi < h; yi ++) {171 for (yi = 0; yi < h; yi ++) {
156 if (geq->bps > 8) {172 if (geq->bps > 8 && geq->bps <= 16) {
157 const uint16_t *src16 = (const uint16_t*)src;173 const uint16_t *src16 = (const uint16_t*)src;
158 double linesum = 0;174 double linesum = 0;
159 175
@@ -161,13 +177,21 @@ static int calculate_sums(GEQContext *geq, int plane, int w, int h) · 1 unmodified line
161 linesum += src16[xi + yi * linesize];177 linesum += src16[xi + yi * linesize];
162 geq->pixel_sums[plane][xi + yi * w] = linesum;178 geq->pixel_sums[plane][xi + yi * w] = linesum;
163 }179 }
164 } else {180 } else if (geq->bps == 8) {
165 double linesum = 0;181 double linesum = 0;
166 182
167 for (xi = 0; xi < w; xi ++) {183 for (xi = 0; xi < w; xi ++) {
168 linesum += src[xi + yi * linesize];184 linesum += src[xi + yi * linesize];
169 geq->pixel_sums[plane][xi + yi * w] = linesum;185 geq->pixel_sums[plane][xi + yi * w] = linesum;
170 }186 }
187 } else if (geq->bps == 32) {
188 const float *src32 = (const float*)src;
189 double linesum = 0;
190
191 for (xi = 0; xi < w; xi ++) {
192 linesum += src32[xi + yi * linesize];
193 geq->pixel_sums[plane][xi + yi * w] = linesum;
194 }
171 }195 }
172 if (yi)196 if (yi)
173 for (xi = 0; xi < w; xi ++) {197 for (xi = 0; xi < w; xi ++) {
@@ -249,8 +273,10 @@ static av_cold int geq_init(AVFilterContext *ctx) · 75 unmodified lines
249 if (!geq->expr_str[V]) geq->expr_str[V] = av_strdup(geq->expr_str[U]);273 if (!geq->expr_str[V]) geq->expr_str[V] = av_strdup(geq->expr_str[U]);
250 }274 }
251 275
252 if (!geq->expr_str[A]) {276 if (!geq->expr_str[A] && geq->bps != 32) {
253 geq->expr_str[A] = av_asprintf("%d", (1<<geq->bps) - 1);277 geq->expr_str[A] = av_asprintf("%d", (1<<geq->bps) - 1);
278 } else {
279 geq->expr_str[A] = av_asprintf("%f", 1.f);
254 }280 }
255 if (!geq->expr_str[G])281 if (!geq->expr_str[G])
256 geq->expr_str[G] = av_strdup("g(X,Y)");282 geq->expr_str[G] = av_strdup("g(X,Y)");
@@ -322,6 +348,7 @@ static int geq_query_formats(AVFilterContext *ctx) · 65 unmodified lines
322 AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV420P16,348 AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV420P16,
323 AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,349 AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
324 AV_PIX_FMT_GRAY16,350 AV_PIX_FMT_GRAY16,
351 AV_PIX_FMT_GRAYF32,
325 AV_PIX_FMT_NONE352 AV_PIX_FMT_NONE
326 };353 };
327 static const enum AVPixelFormat rgb_pix_fmts[] = {354 static const enum AVPixelFormat rgb_pix_fmts[] = {
@@ -331,6 +358,7 @@ static int geq_query_formats(AVFilterContext *ctx) · 3 unmodified lines
331 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12,358 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12,
332 AV_PIX_FMT_GBRP14,359 AV_PIX_FMT_GBRP14,
333 AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16,360 AV_PIX_FMT_GBRP16, AV_PIX_FMT_GBRAP16,
361 AV_PIX_FMT_GBRPF32, AV_PIX_FMT_GBRAPF32,
334 AV_PIX_FMT_NONE362 AV_PIX_FMT_NONE
335 };363 };
336 const enum AVPixelFormat *pix_fmts = geq->is_rgb ? rgb_pix_fmts : yuv_pix_fmts;364 const enum AVPixelFormat *pix_fmts = geq->is_rgb ? rgb_pix_fmts : yuv_pix_fmts;
@@ -390,7 +418,7 @@ static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_j · 53 unmodified lines
390 }418 }
391 ptr += linesize;419 ptr += linesize;
392 }420 }
393 } else {421 } else if (geq->bps <= 16) {
394 uint16_t *ptr16 = geq->dst16 + (linesize/2) * slice_start;422 uint16_t *ptr16 = geq->dst16 + (linesize/2) * slice_start;
395 for (y = slice_start; y < slice_end; y++) {423 for (y = slice_start; y < slice_end; y++) {
396 values[VAR_Y] = y;424 values[VAR_Y] = y;
@@ -400,6 +428,16 @@ static int slice_geq_filter(AVFilterContext *ctx, void *arg, int jobnr, int nb_j · 3 unmodified lines
400 }428 }
401 ptr16 += linesize/2;429 ptr16 += linesize/2;
402 }430 }
431 } else {
432 float *ptr32 = geq->dst32 + (linesize/4) * slice_start;
433 for (y = slice_start; y < slice_end; y++) {
434 values[VAR_Y] = y;
435 for (x = 0; x < width; x++) {
436 values[VAR_X] = x;
437 ptr32[x] = av_expr_eval(geq->e[plane][jobnr], values, geq);
438 }
439 ptr32 += linesize/4;
440 }
403 }441 }
404 442
405 return 0;443 return 0;
@@ -433,6 +471,7 @@ static int geq_filter_frame(AVFilterLink *inlink, AVFrame *in) · 27 unmodified lines
433 471
434 geq->dst = out->data[plane];472 geq->dst = out->data[plane];
435 geq->dst16 = (uint16_t*)out->data[plane];473 geq->dst16 = (uint16_t*)out->data[plane];
474 geq->dst32 = (float*)out->data[plane];
436 475
437 geq->values[VAR_W] = width;476 geq->values[VAR_W] = width;
438 geq->values[VAR_H] = height;477 geq->values[VAR_H] = height;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t