annotate libmpcodecs/vf_stereo3d.c @ 34697:ac6b38cd0d45

Rename sub window video window. It was a bad idea to name the video window "sub window" at the time the GUI was written. The term "sub window" does make sense from the programmer's point of view, but it doesn't make any sense at all from the user's point of view, because the sub window simply is the window where the video will be displayed. Moreover, since the term "sub" is generally short for "subtitles", the renaming makes the code much easier to understand.
author ib
date Sat, 03 Mar 2012 16:45:15 +0000
parents 475d96f700d4
children c24d1a0c7665
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)
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
55 SIDE_BY_SIDE_2_LR, //side by side parallel with half width resolution
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
56 SIDE_BY_SIDE_2_RL, //side by side crosseye with half width resolution
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
57 ABOVE_BELOW_LR, //above-below (left eye above, right eye below)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
58 ABOVE_BELOW_RL, //above-below (right eye above, left eye below)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
59 ABOVE_BELOW_2_LR, //above-below with half height resolution
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
60 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
61 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
62 INTERLEAVE_ROWS_RL, //row-interleave (right eye has top row)
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
63 STEREO_CODE_COUNT //no value set - TODO: needs autodetection
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
64 } stereo_code;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
65
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
66 typedef struct component {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
67 stereo_code fmt;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
68 unsigned int width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
69 unsigned int height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
70 unsigned int off_left;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
71 unsigned int off_right;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
72 unsigned int row_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
73 unsigned int row_right;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
74 } component;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
75
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
76 //==global variables==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
77 static const int ana_coeff[10][3][6] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
78 {{19595, 38470, 7471, 0, 0, 0}, //ANAGLYPH_RC_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
79 { 0, 0, 0, 19595, 38470, 7471},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
80 { 0, 0, 0, 19595, 38470, 7471}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
81 {{19595, 38470, 7471, 0, 0, 0}, //ANAGLYPH_RC_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
82 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
83 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
84 {{65536, 0, 0, 0, 0, 0}, //ANAGLYPH_RC_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
85 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
86 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
87 {{29891, 32800, 11559, -2849, -5763, -102}, //ANAGLYPH_RC_DUBOIS
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
88 {-2627, -2479, -1033, 24804, 48080, -1209},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
89 { -997, -1350, -358, -4729, -7403, 80373}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
90 {{ 0, 0, 0, 19595, 38470, 7471}, //ANAGLYPH_GM_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
91 {19595, 38470, 7471, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
92 { 0, 0, 0, 19595, 38470, 7471}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
93 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_GM_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
94 {19595, 38470, 7471, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
95 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
96 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_GM_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
97 { 0, 65536, 0, 0, 0, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
98 { 0, 0, 0, 0, 0, 65536}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
99 {{ 0, 0, 0, 19595, 38470, 7471}, //ANAGLYPH_YB_GRAY
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
100 { 0, 0, 0, 19595, 38470, 7471},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
101 {19595, 38470, 7471, 0, 0, 0}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
102 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_YB_HALF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
103 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
104 {19595, 38470, 7471, 0, 0, 0}},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
105 {{ 0, 0, 0, 65536, 0, 0}, //ANAGLYPH_YB_COLOR
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
106 { 0, 0, 0, 0, 65536, 0},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
107 { 0, 0, 65536, 0, 0, 0}}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
108 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
109
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
110 struct vf_priv_s {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
111 component in;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
112 component out;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
113 int ana_matrix[3][6];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
114 unsigned int width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
115 unsigned int height;
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
116 unsigned int row_step;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
117 } const vf_priv_default = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
118 {SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
119 {ANAGLYPH_RC_DUBOIS}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
120 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
121
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
122 //==functions==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
123 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
124 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
125 int sum;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
126
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
127 sum = coeff[0] * left[0] + coeff[3] * right[0]; //red in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
128 sum += coeff[1] * left[1] + coeff[4] * right[1]; //green in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
129 sum += coeff[2] * left[2] + coeff[5] * right[2]; //blue in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
130 return av_clip_uint8(sum >> 16);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
131 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
132
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
133 static int config(struct vf_instance *vf, int width, int height, int d_width,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
134 int d_height, unsigned int flags, unsigned int outfmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
135 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
136 if ((width & 1) || (height & 1)) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
137 mp_msg(MSGT_VFILTER, MSGL_WARN, "[stereo3d] invalid height or width\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
138 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
139 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
140 //default input values
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
141 vf->priv->width = width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
142 vf->priv->height = height;
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
143 vf->priv->row_step = 1;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
144 vf->priv->in.width = width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
145 vf->priv->in.height = height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
146 vf->priv->in.off_left = 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
147 vf->priv->in.off_right = 0;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
148 vf->priv->in.row_left = 0;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
149 vf->priv->in.row_right = 0;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
150
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
151 //check input format
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
152 switch (vf->priv->in.fmt) {
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
153 case SIDE_BY_SIDE_2_LR:
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
154 d_width *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
155 case SIDE_BY_SIDE_LR:
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_right = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
158 break;
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
159 case SIDE_BY_SIDE_2_RL:
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
160 d_width *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
161 case SIDE_BY_SIDE_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
162 vf->priv->width = width / 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
163 vf->priv->in.off_left = vf->priv->width * 3;
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_LR:
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_LR:
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_right = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
170 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
171 case ABOVE_BELOW_2_RL:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
172 d_height *= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
173 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
174 vf->priv->height = height / 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
175 vf->priv->in.row_left = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
176 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
177 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
178 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
179 "[stereo3d] stereo format of input is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
180 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
181 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
182 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
183 //default output values
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
184 vf->priv->out.width = vf->priv->width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
185 vf->priv->out.height = vf->priv->height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
186 vf->priv->out.off_left = 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
187 vf->priv->out.off_right = 0;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
188 vf->priv->out.row_left = 0;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
189 vf->priv->out.row_right = 0;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
190
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
191 //check output format
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
192 switch (vf->priv->out.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
193 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
194 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
195 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
196 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
197 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
198 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
199 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
200 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
201 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
202 case ANAGLYPH_YB_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
203 memcpy(vf->priv->ana_matrix, ana_coeff[vf->priv->out.fmt],
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
204 sizeof(vf->priv->ana_matrix));
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
205 break;
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
206 case SIDE_BY_SIDE_2_LR:
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
207 d_width /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
208 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
209 vf->priv->out.width = vf->priv->width * 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
210 vf->priv->out.off_right = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
211 break;
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
212 case SIDE_BY_SIDE_2_RL:
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
213 d_width /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
214 case SIDE_BY_SIDE_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
215 vf->priv->out.width = vf->priv->width * 2;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
216 vf->priv->out.off_left = vf->priv->width * 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
217 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
218 case ABOVE_BELOW_2_LR:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
219 d_height /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
220 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
221 vf->priv->out.height = vf->priv->height * 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
222 vf->priv->out.row_right = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
223 break;
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
224 case ABOVE_BELOW_2_RL:
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
225 d_height /= 2;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
226 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
227 vf->priv->out.height = vf->priv->height * 2;
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
228 vf->priv->out.row_left = vf->priv->height;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
229 break;
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
230 case INTERLEAVE_ROWS_LR:
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
231 vf->priv->row_step = 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
232 vf->priv->height = vf->priv->height / 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
233 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
234 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
235 break;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
236 case INTERLEAVE_ROWS_RL:
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
237 vf->priv->row_step = 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
238 vf->priv->height = vf->priv->height / 2;
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
239 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
240 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
241 break;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
242 case MONO_R:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
243 //same as MONO_L only needs switching of input offsets
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
244 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
245 vf->priv->in.row_left = vf->priv->in.row_right;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
246 //nobreak;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
247 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
248 //use default settings
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
249 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
250 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
251 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
252 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
253 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
254 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
255 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
256 if (!opt_screen_size_x && !opt_screen_size_y) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
257 d_width = d_width * vf->priv->out.width / width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
258 d_height = d_height * vf->priv->out.height / height;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
259 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
260 return vf_next_config(vf, vf->priv->out.width, vf->priv->out.height,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
261 d_width, d_height, flags, outfmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
262 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
263
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
264 static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
265 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
266 mp_image_t *dmpi;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
267 if (vf->priv->in.fmt == vf->priv->out.fmt) { //nothing to do
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
268 dmpi = mpi;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
269 } else {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
270 int out_off_left, out_off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
271 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
272 vf->priv->in.off_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
273 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
274 vf->priv->in.off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
275
32541
45b3a91e8fb7 Indicate that stereo3d can now handle strides properly.
reimar
parents: 32540
diff changeset
276 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
277 MP_IMGFLAG_ACCEPT_STRIDE,
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
278 vf->priv->out.width, vf->priv->out.height);
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
279 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
280 vf->priv->out.off_left;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
281 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
282 vf->priv->out.off_right;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
283
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
284 switch (vf->priv->out.fmt) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
285 case SIDE_BY_SIDE_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
286 case SIDE_BY_SIDE_RL:
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
287 case SIDE_BY_SIDE_2_LR:
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
288 case SIDE_BY_SIDE_2_RL:
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
289 case ABOVE_BELOW_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
290 case ABOVE_BELOW_RL:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
291 case ABOVE_BELOW_2_LR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
292 case ABOVE_BELOW_2_RL:
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
293 case INTERLEAVE_ROWS_LR:
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
294 case INTERLEAVE_ROWS_RL:
33602
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
295 memcpy_pic2(dmpi->planes[0] + out_off_left,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
296 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
297 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
298 vf->priv->height,
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
299 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
300 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
301 vf->priv->row_step != 1);
042b10b477fa Change memcpy_pic to force it to never write to image parts between
reimar
parents: 33599
diff changeset
302 memcpy_pic2(dmpi->planes[0] + out_off_right,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
303 mpi->planes[0] + in_off_right,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
304 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
305 vf->priv->height,
33560
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
306 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
307 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
308 vf->priv->row_step != 1);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
309 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
310 case MONO_L:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
311 case MONO_R:
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
312 memcpy_pic(dmpi->planes[0],
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
313 mpi->planes[0] + in_off_left,
32538
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
314 3 * vf->priv->width,
28f08e7c2a0a Adjust d_height instead of bad ad-hoc scaling.
reimar
parents: 32445
diff changeset
315 vf->priv->height,
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
316 dmpi->stride[0],
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
317 mpi->stride[0]);
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
318 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
319 case ANAGLYPH_RC_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
320 case ANAGLYPH_RC_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
321 case ANAGLYPH_RC_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
322 case ANAGLYPH_RC_DUBOIS:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
323 case ANAGLYPH_GM_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
324 case ANAGLYPH_GM_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
325 case ANAGLYPH_GM_COLOR:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
326 case ANAGLYPH_YB_GRAY:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
327 case ANAGLYPH_YB_HALF:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
328 case ANAGLYPH_YB_COLOR: {
33599
6d690eac34eb Avoid C99 syntax not supported by some old compilers.
reimar
parents: 33560
diff changeset
329 int i,x,y,il,ir,o;
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
330 unsigned char *source = mpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
331 unsigned char *dest = dmpi->planes[0];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
332 unsigned int out_width = vf->priv->out.width;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
333 int *ana_matrix[3];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
334
33599
6d690eac34eb Avoid C99 syntax not supported by some old compilers.
reimar
parents: 33560
diff changeset
335 for(i = 0; i < 3; i++)
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
336 ana_matrix[i] = vf->priv->ana_matrix[i];
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
337
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
338 for (y = 0; y < vf->priv->out.height; y++) {
32539
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
339 o = dmpi->stride[0] * y;
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
340 il = in_off_left + y * mpi->stride[0];
8341f48adbc5 Properly support src/dst stride in vf_stereo3d.
reimar
parents: 32538
diff changeset
341 ir = in_off_right + y * mpi->stride[0];
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
342 for (x = 0; x < out_width; x++) {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
343 dest[o ] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
344 ana_matrix[0], source + il, source + ir); //red out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
345 dest[o + 1] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
346 ana_matrix[1], source + il, source + ir); //green out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
347 dest[o + 2] = ana_convert(
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
348 ana_matrix[2], source + il, source + ir); //blue out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
349 il += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
350 ir += 3;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
351 o += 3;
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 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
355 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
356 default:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
357 mp_msg(MSGT_VFILTER, MSGL_WARN,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
358 "[stereo3d] stereo format of output is not supported\n");
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
359 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
360 break;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
361 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
362 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
363 return vf_next_put_image(vf, dmpi, pts);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
364 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
365
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
366 static int query_format(struct vf_instance *vf, unsigned int fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
367 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
368 switch (fmt)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
369 case IMGFMT_RGB24:
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
370 return vf_next_query_format(vf, fmt);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
371 return 0;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
372 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
373
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
374 static void uninit(vf_instance_t *vf)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
375 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
376 free(vf->priv);
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
377 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
378
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
379 static int vf_open(vf_instance_t *vf, char *args)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
380 {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
381 vf->config = config;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
382 vf->uninit = uninit;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
383 vf->put_image = put_image;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
384 vf->query_format = query_format;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
385
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
386 return 1;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
387 }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
388
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
389 ///Presets usage
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
390 static const struct format_preset {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
391 char* name;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
392 stereo_code scode;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
393 } vf_format_presets_defs[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
394 {"arcg", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
395 {"anaglyph_red_cyan_gray", ANAGLYPH_RC_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
396 {"arch", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
397 {"anaglyph_red_cyan_half_color", ANAGLYPH_RC_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
398 {"arcc", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
399 {"anaglyph_red_cyan_color", ANAGLYPH_RC_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
400 {"arcd", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
401 {"anaglyph_red_cyan_dubios", ANAGLYPH_RC_DUBOIS},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
402 {"agmg", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
403 {"anaglyph_green_magenta_gray", ANAGLYPH_GM_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
404 {"agmh", ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
405 {"anaglyph_green_magenta_half_color",ANAGLYPH_GM_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
406 {"agmc", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
407 {"anaglyph_green_magenta_color", ANAGLYPH_GM_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
408 {"aybg", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
409 {"anaglyph_yellow_blue_gray", ANAGLYPH_YB_GRAY},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
410 {"aybh", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
411 {"anaglyph_yellow_blue_half_color", ANAGLYPH_YB_HALF},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
412 {"aybc", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
413 {"anaglyph_yellow_blue_color", ANAGLYPH_YB_COLOR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
414 {"ml", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
415 {"mono_left", MONO_L},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
416 {"mr", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
417 {"mono_right", MONO_R},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
418 {"sbsl", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
419 {"side_by_side_left_first", SIDE_BY_SIDE_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
420 {"sbsr", SIDE_BY_SIDE_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
421 {"side_by_side_right_first", SIDE_BY_SIDE_RL},
33789
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
422 {"sbs2l", SIDE_BY_SIDE_2_LR},
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
423 {"side_by_side_half_width_left_first", SIDE_BY_SIDE_2_LR},
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
424 {"sbs2r", SIDE_BY_SIDE_2_RL},
475d96f700d4 Half-width side-by-side formats for stereo3d.
reimar
parents: 33602
diff changeset
425 {"side_by_side_half_width_right_first",SIDE_BY_SIDE_2_RL},
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
426 {"abl", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
427 {"above_below_left_first", ABOVE_BELOW_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
428 {"abr", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
429 {"above_below_right_first", ABOVE_BELOW_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
430 {"ab2l", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
431 {"above_below_half_height_left_first", ABOVE_BELOW_2_LR},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
432 {"ab2r", ABOVE_BELOW_2_RL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
433 {"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
434 {"irl", INTERLEAVE_ROWS_LR},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
435 {"interleave_rows_left_first", INTERLEAVE_ROWS_LR},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
436 {"irr", INTERLEAVE_ROWS_RL},
16cf555989a9 Add support for converting to interleaved 3D in vf_stereo3d.
reimar
parents: 32541
diff changeset
437 {"interleave_rows_right_first", INTERLEAVE_ROWS_RL},
32441
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
438 { NULL, 0}
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
439 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
440
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
441 #define ST_OFF(f) M_ST_OFF(struct format_preset,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
442 static const m_option_t vf_format_preset_fields_in[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
443 {"in", ST_OFF(scode), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
444 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
445 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
446 static const m_option_t vf_format_preset_fields_out[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
447 {"out", ST_OFF(scode), 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_format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
452 "stereo_format_preset_in",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
453 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
454 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
455 vf_format_preset_fields_in
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
456 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
457 static const m_struct_t vf_format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
458 "stereo_format_preset_out",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
459 sizeof(struct format_preset),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
460 NULL,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
461 vf_format_preset_fields_out
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
462 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
463
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
464 static const m_struct_t vf_opts;
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
465 static const m_obj_presets_t format_preset_in = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
466 (struct m_struct_st*)&vf_format_preset_in,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
467 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
468 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
469 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
470 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
471 static const m_obj_presets_t format_preset_out = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
472 (struct m_struct_st*)&vf_format_preset_out,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
473 (struct m_struct_st*)&vf_opts,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
474 (struct format_preset*)vf_format_presets_defs,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
475 ST_OFF(name)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
476 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
477
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
478 /// Now the options
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
479 #undef ST_OFF
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
480 #define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f)
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
481 static const m_option_t vf_opts_fields[] = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
482 {"stereo_in", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
483 (m_obj_presets_t*)&format_preset_in},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
484 {"stereo_out", 0, CONF_TYPE_OBJ_PRESETS, 0, 0, 0,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
485 (m_obj_presets_t*)&format_preset_out},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
486 {"in", ST_OFF(in.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
487 {"out", ST_OFF(out.fmt), CONF_TYPE_INT, 0,0,0, NULL},
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
488 { NULL, NULL, 0, 0, 0, 0, NULL }
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
489 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
490
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
491 static const m_struct_t vf_opts = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
492 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
493 sizeof(struct vf_priv_s),
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
494 &vf_priv_default,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
495 vf_opts_fields
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
496 };
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
497
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
498
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
499 //==info struct==//
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
500 const vf_info_t vf_info_stereo3d = {
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
501 "stereoscopic 3d view",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
502 "stereo3d",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
503 "Gordon Schmidt",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
504 "view stereoscopic videos",
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
505 vf_open,
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
506 &vf_opts
1a9b4cb4ba01 Add stereo3d filter.
reimar
parents:
diff changeset
507 };