annotate libmpcodecs/vf_stereo3d.c @ 33771:6e774a02d00c

Remove gtkClearStruct code from mplayer() in interface.c. Move it as static function guiInfoMediumClear() where it is used and rename the symbolic constants used with this code.
author ib
date Sat, 09 Jul 2011 11:48:13 +0000
parents 042b10b477fa
children 475d96f700d4
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:
33602
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
283 memcpy_pic2(dmpi->planes[0] + out_off_left,
32539
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,
33602
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
288 mpi->stride[0] * vf->priv->row_step,
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
289 vf->priv->row_step != 1);
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
290 memcpy_pic2(dmpi->planes[0] + out_off_right,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
291 mpi->planes[0] + in_off_right,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
292 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
293 vf->priv->height,
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
294 dmpi->stride[0] * vf->priv->row_step,
33602
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
295 mpi->stride[0] * vf->priv->row_step,
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
296 vf->priv->row_step != 1);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
297 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
298 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
299 case MONO_R:
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
300 memcpy_pic(dmpi->planes[0],
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
301 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
302 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
303 vf->priv->height,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
304 dmpi->stride[0],
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
305 mpi->stride[0]);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
306 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
307 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
308 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
309 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
310 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
311 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
312 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
313 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
314 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
315 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
316 case ANAGLYPH_YB_COLOR: {
33599
6d690eac34eb Avoid C99 syntax not supported by some old compilers.
reimar
parents: 33560
diff changeset
317 int i,x,y,il,ir,o;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
318 unsigned char *source = mpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
319 unsigned char *dest = dmpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
320 unsigned int out_width = vf->priv->out.width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
321 int *ana_matrix[3];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
322
33599
6d690eac34eb Avoid C99 syntax not supported by some old compilers.
reimar
parents: 33560
diff changeset
323 for(i = 0; i < 3; i++)
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
324 ana_matrix[i] = vf->priv->ana_matrix[i];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
325
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
326 for (y = 0; y < vf->priv->out.height; y++) {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
327 o = dmpi->stride[0] * y;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
328 il = in_off_left + y * mpi->stride[0];
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
329 ir = in_off_right + y * mpi->stride[0];
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
330 for (x = 0; x < out_width; x++) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
331 dest[o ] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
332 ana_matrix[0], source + il, source + ir); //red out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
333 dest[o + 1] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
334 ana_matrix[1], source + il, source + ir); //green out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
335 dest[o + 2] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
336 ana_matrix[2], source + il, source + ir); //blue out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
337 il += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
338 ir += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
339 o += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
340 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
341 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
342 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
343 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
344 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
345 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
346 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
347 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
348 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
349 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
350 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
351 return vf_next_put_image(vf, dmpi, pts);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
352 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
353
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
354 static int query_format(struct vf_instance *vf, unsigned int fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
355 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
356 switch (fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
357 case IMGFMT_RGB24:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
358 return vf_next_query_format(vf, fmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
359 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
360 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
361
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
362 static void uninit(vf_instance_t *vf)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
363 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
364 free(vf->priv);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
365 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
366
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
367 static int vf_open(vf_instance_t *vf, char *args)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
368 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
369 vf->config = config;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
370 vf->uninit = uninit;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
371 vf->put_image = put_image;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
372 vf->query_format = query_format;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
373
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
374 return 1;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
375 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
376
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
377 ///Presets usage
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
378 static const struct format_preset {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
379 char* name;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
380 stereo_code scode;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
381 } vf_format_presets_defs[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
382 {"arcg", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
383 {"anaglyph_red_cyan_gray", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
384 {"arch", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
385 {"anaglyph_red_cyan_half_color", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
386 {"arcc", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
387 {"anaglyph_red_cyan_color", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
388 {"arcd", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
389 {"anaglyph_red_cyan_dubios", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
390 {"agmg", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
391 {"anaglyph_green_magenta_gray", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
392 {"agmh", ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
393 {"anaglyph_green_magenta_half_color",ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
394 {"agmc", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
395 {"anaglyph_green_magenta_color", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
396 {"aybg", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
397 {"anaglyph_yellow_blue_gray", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
398 {"aybh", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
399 {"anaglyph_yellow_blue_half_color", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
400 {"aybc", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
401 {"anaglyph_yellow_blue_color", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
402 {"ml", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
403 {"mono_left", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
404 {"mr", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
405 {"mono_right", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
406 {"sbsl", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
407 {"side_by_side_left_first", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
408 {"sbsr", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
409 {"side_by_side_right_first", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
410 {"abl", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
411 {"above_below_left_first", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
412 {"abr", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
413 {"above_below_right_first", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
414 {"ab2l", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
415 {"above_below_half_height_left_first", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
416 {"ab2r", ABOVE_BELOW_2_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
417 {"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
418 {"irl", INTERLEAVE_ROWS_LR},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
419 {"interleave_rows_left_first", INTERLEAVE_ROWS_LR},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
420 {"irr", INTERLEAVE_ROWS_RL},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
421 {"interleave_rows_right_first", INTERLEAVE_ROWS_RL},
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
422 { NULL, 0}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
423 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
424
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
425 #define ST_OFF(f) M_ST_OFF(struct format_preset,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
426 static const m_option_t vf_format_preset_fields_in[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
427 {"in", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
428 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
429 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
430 static const m_option_t vf_format_preset_fields_out[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
431 {"out", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
432 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
433 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
434
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
435 static const m_struct_t vf_format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
436 "stereo_format_preset_in",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
437 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
438 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
439 vf_format_preset_fields_in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
440 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
441 static const m_struct_t vf_format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
442 "stereo_format_preset_out",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
443 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
444 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
445 vf_format_preset_fields_out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
446 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
447
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
448 static const m_struct_t vf_opts;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
449 static const m_obj_presets_t format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
450 (struct m_struct_st*)&vf_format_preset_in,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
451 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
452 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
453 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
454 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
455 static const m_obj_presets_t format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
456 (struct m_struct_st*)&vf_format_preset_out,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
457 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
458 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
459 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
460 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
461
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
462 /// Now the options
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
463 #undef ST_OFF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
464 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
465 static const m_option_t vf_opts_fields[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
466 {"stereo_in", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
467 (m_obj_presets_t*)&format_preset_in},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
468 {"stereo_out", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
469 (m_obj_presets_t*)&format_preset_out},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
470 {"in", ST_OFF(in.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
471 {"out", ST_OFF(out.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
472 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
473 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
474
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
475 static const m_struct_t vf_opts = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
476 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
477 sizeof(struct vf_priv_s),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
478 &vf_priv_default,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
479 vf_opts_fields
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
480 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
481
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
482
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
483 //==info struct==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
484 const vf_info_t vf_info_stereo3d = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
485 "stereoscopic 3d view",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
486 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
487 "Gordon Schmidt",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
488 "view stereoscopic videos",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
489 vf_open,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
490 &vf_opts
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
491 };