FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mss2dsp.c
Go to the documentation of this file.
1 /*
2  * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder DSP routines
24  */
25 
26 #include "mss2dsp.h"
27 #include "libavutil/common.h"
28 
30  int dst_stride,
31  int gray,
32  int use_mask,
33  int maskcolor,
34  const uint8_t *mask,
35  int mask_stride,
36  const uint8_t *srcy,
37  int srcy_stride,
38  const uint8_t *srcu,
39  const uint8_t *srcv,
40  int srcuv_stride,
41  int w, int h)
42 {
43  int i, j, k, r = -1;
44  while (++r < h) {
45  for (i = 0, j = 0, k = 0; i < w; j += (i & 1), i++, k += 3) {
46  if (!use_mask || mask[i] == maskcolor) {
47  if (gray) {
48  dst[k] = dst[k + 1] = dst[k + 2] = 0x80;
49  } else {
50  int y = srcy[i];
51  int u = srcu[j] - 128;
52  int v = srcv[j] - 128;
53  dst[k] = av_clip_uint8(y + ( 91881 * v + 32768 >> 16));
54  dst[k + 1] = av_clip_uint8(y + (-22554 * u - 46802 * v + 32768 >> 16));
55  dst[k + 2] = av_clip_uint8(y + (116130 * u + 32768 >> 16));
56  }
57  }
58  }
59  mask += mask_stride;
60  dst += dst_stride;
61  srcy += srcy_stride;
62  srcu += srcuv_stride * (r & 1);
63  srcv += srcuv_stride * (r & 1);
64  }
65 }
66 
67 static void mss2_blit_wmv9_c(uint8_t *dst, int dst_stride,
68  const uint8_t *srcy, int srcy_stride,
69  const uint8_t *srcu, const uint8_t *srcv,
70  int srcuv_stride, int w, int h)
71 {
72  mss2_blit_wmv9_template(dst, dst_stride, 0, 0,
73  0, NULL, 0,
74  srcy, srcy_stride,
75  srcu, srcv, srcuv_stride,
76  w, h);
77 }
78 
79 static void mss2_blit_wmv9_masked_c(uint8_t *dst, int dst_stride,
80  int maskcolor, const uint8_t *mask,
81  int mask_stride,
82  const uint8_t *srcy, int srcy_stride,
83  const uint8_t *srcu, const uint8_t *srcv,
84  int srcuv_stride, int w, int h)
85 {
86  mss2_blit_wmv9_template(dst, dst_stride, 0, 1,
87  maskcolor, mask, mask_stride,
88  srcy, srcy_stride,
89  srcu, srcv, srcuv_stride,
90  w, h);
91 }
92 
93 static void mss2_gray_fill_masked_c(uint8_t *dst, int dst_stride,
94  int maskcolor, const uint8_t *mask,
95  int mask_stride, int w, int h)
96 {
97  mss2_blit_wmv9_template(dst, dst_stride, 1, 1,
98  maskcolor, mask, mask_stride,
99  NULL, 0,
100  NULL, NULL, 0,
101  w, h);
102 }
103 
104 static void upsample_plane_c(uint8_t *plane, int plane_stride, int w, int h)
105 {
106  uint8_t *src1, *src2, *dst1, *dst2, *p, a, b;
107  int i, j;
108 
109  if(!w || !h)
110  return;
111 
112  w += (w & 1);
113  h += (h & 1);
114 
115  j = h - 1;
116 
117  memcpy(plane + plane_stride * j,
118  plane + plane_stride * (j >> 1),
119  w);
120 
121  while ((j -= 2) > 0) {
122  dst1 = plane + plane_stride * (j + 1);
123  dst2 = plane + plane_stride * j;
124  src1 = plane + plane_stride * ((j + 1) >> 1);
125  src2 = plane + plane_stride * ( j >> 1);
126 
127  for (i = (w - 1) >> 1; i >= 0; i--) {
128  a = src1[i];
129  b = src2[i];
130  dst1[i] = (3 * a + b + 2) >> 2;
131  dst2[i] = (a + 3 * b + 2) >> 2;
132  }
133  }
134 
135  for (j = h - 1; j >= 0; j--) {
136  p = plane + plane_stride * j;
137  i = w - 1;
138 
139  p[i] = p[i >> 1];
140 
141  while ((i -= 2) > 0) {
142  a = p[ i >> 1];
143  b = p[(i + 1) >> 1];
144  p[i] = (3 * a + b + 1) >> 2;
145  p[i + 1] = (a + 3 * b + 1) >> 2;
146  }
147  }
148 }
149 
151 {
156 }