annotate libmpcodecs/vf_stereo3d.c @ 32972:fbaae7fe1a13

Fix several issues with Translate(). 1. The "Unsafe!" comment has been removed, because the strings passed to the function are strcpy'd. 2. The needless memsets (one of which with wrong size) have been removed in favor of a sufficiently simple initialization of trbuf. 3. The array indices are unsigned now, and the manual optimization of having strlen() outside the for loop has been removed in favor of optimization performed by the compiler. 4. There is a check now to prevent an out-of-bounds array access.
author ib
date Tue, 08 Mar 2011 20:56:51 +0000
parents 45b3a91e8fb7
children 16cf555989a9
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
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
59 STEREO_CODE_COUNT //no value set - TODO: needs autodetection
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
60 } stereo_code;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
61
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
62 typedef struct component {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
63 stereo_code fmt;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
64 unsigned int width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
65 unsigned int height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
66 unsigned int off_left;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
67 unsigned int off_right;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
68 unsigned int row_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
69 unsigned int row_right;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
70 } component;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
71
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
72 //==global variables==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
73 static const int ana_coeff[10][3][6] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
74 {{19595, 38470, 7471, 0, 0, 0}, //ANAGLYPH_RC_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
75 { 0, 0, 0, 19595, 38470, 7471},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
76 { 0, 0, 0, 19595, 38470, 7471}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
77 {{19595, 38470, 7471, 0, 0, 0}, //ANAGLYPH_RC_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
78 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
79 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
80 {{65536, 0, 0, 0, 0, 0}, //ANAGLYPH_RC_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
81 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
82 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
83 {{29891, 32800, 11559, -2849, -5763, -102}, //ANAGLYPH_RC_DUBOIS
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
84 {-2627, -2479, -1033, 24804, 48080, -1209},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
85 { -997, -1350, -358, -4729, -7403, 80373}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
86 {{ 0, 0, 0, 19595, 38470, 7471}, //ANAGLYPH_GM_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
87 {19595, 38470, 7471, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
88 { 0, 0, 0, 19595, 38470, 7471}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
89 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_GM_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
90 {19595, 38470, 7471, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
91 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
92 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_GM_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
93 { 0, 65536, 0, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
94 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
95 {{ 0, 0, 0, 19595, 38470, 7471}, //ANAGLYPH_YB_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
96 { 0, 0, 0, 19595, 38470, 7471},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
97 {19595, 38470, 7471, 0, 0, 0}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
98 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_YB_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
99 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
100 {19595, 38470, 7471, 0, 0, 0}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
101 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_YB_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
102 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
103 { 0, 0, 65536, 0, 0, 0}}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
104 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
105
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
106 struct vf_priv_s {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
107 component in;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
108 component out;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
109 int ana_matrix[3][6];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
110 unsigned int width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
111 unsigned int height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
112 } const vf_priv_default = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
113 {SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
114 {ANAGLYPH_RC_DUBOIS}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
115 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
116
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
117 //==functions==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
118 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
119 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
120 int sum;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
121
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
122 sum = coeff[0] * left[0] + coeff[3] * right[0]; //red in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
123 sum += coeff[1] * left[1] + coeff[4] * right[1]; //green in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
124 sum += coeff[2] * left[2] + coeff[5] * right[2]; //blue in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
125 return av_clip_uint8(sum >> 16);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
126 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
127
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
128 static int config(struct vf_instance *vf, int width, int height, int d_width,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
129 int d_height, unsigned int flags, unsigned int outfmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
130 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
131 if ((width & 1) || (height & 1)) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
132 mp_msg(MSGT_VFILTER, MSGL_WARN, "[stereo3d] invalid height or width\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
133 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
134 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
135 //default input values
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
136 vf->priv->width = width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
137 vf->priv->height = height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
138 vf->priv->in.width = width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
139 vf->priv->in.height = height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
140 vf->priv->in.off_left = 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
141 vf->priv->in.off_right = 0;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
142 vf->priv->in.row_left = 0;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
143 vf->priv->in.row_right = 0;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
144
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
145 //check input format
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
146 switch (vf->priv->in.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
147 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
148 vf->priv->width = width / 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
149 vf->priv->in.off_right = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
150 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
151 case SIDE_BY_SIDE_RL:
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_left = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
154 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
155 case ABOVE_BELOW_2_LR:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
156 d_height *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
157 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
158 vf->priv->height = height / 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
159 vf->priv->in.row_right = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
160 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
161 case ABOVE_BELOW_2_RL:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
162 d_height *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
163 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
164 vf->priv->height = height / 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
165 vf->priv->in.row_left = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
166 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
167 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
168 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
169 "[stereo3d] stereo format of input is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
170 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
171 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
172 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
173 //default output values
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
174 vf->priv->out.width = vf->priv->width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
175 vf->priv->out.height = vf->priv->height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
176 vf->priv->out.off_left = 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
177 vf->priv->out.off_right = 0;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
178 vf->priv->out.row_left = 0;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
179 vf->priv->out.row_right = 0;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
180
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
181 //check output format
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
182 switch (vf->priv->out.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
183 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
184 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
185 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
186 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
187 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
188 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
189 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
190 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
191 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
192 case ANAGLYPH_YB_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
193 memcpy(vf->priv->ana_matrix, ana_coeff[vf->priv->out.fmt],
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
194 sizeof(vf->priv->ana_matrix));
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
195 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
196 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
197 vf->priv->out.width = vf->priv->width * 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
198 vf->priv->out.off_right = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
199 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
200 case SIDE_BY_SIDE_RL:
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_left = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
203 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
204 case ABOVE_BELOW_2_LR:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
205 d_height /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
206 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
207 vf->priv->out.height = vf->priv->height * 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
208 vf->priv->out.row_right = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
209 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
210 case ABOVE_BELOW_2_RL:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
211 d_height /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
212 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
213 vf->priv->out.height = vf->priv->height * 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
214 vf->priv->out.row_left = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
215 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
216 case MONO_R:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
217 //same as MONO_L only needs switching of input offsets
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
218 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
219 vf->priv->in.row_left = vf->priv->in.row_right;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
220 //nobreak;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
221 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
222 //use default settings
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
223 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
224 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
225 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
226 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
227 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
228 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
229 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
230 if (!opt_screen_size_x && !opt_screen_size_y) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
231 d_width = d_width * vf->priv->out.width / width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
232 d_height = d_height * vf->priv->out.height / height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
233 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
234 return vf_next_config(vf, vf->priv->out.width, vf->priv->out.height,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
235 d_width, d_height, flags, outfmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
236 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
237
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
238 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
239 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
240 mp_image_t *dmpi;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
241 if (vf->priv->in.fmt == vf->priv->out.fmt) { //nothing to do
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
242 dmpi = mpi;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
243 } else {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
244 int out_off_left, out_off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
245 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
246 vf->priv->in.off_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
247 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
248 vf->priv->in.off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
249
32541
45b3a91e8fb7 Indicate that stereo3d can now handle strides properly.
reimar
parents: 32540
diff changeset
250 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
251 MP_IMGFLAG_ACCEPT_STRIDE,
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
252 vf->priv->out.width, vf->priv->out.height);
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
253 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
254 vf->priv->out.off_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
255 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
256 vf->priv->out.off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
257
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
258 switch (vf->priv->out.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
259 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
260 case SIDE_BY_SIDE_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
261 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
262 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
263 case ABOVE_BELOW_2_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
264 case ABOVE_BELOW_2_RL:
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
265 memcpy_pic(dmpi->planes[0] + out_off_left,
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
266 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
267 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
268 vf->priv->height,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
269 dmpi->stride[0],
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
270 mpi->stride[0]);
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
271 memcpy_pic(dmpi->planes[0] + out_off_right,
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
272 mpi->planes[0] + in_off_right,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
273 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
274 vf->priv->height,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
275 dmpi->stride[0],
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
276 mpi->stride[0]);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
277 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
278 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
279 case MONO_R:
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
280 memcpy_pic(dmpi->planes[0],
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
281 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
282 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
283 vf->priv->height,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
284 dmpi->stride[0],
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
285 mpi->stride[0]);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
286 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
287 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
288 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
289 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
290 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
291 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
292 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
293 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
294 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
295 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
296 case ANAGLYPH_YB_COLOR: {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
297 int x,y,il,ir,o;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
298 unsigned char *source = mpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
299 unsigned char *dest = dmpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
300 unsigned int out_width = vf->priv->out.width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
301 int *ana_matrix[3];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
302
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
303 for(int i = 0; i < 3; i++)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
304 ana_matrix[i] = vf->priv->ana_matrix[i];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
305
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
306 for (y = 0; y < vf->priv->out.height; y++) {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
307 o = dmpi->stride[0] * y;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
308 il = in_off_left + y * mpi->stride[0];
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
309 ir = in_off_right + y * mpi->stride[0];
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
310 for (x = 0; x < out_width; x++) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
311 dest[o ] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
312 ana_matrix[0], source + il, source + ir); //red out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
313 dest[o + 1] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
314 ana_matrix[1], source + il, source + ir); //green out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
315 dest[o + 2] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
316 ana_matrix[2], source + il, source + ir); //blue out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
317 il += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
318 ir += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
319 o += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
320 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
321 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
322 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
323 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
324 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
325 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
326 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
327 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
328 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
329 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
330 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
331 return vf_next_put_image(vf, dmpi, pts);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
332 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
333
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
334 static int query_format(struct vf_instance *vf, unsigned int fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
335 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
336 switch (fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
337 case IMGFMT_RGB24:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
338 return vf_next_query_format(vf, fmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
339 return 0;
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 static void uninit(vf_instance_t *vf)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
343 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
344 free(vf->priv);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
345 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
346
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
347 static int vf_open(vf_instance_t *vf, char *args)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
348 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
349 vf->config = config;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
350 vf->uninit = uninit;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
351 vf->put_image = put_image;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
352 vf->query_format = query_format;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
353
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
354 return 1;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
355 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
356
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
357 ///Presets usage
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
358 static const struct format_preset {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
359 char* name;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
360 stereo_code scode;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
361 } vf_format_presets_defs[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
362 {"arcg", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
363 {"anaglyph_red_cyan_gray", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
364 {"arch", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
365 {"anaglyph_red_cyan_half_color", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
366 {"arcc", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
367 {"anaglyph_red_cyan_color", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
368 {"arcd", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
369 {"anaglyph_red_cyan_dubios", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
370 {"agmg", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
371 {"anaglyph_green_magenta_gray", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
372 {"agmh", ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
373 {"anaglyph_green_magenta_half_color",ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
374 {"agmc", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
375 {"anaglyph_green_magenta_color", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
376 {"aybg", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
377 {"anaglyph_yellow_blue_gray", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
378 {"aybh", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
379 {"anaglyph_yellow_blue_half_color", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
380 {"aybc", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
381 {"anaglyph_yellow_blue_color", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
382 {"ml", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
383 {"mono_left", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
384 {"mr", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
385 {"mono_right", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
386 {"sbsl", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
387 {"side_by_side_left_first", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
388 {"sbsr", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
389 {"side_by_side_right_first", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
390 {"abl", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
391 {"above_below_left_first", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
392 {"abr", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
393 {"above_below_right_first", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
394 {"ab2l", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
395 {"above_below_half_height_left_first", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
396 {"ab2r", ABOVE_BELOW_2_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
397 {"above_below_half_height_right_first",ABOVE_BELOW_2_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
398 { NULL, 0}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
399 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
400
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
401 #define ST_OFF(f) M_ST_OFF(struct format_preset,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
402 static const m_option_t vf_format_preset_fields_in[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
403 {"in", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
404 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
405 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
406 static const m_option_t vf_format_preset_fields_out[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
407 {"out", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
408 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
409 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
410
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
411 static const m_struct_t vf_format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
412 "stereo_format_preset_in",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
413 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
414 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
415 vf_format_preset_fields_in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
416 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
417 static const m_struct_t vf_format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
418 "stereo_format_preset_out",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
419 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
420 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
421 vf_format_preset_fields_out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
422 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
423
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
424 static const m_struct_t vf_opts;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
425 static const m_obj_presets_t format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
426 (struct m_struct_st*)&vf_format_preset_in,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
427 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
428 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
429 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
430 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
431 static const m_obj_presets_t format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
432 (struct m_struct_st*)&vf_format_preset_out,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
433 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
434 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
435 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
436 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
437
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
438 /// Now the options
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
439 #undef ST_OFF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
440 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
441 static const m_option_t vf_opts_fields[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
442 {"stereo_in", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
443 (m_obj_presets_t*)&format_preset_in},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
444 {"stereo_out", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
445 (m_obj_presets_t*)&format_preset_out},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
446 {"in", ST_OFF(in.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
447 {"out", ST_OFF(out.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
448 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
449 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
450
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
451 static const m_struct_t vf_opts = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
452 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
453 sizeof(struct vf_priv_s),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
454 &vf_priv_default,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
455 vf_opts_fields
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
456 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
457
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
458
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
459 //==info struct==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
460 const vf_info_t vf_info_stereo3d = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
461 "stereoscopic 3d view",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
462 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
463 "Gordon Schmidt",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
464 "view stereoscopic videos",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
465 vf_open,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
466 &vf_opts
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
467 };