[MPlayer-dev-eng] [PATCH] Field-reordering filter

Steinar H. Gunderson sgunderson at bigfoot.com
Sat Jan 9 12:23:23 CET 2010


Hi,

Here's a dead simple filter to switch TFF material to BFF or vice versa --
it uses the standard editing trick of shifting the entire frame one line up.
It's different from the phase filter in that it's not intended to correct
a miscapture; thus, it preserves frame boundaries (keeping the same two
fields together all the time) and doesn't cause any A/V delay.

I've usually done this with a combination of expand and crop, but with recent
mplayer it seems some 4:2:0 format is chosen for my encoding pipeline, which
ruins that completely (the Y crop offset of 1 gets rounded to 0). This filter
doesn't have any such restrictions; even for 4:2:0 (given MPEG-2-style
chroma packing) I think it should be right just to shift one line. (Or, hmm,
perhaps I need to filter?) Also, it's obviously simpler to specify “-vf
freorder” than expand and crop after each other.

/* Steinar */

diff -Nur orig/mplayer-export-2010-01-02/DOCS/man/en/mplayer.1 mplayer-export-2010-01-02/DOCS/man/en/mplayer.1
--- orig/mplayer-export-2010-01-02/DOCS/man/en/mplayer.1	2009-12-29 14:43:03.000000000 +0100
+++ mplayer-export-2010-01-02/DOCS/man/en/mplayer.1	2010-01-09 02:49:37.000000000 +0100
@@ -6995,6 +6995,17 @@
 .RE
 .
 .TP
+.B freorder
+Switch the field order of interlaced video (top-field-first to bottom-field-first
+or vice versa) by shifting the entire frame one line up. This is useful when
+you have BFF video (for instance, from DV tape) and want to encode using a codec
+that only understands TFF, when combining BFF and TFF mateiral, or when flipping
+video or playing it backwards. Unlike the phase filter, this filter does not delay
+the stream by one field (1/50s = 20ms for PAL video), but it introduces a
+one-line black border at the bottom.
+.RE
+.
+.TP
 .B telecine[=start]
 Apply 3:2 'telecine' process to increase framerate by 20%.
 This most likely will not work correctly with MPlayer, but it can
diff -Nur orig/mplayer-export-2010-01-02/libmpcodecs/vf.c mplayer-export-2010-01-02/libmpcodecs/vf.c
--- orig/mplayer-export-2010-01-02/libmpcodecs/vf.c	2010-01-01 00:09:35.000000000 +0100
+++ mplayer-export-2010-01-02/libmpcodecs/vf.c	2010-01-09 02:37:29.000000000 +0100
@@ -100,6 +100,7 @@
 extern const vf_info_t vf_info_blackframe;
 extern const vf_info_t vf_info_geq;
 extern const vf_info_t vf_info_ow;
+extern const vf_info_t vf_info_freorder;
 
 // list of available filters:
 static const vf_info_t* const filter_list[]={
@@ -193,6 +194,7 @@
     &vf_info_yadif,
     &vf_info_blackframe,
     &vf_info_ow,
+    &vf_info_freorder,
     NULL
 };
 
diff -Nur orig/mplayer-export-2010-01-02/libmpcodecs/vf_freorder.c mplayer-export-2010-01-02/libmpcodecs/vf_freorder.c
--- orig/mplayer-export-2010-01-02/libmpcodecs/vf_freorder.c	1970-01-01 01:00:00.000000000 +0100
+++ mplayer-export-2010-01-02/libmpcodecs/vf_freorder.c	2010-01-09 12:17:35.000000000 +0100
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "config.h"
+#include "mp_msg.h"
+#include "help_mp.h"
+
+#include "img_format.h"
+#include "mp_image.h"
+#include "vf.h"
+
+#include "libvo/fastmemcpy.h"
+#include "libavutil/avutil.h"
+
+#include "m_option.h"
+#include "m_struct.h"
+
+static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts) {
+    vf->dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, mpi->w, mpi->h);
+    vf->dmpi->fields = mpi->fields ^ MP_IMGFIELD_TOP_FIRST;
+
+    memcpy_pic(vf->dmpi->planes[0], mpi->planes[0] + mpi->stride[0],
+               mpi->w, mpi->h - 1,
+               vf->dmpi->stride[0], mpi->stride[0]);
+    if (mpi->flags & MP_IMGFLAG_PLANAR) {
+        memcpy_pic(vf->dmpi->planes[1], mpi->planes[1] + mpi->stride[1],
+                   mpi->w, mpi->h - 1,
+                   vf->dmpi->stride[1], mpi->stride[1]);
+        memcpy_pic(vf->dmpi->planes[2], mpi->planes[2] + mpi->stride[2],
+                   mpi->w, mpi->h - 1,
+                   vf->dmpi->stride[2], mpi->stride[2]);
+    } else {
+	vf->dmpi->planes[1] = mpi->planes[1];  // Pass palette through.
+    }
+    return vf_next_put_image(vf,vf->dmpi, pts);
+}
+
+static int open(vf_instance_t *vf, char* args){
+    vf->put_image = put_image;
+    mp_msg(MSGT_VFILTER, MSGL_INFO, "Switch field orders\n");
+    return 1;
+}
+
+const vf_info_t vf_info_freorder = {
+    "switch field order (TFF->BFF or vice versa)",
+    "freorder",
+    "Steinar H. Gunderson",
+    "",
+    open,
+    NULL
+};
diff -Nur orig/mplayer-export-2010-01-02/Makefile mplayer-export-2010-01-02/Makefile
--- orig/mplayer-export-2010-01-02/Makefile	2009-12-31 19:25:35.000000000 +0100
+++ mplayer-export-2010-01-02/Makefile	2010-01-09 01:57:43.000000000 +0100
@@ -312,6 +312,7 @@
                                         loader/dshow/DS_VideoDecoder.c \
                                         loader/dshow/allocator.c \
                                         loader/dshow/cmediasample.c \
+                                        loader/dshow/graph.c \
                                         loader/dshow/guids.c \
                                         loader/dshow/inputpin.c \
                                         loader/dshow/mediatype.c \
@@ -422,6 +423,7 @@
               libmpcodecs/vf_flip.c \
               libmpcodecs/vf_format.c \
               libmpcodecs/vf_framestep.c \
+              libmpcodecs/vf_freorder.c \
               libmpcodecs/vf_gradfun.c \
               libmpcodecs/vf_halfpack.c \
               libmpcodecs/vf_harddup.c \
-- 
Homepage: http://www.sesse.net/



More information about the MPlayer-dev-eng mailing list