FFmpeg
Loading...
Searching...
No Matches
vf_fieldmatch.c File Reference

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

#include <inttypes.h>
#include "libavutil/avassert.h"
#include "libavutil/imgutils.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "libavutil/timestamp.h"
#include "avfilter.h"
#include "filters.h"
#include "formats.h"
#include "video.h"

Go to the source code of this file.

Data Structures

struct  FieldMatchContext
 

Macros

#define INPUT_MAIN   0
 
#define INPUT_CLEANSRC   1
 
#define OFFSET(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

 AVFILTER_DEFINE_CLASS (fieldmatch)
 
static int get_width (const FieldMatchContext *fm, const AVFrame *f, int plane, int input)
 
static int get_height (const FieldMatchContext *fm, const AVFrame *f, int plane, int input)
 
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.
 
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, int input)
 
static AVFramecreate_weave_frame (AVFilterContext *ctx, int match, int field, const AVFrame *prv, AVFrame *src, const AVFrame *nxt, int input)
 
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 activate (AVFilterContext *ctx)
 
static int query_formats (const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
 
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 int fxo0m [] = { mP, mC, mN, mB, mU }
 
static const int fxo1m [] = { mN, mC, mP, mU, mB }
 
static const AVFilterPad fieldmatch_outputs []
 
const FFFilter ff_vf_fieldmatch
 

Detailed Description

Fieldmatching filter, ported from VFM filter (VapourSynth) 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

◆ INPUT_MAIN

#define INPUT_MAIN   0

Definition at line 45 of file vf_fieldmatch.c.

◆ INPUT_CLEANSRC

#define INPUT_CLEANSRC   1

Definition at line 46 of file vf_fieldmatch.c.

◆ OFFSET

#define OFFSET ( x)
Value:

Definition at line 116 of file vf_fieldmatch.c.

◆ FLAGS

Definition at line 117 of file vf_fieldmatch.c.

◆ FILTER

#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
#define abs(x)

Referenced by calc_combed_score().

◆ HAS_FF_AROUND

#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)

Referenced by calc_combed_score().

◆ C_ARRAY_ADD

#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)

Referenced by calc_combed_score().

◆ VERTICAL_HALF

#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) \
C_ARRAY_ADD(1); \
cmkp += cmk_linesize; \
} \
} while (0)
#define width
Definition dsp.h:89

Referenced by calc_combed_score().

◆ LOAD_COMB

#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)
static AVFormatContext * ctx
#define INPUT_MAIN
Definition vf_decimate.c:28
static AVFrame * create_weave_frame(AVFilterContext *ctx, int match, int field, const AVFrame *prv, AVFrame *src, const AVFrame *nxt, int input)
static int calc_combed_score(const FieldMatchContext *fm, const AVFrame *src)

Referenced by checkmm().

◆ SLIDING_FRAME_WINDOW

#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) */ \
av_frame_free(&prv); \
prv = src; \
src = nxt; \
if (in) \
nxt = in; \
if (!prv) \
prv = src; \
if (!prv) /* received only one frame at that point */ \
return 0; \
av_assert0(prv && src && nxt); \
} while (0)
#define src
Definition vp8dsp.c:248

Referenced by filter_frame().

Enumeration Type Documentation

◆ fieldmatch_parity

Enumerator
FM_PARITY_AUTO 
FM_PARITY_BOTTOM 
FM_PARITY_TOP 

Definition at line 48 of file vf_fieldmatch.c.

◆ matching_mode

Enumerator
MODE_PC 
MODE_PC_N 
MODE_PC_U 
MODE_PC_N_UB 
MODE_PCN 
MODE_PCN_UB 
NB_MODE 

Definition at line 54 of file vf_fieldmatch.c.

◆ comb_matching_mode

Enumerator
COMBMATCH_NONE 
COMBMATCH_SC 
COMBMATCH_FULL 
NB_COMBMATCH 

Definition at line 64 of file vf_fieldmatch.c.

◆ comb_dbg

enum comb_dbg
Enumerator
COMBDBG_NONE 
COMBDBG_PCN 
COMBDBG_PCNUB 
NB_COMBDBG 

Definition at line 71 of file vf_fieldmatch.c.

◆ anonymous enum

anonymous enum
Enumerator
mP 
mC 
mN 
mB 
mU 

Definition at line 475 of file vf_fieldmatch.c.

Function Documentation

◆ AVFILTER_DEFINE_CLASS()

AVFILTER_DEFINE_CLASS ( fieldmatch )

◆ get_width()

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

Definition at line 158 of file vf_fieldmatch.c.

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

◆ get_height()

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

Definition at line 163 of file vf_fieldmatch.c.

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

◆ luma_abs_diff()

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

Definition at line 168 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ fill_buf()

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

Definition at line 188 of file vf_fieldmatch.c.

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

◆ calc_combed_score()

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

Definition at line 198 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ build_abs_diff_mask()

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 396 of file vf_fieldmatch.c.

Referenced by build_diff_map().

◆ 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 417 of file vf_fieldmatch.c.

Referenced by compare_fields().

◆ get_field_base()

static int get_field_base ( int match,
int field )
static

Definition at line 477 of file vf_fieldmatch.c.

Referenced by compare_fields().

◆ select_frame()

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

Definition at line 482 of file vf_fieldmatch.c.

Referenced by compare_fields().

◆ compare_fields()

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

Definition at line 489 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ copy_fields()

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

Definition at line 611 of file vf_fieldmatch.c.

Referenced by create_weave_frame().

◆ create_weave_frame()

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

Definition at line 624 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ checkmm()

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

Definition at line 651 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ filter_frame()

static int filter_frame ( AVFilterLink * inlink,
AVFrame * in )
static

Definition at line 679 of file vf_fieldmatch.c.

Referenced by activate().

◆ activate()

static int activate ( AVFilterContext * ctx)
static

Definition at line 850 of file vf_fieldmatch.c.

◆ query_formats()

static int query_formats ( const AVFilterContext * ctx,
AVFilterFormatsConfig ** cfg_in,
AVFilterFormatsConfig ** cfg_out )
static

Definition at line 901 of file vf_fieldmatch.c.

◆ config_input()

static int config_input ( AVFilterLink * inlink)
static

Definition at line 949 of file vf_fieldmatch.c.

◆ fieldmatch_init()

static av_cold int fieldmatch_init ( AVFilterContext * ctx)
static

Definition at line 985 of file vf_fieldmatch.c.

◆ fieldmatch_uninit()

static av_cold void fieldmatch_uninit ( AVFilterContext * ctx)
static

Definition at line 1019 of file vf_fieldmatch.c.

◆ config_output()

static int config_output ( AVFilterLink * outlink)
static

Definition at line 1039 of file vf_fieldmatch.c.

Variable Documentation

◆ fieldmatch_options

const AVOption fieldmatch_options[]
static

Definition at line 119 of file vf_fieldmatch.c.

◆ fxo0m

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

Definition at line 676 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ fxo1m

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

Definition at line 677 of file vf_fieldmatch.c.

Referenced by filter_frame().

◆ fieldmatch_outputs

const AVFilterPad fieldmatch_outputs[]
static
Initial value:
= {
{
.name = "default",
.config_props = config_output,
},
}
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
static int config_output(AVBitStreamFilterLink *outlink)

Definition at line 1058 of file vf_fieldmatch.c.

◆ ff_vf_fieldmatch

const FFFilter ff_vf_fieldmatch
Initial value:
= {
.p.name = "fieldmatch",
.p.description = NULL_IF_CONFIG_SMALL("Field matching for inverse telecine."),
.p.priv_class = &fieldmatch_class,
.priv_size = sizeof(FieldMatchContext),
}
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition aeval.c:246
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
#define AVFILTER_FLAG_DYNAMIC_INPUTS
The number of the filter inputs is not determined just by AVFilter.inputs.
Definition avfilter.h:155
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FILTER_QUERY_FUNC2(func)
Definition filters.h:241
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static av_cold void fieldmatch_uninit(AVFilterContext *ctx)
static const AVFilterPad fieldmatch_outputs[]
static av_cold int fieldmatch_init(AVFilterContext *ctx)

Definition at line 1066 of file vf_fieldmatch.c.