Data Structures | Macros | Enumerations | Functions | Variables
vf_mcdeint.c File Reference

Motion Compensation Deinterlacer Ported from MPlayer libmpcodecs/vf_mcdeint.c. More...

#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavcodec/avcodec.h"
#include "avfilter.h"
#include "formats.h"
#include "internal.h"

Go to the source code of this file.

Data Structures

struct  MCDeintContext


#define OFFSET(x)   offsetof(MCDeintContext, x)
#define CONST(name, help, val, unit)   { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
#define DELTA(j)   av_clip(j, -x, w-1-x)
#define GET_SCORE_EDGE(j)
#define GET_SCORE(j)
#define CHECK_EDGE(j)
#define CHECK(j)


enum  MCDeintMode {
enum  MCDeintParity { PARITY_TFF = 0, PARITY_BFF = 1 }


static int config_props (AVFilterLink *inlink)
static av_cold void uninit (AVFilterContext *ctx)
static int query_formats (AVFilterContext *ctx)
static int filter_frame (AVFilterLink *inlink, AVFrame *inpic)
 CHECK (-1) CHECK(-2)}}}}CHECK(1) CHECK(2)}}}}}if(diff0+diff1 > 0) temp-
 for (y=0;y< h;y++)
 if (ret< 0)
return ff_filter_frame (outlink, outpic)


static const AVOption mcdeint_options []
else temp = (diff0 + diff1 + FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2
filp = *dstp = temp > 255U ? ~(temp>>31) : temp
mcdeint parity = 1
end __pad0__
static const AVFilterPad mcdeint_inputs []
static const AVFilterPad mcdeint_outputs []
AVFilter ff_vf_mcdeint

Detailed Description

Motion Compensation Deinterlacer Ported from MPlayer libmpcodecs/vf_mcdeint.c.

Known Issues:

The motion estimation is somewhat at the mercy of the input, if the input frames are created purely based on spatial interpolation then for example a thin black line or another random and not interpolateable pattern will cause problems. Note: completely ignoring the "unavailable" lines during motion estimation did not look any better, so the most obvious solution would be to improve tfields or penalize problematic motion vectors.

If non iterative ME is used then snow currently ignores the OBMC window and as a result sometimes creates artifacts.

Only past frames are used, we should ideally use future frames too, something like filtering the whole movie in forward and then backward direction seems like an interesting idea but the current filter framework is FAR from supporting such things.

Combining the motion compensated image with the input image also is not as trivial as it seems, simple blindly taking even lines from one and odd ones from the other does not work at all as ME/MC sometimes has nothing in the previous frames which matches the current. The current algorithm has been found by trial and error and almost certainly can be improved...

Definition in file vf_mcdeint.c.

Macro Definition Documentation

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

Definition at line 81 of file vf_mcdeint.c.

Definition at line 82 of file vf_mcdeint.c.

#define CONST (   name,
)    { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }

Definition at line 83 of file vf_mcdeint.c.

#define DELTA (   j)    av_clip(j, -x, w-1-x)
#define GET_SCORE_EDGE (   j)
FFABS(srcp[-srcs+DELTA(-1+(j))] - srcp[+srcs+DELTA(-1-(j))])+\
FFABS(srcp[-srcs+DELTA(j) ] - srcp[+srcs+DELTA( -(j))])+\
FFABS(srcp[-srcs+DELTA(1+(j)) ] - srcp[+srcs+DELTA( 1-(j))])
#define DELTA(j)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72

Referenced by filter_frame().

#define GET_SCORE (   j)
FFABS(srcp[-srcs-1+(j)] - srcp[+srcs-1-(j)])+\
FFABS(srcp[-srcs +(j)] - srcp[+srcs -(j)])+\
FFABS(srcp[-srcs+1+(j)] - srcp[+srcs+1-(j)])
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
#define CHECK_EDGE (   j)
{ int score = GET_SCORE_EDGE(j);\
if (score < spatial_score){\
spatial_score = score;\
diff0 = filp[-fils+DELTA(j)] - srcp[-srcs+DELTA(j)];\
diff1 = filp[+fils+DELTA(-(j))] - srcp[+srcs+DELTA(-(j))];\
#define GET_SCORE_EDGE(j)
#define DELTA(j)
* filp
Definition: vf_mcdeint.c:260
if(ret< 0)
Definition: vf_mcdeint.c:282

Referenced by filter_frame().

#define CHECK (   j)
{ int score = GET_SCORE(j);\
if (score < spatial_score){\
spatial_score= score;\
diff0 = filp[-fils+(j)] - srcp[-srcs+(j)];\
diff1 = filp[+fils-(j)] - srcp[+srcs-(j)];\
#define GET_SCORE(j)
* filp
Definition: vf_mcdeint.c:260
if(ret< 0)
Definition: vf_mcdeint.c:282

Enumeration Type Documentation


Definition at line 59 of file vf_mcdeint.c.


top field first


bottom field first

Definition at line 67 of file vf_mcdeint.c.

Function Documentation

static int config_props ( AVFilterLink inlink)

Definition at line 102 of file vf_mcdeint.c.

static av_cold void uninit ( AVFilterContext ctx)

Definition at line 157 of file vf_mcdeint.c.

static int query_formats ( AVFilterContext ctx)

Definition at line 165 of file vf_mcdeint.c.

static int filter_frame ( AVFilterLink inlink,
AVFrame inpic 

Definition at line 176 of file vf_mcdeint.c.

CHECK ( 1)
for ( )

Definition at line 268 of file vf_mcdeint.c.

if ( )

Definition at line 282 of file vf_mcdeint.c.

return ff_filter_frame ( outlink  ,

Referenced by if().

Variable Documentation

const AVOption mcdeint_options[]
Initial value:
= {
{ "mode", "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=MODE_FAST}, 0, MODE_NB-1, FLAGS, .unit="mode" },
CONST("fast", NULL, MODE_FAST, "mode"),
CONST("medium", NULL, MODE_MEDIUM, "mode"),
CONST("slow", NULL, MODE_SLOW, "mode"),
CONST("extra_slow", NULL, MODE_EXTRA_SLOW, "mode"),
{ "parity", "set the assumed picture field parity", OFFSET(parity), AV_OPT_TYPE_INT, {.i64=PARITY_BFF}, -1, 1, FLAGS, "parity" },
CONST("tff", "assume top field first", PARITY_TFF, "parity"),
CONST("bff", "assume bottom field first", PARITY_BFF, "parity"),
{ "qp", "set qp", OFFSET(qp), AV_OPT_TYPE_INT, {.i64=1}, INT_MIN, INT_MAX, FLAGS },
{ NULL }
#define NULL
Definition: coverity.c:32
#define OFFSET(x)
Definition: vf_mcdeint.c:81
bottom field first
Definition: vf_mcdeint.c:69
#define CONST(name, help, val, unit)
Definition: vf_mcdeint.c:83
#define FLAGS
Definition: vf_mcdeint.c:82
mcdeint parity
Definition: vf_mcdeint.c:277
top field first
Definition: vf_mcdeint.c:68
Use these values in ebur128_init (or&#39;ed).
Definition: ebur128.h:83

Definition at line 85 of file vf_mcdeint.c.

Initial value:
int spatial_score = GET_SCORE(0) - 1
#define GET_SCORE(j)

Definition at line 249 of file vf_mcdeint.c.

else temp = (diff0 + diff1 + FFABS(FFABS(diff0) - FFABS(diff1)) / 2) / 2

Definition at line 259 of file vf_mcdeint.c.

Referenced by a64_compress_colram(), acb_search(), adpcm_decode_frame(), at1_subband_synthesis(), av_div_sf(), await_reference_row(), backward_filter(), bink_idct_c(), bink_idct_put_c(), bit8x8_c(), categorize_regions(), cbs_h2645_write_slice_data(), celt_frame_mdct(), comp_autocorr(), comp_interp_index(), config_input(), dct_max8x8_c(), dct_sad8x8_c(), decode_8_pulses_31bits(), decode_plane(), decode_rgb_frame_TMPL(), decompress_p(), decompress_p3(), encode_mode(), estimate_pitch(), ff_atrac_iqmf(), ff_avg_h264_qpel16_mc12_mmi(), ff_avg_h264_qpel16_mc21_mmi(), ff_avg_h264_qpel16_mc22_mmi(), ff_avg_h264_qpel16_mc23_mmi(), ff_avg_h264_qpel16_mc32_mmi(), ff_avg_h264_qpel8_mc12_mmi(), ff_avg_h264_qpel8_mc21_mmi(), ff_avg_h264_qpel8_mc22_mmi(), ff_avg_h264_qpel8_mc23_mmi(), ff_avg_h264_qpel8_mc32_mmi(), ff_block_permute(), ff_celt_bitalloc(), ff_ea_idct_put_c(), ff_faandct(), ff_faandct248(), ff_faanidct(), ff_faanidct_add(), ff_faanidct_put(), ff_g723_1_inverse_quant(), ff_h264_chroma422_dc_dequant_idct(), ff_h264_chroma422_dc_dequant_idct_8_mmi(), ff_h264_luma_dc_dequant_idct(), ff_mjpegenc_huffman_compute_bits(), ff_mkdir_p(), ff_put_h264_qpel16_mc12_mmi(), ff_put_h264_qpel16_mc21_mmi(), ff_put_h264_qpel16_mc22_mmi(), ff_put_h264_qpel16_mc23_mmi(), ff_put_h264_qpel16_mc32_mmi(), ff_put_h264_qpel8_mc12_mmi(), ff_put_h264_qpel8_mc21_mmi(), ff_put_h264_qpel8_mc22_mmi(), ff_put_h264_qpel8_mc23_mmi(), ff_put_h264_qpel8_mc32_mmi(), ff_put_wav_header(), ff_queue_destroy(), ff_vc1_inv_trans_8x8_dc_mmi(), ff_vorbis_inverse_coupling(), filter(), filter_frame(), find_new_headers(), flac_parse(), flac_parse_close(), formant_postfilter(), ftx_2d(), gain_scale(), gen_fcb_excitation(), get_fcb_param(), get_tilt_comp(), h261_loop_filter(), hadamard8_diff8x8_c(), hadamard8_intra8x8_c(), handle_file(), harmonic_filter(), harmonic_noise_sub(), horizontal_compose_daub97i_TMPL(), horizontal_compose_dirac53i_TMPL(), horizontal_compose_haar0i_TMPL(), horizontal_compose_haar1i_TMPL(), horizontal_compose_haari_TMPL(), http_write(), hybrid6_cx(), hypot(), idct(), idct_put(), idctRowCondDC(), imdct_and_windowing(), imdct_and_windowing_960(), imdct_and_windowing_eld(), ivr_read_header(), levinson_durbin(), lpc2lsp(), ls_encode_runterm(), ls_get_code_runterm(), magy_huffman_compute_bits(), main(), matroska_parse_laces(), pack_bitstream(), pgx_get_number(), postfilter(), pp_get_mode_by_name_and_quality(), qian_thresholding(), quant_psnr8x8_c(), queue_frame(), rd8x8_c(), read10in32_gray(), read16(), read32(), read_time(), render_slice(), rtmp_server_handshake(), rv34_idct_add_c(), rv34_inv_transform_noround_c(), sbc_unpack_frame(), sbr_gain_calc(), sbr_make_f_derived(), sbr_make_f_master(), scale_coefs(), set_noise_profile(), set_spdif(), setup_classifs(), simple_idct_add_msa(), simple_idct_msa(), simple_idct_put_msa(), soft_thresholding(), store_slice16_c(), store_slice2_c(), store_slice_c(), sub_acb_contrib(), sub_left_prediction(), svq1_encode_plane(), svq3_luma_dc_dequant_idct_c(), synth_percept_filter(), tta_encode_frame(), unpack_bitstream(), vc1_inv_trans_8x8_c(), and wavpack_encode_block().

* filp = *dstp = temp > 255U ? ~(temp>>31) : temp

Definition at line 260 of file vf_mcdeint.c.

Referenced by filter_frame().

mcdeint parity = 1
end __pad0__

Definition at line 280 of file vf_mcdeint.c.

av_frame_free& inpic

Definition at line 281 of file vf_mcdeint.c.

Referenced by filter_frame(), and for().

const AVFilterPad mcdeint_inputs[]
Initial value:
= {
.name = "default",
.filter_frame = filter_frame,
.config_props = config_props,
{ NULL }
#define NULL
Definition: coverity.c:32
static int config_props(AVFilterLink *inlink)
Definition: vf_mcdeint.c:102
static int filter_frame(AVFilterLink *inlink, AVFrame *inpic)
Definition: vf_mcdeint.c:176

Definition at line 289 of file vf_mcdeint.c.

const AVFilterPad mcdeint_outputs[]
Initial value:
= {
.name = "default",
{ NULL }
#define NULL
Definition: coverity.c:32

Definition at line 299 of file vf_mcdeint.c.

AVFilter ff_vf_mcdeint
Initial value:
= {
.name = "mcdeint",
.description = NULL_IF_CONFIG_SMALL("Apply motion compensating deinterlacing."),
.priv_size = sizeof(MCDeintContext),
.priv_class = &mcdeint_class,
static const AVFilterPad mcdeint_inputs[]
Definition: vf_mcdeint.c:289
static const AVFilterPad mcdeint_outputs[]
Definition: vf_mcdeint.c:299
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:117
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_mcdeint.c:157
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
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
static int query_formats(AVFilterContext *ctx)
Definition: vf_mcdeint.c:165

Definition at line 307 of file vf_mcdeint.c.