mirror of https://github.com/mpv-player/mpv
video/filter: kill vf_pp (libpostproc)
This is an ancient filter, and we assume it's not useful anymore. If you really want this, it's still available in libavfilter (e.g. via --vf=lavfi=[pp...]). The disadvantage is that mpv doesn't pass through QP information to libavfilter. (This was probably the reason vf_pp still was part of mpv - it was slightly easier to pass QP internally.)
This commit is contained in:
parent
8fc3d7dc39
commit
809936fdb9
150
DOCS/man/vf.rst
150
DOCS/man/vf.rst
|
@ -231,156 +231,6 @@ Available filters are:
|
|||
``<fmt>``
|
||||
Format name, e.g. rgb15, bgr24, 420p, etc. (default: 420p).
|
||||
|
||||
``pp=[filter string]``
|
||||
Enables the specified chain of post-processing subfilters. Subfilters must
|
||||
be separated by '/' and can be disabled by prepending a '-'. Each
|
||||
subfilter and some options have a short and a long name that can be used
|
||||
interchangeably, i.e. ``dr``/``dering`` are the same.
|
||||
|
||||
.. note::
|
||||
|
||||
Unlike in MPlayer or in earlier versions, you must quote the pp string
|
||||
if it contains ``:`` characters, e.g. ``'--vf=pp=[...]'``.
|
||||
|
||||
.. admonition:: Warning
|
||||
|
||||
This filter is most likely useless on modern HD video. It might be
|
||||
helpful with old low-resolution files.
|
||||
|
||||
All subfilters share common options to determine their scope:
|
||||
|
||||
``a/autoq``
|
||||
Automatically switch the subfilter off if the CPU is too slow.
|
||||
``c/chrom``
|
||||
Do chrominance filtering, too (default).
|
||||
``y/nochrom``
|
||||
Do luminance filtering only (no chrominance).
|
||||
``n/noluma``
|
||||
Do chrominance filtering only (no luminance).
|
||||
|
||||
.. note::
|
||||
|
||||
``--vf=pp:help`` shows a list of available subfilters.
|
||||
|
||||
Available subfilters are:
|
||||
|
||||
``hb/hdeblock[:difference[:flatness]]``
|
||||
horizontal deblocking filter
|
||||
|
||||
:<difference>: Difference factor where higher values mean more
|
||||
deblocking (default: 32).
|
||||
:<flatness>: Flatness threshold where lower values mean more
|
||||
deblocking (default: 39).
|
||||
|
||||
``vb/vdeblock[:difference[:flatness]]``
|
||||
vertical deblocking filter
|
||||
|
||||
:<difference>: Difference factor where higher values mean more
|
||||
deblocking (default: 32).
|
||||
:<flatness>: Flatness threshold where lower values mean more
|
||||
deblocking (default: 39).
|
||||
|
||||
``ha/hadeblock[:difference[:flatness]]``
|
||||
accurate horizontal deblocking filter
|
||||
|
||||
:<difference>: Difference factor where higher values mean more
|
||||
deblocking (default: 32).
|
||||
:<flatness>: Flatness threshold where lower values mean more
|
||||
deblocking (default: 39).
|
||||
|
||||
``va/vadeblock[:difference[:flatness]]``
|
||||
accurate vertical deblocking filter
|
||||
|
||||
:<difference>: Difference factor where higher values mean more
|
||||
deblocking (default: 32).
|
||||
:<flatness>: Flatness threshold where lower values mean more
|
||||
deblocking (default: 39).
|
||||
|
||||
The horizontal and vertical deblocking filters share the difference and
|
||||
flatness values so you cannot set different horizontal and vertical
|
||||
thresholds.
|
||||
|
||||
``h1/x1hdeblock``
|
||||
experimental horizontal deblocking filter
|
||||
|
||||
``v1/x1vdeblock``
|
||||
experimental vertical deblocking filter
|
||||
|
||||
``dr/dering``
|
||||
deringing filter
|
||||
|
||||
``tn/tmpnoise[:threshold1[:threshold2[:threshold3]]]``
|
||||
temporal noise reducer
|
||||
|
||||
:<threshold1>: larger -> stronger filtering
|
||||
:<threshold2>: larger -> stronger filtering
|
||||
:<threshold3>: larger -> stronger filtering
|
||||
|
||||
``al/autolevels[:f/fullyrange]``
|
||||
automatic brightness / contrast correction
|
||||
|
||||
:f/fullyrange: Stretch luminance to (0-255).
|
||||
|
||||
``lb/linblenddeint``
|
||||
Linear blend deinterlacing filter that deinterlaces the given block by
|
||||
filtering all lines with a (1 2 1) filter.
|
||||
|
||||
``li/linipoldeint``
|
||||
Linear interpolating deinterlacing filter that deinterlaces the given
|
||||
block by linearly interpolating every second line.
|
||||
|
||||
``ci/cubicipoldeint``
|
||||
Cubic interpolating deinterlacing filter deinterlaces the given block
|
||||
by cubically interpolating every second line.
|
||||
|
||||
``md/mediandeint``
|
||||
Median deinterlacing filter that deinterlaces the given block by
|
||||
applying a median filter to every second line.
|
||||
|
||||
``fd/ffmpegdeint``
|
||||
FFmpeg deinterlacing filter that deinterlaces the given block by
|
||||
filtering every second line with a (-1 4 2 4 -1) filter.
|
||||
|
||||
``l5/lowpass5``
|
||||
Vertically applied FIR low-pass deinterlacing filter that deinterlaces
|
||||
the given block by filtering all lines with a (-1 2 6 2 -1) filter.
|
||||
|
||||
``fq/forceQuant[:quantizer]``
|
||||
Overrides the quantizer table from the input with the constant
|
||||
quantizer you specify.
|
||||
|
||||
:<quantizer>: quantizer to use
|
||||
|
||||
``de/default``
|
||||
default pp filter combination (hb:a,vb:a,dr:a)
|
||||
|
||||
``fa/fast``
|
||||
fast pp filter combination (h1:a,v1:a,dr:a)
|
||||
|
||||
``ac``
|
||||
high quality pp filter combination (ha:a:128:7,va:a,dr:a)
|
||||
|
||||
.. note::
|
||||
|
||||
This filter is only available if FFmpeg/Libav has been compiled
|
||||
with libpostproc enabled.
|
||||
|
||||
.. admonition:: Examples
|
||||
|
||||
``--vf=pp=hb/vb/dr/al``
|
||||
horizontal and vertical deblocking, deringing and automatic
|
||||
brightness/contrast
|
||||
|
||||
``--vf=pp=de/-al``
|
||||
default filters without brightness/contrast correction
|
||||
|
||||
``--vf=pp=[default/tmpnoise:1:2:3]``
|
||||
Enable default filters & temporal denoiser.
|
||||
|
||||
``--vf=pp=[hb:y/vb:a]``
|
||||
Horizontal deblocking on luminance only, and switch vertical
|
||||
deblocking on or off automatically depending on available CPU time.
|
||||
|
||||
``lavfi=graph[:sws-flags[:o=opts]]``
|
||||
Filter video using FFmpeg's libavfilter.
|
||||
|
||||
|
|
|
@ -179,7 +179,6 @@ options_state_machine() {
|
|||
opt_yes_no _dvdnav "libdvdnav"
|
||||
opt_yes_no _enca "ENCA charset oracle library"
|
||||
opt_yes_no _libass "subtitle rendering with libass"
|
||||
opt_yes_no _libpostproc "postprocess filter (vf_pp)"
|
||||
opt_yes_no _libavdevice "libavdevice demuxers"
|
||||
opt_yes_no _libavfilter "libavfilter"
|
||||
opt_yes_no _jpeg "support for writing JPEG screenshots"
|
||||
|
@ -837,8 +836,6 @@ check_pkg_config "libavfilter" $_libavfilter LIBAVFILTER 'libavfilter >= 3.90.10
|
|||
|
||||
check_pkg_config "libavdevice" $_libavdevice LIBAVDEVICE 'libavdevice >= 54.0.0'
|
||||
|
||||
check_pkg_config "libpostproc" $_libpostproc LIBPOSTPROC 'libpostproc >= 52.0.0'
|
||||
|
||||
check_trivial "TV interface" $_tv TV
|
||||
|
||||
check_statement_libs "Video 4 Linux 2 TV interface" $_tv_v4l2 TV_V4L2 \
|
||||
|
|
|
@ -42,7 +42,6 @@ SOURCES-$(LIBASS) += sub/ass_mp.c sub/sd_ass.c \
|
|||
SOURCES-$(LIBBLURAY) += stream/stream_bluray.c
|
||||
SOURCES-$(LIBBS2B) += audio/filter/af_bs2b.c
|
||||
|
||||
SOURCES-$(LIBPOSTPROC) += video/filter/vf_pp.c
|
||||
SOURCES-$(LIBSMBCLIENT) += stream/stream_smb.c
|
||||
|
||||
SOURCES-$(MPG123) += audio/decode/ad_mpg123.c
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
|
||||
extern const vf_info_t vf_info_crop;
|
||||
extern const vf_info_t vf_info_expand;
|
||||
extern const vf_info_t vf_info_pp;
|
||||
extern const vf_info_t vf_info_scale;
|
||||
extern const vf_info_t vf_info_format;
|
||||
extern const vf_info_t vf_info_noformat;
|
||||
|
@ -86,9 +85,6 @@ static const vf_info_t *const filter_list[] = {
|
|||
&vf_info_rotate,
|
||||
&vf_info_mirror,
|
||||
|
||||
#if HAVE_LIBPOSTPROC
|
||||
&vf_info_pp,
|
||||
#endif
|
||||
#if HAVE_LIBAVFILTER
|
||||
&vf_info_lavfi,
|
||||
#endif
|
||||
|
|
|
@ -1,153 +0,0 @@
|
|||
/*
|
||||
* This file is part of MPlayer.
|
||||
*
|
||||
* MPlayer is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <libpostproc/postprocess.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "common/msg.h"
|
||||
#include "options/m_option.h"
|
||||
|
||||
#include "video/img_format.h"
|
||||
#include "video/mp_image.h"
|
||||
#include "vf.h"
|
||||
|
||||
struct vf_priv_s {
|
||||
int pp;
|
||||
pp_mode *ppMode[PP_QUALITY_MAX+1];
|
||||
void *context;
|
||||
char *arg;
|
||||
};
|
||||
|
||||
//===========================================================================//
|
||||
|
||||
static int config(struct vf_instance *vf,
|
||||
int width, int height, int d_width, int d_height,
|
||||
unsigned int voflags, unsigned int outfmt){
|
||||
int flags= PP_CPU_CAPS_AUTO;
|
||||
switch(outfmt){
|
||||
case IMGFMT_444P: flags|= PP_FORMAT_444; break;
|
||||
case IMGFMT_422P: flags|= PP_FORMAT_422; break;
|
||||
case IMGFMT_411P: flags|= PP_FORMAT_411; break;
|
||||
default: flags|= PP_FORMAT_420; break;
|
||||
}
|
||||
|
||||
if(vf->priv->context) pp_free_context(vf->priv->context);
|
||||
vf->priv->context= pp_get_context(width, height, flags);
|
||||
|
||||
return vf_next_config(vf,width,height,d_width,d_height,voflags,outfmt);
|
||||
}
|
||||
|
||||
static void uninit(struct vf_instance *vf){
|
||||
int i;
|
||||
for(i=0; i<=PP_QUALITY_MAX; i++){
|
||||
if(vf->priv->ppMode[i])
|
||||
pp_free_mode(vf->priv->ppMode[i]);
|
||||
}
|
||||
if(vf->priv->context) pp_free_context(vf->priv->context);
|
||||
}
|
||||
|
||||
static int query_format(struct vf_instance *vf, unsigned int fmt){
|
||||
switch(fmt){
|
||||
case IMGFMT_444P:
|
||||
case IMGFMT_422P:
|
||||
case IMGFMT_420P:
|
||||
case IMGFMT_411P: ;
|
||||
return vf_next_query_format(vf,fmt);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct mp_image *filter(struct vf_instance *vf, struct mp_image *mpi)
|
||||
{
|
||||
// pass-through if pp disabled
|
||||
if (!vf->priv->pp)
|
||||
return mpi;
|
||||
|
||||
bool non_local = vf->priv->pp & 0xFFFF;
|
||||
|
||||
struct mp_image *dmpi = mpi;
|
||||
if (!mp_image_is_writeable(mpi) || non_local) {
|
||||
dmpi = vf_alloc_out_image(vf);
|
||||
if (!dmpi)
|
||||
return NULL;
|
||||
mp_image_copy_attributes(dmpi, mpi);
|
||||
}
|
||||
|
||||
// apparently this is required
|
||||
assert(mpi->stride[0] >= ((mpi->w+7)&(~7)));
|
||||
|
||||
// do the postprocessing! (or copy if no DR)
|
||||
pp_postprocess((const uint8_t **)mpi->planes, mpi->stride,
|
||||
dmpi->planes,dmpi->stride,
|
||||
(mpi->w+7)&(~7),mpi->h,
|
||||
mpi->qscale, mpi->qstride,
|
||||
vf->priv->ppMode[ vf->priv->pp ], vf->priv->context,
|
||||
mpi->pict_type | (mpi->qscale_type ? PP_PICT_TYPE_QP2 : 0));
|
||||
|
||||
if (dmpi != mpi)
|
||||
talloc_free(mpi);
|
||||
return dmpi;
|
||||
}
|
||||
|
||||
static int vf_open(vf_instance_t *vf){
|
||||
int i;
|
||||
|
||||
vf->query_format=query_format;
|
||||
vf->config=config;
|
||||
vf->filter=filter;
|
||||
vf->uninit=uninit;
|
||||
|
||||
for(i=0; i<=PP_QUALITY_MAX; i++){
|
||||
vf->priv->ppMode[i]= pp_get_mode_by_name_and_quality(vf->priv->arg, i);
|
||||
if(vf->priv->ppMode[i]==NULL) return -1;
|
||||
}
|
||||
|
||||
vf->priv->pp=PP_QUALITY_MAX;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void print_help(struct mp_log *log)
|
||||
{
|
||||
mp_info(log, "%s", pp_help);
|
||||
mp_info(log,
|
||||
"Don't forget to quote the filter list, e.g.: '--vf=pp=[tn:64:128:256]'\n\n");
|
||||
}
|
||||
|
||||
#define OPT_BASE_STRUCT struct vf_priv_s
|
||||
const vf_info_t vf_info_pp = {
|
||||
.description = "postprocessing",
|
||||
.name = "pp",
|
||||
.open = vf_open,
|
||||
.print_help = print_help,
|
||||
.priv_size = sizeof(struct vf_priv_s),
|
||||
.priv_defaults = &(const struct vf_priv_s){
|
||||
.arg = "de",
|
||||
},
|
||||
.options = (const struct m_option[]){
|
||||
OPT_STRING("filters", arg, 0),
|
||||
{0}
|
||||
},
|
||||
};
|
||||
|
||||
//===========================================================================//
|
4
wscript
4
wscript
|
@ -424,10 +424,6 @@ Libav libraries ({0}). Aborting.".format(" ".join(libav_pkg_config_checks))
|
|||
'name': '--libavdevice',
|
||||
'desc': 'libavdevice',
|
||||
'func': check_pkg_config('libavdevice', '>= 54.0.0'),
|
||||
}, {
|
||||
'name': '--libpostproc',
|
||||
'desc': 'libpostproc',
|
||||
'func': check_pkg_config('libpostproc', '>= 52.2.100'),
|
||||
}, {
|
||||
'name': 'avcodec-metadata-update-side-data',
|
||||
'desc': 'libavcodec AV_PKT_DATA_METADATA_UPDATE side data type',
|
||||
|
|
|
@ -312,7 +312,6 @@ def build(ctx):
|
|||
( "video/filter/vf_noformat.c" ),
|
||||
( "video/filter/vf_noise.c" ),
|
||||
( "video/filter/vf_phase.c" ),
|
||||
( "video/filter/vf_pp.c", "libpostproc" ),
|
||||
( "video/filter/vf_pullup.c" ),
|
||||
( "video/filter/vf_rotate.c" ),
|
||||
( "video/filter/vf_scale.c" ),
|
||||
|
|
Loading…
Reference in New Issue