|
|
|
@ -213,11 +213,16 @@ static int config_props(AVFilterLink *outlink) |
|
|
|
|
|
|
|
|
|
if (scale->sws) |
|
|
|
|
sws_freeContext(scale->sws); |
|
|
|
|
scale->sws = sws_getContext(inlink ->w, inlink ->h, inlink ->format, |
|
|
|
|
outlink->w, outlink->h, outlink->format, |
|
|
|
|
scale->flags, NULL, NULL, NULL); |
|
|
|
|
if (!scale->sws) |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
if (inlink->w == outlink->w && inlink->h == outlink->h && |
|
|
|
|
inlink->format == outlink->format) |
|
|
|
|
scale->sws = NULL; |
|
|
|
|
else { |
|
|
|
|
scale->sws = sws_getContext(inlink ->w, inlink ->h, inlink ->format, |
|
|
|
|
outlink->w, outlink->h, outlink->format, |
|
|
|
|
scale->flags, NULL, NULL, NULL); |
|
|
|
|
if (!scale->sws) |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (inlink->sample_aspect_ratio.num) |
|
|
|
@ -241,6 +246,11 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) |
|
|
|
|
AVFilterLink *outlink = link->dst->outputs[0]; |
|
|
|
|
AVFilterBufferRef *outpicref; |
|
|
|
|
|
|
|
|
|
if (!scale->sws) { |
|
|
|
|
avfilter_start_frame(outlink, avfilter_ref_buffer(picref, ~0)); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
scale->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w; |
|
|
|
|
scale->vsub = av_pix_fmt_descriptors[link->format].log2_chroma_h; |
|
|
|
|
|
|
|
|
@ -267,6 +277,11 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir) |
|
|
|
|
AVFilterBufferRef *cur_pic = link->cur_buf; |
|
|
|
|
const uint8_t *data[4]; |
|
|
|
|
|
|
|
|
|
if (!scale->sws) { |
|
|
|
|
avfilter_draw_slice(link->dst->outputs[0], y, h, slice_dir); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (scale->slice_y == 0 && slice_dir == -1) |
|
|
|
|
scale->slice_y = link->dst->outputs[0]->h; |
|
|
|
|
|
|
|
|
|