author | harlekin <harlekin> | 2002-12-19 21:41:50 (UTC) |
---|---|---|
committer | harlekin <harlekin> | 2002-12-19 21:41:50 (UTC) |
commit | 5fd6636ba3d94b48dd543887316c47c5388a43c2 (patch) (unidiff) | |
tree | f750583ce4284ac226da90858751875a5404de6b | |
parent | d73c08dacb1abd6e02e0ff803083985bd0ca791b (diff) | |
download | opie-5fd6636ba3d94b48dd543887316c47c5388a43c2.zip opie-5fd6636ba3d94b48dd543887316c47c5388a43c2.tar.gz opie-5fd6636ba3d94b48dd543887316c47c5388a43c2.tar.bz2 |
adapted to todays xine cvs
-rw-r--r-- | noncore/multimedia/opieplayer2/nullvideo.c | 2 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/yuv2rgb.c | 4 |
2 files changed, 4 insertions, 2 deletions
diff --git a/noncore/multimedia/opieplayer2/nullvideo.c b/noncore/multimedia/opieplayer2/nullvideo.c index a49f9d3..095f206 100644 --- a/noncore/multimedia/opieplayer2/nullvideo.c +++ b/noncore/multimedia/opieplayer2/nullvideo.c | |||
@@ -22,192 +22,194 @@ | |||
22 | ..}^=.= = ; Library General Public License for more | 22 | ..}^=.= = ; Library General Public License for more |
23 | ++= -. .` .: details. | 23 | ++= -. .` .: details. |
24 | : = ...= . :.=- | 24 | : = ...= . :.=- |
25 | -. .:....=;==+<; You should have received a copy of the GNU | 25 | -. .:....=;==+<; You should have received a copy of the GNU |
26 | -_. . . )=. = Library General Public License along with | 26 | -_. . . )=. = Library General Public License along with |
27 | -- :-=` this library; see the file COPYING.LIB. | 27 | -- :-=` this library; see the file COPYING.LIB. |
28 | If not, write to the Free Software Foundation, | 28 | If not, write to the Free Software Foundation, |
29 | Inc., 59 Temple Place - Suite 330, | 29 | Inc., 59 Temple Place - Suite 330, |
30 | Boston, MA 02111-1307, USA. | 30 | Boston, MA 02111-1307, USA. |
31 | 31 | ||
32 | */ | 32 | */ |
33 | 33 | ||
34 | #include <stdlib.h> | 34 | #include <stdlib.h> |
35 | #include <stdio.h> | 35 | #include <stdio.h> |
36 | 36 | ||
37 | #include <math.h> | 37 | #include <math.h> |
38 | 38 | ||
39 | #include <xine.h> | 39 | #include <xine.h> |
40 | #include <xine/video_out.h> | 40 | #include <xine/video_out.h> |
41 | #include <xine/xine_internal.h> | 41 | #include <xine/xine_internal.h> |
42 | #include <xine/xineutils.h> | 42 | #include <xine/xineutils.h> |
43 | #include <xine/vo_scale.h> | 43 | #include <xine/vo_scale.h> |
44 | #include <xine/buffer.h> | 44 | #include <xine/buffer.h> |
45 | 45 | ||
46 | #include <pthread.h> | 46 | #include <pthread.h> |
47 | #include "alphablend.h" | 47 | #include "alphablend.h" |
48 | #include "yuv2rgb.h" | 48 | #include "yuv2rgb.h" |
49 | 49 | ||
50 | #define printf(x,...) | 50 | #define printf(x,...) |
51 | 51 | ||
52 | /* | 52 | /* |
53 | #define LOG | 53 | #define LOG |
54 | */ | 54 | */ |
55 | 55 | ||
56 | /* the caller for our event draw handler */ | 56 | /* the caller for our event draw handler */ |
57 | typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame, | 57 | typedef void (*display_xine_frame_t) (void *user_data, uint8_t* frame, |
58 | int width, int height,int bytes ); | 58 | int width, int height,int bytes ); |
59 | 59 | ||
60 | typedef struct null_driver_s null_driver_t; | 60 | typedef struct null_driver_s null_driver_t; |
61 | 61 | ||
62 | struct null_driver_s { | 62 | struct null_driver_s { |
63 | vo_driver_t vo_driver; | 63 | vo_driver_t vo_driver; |
64 | 64 | ||
65 | uint32_t m_capabilities; | 65 | uint32_t m_capabilities; |
66 | int m_show_video; | 66 | int m_show_video; |
67 | int m_video_fullscreen; | 67 | int m_video_fullscreen; |
68 | int m_is_scaling; | 68 | int m_is_scaling; |
69 | 69 | ||
70 | int depth, bpp, bytes_per_pixel; | 70 | int depth, bpp, bytes_per_pixel; |
71 | int yuv2rgb_mode; | 71 | int yuv2rgb_mode; |
72 | int yuv2rgb_swap; | 72 | int yuv2rgb_swap; |
73 | int yuv2rgb_gamma; | 73 | int yuv2rgb_gamma; |
74 | uint8_t *yuv2rgb_cmap; | 74 | uint8_t *yuv2rgb_cmap; |
75 | yuv2rgb_factory_t *yuv2rgb_factory; | 75 | yuv2rgb_factory_t *yuv2rgb_factory; |
76 | 76 | ||
77 | vo_overlay_t *overlay; | 77 | vo_overlay_t *overlay; |
78 | vo_scale_t sc; | 78 | vo_scale_t sc; |
79 | 79 | ||
80 | int gui_width; | 80 | int gui_width; |
81 | int gui_height; | 81 | int gui_height; |
82 | int gui_changed; | 82 | int gui_changed; |
83 | 83 | ||
84 | double display_ratio; | 84 | double display_ratio; |
85 | void* caller; | 85 | void* caller; |
86 | display_xine_frame_t frameDis; | 86 | display_xine_frame_t frameDis; |
87 | }; | 87 | }; |
88 | 88 | ||
89 | typedef struct opie_frame_s opie_frame_t; | 89 | typedef struct opie_frame_s opie_frame_t; |
90 | struct opie_frame_s { | 90 | struct opie_frame_s { |
91 | vo_frame_t frame; | 91 | vo_frame_t frame; |
92 | 92 | ||
93 | int format; | 93 | int format; |
94 | int flags; | 94 | int flags; |
95 | 95 | ||
96 | vo_scale_t sc; | 96 | vo_scale_t sc; |
97 | 97 | ||
98 | uint8_t *chunk[3]; | 98 | uint8_t *chunk[3]; |
99 | 99 | ||
100 | uint8_t *data; /* rgb */ | 100 | uint8_t *data; /* rgb */ |
101 | int bytes_per_line; | 101 | int bytes_per_line; |
102 | 102 | ||
103 | yuv2rgb_t *yuv2rgb; | 103 | yuv2rgb_t *yuv2rgb; |
104 | uint8_t *rgb_dst; | 104 | uint8_t *rgb_dst; |
105 | int yuv_stride; | 105 | int yuv_stride; |
106 | int stripe_height, stripe_inc; | 106 | int stripe_height, stripe_inc; |
107 | 107 | ||
108 | null_driver_t *output; | 108 | null_driver_t *output; |
109 | }; | 109 | }; |
110 | 110 | ||
111 | static uint32_t null_get_capabilities( vo_driver_t *self ){ | 111 | static uint32_t null_get_capabilities( vo_driver_t *self ){ |
112 | null_driver_t* this = (null_driver_t*)self; | 112 | null_driver_t* this = (null_driver_t*)self; |
113 | return this->m_capabilities; | 113 | return this->m_capabilities; |
114 | } | 114 | } |
115 | 115 | ||
116 | static void null_frame_copy (vo_frame_t *vo_img, uint8_t **src) { | 116 | static void null_frame_copy (vo_frame_t *vo_img, uint8_t **src) { |
117 | opie_frame_t *frame = (opie_frame_t *) vo_img ; | 117 | opie_frame_t *frame = (opie_frame_t *) vo_img ; |
118 | |||
119 | vo_img->copy_called = 1; | ||
118 | 120 | ||
119 | if (!frame->output->m_show_video) { | 121 | if (!frame->output->m_show_video) { |
120 | /* printf("nullvideo: no video\n"); */ | 122 | /* printf("nullvideo: no video\n"); */ |
121 | return; | 123 | return; |
122 | } | 124 | } |
123 | 125 | ||
124 | if (frame->format == XINE_IMGFMT_YV12) { | 126 | if (frame->format == XINE_IMGFMT_YV12) { |
125 | frame->yuv2rgb->yuv2rgb_fun (frame->yuv2rgb, frame->rgb_dst, | 127 | frame->yuv2rgb->yuv2rgb_fun (frame->yuv2rgb, frame->rgb_dst, |
126 | src[0], src[1], src[2]); | 128 | src[0], src[1], src[2]); |
127 | } else { | 129 | } else { |
128 | 130 | ||
129 | frame->yuv2rgb->yuy22rgb_fun (frame->yuv2rgb, frame->rgb_dst, | 131 | frame->yuv2rgb->yuy22rgb_fun (frame->yuv2rgb, frame->rgb_dst, |
130 | src[0]); | 132 | src[0]); |
131 | } | 133 | } |
132 | 134 | ||
133 | frame->rgb_dst += frame->stripe_inc; | 135 | frame->rgb_dst += frame->stripe_inc; |
134 | } | 136 | } |
135 | 137 | ||
136 | static void null_frame_field (vo_frame_t *vo_img, int which_field) { | 138 | static void null_frame_field (vo_frame_t *vo_img, int which_field) { |
137 | 139 | ||
138 | opie_frame_t *frame = (opie_frame_t *) vo_img ; | 140 | opie_frame_t *frame = (opie_frame_t *) vo_img ; |
139 | 141 | ||
140 | switch (which_field) { | 142 | switch (which_field) { |
141 | case VO_TOP_FIELD: | 143 | case VO_TOP_FIELD: |
142 | frame->rgb_dst = (uint8_t *)frame->data; | 144 | frame->rgb_dst = (uint8_t *)frame->data; |
143 | frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line; | 145 | frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line; |
144 | break; | 146 | break; |
145 | case VO_BOTTOM_FIELD: | 147 | case VO_BOTTOM_FIELD: |
146 | frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ; | 148 | frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ; |
147 | frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line; | 149 | frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line; |
148 | break; | 150 | break; |
149 | case VO_BOTH_FIELDS: | 151 | case VO_BOTH_FIELDS: |
150 | frame->rgb_dst = (uint8_t *)frame->data; | 152 | frame->rgb_dst = (uint8_t *)frame->data; |
151 | break; | 153 | break; |
152 | } | 154 | } |
153 | } | 155 | } |
154 | 156 | ||
155 | 157 | ||
156 | /* take care of the frame*/ | 158 | /* take care of the frame*/ |
157 | static void null_frame_dispose( vo_frame_t* vo_img){ | 159 | static void null_frame_dispose( vo_frame_t* vo_img){ |
158 | opie_frame_t* frame = (opie_frame_t*)vo_img; | 160 | opie_frame_t* frame = (opie_frame_t*)vo_img; |
159 | 161 | ||
160 | if (frame->data) | 162 | if (frame->data) |
161 | free( frame->data ); | 163 | free( frame->data ); |
162 | free (frame); | 164 | free (frame); |
163 | } | 165 | } |
164 | 166 | ||
165 | /* end take care of frames*/ | 167 | /* end take care of frames*/ |
166 | 168 | ||
167 | static vo_frame_t* null_alloc_frame( vo_driver_t* self ){ | 169 | static vo_frame_t* null_alloc_frame( vo_driver_t* self ){ |
168 | 170 | ||
169 | null_driver_t* this = (null_driver_t*)self; | 171 | null_driver_t* this = (null_driver_t*)self; |
170 | opie_frame_t* frame; | 172 | opie_frame_t* frame; |
171 | 173 | ||
172 | #ifdef LOG | 174 | #ifdef LOG |
173 | fprintf (stderr, "nullvideo: alloc_frame\n"); | 175 | fprintf (stderr, "nullvideo: alloc_frame\n"); |
174 | #endif | 176 | #endif |
175 | 177 | ||
176 | frame = (opie_frame_t*)malloc ( sizeof(opie_frame_t) ); | 178 | frame = (opie_frame_t*)malloc ( sizeof(opie_frame_t) ); |
177 | 179 | ||
178 | memset( frame, 0, sizeof( opie_frame_t) ); | 180 | memset( frame, 0, sizeof( opie_frame_t) ); |
179 | memcpy (&frame->sc, &this->sc, sizeof(vo_scale_t)); | 181 | memcpy (&frame->sc, &this->sc, sizeof(vo_scale_t)); |
180 | 182 | ||
181 | pthread_mutex_init (&frame->frame.mutex, NULL); | 183 | pthread_mutex_init (&frame->frame.mutex, NULL); |
182 | 184 | ||
183 | frame->output = this; | 185 | frame->output = this; |
184 | 186 | ||
185 | /* initialize the frame*/ | 187 | /* initialize the frame*/ |
186 | frame->frame.driver = self; | 188 | frame->frame.driver = self; |
187 | frame->frame.copy = null_frame_copy; | 189 | frame->frame.copy = null_frame_copy; |
188 | frame->frame.field = null_frame_field; | 190 | frame->frame.field = null_frame_field; |
189 | frame->frame.dispose = null_frame_dispose; | 191 | frame->frame.dispose = null_frame_dispose; |
190 | 192 | ||
191 | /* | 193 | /* |
192 | * colorspace converter for this frame | 194 | * colorspace converter for this frame |
193 | */ | 195 | */ |
194 | frame->yuv2rgb = this->yuv2rgb_factory->create_converter (this->yuv2rgb_factory); | 196 | frame->yuv2rgb = this->yuv2rgb_factory->create_converter (this->yuv2rgb_factory); |
195 | 197 | ||
196 | return (vo_frame_t*) frame; | 198 | return (vo_frame_t*) frame; |
197 | } | 199 | } |
198 | 200 | ||
199 | static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, | 201 | static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, |
200 | uint32_t width, uint32_t height, | 202 | uint32_t width, uint32_t height, |
201 | int ratio_code, int format, int flags ){ | 203 | int ratio_code, int format, int flags ){ |
202 | null_driver_t* this = (null_driver_t*) self; | 204 | null_driver_t* this = (null_driver_t*) self; |
203 | opie_frame_t* frame = (opie_frame_t*)img; | 205 | opie_frame_t* frame = (opie_frame_t*)img; |
204 | /* not needed now */ | 206 | /* not needed now */ |
205 | 207 | ||
206 | #ifdef LOG | 208 | #ifdef LOG |
207 | fprintf (stderr, "nullvideo: update_frame_format\n"); | 209 | fprintf (stderr, "nullvideo: update_frame_format\n"); |
208 | #endif | 210 | #endif |
209 | 211 | ||
210 | flags &= VO_BOTH_FIELDS; | 212 | flags &= VO_BOTH_FIELDS; |
211 | 213 | ||
212 | /* find out if we need to adapt this frame */ | 214 | /* find out if we need to adapt this frame */ |
213 | 215 | ||
diff --git a/noncore/multimedia/opieplayer2/yuv2rgb.c b/noncore/multimedia/opieplayer2/yuv2rgb.c index e8e86e6..8e34052 100644 --- a/noncore/multimedia/opieplayer2/yuv2rgb.c +++ b/noncore/multimedia/opieplayer2/yuv2rgb.c | |||
@@ -1114,197 +1114,197 @@ static void scale_line_3_4 (uint8_t *source, uint8_t *dest, | |||
1114 | int width, int step) { | 1114 | int width, int step) { |
1115 | 1115 | ||
1116 | int p1, p2; | 1116 | int p1, p2; |
1117 | 1117 | ||
1118 | xine_profiler_start_count(prof_scale_line); | 1118 | xine_profiler_start_count(prof_scale_line); |
1119 | 1119 | ||
1120 | while ((width -= 4) >= 0) { | 1120 | while ((width -= 4) >= 0) { |
1121 | p1 = source[0]; | 1121 | p1 = source[0]; |
1122 | p2 = source[1]; | 1122 | p2 = source[1]; |
1123 | dest[0] = p1; | 1123 | dest[0] = p1; |
1124 | dest[1] = (1*p1 + 3*p2) >> 2; | 1124 | dest[1] = (1*p1 + 3*p2) >> 2; |
1125 | p1 = source[2]; | 1125 | p1 = source[2]; |
1126 | dest[2] = (1*p2 + 1*p1) >> 1; | 1126 | dest[2] = (1*p2 + 1*p1) >> 1; |
1127 | p2 = source[3]; | 1127 | p2 = source[3]; |
1128 | dest[3] = (3*p1 + 1*p2) >> 2; | 1128 | dest[3] = (3*p1 + 1*p2) >> 2; |
1129 | source += 3; | 1129 | source += 3; |
1130 | dest += 4; | 1130 | dest += 4; |
1131 | } | 1131 | } |
1132 | 1132 | ||
1133 | if ((width += 4) <= 0) goto done; | 1133 | if ((width += 4) <= 0) goto done; |
1134 | *dest++ = source[0]; | 1134 | *dest++ = source[0]; |
1135 | if (--width <= 0) goto done; | 1135 | if (--width <= 0) goto done; |
1136 | *dest++ = (1*source[0] + 3*source[1]) >> 2; | 1136 | *dest++ = (1*source[0] + 3*source[1]) >> 2; |
1137 | if (--width <= 0) goto done; | 1137 | if (--width <= 0) goto done; |
1138 | *dest++ = (1*source[1] + 1*source[2]) >> 1; | 1138 | *dest++ = (1*source[1] + 1*source[2]) >> 1; |
1139 | done: | 1139 | done: |
1140 | 1140 | ||
1141 | xine_profiler_stop_count(prof_scale_line); | 1141 | xine_profiler_stop_count(prof_scale_line); |
1142 | } | 1142 | } |
1143 | 1143 | ||
1144 | 1144 | ||
1145 | /* Interpolate 2 output pixels from one source pixel. */ | 1145 | /* Interpolate 2 output pixels from one source pixel. */ |
1146 | 1146 | ||
1147 | static void scale_line_1_2 (uint8_t *source, uint8_t *dest, | 1147 | static void scale_line_1_2 (uint8_t *source, uint8_t *dest, |
1148 | int width, int step) { | 1148 | int width, int step) { |
1149 | int p1, p2; | 1149 | int p1, p2; |
1150 | 1150 | ||
1151 | xine_profiler_start_count(prof_scale_line); | 1151 | xine_profiler_start_count(prof_scale_line); |
1152 | 1152 | ||
1153 | p1 = *source; | 1153 | p1 = *source; |
1154 | while ((width -= 4) >= 0) { | 1154 | while ((width -= 4) >= 0) { |
1155 | *dest++ = p1; | 1155 | *dest++ = p1; |
1156 | p2 = *++source; | 1156 | p2 = *++source; |
1157 | *dest++ = (p1 + p2) >> 1; | 1157 | *dest++ = (p1 + p2) >> 1; |
1158 | *dest++ = p2; | 1158 | *dest++ = p2; |
1159 | p1 = *++source; | 1159 | p1 = *++source; |
1160 | *dest++ = (p2 + p1) >> 1; | 1160 | *dest++ = (p2 + p1) >> 1; |
1161 | } | 1161 | } |
1162 | 1162 | ||
1163 | if ((width += 4) <= 0) goto done; | 1163 | if ((width += 4) <= 0) goto done; |
1164 | *dest++ = source[0]; | 1164 | *dest++ = source[0]; |
1165 | if (--width <= 0) goto done; | 1165 | if (--width <= 0) goto done; |
1166 | *dest++ = (source[0] + source[1]) >> 1; | 1166 | *dest++ = (source[0] + source[1]) >> 1; |
1167 | if (--width <= 0) goto done; | 1167 | if (--width <= 0) goto done; |
1168 | *dest++ = source[1]; | 1168 | *dest++ = source[1]; |
1169 | done: | 1169 | done: |
1170 | 1170 | ||
1171 | xine_profiler_stop_count(prof_scale_line); | 1171 | xine_profiler_stop_count(prof_scale_line); |
1172 | } | 1172 | } |
1173 | 1173 | ||
1174 | 1174 | ||
1175 | /* | 1175 | /* |
1176 | * Scale line with no horizontal scaling. For NTSC mpeg2 dvd input in | 1176 | * Scale line with no horizontal scaling. For NTSC mpeg2 dvd input in |
1177 | * 4:3 output format (720x480 -> 720x540) | 1177 | * 4:3 output format (720x480 -> 720x540) |
1178 | */ | 1178 | */ |
1179 | static void scale_line_1_1 (uint8_t *source, uint8_t *dest, | 1179 | static void scale_line_1_1 (uint8_t *source, uint8_t *dest, |
1180 | int width, int step) { | 1180 | int width, int step) { |
1181 | 1181 | ||
1182 | xine_profiler_start_count(prof_scale_line); | 1182 | xine_profiler_start_count(prof_scale_line); |
1183 | xine_fast_memcpy(dest, source, width); | 1183 | xine_fast_memcpy(dest, source, width); |
1184 | xine_profiler_stop_count(prof_scale_line); | 1184 | xine_profiler_stop_count(prof_scale_line); |
1185 | } | 1185 | } |
1186 | 1186 | ||
1187 | 1187 | ||
1188 | static scale_line_func_t find_scale_line_func(int step) { | 1188 | static scale_line_func_t find_scale_line_func(int step) { |
1189 | static struct { | 1189 | static struct { |
1190 | int src_step; | 1190 | int src_step; |
1191 | int dest_step; | 1191 | int dest_step; |
1192 | scale_line_func_tfunc; | 1192 | scale_line_func_tfunc; |
1193 | char *desc; | 1193 | char *desc; |
1194 | } scale_line[] = { | 1194 | } scale_line[] = { |
1195 | { 15, 16, scale_line_15_16, "dvd 4:3(pal)" }, | 1195 | { 15, 16, scale_line_15_16, "dvd 4:3(pal)" }, |
1196 | { 45, 64, scale_line_45_64, "dvd 16:9(pal), fullscreen(1024x768)" }, | 1196 | { 45, 64, scale_line_45_64, "dvd 16:9(pal), fullscreen(1024x768)" }, |
1197 | { 9, 16, scale_line_9_16, "dvd fullscreen(1280x1024)" }, | 1197 | { 9, 16, scale_line_9_16, "dvd fullscreen(1280x1024)" }, |
1198 | { 45, 53, scale_line_45_53, "dvd 16:9(ntsc)" }, | 1198 | { 45, 53, scale_line_45_53, "dvd 16:9(ntsc)" }, |
1199 | { 11, 12, scale_line_11_12, "vcd 4:3(pal)" }, | 1199 | { 11, 12, scale_line_11_12, "vcd 4:3(pal)" }, |
1200 | { 11, 24, scale_line_11_24, "vcd 4:3(pal) 2*zoom" }, | 1200 | { 11, 24, scale_line_11_24, "vcd 4:3(pal) 2*zoom" }, |
1201 | { 5, 8, scale_line_5_8, "svcd 4:3(pal)" }, | 1201 | { 5, 8, scale_line_5_8, "svcd 4:3(pal)" }, |
1202 | { 3, 4, scale_line_3_4, "svcd 4:3(ntsc)" }, | 1202 | { 3, 4, scale_line_3_4, "svcd 4:3(ntsc)" }, |
1203 | { 1, 2, scale_line_1_2, "2*zoom" }, | 1203 | { 1, 2, scale_line_1_2, "2*zoom" }, |
1204 | { 1, 1, scale_line_1_1, "non-scaled" }, | 1204 | { 1, 1, scale_line_1_1, "non-scaled" }, |
1205 | }; | 1205 | }; |
1206 | int i; | 1206 | int i; |
1207 | 1207 | ||
1208 | for (i = 0; i < sizeof(scale_line)/sizeof(scale_line[0]); i++) { | 1208 | for (i = 0; i < sizeof(scale_line)/sizeof(scale_line[0]); i++) { |
1209 | if (step == scale_line[i].src_step*32768/scale_line[i].dest_step) { | 1209 | if (step == scale_line[i].src_step*32768/scale_line[i].dest_step) { |
1210 | printf("yuv2rgb: using %s optimized scale_line\n", scale_line[i].desc); | 1210 | //printf("yuv2rgb: using %s optimized scale_line\n", scale_line[i].desc); |
1211 | return scale_line[i].func; | 1211 | return scale_line[i].func; |
1212 | } | 1212 | } |
1213 | } | 1213 | } |
1214 | printf("yuv2rgb: using generic scale_line with interpolation\n"); | 1214 | //printf("yuv2rgb: using generic scale_line with interpolation\n"); |
1215 | return scale_line_gen; | 1215 | return scale_line_gen; |
1216 | 1216 | ||
1217 | } | 1217 | } |
1218 | 1218 | ||
1219 | 1219 | ||
1220 | static void scale_line_2 (uint8_t *source, uint8_t *dest, | 1220 | static void scale_line_2 (uint8_t *source, uint8_t *dest, |
1221 | int width, int step) { | 1221 | int width, int step) { |
1222 | int p1; | 1222 | int p1; |
1223 | int p2; | 1223 | int p2; |
1224 | int dx; | 1224 | int dx; |
1225 | 1225 | ||
1226 | p1 = *source; source+=2; | 1226 | p1 = *source; source+=2; |
1227 | p2 = *source; source+=2; | 1227 | p2 = *source; source+=2; |
1228 | dx = 0; | 1228 | dx = 0; |
1229 | 1229 | ||
1230 | while (width) { | 1230 | while (width) { |
1231 | 1231 | ||
1232 | *dest = (p1 * (32768 - dx) + p2 * dx) / 32768; | 1232 | *dest = (p1 * (32768 - dx) + p2 * dx) / 32768; |
1233 | 1233 | ||
1234 | dx += step; | 1234 | dx += step; |
1235 | while (dx > 32768) { | 1235 | while (dx > 32768) { |
1236 | dx -= 32768; | 1236 | dx -= 32768; |
1237 | p1 = p2; | 1237 | p1 = p2; |
1238 | p2 = *source; | 1238 | p2 = *source; |
1239 | source+=2; | 1239 | source+=2; |
1240 | } | 1240 | } |
1241 | 1241 | ||
1242 | dest ++; | 1242 | dest ++; |
1243 | width --; | 1243 | width --; |
1244 | } | 1244 | } |
1245 | } | 1245 | } |
1246 | 1246 | ||
1247 | static void scale_line_4 (uint8_t *source, uint8_t *dest, | 1247 | static void scale_line_4 (uint8_t *source, uint8_t *dest, |
1248 | int width, int step) { | 1248 | int width, int step) { |
1249 | int p1; | 1249 | int p1; |
1250 | int p2; | 1250 | int p2; |
1251 | int dx; | 1251 | int dx; |
1252 | 1252 | ||
1253 | p1 = *source; source+=4; | 1253 | p1 = *source; source+=4; |
1254 | p2 = *source; source+=4; | 1254 | p2 = *source; source+=4; |
1255 | dx = 0; | 1255 | dx = 0; |
1256 | 1256 | ||
1257 | while (width) { | 1257 | while (width) { |
1258 | 1258 | ||
1259 | *dest = (p1 * (32768 - dx) + p2 * dx) / 32768; | 1259 | *dest = (p1 * (32768 - dx) + p2 * dx) / 32768; |
1260 | 1260 | ||
1261 | dx += step; | 1261 | dx += step; |
1262 | while (dx > 32768) { | 1262 | while (dx > 32768) { |
1263 | dx -= 32768; | 1263 | dx -= 32768; |
1264 | p1 = p2; | 1264 | p1 = p2; |
1265 | p2 = *source; | 1265 | p2 = *source; |
1266 | source+=4; | 1266 | source+=4; |
1267 | } | 1267 | } |
1268 | 1268 | ||
1269 | dest ++; | 1269 | dest ++; |
1270 | width --; | 1270 | width --; |
1271 | } | 1271 | } |
1272 | } | 1272 | } |
1273 | 1273 | ||
1274 | 1274 | ||
1275 | #define RGB(i) \ | 1275 | #define RGB(i) \ |
1276 | U = pu[i]; \ | 1276 | U = pu[i]; \ |
1277 | V = pv[i]; \ | 1277 | V = pv[i]; \ |
1278 | r = this->table_rV[V]; \ | 1278 | r = this->table_rV[V]; \ |
1279 | g = (void *) (((uint8_t *)this->table_gU[U]) + this->table_gV[V]);\ | 1279 | g = (void *) (((uint8_t *)this->table_gU[U]) + this->table_gV[V]);\ |
1280 | b = this->table_bU[U]; | 1280 | b = this->table_bU[U]; |
1281 | 1281 | ||
1282 | #define DST1(i) \ | 1282 | #define DST1(i) \ |
1283 | Y = py_1[2*i]; \ | 1283 | Y = py_1[2*i]; \ |
1284 | dst_1[2*i] = r[Y] + g[Y] + b[Y];\ | 1284 | dst_1[2*i] = r[Y] + g[Y] + b[Y];\ |
1285 | Y = py_1[2*i+1]; \ | 1285 | Y = py_1[2*i+1]; \ |
1286 | dst_1[2*i+1] = r[Y] + g[Y] + b[Y]; | 1286 | dst_1[2*i+1] = r[Y] + g[Y] + b[Y]; |
1287 | 1287 | ||
1288 | #define DST2(i) \ | 1288 | #define DST2(i) \ |
1289 | Y = py_2[2*i]; \ | 1289 | Y = py_2[2*i]; \ |
1290 | dst_2[2*i] = r[Y] + g[Y] + b[Y];\ | 1290 | dst_2[2*i] = r[Y] + g[Y] + b[Y];\ |
1291 | Y = py_2[2*i+1]; \ | 1291 | Y = py_2[2*i+1]; \ |
1292 | dst_2[2*i+1] = r[Y] + g[Y] + b[Y]; | 1292 | dst_2[2*i+1] = r[Y] + g[Y] + b[Y]; |
1293 | 1293 | ||
1294 | #define DST1RGB(i) \ | 1294 | #define DST1RGB(i) \ |
1295 | Y = py_1[2*i]; \ | 1295 | Y = py_1[2*i]; \ |
1296 | dst_1[6*i] = r[Y]; dst_1[6*i+1] = g[Y]; dst_1[6*i+2] = b[Y];\ | 1296 | dst_1[6*i] = r[Y]; dst_1[6*i+1] = g[Y]; dst_1[6*i+2] = b[Y];\ |
1297 | Y = py_1[2*i+1]; \ | 1297 | Y = py_1[2*i+1]; \ |
1298 | dst_1[6*i+3] = r[Y]; dst_1[6*i+4] = g[Y]; dst_1[6*i+5] = b[Y]; | 1298 | dst_1[6*i+3] = r[Y]; dst_1[6*i+4] = g[Y]; dst_1[6*i+5] = b[Y]; |
1299 | 1299 | ||
1300 | #define DST2RGB(i) \ | 1300 | #define DST2RGB(i) \ |
1301 | Y = py_2[2*i]; \ | 1301 | Y = py_2[2*i]; \ |
1302 | dst_2[6*i] = r[Y]; dst_2[6*i+1] = g[Y]; dst_2[6*i+2] = b[Y];\ | 1302 | dst_2[6*i] = r[Y]; dst_2[6*i+1] = g[Y]; dst_2[6*i+2] = b[Y];\ |
1303 | Y = py_2[2*i+1]; \ | 1303 | Y = py_2[2*i+1]; \ |
1304 | dst_2[6*i+3] = r[Y]; dst_2[6*i+4] = g[Y]; dst_2[6*i+5] = b[Y]; | 1304 | dst_2[6*i+3] = r[Y]; dst_2[6*i+4] = g[Y]; dst_2[6*i+5] = b[Y]; |
1305 | 1305 | ||
1306 | #define DST1BGR(i) \ | 1306 | #define DST1BGR(i) \ |
1307 | Y = py_1[2*i]; \ | 1307 | Y = py_1[2*i]; \ |
1308 | dst_1[6*i] = b[Y]; dst_1[6*i+1] = g[Y]; dst_1[6*i+2] = r[Y];\ | 1308 | dst_1[6*i] = b[Y]; dst_1[6*i+1] = g[Y]; dst_1[6*i+2] = r[Y];\ |
1309 | Y = py_1[2*i+1]; \ | 1309 | Y = py_1[2*i+1]; \ |
1310 | dst_1[6*i+3] = b[Y]; dst_1[6*i+4] = g[Y]; dst_1[6*i+5] = r[Y]; | 1310 | dst_1[6*i+3] = b[Y]; dst_1[6*i+4] = g[Y]; dst_1[6*i+5] = r[Y]; |