vf_fieldmatch.c File Reference

Fieldmatching filter, ported from VFM filter (VapouSsynth) by Clément. More...

#include <inttypes.h>
#include "libavutil/avassert.h"
#include "libavutil/imgutils.h"
#include "libavutil/opt.h"
#include "libavutil/timestamp.h"
#include "avfilter.h"
#include "internal.h"
Include dependency graph for vf_fieldmatch.c:

Go to the source code of this file.

Data Structures

struct  FieldMatchContext
 

Macros

#define INPUT_MAIN   0
 
#define INPUT_CLEANSRC   1
 
#define OFFSET(x)   offsetof(FieldMatchContext, x)
 
#define FLAGS   AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
 
#define FILTER(xm2, xm1, xp1, xp2)
 
#define HAS_FF_AROUND(p, lz)
 
#define C_ARRAY_ADD(v)
 
#define VERTICAL_HALF(y_start, y_end)
 
#define LOAD_COMB(mid)
 
#define SLIDING_FRAME_WINDOW(prv, src, nxt)
 

Enumerations

enum  fieldmatch_parity { FM_PARITY_AUTO = -1, FM_PARITY_BOTTOM = 0, FM_PARITY_TOP = 1 }
 
enum  matching_mode {
  MODE_PC, MODE_PC_N, MODE_PC_U, MODE_PC_N_UB,
  MODE_PCN, MODE_PCN_UB, NB_MODE
}
 
enum  comb_matching_mode { COMBMATCH_NONE, COMBMATCH_SC, COMBMATCH_FULL, NB_COMBMATCH }
 
enum  comb_dbg { COMBDBG_NONE, COMBDBG_PCN, COMBDBG_PCNUB, NB_COMBDBG }
 
enum  {
  mP, mC, mN, mB,
  mU
}
 

Functions

static int get_width (const FieldMatchContext *fm, const AVFrame *f, int plane)
 
static int get_height (const FieldMatchContext *fm, const AVFrame *f, int plane)
 
static int64_t luma_abs_diff (const AVFrame *f1, const AVFrame *f2)
 
static void fill_buf (uint8_t *data, int w, int h, int linesize, uint8_t v)
 
static int calc_combed_score (const FieldMatchContext *fm, const AVFrame *src)
 
static void build_abs_diff_mask (const uint8_t *prvp, int prv_linesize, const uint8_t *nxtp, int nxt_linesize, uint8_t *tbuffer, int tbuf_linesize, int width, int height)
 
static void build_diff_map (FieldMatchContext *fm, const uint8_t *prvp, int prv_linesize, const uint8_t *nxtp, int nxt_linesize, uint8_t *dstp, int dst_linesize, int height, int width, int plane)
 Build a map over which pixels differ a lot/a little. More...
 
static int get_field_base (int match, int field)
 
static AVFrameselect_frame (FieldMatchContext *fm, int match)
 
static int compare_fields (FieldMatchContext *fm, int match1, int match2, int field)
 
static void copy_fields (const FieldMatchContext *fm, AVFrame *dst, const AVFrame *src, int field)
 
static AVFramecreate_weave_frame (AVFilterContext *ctx, int match, int field, const AVFrame *prv, AVFrame *src, const AVFrame *nxt)
 
static int checkmm (AVFilterContext *ctx, int *combs, int m1, int m2, AVFrame **gen_frames, int field)
 
static int filter_frame (AVFilterLink *inlink, AVFrame *in)
 
static int request_inlink (AVFilterContext *ctx, int lid)
 
static int request_frame (AVFilterLink *outlink)
 
static int query_formats (AVFilterContext *ctx)
 
static int config_input (AVFilterLink *inlink)
 
static av_cold int fieldmatch_init (AVFilterContext *ctx)
 
static av_cold void fieldmatch_uninit (AVFilterContext *ctx)
 
static int config_output (AVFilterLink *outlink)
 

Variables

static const AVOption fieldmatch_options []
 
static const AVClass fieldmatch_class = { .class_name = "fieldmatch", .item_name = av_default_item_name, .option = fieldmatch_options, .version = LIBAVUTIL_VERSION_INT, .category = AV_CLASS_CATEGORY_FILTER, }
 
static const int fxo0m [] = { mP, mC, mN, mB, mU }
 
static const int fxo1m [] = { mN, mC, mP, mU, mB }
 
static const AVFilterPad fieldmatch_outputs []
 
AVFilter avfilter_vf_fieldmatch
 

Detailed Description

Fieldmatching filter, ported from VFM filter (VapouSsynth) by Clément.

Fredrik Mellbin is the author of the VIVTC/VFM filter, which is itself a light clone of the TIVTC/TFM (AviSynth) filter written by Kevin Stone (tritical), the original author.

See also
http://bengal.missouri.edu/~kes25c/
http://www.vapoursynth.com/about/

Definition in file vf_fieldmatch.c.

Macro Definition Documentation

#define C_ARRAY_ADD (   v)
Value:
do { \
const int box1 = (x / blockx) * 4; \
const int box2 = ((x + xhalf) / blockx) * 4; \
c_array[temp1 + box1 ] += v; \
c_array[temp1 + box2 + 1] += v; \
c_array[temp2 + box1 + 2] += v; \
c_array[temp2 + box2 + 3] += v; \
} while (0)
float v
Discrete Time axis x

Referenced by calc_combed_score().

#define FILTER (   xm2,
  xm1,
  xp1,
  xp2 
)
Value:
abs( 4 * srcp[x] \
-3 * (srcp[x + (xm1)*src_linesize] + srcp[x + (xp1)*src_linesize]) \
+ (srcp[x + (xm2)*src_linesize] + srcp[x + (xp2)*src_linesize])) > cthresh6
BYTE int const BYTE * srcp
Definition: avisynth_c.h:713
Discrete Time axis x

Referenced by calc_combed_score().

Definition at line 114 of file vf_fieldmatch.c.

#define HAS_FF_AROUND (   p,
  lz 
)
Value:
(p[x-1 - lz] == 0xff || p[x - lz] == 0xff || p[x+1 - lz] == 0xff || \
p[x-1 ] == 0xff || p[x+1 ] == 0xff || \
p[x-1 + lz] == 0xff || p[x + lz] == 0xff || p[x+1 + lz] == 0xff)
Discrete Time axis x

Referenced by calc_combed_score().

#define INPUT_CLEANSRC   1

Definition at line 43 of file vf_fieldmatch.c.

Referenced by config_output(), fieldmatch_init(), filter_frame(), and request_frame().

#define INPUT_MAIN   0

Definition at line 42 of file vf_fieldmatch.c.

Referenced by config_output(), fieldmatch_init(), filter_frame(), and request_frame().

#define LOAD_COMB (   mid)
Value:
do { \
if (combs[mid] < 0) { \
if (!gen_frames[mid]) \
gen_frames[mid] = create_weave_frame(ctx, mid, field, \
fm->prv, fm->src, fm->nxt); \
combs[mid] = calc_combed_score(fm, gen_frames[mid]); \
} \
} while (0)
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
static AVFrame * create_weave_frame(AVFilterContext *ctx, int match, int field, const AVFrame *prv, AVFrame *src, const AVFrame *nxt)
static int calc_combed_score(const FieldMatchContext *fm, const AVFrame *src)

Referenced by checkmm().

#define OFFSET (   x)    offsetof(FieldMatchContext, x)

Definition at line 113 of file vf_fieldmatch.c.

#define SLIDING_FRAME_WINDOW (   prv,
  src,
  nxt 
)
Value:
do { \
if (prv != src) /* 2nd loop exception (1st has prv==src and we don't want to loose src) */ \
prv = src; \
src = nxt; \
if (in) \
nxt = in; \
if (!prv) \
prv = src; \
if (!prv) /* received only one frame at that point */ \
av_assert0(prv && src && nxt); \
} while (0)
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AVS_Value src
Definition: avisynth_c.h:523
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:108
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame This method is called when a frame is wanted on an output For an it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return it should return

Referenced by filter_frame().

#define VERTICAL_HALF (   y_start,
  y_end 
)
Value:
do { \
for (y = y_start; y < y_end; y++) { \
const int temp1 = (y / blocky) * xblocks4; \
const int temp2 = ((y + yhalf) / blocky) * xblocks4; \
for (x = 0; x < width; x++) \
if (cmkp[x - cmk_linesize] == 0xff && \
cmkp[x ] == 0xff && \
cmkp[x + cmk_linesize] == 0xff) \
cmkp += cmk_linesize; \
} \
} while (0)
Discrete Time axis x
#define C_ARRAY_ADD(v)
static int width
Definition: tests/utils.c:158
for(i=0;i< h;i++)
Definition: hpel_template.c:97
function y
Definition: D.m:1

Referenced by calc_combed_score().

Enumeration Type Documentation

anonymous enum
Enumerator
mP 
mC 
mN 
mB 
mU 

Definition at line 472 of file vf_fieldmatch.c.

enum comb_dbg
Enumerator
COMBDBG_NONE 
COMBDBG_PCN 
COMBDBG_PCNUB 
NB_COMBDBG 

Definition at line 68 of file vf_fieldmatch.c.

Enumerator
COMBMATCH_NONE 
COMBMATCH_SC 
COMBMATCH_FULL 
NB_COMBMATCH 

Definition at line 61 of file vf_fieldmatch.c.

Enumerator
FM_PARITY_AUTO 
FM_PARITY_BOTTOM 
FM_PARITY_TOP 

Definition at line 45 of file vf_fieldmatch.c.

Enumerator
MODE_PC 
MODE_PC_N 
MODE_PC_U 
MODE_PC_N_UB 
MODE_PCN 
MODE_PCN_UB 
NB_MODE 

Definition at line 51 of file vf_fieldmatch.c.

Function Documentation

static void build_abs_diff_mask ( const uint8_t *  prvp,
int  prv_linesize,
const uint8_t *  nxtp,
int  nxt_linesize,
uint8_t *  tbuffer,
int  tbuf_linesize,
int  width,
int  height 
)
static

Definition at line 393 of file vf_fieldmatch.c.

Referenced by build_diff_map().

static void build_diff_map ( FieldMatchContext fm,
const uint8_t *  prvp,
int  prv_linesize,
const uint8_t *  nxtp,
int  nxt_linesize,
uint8_t *  dstp,
int  dst_linesize,
int  height,
int  width,
int  plane 
)
static

Build a map over which pixels differ a lot/a little.

Definition at line 414 of file vf_fieldmatch.c.

Referenced by compare_fields().

static int calc_combed_score ( const FieldMatchContext fm,
const AVFrame src 
)
static

Definition at line 195 of file vf_fieldmatch.c.

Referenced by filter_frame().

static int checkmm ( AVFilterContext ctx,
int *  combs,
int  m1,
int  m2,
AVFrame **  gen_frames,
int  field 
)
static

Definition at line 645 of file vf_fieldmatch.c.

Referenced by filter_frame().

static int compare_fields ( FieldMatchContext fm,
int  match1,
int  match2,
int  field 
)
static

Definition at line 486 of file vf_fieldmatch.c.

Referenced by filter_frame().

static int config_input ( AVFilterLink inlink)
static

Definition at line 864 of file vf_fieldmatch.c.

Referenced by fieldmatch_init().

static int config_output ( AVFilterLink outlink)
static

Definition at line 949 of file vf_fieldmatch.c.

static void copy_fields ( const FieldMatchContext fm,
AVFrame dst,
const AVFrame src,
int  field 
)
static

Definition at line 608 of file vf_fieldmatch.c.

Referenced by create_weave_frame().

static AVFrame* create_weave_frame ( AVFilterContext ctx,
int  match,
int  field,
const AVFrame prv,
AVFrame src,
const AVFrame nxt 
)
static

Definition at line 618 of file vf_fieldmatch.c.

Referenced by filter_frame().

static av_cold int fieldmatch_init ( AVFilterContext ctx)
static

Definition at line 895 of file vf_fieldmatch.c.

static av_cold void fieldmatch_uninit ( AVFilterContext ctx)
static

Definition at line 931 of file vf_fieldmatch.c.

static void fill_buf ( uint8_t *  data,
int  w,
int  h,
int  linesize,
uint8_t  v 
)
static

Definition at line 185 of file vf_fieldmatch.c.

Referenced by calc_combed_score(), and compare_fields().

static int filter_frame ( AVFilterLink inlink,
AVFrame in 
)
static

Definition at line 672 of file vf_fieldmatch.c.

Referenced by fieldmatch_init(), and request_inlink().

static int get_field_base ( int  match,
int  field 
)
static

Definition at line 474 of file vf_fieldmatch.c.

Referenced by compare_fields().

static int get_height ( const FieldMatchContext fm,
const AVFrame f,
int  plane 
)
static

Definition at line 160 of file vf_fieldmatch.c.

Referenced by calc_combed_score(), compare_fields(), and copy_fields().

static int get_width ( const FieldMatchContext fm,
const AVFrame f,
int  plane 
)
static

Definition at line 155 of file vf_fieldmatch.c.

Referenced by calc_combed_score(), compare_fields(), and copy_fields().

static int64_t luma_abs_diff ( const AVFrame f1,
const AVFrame f2 
)
static

Definition at line 165 of file vf_fieldmatch.c.

Referenced by filter_frame().

static int query_formats ( AVFilterContext ctx)
static

Definition at line 852 of file vf_fieldmatch.c.

static int request_frame ( AVFilterLink outlink)
static

Definition at line 836 of file vf_fieldmatch.c.

static int request_inlink ( AVFilterContext ctx,
int  lid 
)
static

Definition at line 820 of file vf_fieldmatch.c.

Referenced by request_frame().

static AVFrame* select_frame ( FieldMatchContext fm,
int  match 
)
static

Definition at line 479 of file vf_fieldmatch.c.

Referenced by compare_fields().

Variable Documentation

AVFilter avfilter_vf_fieldmatch
Initial value:
= {
.name = "fieldmatch",
.description = NULL_IF_CONFIG_SMALL("Field matching for inverse telecine."),
.query_formats = query_formats,
.priv_size = sizeof(FieldMatchContext),
.priv_class = &fieldmatch_class,
.flags = (1 << 0) ,
}
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:117
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static const AVClass fieldmatch_class
static av_cold int uninit(AVCodecContext *avctx)
Definition: crystalhd.c:334
static av_cold int fieldmatch_init(AVFilterContext *ctx)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static const AVFilterPad fieldmatch_outputs[]
NULL
Definition: eval.c:55
static int flags
Definition: cpu.c:23
static int query_formats(AVFilterContext *ctx)
static av_cold void fieldmatch_uninit(AVFilterContext *ctx)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs

Definition at line 975 of file vf_fieldmatch.c.

const AVClass fieldmatch_class = { .class_name = "fieldmatch", .item_name = av_default_item_name, .option = fieldmatch_options, .version = LIBAVUTIL_VERSION_INT, .category = AV_CLASS_CATEGORY_FILTER, }
static

Definition at line 153 of file vf_fieldmatch.c.

const AVOption fieldmatch_options[]
static

Definition at line 116 of file vf_fieldmatch.c.

const AVFilterPad fieldmatch_outputs[]
static
Initial value:
= {
{
.name = "default",
.request_frame = request_frame,
.config_props = config_output,
},
{ NULL }
}
static int config_output(AVFilterLink *outlink)
static int request_frame(AVFilterLink *outlink)
NULL
Definition: eval.c:55

Definition at line 965 of file vf_fieldmatch.c.

const int fxo0m[] = { mP, mC, mN, mB, mU }
static

Definition at line 669 of file vf_fieldmatch.c.

Referenced by filter_frame().

const int fxo1m[] = { mN, mC, mP, mU, mB }
static

Definition at line 670 of file vf_fieldmatch.c.

Referenced by filter_frame().