diff options
author | James Darnley <james.darnley@gmail.com> | 2011-04-05 02:45:10 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-04-05 03:21:36 +0200 |
commit | 257ac5f1d64257ddc3763a3cd9c8d58d3546a2ca (patch) | |
tree | 176c840f7924aeaa79bf3dd9a1837944f2e0881e /libavfilter/vf_yadif.c | |
parent | 8af3167bb6d32379c5575c67a5b88c82d5019cb4 (diff) | |
download | ffmpeg-257ac5f1d64257ddc3763a3cd9c8d58d3546a2ca.tar.gz |
support more than yuv420p in yadif
(and correctly support grey8)
Diffstat (limited to 'libavfilter/vf_yadif.c')
-rw-r--r-- | libavfilter/vf_yadif.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/libavfilter/vf_yadif.c b/libavfilter/vf_yadif.c index 2494232033..52fd7dfa4c 100644 --- a/libavfilter/vf_yadif.c +++ b/libavfilter/vf_yadif.c @@ -20,6 +20,7 @@ #include "libavutil/cpu.h" #include "libavutil/common.h" +#include "libavutil/pixdesc.h" #include "avfilter.h" #include "yadif.h" @@ -51,6 +52,8 @@ typedef struct { void (*filter_line)(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode); + + const AVPixFmtDescriptor *csp; } YADIFContext; static void filter_line_c(uint8_t *dst, @@ -121,12 +124,17 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic, YADIFContext *yadif = ctx->priv; int y, i; - for (i = 0; i < 3; i++) { - int is_chroma = !!i; - int w = dstpic->video->w >> is_chroma; - int h = dstpic->video->h >> is_chroma; + for (i = 0; i < yadif->csp->nb_components; i++) { + int w = dstpic->video->w; + int h = dstpic->video->h; int refs = yadif->cur->linesize[i]; + if (i) { + /* Why is this not part of the per-plane description thing? */ + w >>= yadif->csp->log2_chroma_w; + h >>= yadif->csp->log2_chroma_h; + } + for (y = 0; y < h; y++) { if ((y ^ parity) & 1) { uint8_t *prev = &yadif->prev->data[i][y*refs]; @@ -181,6 +189,9 @@ static void return_frame(AVFilterContext *ctx, int is_second) yadif->out = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE | AV_PERM_REUSE, link->w, link->h); + if (!yadif->csp) + yadif->csp = &av_pix_fmt_descriptors[link->format]; + filter(ctx, yadif->out, tff ^ !is_second, tff); if (is_second) { @@ -292,7 +303,16 @@ static int query_formats(AVFilterContext *ctx) { static const enum PixelFormat pix_fmts[] = { PIX_FMT_YUV420P, + PIX_FMT_YUV422P, + PIX_FMT_YUV444P, + PIX_FMT_YUV410P, + PIX_FMT_YUV411P, PIX_FMT_GRAY8, + PIX_FMT_YUVJ420P, + PIX_FMT_YUVJ422P, + PIX_FMT_YUVJ444P, + PIX_FMT_YUV440P, + PIX_FMT_YUVJ440P, PIX_FMT_NONE }; @@ -308,6 +328,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque) yadif->mode = 0; yadif->parity = -1; + yadif->csp = NULL; if (args) sscanf(args, "%d:%d", &yadif->mode, &yadif->parity); |