@@ -47,7 +47,9 @@ typedef struct MaskedClampContext {
47
47
int depth ;
48
48
FFFrameSync fs ;
49
49
50
- int (* maskedclamp )(AVFilterContext * ctx , void * arg , int jobnr , int nb_jobs );
50
+ void (* maskedclamp )(const uint8_t * bsrc , uint8_t * dst ,
51
+ const uint8_t * darksrc , const uint8_t * brightsrc ,
52
+ int w , int undershoot , int overshoot );
51
53
} MaskedClampContext ;
52
54
53
55
static const AVOption maskedclamp_options [] = {
@@ -85,45 +87,7 @@ static int query_formats(AVFilterContext *ctx)
85
87
return ff_set_common_formats (ctx , ff_make_format_list (pix_fmts ));
86
88
}
87
89
88
- static int process_frame (FFFrameSync * fs )
89
- {
90
- AVFilterContext * ctx = fs -> parent ;
91
- MaskedClampContext * s = fs -> opaque ;
92
- AVFilterLink * outlink = ctx -> outputs [0 ];
93
- AVFrame * out , * base , * dark , * bright ;
94
- int ret ;
95
-
96
- if ((ret = ff_framesync_get_frame (& s -> fs , 0 , & base , 0 )) < 0 ||
97
- (ret = ff_framesync_get_frame (& s -> fs , 1 , & dark , 0 )) < 0 ||
98
- (ret = ff_framesync_get_frame (& s -> fs , 2 , & bright , 0 )) < 0 )
99
- return ret ;
100
-
101
- if (ctx -> is_disabled ) {
102
- out = av_frame_clone (base );
103
- if (!out )
104
- return AVERROR (ENOMEM );
105
- } else {
106
- ThreadData td ;
107
-
108
- out = ff_get_video_buffer (outlink , outlink -> w , outlink -> h );
109
- if (!out )
110
- return AVERROR (ENOMEM );
111
- av_frame_copy_props (out , base );
112
-
113
- td .b = base ;
114
- td .o = dark ;
115
- td .m = bright ;
116
- td .d = out ;
117
-
118
- ctx -> internal -> execute (ctx , s -> maskedclamp , & td , NULL , FFMIN (s -> height [0 ],
119
- ff_filter_get_nb_threads (ctx )));
120
- }
121
- out -> pts = av_rescale_q (s -> fs .pts , s -> fs .time_base , outlink -> time_base );
122
-
123
- return ff_filter_frame (outlink , out );
124
- }
125
-
126
- static int maskedclamp8 (AVFilterContext * ctx , void * arg , int jobnr , int nb_jobs )
90
+ static int maskedclamp_slice (AVFilterContext * ctx , void * arg , int jobnr , int nb_jobs )
127
91
{
128
92
MaskedClampContext * s = ctx -> priv ;
129
93
ThreadData * td = arg ;
@@ -144,7 +108,7 @@ static int maskedclamp8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
144
108
uint8_t * dst = td -> d -> data [p ] + slice_start * dlinesize ;
145
109
const int undershoot = s -> undershoot ;
146
110
const int overshoot = s -> overshoot ;
147
- int x , y ;
111
+ int y ;
148
112
149
113
if (!((1 << p ) & s -> planes )) {
150
114
av_image_copy_plane (dst , dlinesize , bsrc , blinesize ,
@@ -153,14 +117,7 @@ static int maskedclamp8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
153
117
}
154
118
155
119
for (y = slice_start ; y < slice_end ; y ++ ) {
156
- for (x = 0 ; x < w ; x ++ ) {
157
- if (bsrc [x ] < darksrc [x ] - undershoot )
158
- dst [x ] = darksrc [x ] - undershoot ;
159
- else if (bsrc [x ] > brightsrc [x ] + overshoot )
160
- dst [x ] = brightsrc [x ] + overshoot ;
161
- else
162
- dst [x ] = bsrc [x ];
163
- }
120
+ s -> maskedclamp (bsrc , dst , darksrc , brightsrc , w , undershoot , overshoot );
164
121
165
122
dst += dlinesize ;
166
123
bsrc += blinesize ;
@@ -172,55 +129,67 @@ static int maskedclamp8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
172
129
return 0 ;
173
130
}
174
131
175
- static int maskedclamp16 ( AVFilterContext * ctx , void * arg , int jobnr , int nb_jobs )
132
+ static int process_frame ( FFFrameSync * fs )
176
133
{
177
- MaskedClampContext * s = ctx -> priv ;
178
- ThreadData * td = arg ;
179
- int p ;
134
+ AVFilterContext * ctx = fs -> parent ;
135
+ MaskedClampContext * s = fs -> opaque ;
136
+ AVFilterLink * outlink = ctx -> outputs [0 ];
137
+ AVFrame * out , * base , * dark , * bright ;
138
+ int ret ;
180
139
181
- for (p = 0 ; p < s -> nb_planes ; p ++ ) {
182
- const ptrdiff_t blinesize = td -> b -> linesize [p ] / 2 ;
183
- const ptrdiff_t brightlinesize = td -> m -> linesize [p ] / 2 ;
184
- const ptrdiff_t darklinesize = td -> o -> linesize [p ] / 2 ;
185
- const ptrdiff_t dlinesize = td -> d -> linesize [p ] / 2 ;
186
- const int w = s -> width [p ];
187
- const int h = s -> height [p ];
188
- const int slice_start = (h * jobnr ) / nb_jobs ;
189
- const int slice_end = (h * (jobnr + 1 )) / nb_jobs ;
190
- const uint16_t * bsrc = (const uint16_t * )td -> b -> data [p ] + slice_start * blinesize ;
191
- const uint16_t * darksrc = (const uint16_t * )td -> o -> data [p ] + slice_start * darklinesize ;
192
- const uint16_t * brightsrc = (const uint16_t * )td -> m -> data [p ] + slice_start * brightlinesize ;
193
- uint16_t * dst = (uint16_t * )td -> d -> data [p ] + slice_start * dlinesize ;
194
- const int undershoot = s -> undershoot ;
195
- const int overshoot = s -> overshoot ;
196
- int x , y ;
140
+ if ((ret = ff_framesync_get_frame (& s -> fs , 0 , & base , 0 )) < 0 ||
141
+ (ret = ff_framesync_get_frame (& s -> fs , 1 , & dark , 0 )) < 0 ||
142
+ (ret = ff_framesync_get_frame (& s -> fs , 2 , & bright , 0 )) < 0 )
143
+ return ret ;
197
144
198
- if (!((1 << p ) & s -> planes )) {
199
- av_image_copy_plane ((uint8_t * )dst , dlinesize , (const uint8_t * )bsrc , blinesize ,
200
- s -> linesize [p ], slice_end - slice_start );
201
- continue ;
202
- }
145
+ if (ctx -> is_disabled ) {
146
+ out = av_frame_clone (base );
147
+ if (!out )
148
+ return AVERROR (ENOMEM );
149
+ } else {
150
+ ThreadData td ;
203
151
204
- for (y = slice_start ; y < slice_end ; y ++ ) {
205
- for (x = 0 ; x < w ; x ++ ) {
206
- if (bsrc [x ] < darksrc [x ] - undershoot )
207
- dst [x ] = darksrc [x ] - undershoot ;
208
- else if (bsrc [x ] > brightsrc [x ] + overshoot )
209
- dst [x ] = brightsrc [x ] + overshoot ;
210
- else
211
- dst [x ] = bsrc [x ];
212
- }
152
+ out = ff_get_video_buffer (outlink , outlink -> w , outlink -> h );
153
+ if (!out )
154
+ return AVERROR (ENOMEM );
155
+ av_frame_copy_props (out , base );
213
156
214
- dst += dlinesize ;
215
- bsrc += blinesize ;
216
- darksrc += darklinesize ;
217
- brightsrc += brightlinesize ;
218
- }
157
+ td .b = base ;
158
+ td .o = dark ;
159
+ td .m = bright ;
160
+ td .d = out ;
161
+
162
+ ctx -> internal -> execute (ctx , maskedclamp_slice , & td , NULL , FFMIN (s -> height [0 ],
163
+ ff_filter_get_nb_threads (ctx )));
219
164
}
165
+ out -> pts = av_rescale_q (s -> fs .pts , s -> fs .time_base , outlink -> time_base );
220
166
221
- return 0 ;
167
+ return ff_filter_frame ( outlink , out ) ;
222
168
}
223
169
170
+ #define MASKEDCLAMP (type , name ) \
171
+ static void maskedclamp##name(const uint8_t *bbsrc, uint8_t *ddst, \
172
+ const uint8_t *ddarksrc, const uint8_t *bbrightsrc, \
173
+ int w, int undershoot, int overshoot) \
174
+ { \
175
+ const type *bsrc = (const type *)bbsrc; \
176
+ const type *darksrc = (const type *)ddarksrc; \
177
+ const type *brightsrc = (const type *)bbrightsrc; \
178
+ type *dst = (type *)ddst; \
179
+ \
180
+ for (int x = 0; x < w; x++) { \
181
+ if (bsrc[x] < darksrc[x] - undershoot) \
182
+ dst[x] = darksrc[x] - undershoot; \
183
+ else if (bsrc[x] > brightsrc[x] + overshoot) \
184
+ dst[x] = brightsrc[x] + overshoot; \
185
+ else \
186
+ dst[x] = bsrc[x]; \
187
+ } \
188
+ }
189
+
190
+ MASKEDCLAMP (uint8_t , 8 )
191
+ MASKEDCLAMP (uint16_t , 16 )
192
+
224
193
static int config_input (AVFilterLink * inlink )
225
194
{
226
195
AVFilterContext * ctx = inlink -> dst ;
0 commit comments