... | ... |
@@ -152,22 +152,28 @@ static int geq_config_props(AVFilterLink *inlink) |
152 | 152 |
return 0; |
153 | 153 |
} |
154 | 154 |
|
155 |
-static int geq_end_frame(AVFilterLink *inlink) |
|
155 |
+static int geq_filter_frame(AVFilterLink *inlink, AVFilterBufferRef *in) |
|
156 | 156 |
{ |
157 |
- int ret, plane; |
|
157 |
+ int plane; |
|
158 | 158 |
GEQContext *geq = inlink->dst->priv; |
159 | 159 |
AVFilterLink *outlink = inlink->dst->outputs[0]; |
160 |
- AVFilterBufferRef *outpicref = outlink->out_buf; |
|
160 |
+ AVFilterBufferRef *out; |
|
161 | 161 |
double values[VAR_VARS_NB] = { |
162 | 162 |
[VAR_N] = geq->framenum++, |
163 | 163 |
}; |
164 | 164 |
|
165 |
- geq->picref = inlink->cur_buf; |
|
165 |
+ geq->picref = in; |
|
166 |
+ out = ff_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h); |
|
167 |
+ if (!out) { |
|
168 |
+ avfilter_unref_bufferp(&in); |
|
169 |
+ return AVERROR(ENOMEM); |
|
170 |
+ } |
|
171 |
+ avfilter_copy_buffer_ref_props(out, in); |
|
166 | 172 |
|
167 | 173 |
for (plane = 0; plane < 3; plane++) { |
168 | 174 |
int x, y; |
169 |
- uint8_t *dst = outpicref->data[plane]; |
|
170 |
- const int linesize = outpicref->linesize[plane]; |
|
175 |
+ uint8_t *dst = out->data[plane]; |
|
176 |
+ const int linesize = out->linesize[plane]; |
|
171 | 177 |
const int w = inlink->w >> (plane ? geq->hsub : 0); |
172 | 178 |
const int h = inlink->h >> (plane ? geq->vsub : 0); |
173 | 179 |
|
... | ... |
@@ -186,10 +192,8 @@ static int geq_end_frame(AVFilterLink *inlink) |
186 | 186 |
} |
187 | 187 |
} |
188 | 188 |
|
189 |
- if ((ret = ff_draw_slice(outlink, 0, outlink->h, 1)) < 0 || |
|
190 |
- (ret = ff_end_frame(outlink)) < 0) |
|
191 |
- return ret; |
|
192 |
- return 0; |
|
189 |
+ avfilter_unref_bufferp(&geq->picref); |
|
190 |
+ return ff_filter_frame(outlink, out); |
|
193 | 191 |
} |
194 | 192 |
|
195 | 193 |
static av_cold void geq_uninit(AVFilterContext *ctx) |
... | ... |
@@ -202,15 +206,12 @@ static av_cold void geq_uninit(AVFilterContext *ctx) |
202 | 202 |
av_opt_free(geq); |
203 | 203 |
} |
204 | 204 |
|
205 |
-static int null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { return 0; } |
|
206 |
- |
|
207 | 205 |
static const AVFilterPad geq_inputs[] = { |
208 | 206 |
{ |
209 | 207 |
.name = "default", |
210 | 208 |
.type = AVMEDIA_TYPE_VIDEO, |
211 |
- .draw_slice = null_draw_slice, |
|
212 | 209 |
.config_props = geq_config_props, |
213 |
- .end_frame = geq_end_frame, |
|
210 |
+ .filter_frame = geq_filter_frame, |
|
214 | 211 |
.min_perms = AV_PERM_READ, |
215 | 212 |
}, |
216 | 213 |
{ NULL } |