annotate libmpcodecs/vf_eq.c @ 7062:9eae15166ebb

soft video equalizer filter, currently supports brightness and contrast adjustment for all planar yuv formats
author rfelker
date Wed, 21 Aug 2002 23:08:20 +0000
parents
children 7685130ba4bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7062
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
1 #include <stdio.h>
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
2 #include <stdlib.h>
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
3 #include <string.h>
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
4 #include <inttypes.h>
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
5
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
6 #include "../config.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
7 #include "../mp_msg.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
8
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
9 #include "img_format.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
10 #include "mp_image.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
11 #include "vf.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
12
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
13 #include "../libvo/video_out.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
14 #include "../libvo/fastmemcpy.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
15 #include "../postproc/rgb2rgb.h"
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
16
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
17 struct vf_priv_s {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
18 unsigned char *buf;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
19 int brightness;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
20 int contrast;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
21 };
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
22
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
23 static void process(unsigned char *dest, int dstride, unsigned char *src, int sstride,
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
24 int w, int h, int brightness, int contrast)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
25 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
26 int i;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
27 int pel;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
28 int dstep = dstride-w;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
29 int sstep = sstride-w;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
30
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
31 brightness = ((brightness+100)*511)/200-128;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
32 contrast = ((contrast+100)*512)/200;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
33
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
34 while (h--) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
35 for (i = w; i; i--)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
36 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
37 /* slow */
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
38 pel = ((*src++ - 128) * contrast)/256 + brightness;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
39 *dest++ = pel > 255 ? 255 : (pel < 0 ? 0 : pel);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
40 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
41 src += sstep;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
42 dest += dstep;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
43 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
44 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
45
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
46 /* FIXME: add packed yuv version of process, and optimized code! */
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
47
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
48 static void put_image(struct vf_instance_s* vf, mp_image_t *mpi)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
49 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
50 mp_image_t *dmpi;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
51
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
52 dmpi=vf_get_image(vf->next, mpi->imgfmt,
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
53 MP_IMGTYPE_EXPORT, 0,
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
54 mpi->w, mpi->h);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
55
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
56 dmpi->stride[0] = mpi->stride[0];
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
57 dmpi->planes[1] = mpi->planes[1];
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
58 dmpi->planes[2] = mpi->planes[2];
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
59 dmpi->stride[1] = mpi->stride[1];
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
60 dmpi->stride[2] = mpi->stride[2];
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
61
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
62 if (!vf->priv->buf) vf->priv->buf = malloc(mpi->stride[0]*mpi->h);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
63
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
64 if ((vf->priv->brightness == 0) && (vf->priv->contrast == 0))
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
65 dmpi->planes[0] = mpi->planes[0];
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
66 else {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
67 dmpi->planes[0] = vf->priv->buf;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
68 process(dmpi->planes[0], dmpi->stride[0],
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
69 mpi->planes[0], mpi->stride[0],
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
70 mpi->w, mpi->h, vf->priv->brightness,
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
71 vf->priv->contrast);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
72 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
73
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
74 vf_next_put_image(vf,dmpi);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
75 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
76
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
77 static int control(struct vf_instance_s* vf, int request, void* data)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
78 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
79 vf_equalizer_t *eq;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
80
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
81 switch (request) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
82 case VFCTRL_SET_EQUALIZER:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
83 eq = data;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
84 if (!strcmp(eq->item,"brightness")) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
85 vf->priv->brightness = eq->value;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
86 return CONTROL_TRUE;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
87 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
88 else if (!strcmp(eq->item,"contrast")) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
89 vf->priv->contrast = eq->value;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
90 return CONTROL_TRUE;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
91 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
92 break;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
93 case VFCTRL_GET_EQUALIZER:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
94 eq = data;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
95 if (!strcmp(eq->item,"brightness")) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
96 eq->value = vf->priv->brightness;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
97 return CONTROL_TRUE;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
98 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
99 else if (!strcmp(eq->item,"contrast")) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
100 eq->value = vf->priv->contrast;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
101 return CONTROL_TRUE;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
102 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
103 break;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
104 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
105 return vf_next_control(vf, request, data);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
106 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
107
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
108 static int query_format(struct vf_instance_s* vf, unsigned int fmt)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
109 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
110 switch (fmt) {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
111 case IMGFMT_YVU9:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
112 case IMGFMT_IF09:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
113 case IMGFMT_YV12:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
114 case IMGFMT_I420:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
115 case IMGFMT_IYUV:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
116 case IMGFMT_CLPL:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
117 case IMGFMT_Y800:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
118 case IMGFMT_Y8:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
119 case IMGFMT_NV12:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
120 case IMGFMT_444P:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
121 case IMGFMT_422P:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
122 case IMGFMT_411P:
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
123 return vf_next_query_format(vf, fmt);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
124 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
125 return 0;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
126 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
127
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
128 static void uninit(struct vf_instance_s* vf)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
129 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
130 if (vf->priv->buf) free(vf->priv->buf);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
131 free(vf->priv);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
132 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
133
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
134 static int open(vf_instance_t *vf, char* args)
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
135 {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
136 vf->control=control;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
137 vf->query_format=query_format;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
138 vf->put_image=put_image;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
139 vf->uninit=uninit;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
140
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
141 vf->priv = malloc(sizeof(struct vf_priv_s));
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
142 memset(vf->priv, 0, sizeof(struct vf_priv_s));
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
143 if (args) sscanf(args, "%d:%d", &vf->priv->brightness, &vf->priv->contrast);
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
144 return 1;
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
145 }
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
146
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
147 vf_info_t vf_info_eq = {
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
148 "soft video equalizer",
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
149 "eq",
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
150 "Richard Felker",
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
151 "",
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
152 open
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
153 };
9eae15166ebb soft video equalizer filter, currently supports brightness and
rfelker
parents:
diff changeset
154