[FFmpeg-cvslog] yadif: support more than yuv420p.

James Darnley git at videolan.org
Wed Apr 27 03:56:14 CEST 2011


ffmpeg | branch: master | James Darnley <james.darnley at gmail.com> | Tue Apr  5 02:45:10 2011 +0200| [88312a4de3708cdd8f0ca4121546ec882777b7fa] | committer: Anton Khirnov

yadif: support more than yuv420p.

and correctly support grey8

Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=88312a4de3708cdd8f0ca4121546ec882777b7fa
---

 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 0396fe4..59b5ac7 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);
 



More information about the ffmpeg-cvslog mailing list