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
7171 char *comp_expr_str[4];
7272 AVExpr *comp_expr[4];
7373 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);
7482 } PseudoColorContext;
7583
7684 #define OFFSET(x) offsetof(PseudoColorContext, x)
@@ -87,6 +95,8 @@ static const AVOption pseudocolor_options[] = { · 10 unmodified lines
8795
8896 static const enum AVPixelFormat pix_fmts[] = {
8997 AV_PIX_FMT_GRAY8,
98+ AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P,
99+ AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA422P,
90100 AV_PIX_FMT_YUV444P, AV_PIX_FMT_GBRP,
91101 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_GBRAP,
92102 AV_PIX_FMT_NONE
@@ -100,6 +110,139 @@ static int query_formats(AVFilterContext *ctx) · 7 unmodified lines
100110 return ff_set_common_formats(ctx, fmts_list);
101111 }
102112
113+static 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+
140+static 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+
166+static 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+
192+static 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+
219+static 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+
103246 static int config_input(AVFilterLink *inlink)
104247 {
105248 AVFilterContext *ctx = inlink->dst;
@@ -169,6 +312,46 @@ static int config_input(AVFilterLink *inlink) · 63 unmodified lines
169312 }
170313 }
171314
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+
172355 return 0;
173356 }
174357
@@ -178,7 +361,7 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 3 unmodified lines
178361 PseudoColorContext *s = ctx->priv;
179362 AVFilterLink *outlink = ctx->outputs[0];
180363 AVFrame *out;
181− int x, y, plane;
364+ int plane;
182365
183366 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
184367 if (!out) {
@@ -191,21 +374,13 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 6 unmodified lines
191374 const uint8_t *index = in->data[s->index];
192375 const uint8_t *src = in->data[plane];
193376 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];
194380
195− for (y = 0; y < s->height[plane]; y++) {
196− for (x = 0; x < s->width[plane]; x++) {
197− int v = s->lut[plane][index[x]];
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− }
381+ s->filter[plane](s->max, s->width[plane], s->height[plane],
382+ index, src, dst, ilinesize, slinesize,
383+ dlinesize, s->lut[plane]);
209384 }
210385
211386 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