av_log(ctx, AV_LOG_ERROR, "Hint file must be set.\n");
return AVERROR(EINVAL);
}
- s->hint = fopen(s->hint_file_str, "r");
+ s->hint = av_fopen_utf8(s->hint_file_str, "r");
if (!s->hint) {
ret = AVERROR(errno);
av_log(ctx, AV_LOG_ERROR, "%s: %s\n", s->hint_file_str, av_err2str(ret));
static int query_formats(AVFilterContext *ctx)
{
- AVFilterFormats *pix_fmts = NULL;
- int fmt, ret;
-
- for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) {
- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
- if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL ||
- desc->flags & AV_PIX_FMT_FLAG_PAL ||
- desc->flags & AV_PIX_FMT_FLAG_BITSTREAM) &&
- (ret = ff_add_format(&pix_fmts, fmt)) < 0)
- return ret;
- }
+ AVFilterFormats *formats = NULL;
+ int ret;
- return ff_set_common_formats(ctx, pix_fmts);
+ ret = ff_formats_pixdesc_filter(&formats, 0,
+ AV_PIX_FMT_FLAG_HWACCEL |
+ AV_PIX_FMT_FLAG_BITSTREAM |
+ AV_PIX_FMT_FLAG_PAL);
+ if (ret < 0)
+ return ret;
+ return ff_set_common_formats(ctx, formats);
}
static int config_input(AVFilterLink *inlink)
AVFrame *out, *top, *bottom;
char buf[1024] = { 0 };
int64_t tf, bf;
- char hint = '=';
+ int tfactor = 0, bfactor = 1;
+ char hint = '=', field = '=';
int p;
av_frame_free(&s->frame[0]);
s->line++;
if (buf[0] == '#' || buf[0] == ';') {
continue;
+ } else if (sscanf(buf, "%"PRId64",%"PRId64" %c %c", &tf, &bf, &hint, &field) == 4) {
+ ;
} else if (sscanf(buf, "%"PRId64",%"PRId64" %c", &tf, &bf, &hint) == 3) {
;
} else if (sscanf(buf, "%"PRId64",%"PRId64"", &tf, &bf) == 2) {
av_assert0(0);
}
+ switch (field) {
+ case 'b':
+ tfactor = 1;
+ top = bottom;
+ break;
+ case 't':
+ bfactor = 0;
+ bottom = top;
+ break;
+ case '=':
+ break;
+ default:
+ av_log(ctx, AV_LOG_ERROR, "Invalid field: %c.\n", field);
+ av_frame_free(&out);
+ return AVERROR(EINVAL);
+ }
+
switch (hint) {
case '+':
out->interlaced_frame = 1;
break;
case '=':
break;
+ case 'b':
+ tfactor = 1;
+ top = bottom;
+ break;
+ case 't':
+ bfactor = 0;
+ bottom = top;
+ break;
default:
av_log(ctx, AV_LOG_ERROR, "Invalid hint: %c.\n", hint);
av_frame_free(&out);
for (p = 0; p < s->nb_planes; p++) {
av_image_copy_plane(out->data[p],
out->linesize[p] * 2,
- top->data[p],
+ top->data[p] + tfactor * top->linesize[p],
top->linesize[p] * 2,
s->planewidth[p],
(s->planeheight[p] + 1) / 2);
av_image_copy_plane(out->data[p] + out->linesize[p],
out->linesize[p] * 2,
- bottom->data[p] + bottom->linesize[p],
+ bottom->data[p] + bfactor * bottom->linesize[p],
bottom->linesize[p] * 2,
s->planewidth[p],
(s->planeheight[p] + 1) / 2);
{ NULL }
};
-AVFilter ff_vf_fieldhint = {
+const AVFilter ff_vf_fieldhint = {
.name = "fieldhint",
.description = NULL_IF_CONFIG_SMALL("Field matching using hints."),
.priv_size = sizeof(FieldHintContext),