diff options
author | Philip Langdale <philipl@overt.org> | 2018-11-04 10:02:07 -0800 |
---|---|---|
committer | Philip Langdale <philipl@overt.org> | 2018-11-14 17:41:01 -0800 |
commit | fa74e4aef2103e27424d2cfae3f142149b6a3b36 (patch) | |
tree | 692223a83e3b850bd80788e2eb7baf5121a705ce | |
parent | 19d3d0c0570981ddc8a224f07d734ff75d76e234 (diff) | |
download | ffmpeg-fa74e4aef2103e27424d2cfae3f142149b6a3b36.tar.gz |
avfilter/yadif_common: Add field type tracking to help bwdif
The bwdif filter can use common yadif frame management if we track
when a field is the first or last field in a sequence. While this
information is not used by yadif, the added benefit of removing the
duplicated frame management logic makes it worth tracking this state
in the common code.
-rw-r--r-- | libavfilter/yadif.h | 14 | ||||
-rw-r--r-- | libavfilter/yadif_common.c | 12 |
2 files changed, 23 insertions, 3 deletions
diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h index 32d6f4a0d4..c928911b35 100644 --- a/libavfilter/yadif.h +++ b/libavfilter/yadif.h @@ -41,6 +41,12 @@ enum YADIFDeint { YADIF_DEINT_INTERLACED = 1, ///< only deinterlace frames marked as interlaced }; +enum YADIFCurrentField { + YADIF_FIELD_BACK_END = -1, ///< The last frame in a sequence + YADIF_FIELD_END = 0, ///< The first or last field in a sequence + YADIF_FIELD_NORMAL = 1, ///< A normal field in the middle of a sequence +}; + typedef struct YADIFContext { const AVClass *class; @@ -70,6 +76,14 @@ typedef struct YADIFContext { int eof; uint8_t *temp_line; int temp_line_size; + + /* + * An algorithm that treats first and/or last fields in a sequence + * differently can use this to detect those cases. It is the algorithm's + * responsibility to set the value to YADIF_FIELD_NORMAL after processing + * the first field. + */ + int current_field; ///< YADIFCurrentField } YADIFContext; void ff_yadif_init_x86(YADIFContext *yadif); diff --git a/libavfilter/yadif_common.c b/libavfilter/yadif_common.c index 19e8ac5281..a10cf7a17f 100644 --- a/libavfilter/yadif_common.c +++ b/libavfilter/yadif_common.c @@ -44,6 +44,8 @@ static int return_frame(AVFilterContext *ctx, int is_second) av_frame_copy_props(yadif->out, yadif->cur); yadif->out->interlaced_frame = 0; + if (yadif->current_field == YADIF_FIELD_BACK_END) + yadif->current_field = YADIF_FIELD_END; } yadif->filter(ctx, yadif->out, tff ^ !is_second, tff); @@ -103,9 +105,12 @@ int ff_yadif_filter_frame(AVFilterLink *link, AVFrame *frame) yadif->cur = yadif->next; yadif->next = frame; - if (!yadif->cur && - !(yadif->cur = av_frame_clone(yadif->next))) - return AVERROR(ENOMEM); + if (!yadif->cur) { + yadif->cur = av_frame_clone(yadif->next); + if (!yadif->cur) + return AVERROR(ENOMEM); + yadif->current_field = YADIF_FIELD_END; + } if (checkstride(yadif, yadif->next, yadif->cur)) { av_log(ctx, AV_LOG_VERBOSE, "Reallocating frame due to differing stride\n"); @@ -173,6 +178,7 @@ int ff_yadif_request_frame(AVFilterLink *link) if (!next) return AVERROR(ENOMEM); + yadif->current_field = YADIF_FIELD_BACK_END; next->pts = yadif->next->pts * 2 - yadif->cur->pts; ff_yadif_filter_frame(ctx->inputs[0], next); |