summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-12-10 19:24:58 +0100
committerwm4 <wm4@nowhere>2013-12-10 20:07:39 +0100
commite6e6b88b6da6c50bd7d7b03df583085d19427986 (patch)
treeea7d4c0ac37ff0aba518816a64f8e261bf7b2646 /video
parent2f46b23d51684eef7cfa2bd5fa5e2892772ca816 (diff)
downloadmpv-e6e6b88b6da6c50bd7d7b03df583085d19427986.tar.bz2
mpv-e6e6b88b6da6c50bd7d7b03df583085d19427986.tar.xz
video: move VO reinit from filter chain to player
This gets rid of the vf_vo pseudo-filter. It ends the idea of MPlayer's architecture that the VO is just a (terminating) video filter. It didn't really work for us with respect to video timing (the "end" of the video chain isn't really made for video timing, and making it do so would be awkward), and now we're removing it entirely. We will be able to fix some things, such as properly draining video on reconfiguration.
Diffstat (limited to 'video')
-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),
-};