diff options
Diffstat (limited to 'video')
-rw-r--r-- | video/filter/vf.c | 49 | ||||
-rw-r--r-- | video/filter/vf.h | 6 | ||||
-rw-r--r-- | video/filter/vf_vo.c | 96 |
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), -}; |