History

avfilter/vf_pseudocolor: add support for some subsampled formats

Paul B Mahol committed 9 years ago

Commit f5361ee1 parent b8b84f91 file · +190 −15Browse files

Unified · Split

libavfilter/vf_pseudocolor.c+190−15
@@ -71,6 +71,14 @@ typedef struct PseudoColorContext { · 70 unmodified lines
71 char *comp_expr_str[4];71 char *comp_expr_str[4];
72 AVExpr *comp_expr[4];72 AVExpr *comp_expr[4];
73 float lut[4][256];73 float lut[4][256];
74
75 void (*filter[4])(int max, int width, int height,
76 const uint8_t *index, const uint8_t *src,
77 uint8_t *dst,
78 ptrdiff_t ilinesize,
79 ptrdiff_t slinesize,
80 ptrdiff_t dlinesize,
81 float *lut);
74} PseudoColorContext;82} PseudoColorContext;
75 83
76#define OFFSET(x) offsetof(PseudoColorContext, x)84#define OFFSET(x) offsetof(PseudoColorContext, x)
@@ -87,6 +95,8 @@ static const AVOption pseudocolor_options[] = { · 10 unmodified lines
87 95
88static const enum AVPixelFormat pix_fmts[] = {96static const enum AVPixelFormat pix_fmts[] = {
89 AV_PIX_FMT_GRAY8,97 AV_PIX_FMT_GRAY8,
98 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P,
99 AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P,
90 AV_PIX_FMT_YUV444P, AV_PIX_FMT_GBRP,100 AV_PIX_FMT_YUV444P, AV_PIX_FMT_GBRP,
91 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_GBRAP,101 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_GBRAP,
92 AV_PIX_FMT_NONE102 AV_PIX_FMT_NONE
@@ -100,6 +110,139 @@ static int query_formats(AVFilterContext *ctx) · 7 unmodified lines
100 return ff_set_common_formats(ctx, fmts_list);110 return ff_set_common_formats(ctx, fmts_list);
101}111}
102 112
113static void pseudocolor_filter(int max, int width, int height,
114 const uint8_t *index,
115 const uint8_t *src,
116 uint8_t *dst,
117 ptrdiff_t ilinesize,
118 ptrdiff_t slinesize,
119 ptrdiff_t dlinesize,
120 float *lut)
121{
122 int x, y;
123
124 for (y = 0; y < height; y++) {
125 for (x = 0; x < width; x++) {
126 int v = lut[index[x]];
127
128 if (v >= 0 && v <= max) {
129 dst[x] = v;
130 } else {
131 dst[x] = src[x];
132 }
133 }
134 index += ilinesize;
135 src += slinesize;
136 dst += dlinesize;
137 }
138}
139
140static void pseudocolor_filter_11(int max, int width, int height,
141 const uint8_t *index,
142 const uint8_t *src,
143 uint8_t *dst,
144 ptrdiff_t ilinesize,
145 ptrdiff_t slinesize,
146 ptrdiff_t dlinesize,
147 float *lut)
148{
149 int x, y;
150
151 for (y = 0; y < height; y++) {
152 for (x = 0; x < width; x++) {
153 int v = lut[index[(y << 1) * ilinesize + (x << 1)]];
154
155 if (v >= 0 && v <= max) {
156 dst[x] = v;
157 } else {
158 dst[x] = src[x];
159 }
160 }
161 src += slinesize;
162 dst += dlinesize;
163 }
164}
165
166static void pseudocolor_filter_11d(int max, int width, int height,
167 const uint8_t *index,
168 const uint8_t *src,
169 uint8_t *dst,
170 ptrdiff_t ilinesize,
171 ptrdiff_t slinesize,
172 ptrdiff_t dlinesize,
173 float *lut)
174{
175 int x, y;
176
177 for (y = 0; y < height; y++) {
178 for (x = 0; x < width; x++) {
179 int v = lut[index[(y >> 1) * ilinesize + (x >> 1)]];
180
181 if (v >= 0 && v <= max) {
182 dst[x] = v;
183 } else {
184 dst[x] = src[x];
185 }
186 }
187 src += slinesize;
188 dst += dlinesize;
189 }
190}
191
192static void pseudocolor_filter_10(int max, int width, int height,
193 const uint8_t *index,
194 const uint8_t *src,
195 uint8_t *dst,
196 ptrdiff_t ilinesize,
197 ptrdiff_t slinesize,
198 ptrdiff_t dlinesize,
199 float *lut)
200{
201 int x, y;
202
203 for (y = 0; y < height; y++) {
204 for (x = 0; x < width; x++) {
205 int v = lut[index[x << 1]];
206
207 if (v >= 0 && v <= max) {
208 dst[x] = v;
209 } else {
210 dst[x] = src[x];
211 }
212 }
213 index += ilinesize;
214 src += slinesize;
215 dst += dlinesize;
216 }
217}
218
219static void pseudocolor_filter_10d(int max, int width, int height,
220 const uint8_t *index,
221 const uint8_t *src,
222 uint8_t *dst,
223 ptrdiff_t ilinesize,
224 ptrdiff_t slinesize,
225 ptrdiff_t dlinesize,
226 float *lut)
227{
228 int x, y;
229
230 for (y = 0; y < height; y++) {
231 for (x = 0; x < width; x++) {
232 int v = lut[index[x >> 1]];
233
234 if (v >= 0 && v <= max) {
235 dst[x] = v;
236 } else {
237 dst[x] = src[x];
238 }
239 }
240 index += ilinesize;
241 src += slinesize;
242 dst += dlinesize;
243 }
244}
245
103static int config_input(AVFilterLink *inlink)246static int config_input(AVFilterLink *inlink)
104{247{
105 AVFilterContext *ctx = inlink->dst;248 AVFilterContext *ctx = inlink->dst;
@@ -169,6 +312,46 @@ static int config_input(AVFilterLink *inlink) · 63 unmodified lines
169 }312 }
170 }313 }
171 314
315 switch (inlink->format) {
316 case AV_PIX_FMT_YUV444P:
317 case AV_PIX_FMT_YUVA444P:
318 case AV_PIX_FMT_GBRP:
319 case AV_PIX_FMT_GBRAP:
320 case AV_PIX_FMT_GRAY8:
321 s->filter[0] = s->filter[1] = s->filter[2] = s->filter[3] = pseudocolor_filter;
322 break;
323 case AV_PIX_FMT_YUV420P:
324 case AV_PIX_FMT_YUVA420P:
325 switch (s->index) {
326 case 0:
327 case 3:
328 s->filter[0] = s->filter[3] = pseudocolor_filter;
329 s->filter[1] = s->filter[2] = pseudocolor_filter_11;
330 break;
331 case 1:
332 case 2:
333 s->filter[0] = s->filter[3] = pseudocolor_filter_11d;
334 s->filter[1] = s->filter[2] = pseudocolor_filter;
335 break;
336 }
337 break;
338 case AV_PIX_FMT_YUV422P:
339 case AV_PIX_FMT_YUVA422P:
340 switch (s->index) {
341 case 0:
342 case 3:
343 s->filter[0] = s->filter[3] = pseudocolor_filter;
344 s->filter[1] = s->filter[2] = pseudocolor_filter_10;
345 break;
346 case 1:
347 case 2:
348 s->filter[0] = s->filter[3] = pseudocolor_filter_10d;
349 s->filter[1] = s->filter[2] = pseudocolor_filter;
350 break;
351 }
352 break;
353 }
354
172 return 0;355 return 0;
173}356}
174 357
@@ -178,7 +361,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 3 unmodified lines
178 PseudoColorContext *s = ctx->priv;361 PseudoColorContext *s = ctx->priv;
179 AVFilterLink *outlink = ctx->outputs[0];362 AVFilterLink *outlink = ctx->outputs[0];
180 AVFrame *out;363 AVFrame *out;
181 int x, y, plane;364 int plane;
182 365
183 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);366 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
184 if (!out) {367 if (!out) {
@@ -191,21 +374,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 6 unmodified lines
191 const uint8_t *index = in->data[s->index];374 const uint8_t *index = in->data[s->index];
192 const uint8_t *src = in->data[plane];375 const uint8_t *src = in->data[plane];
193 uint8_t *dst = out->data[plane];376 uint8_t *dst = out->data[plane];
377 ptrdiff_t ilinesize = in->linesize[s->index];
378 ptrdiff_t slinesize = in->linesize[plane];
379 ptrdiff_t dlinesize = out->linesize[plane];
194 380
195 for (y = 0; y < s->height[plane]; y++) {381 s->filter[plane](s->max, s->width[plane], s->height[plane],
196 for (x = 0; x < s->width[plane]; x++) {382 index, src, dst, ilinesize, slinesize,
197 int v = s->lut[plane][index[x]];383 dlinesize, s->lut[plane]);
198
199 if (v >= 0 && v <= s->max) {
200 dst[x] = v;
201 } else {
202 dst[x] = src[x];
203 }
204 }
205 index += in->linesize[s->index];
206 src += in->linesize[plane];
207 dst += out->linesize[plane];
208 }
209 }384 }
210 385
211 av_frame_free(&in);386 av_frame_free(&in);

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