#include "libavutil/avassert.h"
#include "libswscale/swscale.h"
-static const char *var_names[] = {
+static const char * const var_names[] = {
"in_w", "iw",
"in_h", "ih",
"out_w", "ow",
if (ctx->outputs[0]) {
formats = NULL;
for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
- if ( sws_isSupportedOutput(pix_fmt)
+ if ( (sws_isSupportedOutput(pix_fmt) || pix_fmt == PIX_FMT_PAL8)
&& (ret = avfilter_add_format(&formats, pix_fmt)) < 0) {
avfilter_formats_unref(&formats);
return ret;
{
AVFilterContext *ctx = outlink->src;
AVFilterLink *inlink = outlink->src->inputs[0];
+ enum PixelFormat outfmt = outlink->format;
ScaleContext *scale = ctx->priv;
int64_t w, h;
double var_values[VARS_NB], res;
scale->flags);
scale->input_is_pal = av_pix_fmt_descriptors[inlink->format].flags & PIX_FMT_PAL;
+ if (outfmt == PIX_FMT_PAL8) outfmt = PIX_FMT_BGR8;
if (scale->sws)
sws_freeContext(scale->sws);
scale->sws = sws_getContext(inlink ->w, inlink ->h, inlink ->format,
- outlink->w, outlink->h, outlink->format,
+ outlink->w, outlink->h, outfmt,
scale->flags, NULL, NULL, NULL);
if (scale->isws[0])
sws_freeContext(scale->isws[0]);
scale->isws[0] = sws_getContext(inlink ->w, inlink ->h/2, inlink ->format,
- outlink->w, outlink->h/2, outlink->format,
+ outlink->w, outlink->h/2, outfmt,
scale->flags, NULL, NULL, NULL);
if (scale->isws[1])
sws_freeContext(scale->isws[1]);
scale->isws[1] = sws_getContext(inlink ->w, inlink ->h/2, inlink ->format,
- outlink->w, outlink->h/2, outlink->format,
+ outlink->w, outlink->h/2, outfmt,
scale->flags, NULL, NULL, NULL);
if (!scale->sws || !scale->isws[0] || !scale->isws[1])
return AVERROR(EINVAL);
scale->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w;
scale->vsub = av_pix_fmt_descriptors[link->format].log2_chroma_h;
- outpicref = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, outlink->w, outlink->h);
+ outpicref = avfilter_get_video_buffer(outlink, AV_PERM_WRITE|AV_PERM_ALIGN, outlink->w, outlink->h);
avfilter_copy_buffer_ref_props(outpicref, picref);
outpicref->video->w = outlink->w;
outpicref->video->h = outlink->h;
scale->slice_y = link->dst->outputs[0]->h;
if(scale->interlaced>0 || (scale->interlaced<0 && link->cur_buf->video->interlaced)){
- av_assert0(y%4 == 0);
+ av_assert0(y%(2<<scale->vsub) == 0);
out_h = scale_slice(link, scale->isws[0], y, (h+1)/2, 2, 0);
out_h+= scale_slice(link, scale->isws[1], y, h /2, 2, 1);
}else{
.priv_size = sizeof(ScaleContext),
- .inputs = (AVFilterPad[]) {{ .name = "default",
+ .inputs = (const AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.start_frame = start_frame,
.draw_slice = draw_slice,
.min_perms = AV_PERM_READ, },
{ .name = NULL}},
- .outputs = (AVFilterPad[]) {{ .name = "default",
+ .outputs = (const AVFilterPad[]) {{ .name = "default",
.type = AVMEDIA_TYPE_VIDEO,
.config_props = config_props, },
{ .name = NULL}},