aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Darnley <james.darnley@gmail.com>2011-04-05 02:45:10 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-04-05 03:21:36 +0200
commit257ac5f1d64257ddc3763a3cd9c8d58d3546a2ca (patch)
tree176c840f7924aeaa79bf3dd9a1837944f2e0881e
parent8af3167bb6d32379c5575c67a5b88c82d5019cb4 (diff)
downloadffmpeg-257ac5f1d64257ddc3763a3cd9c8d58d3546a2ca.tar.gz
support more than yuv420p in yadif
(and correctly support grey8)
-rw-r--r--libavfilter/vf_yadif.c29
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);