summaryrefslogtreecommitdiffstats
path: root/video/filter
diff options
context:
space:
mode:
Diffstat (limited to 'video/filter')
-rw-r--r--video/filter/vf.c49
-rw-r--r--video/filter/vf.h6
-rw-r--r--video/filter/vf_vo.c96
3 files changed, 34 insertions, 117 deletions
diff --git a/video/filter/vf.c b/video/filter/vf.c
index 1345826e57..69d5b29137 100644
--- a/video/filter/vf.c
+++ b/video/filter/vf.c
@@ -39,7 +39,6 @@
#include "video/memcpy_pic.h"
-extern const vf_info_t vf_info_vo;
extern const vf_info_t vf_info_crop;
extern const vf_info_t vf_info_expand;
extern const vf_info_t vf_info_pp;
@@ -75,7 +74,6 @@ static const vf_info_t *const filter_list[] = {
&vf_info_crop,
&vf_info_expand,
&vf_info_scale,
- &vf_info_vo,
&vf_info_format,
&vf_info_noformat,
&vf_info_flip,
@@ -259,19 +257,17 @@ error:
static vf_instance_t *vf_open_filter(struct vf_chain *c, const char *name,
char **args)
{
- if (strcmp(name, "vo") != 0) {
- int i, l = 0;
- for (i = 0; args && args[2 * i]; i++)
- l += 1 + strlen(args[2 * i]) + 1 + strlen(args[2 * i + 1]);
- l += strlen(name);
- char str[l + 1];
- char *p = str;
- p += sprintf(str, "%s", name);
- for (i = 0; args && args[2 * i]; i++)
- p += sprintf(p, " %s=%s", args[2 * i], args[2 * i + 1]);
- mp_msg(MSGT_VFILTER, MSGL_INFO, "%s[%s]\n",
- "Opening video filter: ", str);
- }
+ int i, l = 0;
+ for (i = 0; args && args[2 * i]; i++)
+ l += 1 + strlen(args[2 * i]) + 1 + strlen(args[2 * i + 1]);
+ l += strlen(name);
+ char str[l + 1];
+ char *p = str;
+ p += sprintf(str, "%s", name);
+ for (i = 0; args && args[2 * i]; i++)
+ p += sprintf(p, " %s=%s", args[2 * i], args[2 * i + 1]);
+ mp_msg(MSGT_VFILTER, MSGL_INFO, "%s[%s]\n",
+ "Opening video filter: ", str);
return vf_open(c, name, args);
}
@@ -280,7 +276,7 @@ struct vf_instance *vf_append_filter(struct vf_chain *c, const char *name,
{
struct vf_instance *vf = vf_open_filter(c, name, args);
if (vf) {
- // Insert it before the last filter, which is the "vo" filter
+ // Insert it before the last filter, which is the "out" pseudo-filter
// (But after the "in" pseudo-filter)
struct vf_instance **pprev = &c->first->next;
while (*pprev && (*pprev)->next)
@@ -309,9 +305,7 @@ int vf_append_filter_list(struct vf_chain *c, struct m_obj_settings *list)
void vf_add_output_frame(struct vf_instance *vf, struct mp_image *img)
{
if (img) {
- // vf_vo doesn't have output config
- if (vf->fmt_out.imgfmt)
- vf_fix_img_params(img, &vf->fmt_out);
+ vf_fix_img_params(img, &vf->fmt_out);
MP_TARRAY_APPEND(vf, vf->out_queued, vf->num_out_queued, img);
}
}
@@ -508,6 +502,8 @@ int vf_reconfig(struct vf_chain *c, const struct mp_image_params *params)
break;
cur = vf->fmt_out;
}
+ if (r >= 0)
+ c->output_params = cur;
c->initialized = r < 0 ? -1 : 1;
int loglevel = r < 0 ? MSGL_WARN : MSGL_V;
if (r == -2)
@@ -544,6 +540,14 @@ static int input_query_format(struct vf_instance *vf, unsigned int fmt)
return 0;
}
+static int output_query_format(struct vf_instance *vf, unsigned int fmt)
+{
+ struct vf_chain *c = (void *)vf->priv;
+ if (fmt >= IMGFMT_START && fmt < IMGFMT_END)
+ return c->allowed_output_formats[fmt - IMGFMT_START];
+ return 0;
+}
+
struct vf_chain *vf_new(struct MPOpts *opts)
{
struct vf_chain *c = talloc_ptrtype(NULL, c);
@@ -556,6 +560,13 @@ struct vf_chain *vf_new(struct MPOpts *opts)
.info = &in,
.query_format = input_query_format,
};
+ static const struct vf_info out = { .name = "out" };
+ c->first->next = talloc(c, struct vf_instance);
+ *c->first->next = (struct vf_instance) {
+ .info = &out,
+ .query_format = output_query_format,
+ .priv = (void *)c,
+ };
return c;
}
diff --git a/video/filter/vf.h b/video/filter/vf.h
index a852a245f3..5892247556 100644
--- a/video/filter/vf.h
+++ b/video/filter/vf.h
@@ -95,7 +95,10 @@ typedef struct vf_instance {
struct vf_chain {
int initialized; // 0: no, 1: yes, -1: attempted to, but failed
- struct vf_instance *first;
+ struct vf_instance *first, *last;
+
+ struct mp_image_params output_params;
+ uint8_t allowed_output_formats[IMGFMT_END - IMGFMT_START];
struct MPOpts *opts;
struct mp_hwdec_info *hwdec;
@@ -117,7 +120,6 @@ enum vf_ctrl {
/* Hack to make the OSD state object available to vf_sub which
* access OSD/subtitle state outside of normal OSD draw time. */
VFCTRL_SET_OSD_OBJ,
- VFCTRL_SET_VO,
};
struct vf_chain *vf_new(struct MPOpts *opts);
diff --git a/video/filter/vf_vo.c b/video/filter/vf_vo.c
deleted file mode 100644
index 4f90f6ab3e..0000000000
--- a/video/filter/vf_vo.c
+++ /dev/null
@@ -1,96 +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 <stdbool.h>
-
-#include "config.h"
-#include "mpvcore/mp_msg.h"
-#include "mpvcore/options.h"
-
-#include "video/mp_image.h"
-#include "vf.h"
-
-#include "video/out/vo.h"
-
-struct vf_priv_s {
- struct vo *vo;
-};
-#define video_out (vf->priv->vo)
-
-static int reconfig(struct vf_instance *vf, struct mp_image_params *in,
- struct mp_image_params *out)
-{
- if (!video_out)
- return -1;
-
- struct mp_image_params *p = in;
- *out = *in;
-
- if (p->w <= 0 || p->h <= 0 || p->d_w <= 0 || p->d_h <= 0) {
- mp_msg(MSGT_CPLAYER, MSGL_ERR, "VO: invalid dimensions!\n");
- return -1;
- }
-
- const struct vo_driver *info = video_out->driver;
- mp_msg(MSGT_CPLAYER, MSGL_INFO, "VO: [%s] %dx%d => %dx%d %s\n",
- info->name,
- p->w, p->h, p->d_w, p->d_h,
- vo_format_name(p->imgfmt));
- mp_msg(MSGT_CPLAYER, MSGL_V, "VO: Description: %s\n", info->description);
-
- return vo_reconfig(video_out, p, 0);
-}
-
-static int control(struct vf_instance *vf, int request, void *data)
-{
- if (request == VFCTRL_SET_VO) {
- video_out = data;
- return CONTROL_OK;
- }
- return CONTROL_UNKNOWN;
-}
-
-static int query_format(struct vf_instance *vf, unsigned int fmt)
-{
- if (!video_out)
- return 0;
- return video_out->driver->query_format(video_out, fmt);
-}
-
-static void uninit(struct vf_instance *vf)
-{
-}
-
-static int vf_open(vf_instance_t *vf)
-{
- vf->reconfig = reconfig;
- vf->control = control;
- vf->query_format = query_format;
- vf->uninit = uninit;
- return 1;
-}
-
-const vf_info_t vf_info_vo = {
- .description = "libvo wrapper",
- .name = "vo",
- .open = vf_open,
- .priv_size = sizeof(struct vf_priv_s),
-};