annotate libmpcodecs/vf_stereo3d.c @ 33569:8e70a224c411

Change vo_directx to use w32_common.c While I tested it quite thoroughly, with and without -wid, -vm, -fs, ... it is _very_ likely to break something, please report any regressions! In the worst case it can still be reverted, however since it has very little relevance nowadays it will rot all the faster if not at least some code is shared.
author reimar
date Sun, 19 Jun 2011 12:51:36 +0000
parents 16cf555989a9
children 6d690eac34eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
1 /*
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
2 * Copyright (C) 2010 Gordon Schmidt <gordon.schmidt <at> s2000.tu-chemnitz.de>
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
3 *
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
4 * This file is part of MPlayer.
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
5 *
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
9 * (at your option) any later version.
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
10 *
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
14 * GNU General Public License for more details.
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
15 *
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License along
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
19 */
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
20
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
21 //==includes==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
22 #include <stdio.h>
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
23 #include <stdlib.h>
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
24 #include <string.h>
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
25
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
26 #include "config.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
27 #include "mp_msg.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
28 #include "help_mp.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
29
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
30 #include "img_format.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
31 #include "mp_image.h"
32445
7ec524214684 Use proper include instead of extern declarations in the .c file.
reimar
parents: 32441
diff changeset
32 #include "vd.h"
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
33 #include "vf.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
34 #include "m_struct.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
35
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
36 #include "libavutil/common.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
37 #include "libvo/fastmemcpy.h"
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
38
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
39 //==types==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
40 typedef enum stereo_code {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
41 ANAGLYPH_RC_GRAY, //anaglyph red/cyan gray
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
42 ANAGLYPH_RC_HALF, //anaglyph red/cyan half colored
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
43 ANAGLYPH_RC_COLOR, //anaglyph red/cyan colored
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
44 ANAGLYPH_RC_DUBOIS, //anaglyph red/cyan dubois
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
45 ANAGLYPH_GM_GRAY, //anaglyph green/magenta gray
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
46 ANAGLYPH_GM_HALF, //anaglyph green/magenta half colored
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
47 ANAGLYPH_GM_COLOR, //anaglyph green/magenta colored
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
48 ANAGLYPH_YB_GRAY, //anaglyph yellow/blue gray
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
49 ANAGLYPH_YB_HALF, //anaglyph yellow/blue half colored
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
50 ANAGLYPH_YB_COLOR, //anaglyph yellow/blue colored
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
51 MONO_L, //mono output for debugging (left eye only)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
52 MONO_R, //mono output for debugging (right eye only)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
53 SIDE_BY_SIDE_LR, //side by side parallel (left eye left, right eye right)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
54 SIDE_BY_SIDE_RL, //side by side crosseye (right eye left, left eye right)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
55 ABOVE_BELOW_LR, //above-below (left eye above, right eye below)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
56 ABOVE_BELOW_RL, //above-below (right eye above, left eye below)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
57 ABOVE_BELOW_2_LR, //above-below with half height resolution
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
58 ABOVE_BELOW_2_RL, //above-below with half height resolution
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
59 INTERLEAVE_ROWS_LR, //row-interleave (left eye has top row)
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
60 INTERLEAVE_ROWS_RL, //row-interleave (right eye has top row)
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
61 STEREO_CODE_COUNT //no value set - TODO: needs autodetection
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
62 } stereo_code;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
63
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
64 typedef struct component {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
65 stereo_code fmt;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
66 unsigned int width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
67 unsigned int height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
68 unsigned int off_left;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
69 unsigned int off_right;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
70 unsigned int row_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
71 unsigned int row_right;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
72 } component;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
73
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
74 //==global variables==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
75 static const int ana_coeff[10][3][6] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
76 {{19595, 38470, 7471, 0, 0, 0}, //ANAGLYPH_RC_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
77 { 0, 0, 0, 19595, 38470, 7471},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
78 { 0, 0, 0, 19595, 38470, 7471}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
79 {{19595, 38470, 7471, 0, 0, 0}, //ANAGLYPH_RC_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
80 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
81 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
82 {{65536, 0, 0, 0, 0, 0}, //ANAGLYPH_RC_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
83 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
84 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
85 {{29891, 32800, 11559, -2849, -5763, -102}, //ANAGLYPH_RC_DUBOIS
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
86 {-2627, -2479, -1033, 24804, 48080, -1209},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
87 { -997, -1350, -358, -4729, -7403, 80373}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
88 {{ 0, 0, 0, 19595, 38470, 7471}, //ANAGLYPH_GM_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
89 {19595, 38470, 7471, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
90 { 0, 0, 0, 19595, 38470, 7471}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
91 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_GM_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
92 {19595, 38470, 7471, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
93 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
94 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_GM_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
95 { 0, 65536, 0, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
96 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
97 {{ 0, 0, 0, 19595, 38470, 7471}, //ANAGLYPH_YB_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
98 { 0, 0, 0, 19595, 38470, 7471},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
99 {19595, 38470, 7471, 0, 0, 0}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
100 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_YB_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
101 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
102 {19595, 38470, 7471, 0, 0, 0}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
103 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_YB_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
104 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
105 { 0, 0, 65536, 0, 0, 0}}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
106 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
107
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
108 struct vf_priv_s {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
109 component in;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
110 component out;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
111 int ana_matrix[3][6];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
112 unsigned int width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
113 unsigned int height;
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
114 unsigned int row_step;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
115 } const vf_priv_default = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
116 {SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
117 {ANAGLYPH_RC_DUBOIS}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
118 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
119
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
120 //==functions==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
121 static inline uint8_t ana_convert(int coeff[6], uint8_t left[3], uint8_t right[3])
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
122 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
123 int sum;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
124
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
125 sum = coeff[0] * left[0] + coeff[3] * right[0]; //red in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
126 sum += coeff[1] * left[1] + coeff[4] * right[1]; //green in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
127 sum += coeff[2] * left[2] + coeff[5] * right[2]; //blue in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
128 return av_clip_uint8(sum >> 16);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
129 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
130
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
131 static int config(struct vf_instance *vf, int width, int height, int d_width,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
132 int d_height, unsigned int flags, unsigned int outfmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
133 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
134 if ((width & 1) || (height & 1)) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
135 mp_msg(MSGT_VFILTER, MSGL_WARN, "[stereo3d] invalid height or width\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
136 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
137 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
138 //default input values
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
139 vf->priv->width = width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
140 vf->priv->height = height;
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
141 vf->priv->row_step = 1;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
142 vf->priv->in.width = width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
143 vf->priv->in.height = height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
144 vf->priv->in.off_left = 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
145 vf->priv->in.off_right = 0;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
146 vf->priv->in.row_left = 0;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
147 vf->priv->in.row_right = 0;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
148
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
149 //check input format
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
150 switch (vf->priv->in.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
151 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
152 vf->priv->width = width / 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
153 vf->priv->in.off_right = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
154 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
155 case SIDE_BY_SIDE_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
156 vf->priv->width = width / 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
157 vf->priv->in.off_left = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
158 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
159 case ABOVE_BELOW_2_LR:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
160 d_height *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
161 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
162 vf->priv->height = height / 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
163 vf->priv->in.row_right = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
164 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
165 case ABOVE_BELOW_2_RL:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
166 d_height *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
167 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
168 vf->priv->height = height / 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
169 vf->priv->in.row_left = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
170 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
171 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
172 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
173 "[stereo3d] stereo format of input is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
174 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
175 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
176 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
177 //default output values
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
178 vf->priv->out.width = vf->priv->width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
179 vf->priv->out.height = vf->priv->height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
180 vf->priv->out.off_left = 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
181 vf->priv->out.off_right = 0;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
182 vf->priv->out.row_left = 0;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
183 vf->priv->out.row_right = 0;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
184
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
185 //check output format
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
186 switch (vf->priv->out.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
187 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
188 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
189 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
190 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
191 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
192 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
193 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
194 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
195 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
196 case ANAGLYPH_YB_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
197 memcpy(vf->priv->ana_matrix, ana_coeff[vf->priv->out.fmt],
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
198 sizeof(vf->priv->ana_matrix));
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
199 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
200 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
201 vf->priv->out.width = vf->priv->width * 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
202 vf->priv->out.off_right = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
203 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
204 case SIDE_BY_SIDE_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
205 vf->priv->out.width = vf->priv->width * 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
206 vf->priv->out.off_left = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
207 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
208 case ABOVE_BELOW_2_LR:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
209 d_height /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
210 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
211 vf->priv->out.height = vf->priv->height * 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
212 vf->priv->out.row_right = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
213 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
214 case ABOVE_BELOW_2_RL:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
215 d_height /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
216 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
217 vf->priv->out.height = vf->priv->height * 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
218 vf->priv->out.row_left = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
219 break;
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
220 case INTERLEAVE_ROWS_LR:
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
221 vf->priv->row_step = 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
222 vf->priv->height = vf->priv->height / 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
223 vf->priv->out.off_right = vf->priv->width * 3;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
224 vf->priv->in.off_right += vf->priv->in.width * 3;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
225 break;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
226 case INTERLEAVE_ROWS_RL:
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
227 vf->priv->row_step = 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
228 vf->priv->height = vf->priv->height / 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
229 vf->priv->out.off_left = vf->priv->width * 3;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
230 vf->priv->in.off_left += vf->priv->in.width * 3;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
231 break;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
232 case MONO_R:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
233 //same as MONO_L only needs switching of input offsets
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
234 vf->priv->in.off_left = vf->priv->in.off_right;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
235 vf->priv->in.row_left = vf->priv->in.row_right;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
236 //nobreak;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
237 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
238 //use default settings
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
239 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
240 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
241 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
242 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
243 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
244 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
245 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
246 if (!opt_screen_size_x && !opt_screen_size_y) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
247 d_width = d_width * vf->priv->out.width / width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
248 d_height = d_height * vf->priv->out.height / height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
249 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
250 return vf_next_config(vf, vf->priv->out.width, vf->priv->out.height,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
251 d_width, d_height, flags, outfmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
252 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
253
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
254 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
255 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
256 mp_image_t *dmpi;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
257 if (vf->priv->in.fmt == vf->priv->out.fmt) { //nothing to do
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
258 dmpi = mpi;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
259 } else {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
260 int out_off_left, out_off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
261 int in_off_left = vf->priv->in.row_left * mpi->stride[0] +
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
262 vf->priv->in.off_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
263 int in_off_right = vf->priv->in.row_right * mpi->stride[0] +
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
264 vf->priv->in.off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
265
32541
45b3a91e8fb7 Indicate that stereo3d can now handle strides properly.
reimar
parents: 32540
diff changeset
266 dmpi = vf_get_image(vf->next, IMGFMT_RGB24, MP_IMGTYPE_TEMP,
45b3a91e8fb7 Indicate that stereo3d can now handle strides properly.
reimar
parents: 32540
diff changeset
267 MP_IMGFLAG_ACCEPT_STRIDE,
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
268 vf->priv->out.width, vf->priv->out.height);
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
269 out_off_left = vf->priv->out.row_left * dmpi->stride[0] +
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
270 vf->priv->out.off_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
271 out_off_right = vf->priv->out.row_right * dmpi->stride[0] +
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
272 vf->priv->out.off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
273
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
274 switch (vf->priv->out.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
275 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
276 case SIDE_BY_SIDE_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
277 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
278 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
279 case ABOVE_BELOW_2_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
280 case ABOVE_BELOW_2_RL:
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
281 case INTERLEAVE_ROWS_LR:
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
282 case INTERLEAVE_ROWS_RL:
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
283 memcpy_pic(dmpi->planes[0] + out_off_left,
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
284 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
285 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
286 vf->priv->height,
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
287 dmpi->stride[0] * vf->priv->row_step,
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
288 mpi->stride[0] * vf->priv->row_step);
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
289 memcpy_pic(dmpi->planes[0] + out_off_right,
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
290 mpi->planes[0] + in_off_right,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
291 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
292 vf->priv->height,
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
293 dmpi->stride[0] * vf->priv->row_step,
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
294 mpi->stride[0] * vf->priv->row_step);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
295 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
296 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
297 case MONO_R:
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
298 memcpy_pic(dmpi->planes[0],
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
299 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
300 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
301 vf->priv->height,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
302 dmpi->stride[0],
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
303 mpi->stride[0]);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
304 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
305 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
306 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
307 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
308 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
309 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
310 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
311 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
312 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
313 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
314 case ANAGLYPH_YB_COLOR: {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
315 int x,y,il,ir,o;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
316 unsigned char *source = mpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
317 unsigned char *dest = dmpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
318 unsigned int out_width = vf->priv->out.width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
319 int *ana_matrix[3];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
320
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
321 for(int i = 0; i < 3; i++)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
322 ana_matrix[i] = vf->priv->ana_matrix[i];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
323
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
324 for (y = 0; y < vf->priv->out.height; y++) {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
325 o = dmpi->stride[0] * y;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
326 il = in_off_left + y * mpi->stride[0];
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
327 ir = in_off_right + y * mpi->stride[0];
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
328 for (x = 0; x < out_width; x++) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
329 dest[o ] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
330 ana_matrix[0], source + il, source + ir); //red out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
331 dest[o + 1] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
332 ana_matrix[1], source + il, source + ir); //green out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
333 dest[o + 2] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
334 ana_matrix[2], source + il, source + ir); //blue out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
335 il += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
336 ir += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
337 o += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
338 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
339 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
340 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
341 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
342 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
343 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
344 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
345 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
346 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
347 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
348 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
349 return vf_next_put_image(vf, dmpi, pts);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
350 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
351
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
352 static int query_format(struct vf_instance *vf, unsigned int fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
353 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
354 switch (fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
355 case IMGFMT_RGB24:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
356 return vf_next_query_format(vf, fmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
357 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
358 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
359
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
360 static void uninit(vf_instance_t *vf)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
361 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
362 free(vf->priv);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
363 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
364
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
365 static int vf_open(vf_instance_t *vf, char *args)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
366 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
367 vf->config = config;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
368 vf->uninit = uninit;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
369 vf->put_image = put_image;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
370 vf->query_format = query_format;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
371
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
372 return 1;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
373 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
374
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
375 ///Presets usage
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
376 static const struct format_preset {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
377 char* name;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
378 stereo_code scode;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
379 } vf_format_presets_defs[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
380 {"arcg", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
381 {"anaglyph_red_cyan_gray", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
382 {"arch", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
383 {"anaglyph_red_cyan_half_color", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
384 {"arcc", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
385 {"anaglyph_red_cyan_color", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
386 {"arcd", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
387 {"anaglyph_red_cyan_dubios", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
388 {"agmg", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
389 {"anaglyph_green_magenta_gray", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
390 {"agmh", ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
391 {"anaglyph_green_magenta_half_color",ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
392 {"agmc", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
393 {"anaglyph_green_magenta_color", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
394 {"aybg", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
395 {"anaglyph_yellow_blue_gray", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
396 {"aybh", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
397 {"anaglyph_yellow_blue_half_color", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
398 {"aybc", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
399 {"anaglyph_yellow_blue_color", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
400 {"ml", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
401 {"mono_left", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
402 {"mr", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
403 {"mono_right", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
404 {"sbsl", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
405 {"side_by_side_left_first", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
406 {"sbsr", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
407 {"side_by_side_right_first", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
408 {"abl", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
409 {"above_below_left_first", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
410 {"abr", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
411 {"above_below_right_first", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
412 {"ab2l", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
413 {"above_below_half_height_left_first", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
414 {"ab2r", ABOVE_BELOW_2_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
415 {"above_below_half_height_right_first",ABOVE_BELOW_2_RL},
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
416 {"irl", INTERLEAVE_ROWS_LR},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
417 {"interleave_rows_left_first", INTERLEAVE_ROWS_LR},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
418 {"irr", INTERLEAVE_ROWS_RL},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
419 {"interleave_rows_right_first", INTERLEAVE_ROWS_RL},
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
420 { NULL, 0}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
421 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
422
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
423 #define ST_OFF(f) M_ST_OFF(struct format_preset,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
424 static const m_option_t vf_format_preset_fields_in[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
425 {"in", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
426 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
427 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
428 static const m_option_t vf_format_preset_fields_out[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
429 {"out", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
430 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
431 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
432
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
433 static const m_struct_t vf_format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
434 "stereo_format_preset_in",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
435 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
436 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
437 vf_format_preset_fields_in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
438 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
439 static const m_struct_t vf_format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
440 "stereo_format_preset_out",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
441 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
442 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
443 vf_format_preset_fields_out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
444 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
445
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
446 static const m_struct_t vf_opts;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
447 static const m_obj_presets_t format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
448 (struct m_struct_st*)&vf_format_preset_in,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
449 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
450 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
451 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
452 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
453 static const m_obj_presets_t format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
454 (struct m_struct_st*)&vf_format_preset_out,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
455 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
456 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
457 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
458 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
459
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
460 /// Now the options
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
461 #undef ST_OFF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
462 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
463 static const m_option_t vf_opts_fields[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
464 {"stereo_in", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
465 (m_obj_presets_t*)&format_preset_in},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
466 {"stereo_out", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
467 (m_obj_presets_t*)&format_preset_out},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
468 {"in", ST_OFF(in.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
469 {"out", ST_OFF(out.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
470 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
471 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
472
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
473 static const m_struct_t vf_opts = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
474 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
475 sizeof(struct vf_priv_s),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
476 &vf_priv_default,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
477 vf_opts_fields
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
478 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
479
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
480
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
481 //==info struct==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
482 const vf_info_t vf_info_stereo3d = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
483 "stereoscopic 3d view",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
484 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
485 "Gordon Schmidt",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
486 "view stereoscopic videos",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
487 vf_open,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
488 &vf_opts
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
489 };