summaryrefslogtreecommitdiffstats
path: root/video/filter/refqueue.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/filter/refqueue.c')
-rw-r--r--video/filter/refqueue.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/video/filter/refqueue.c b/video/filter/refqueue.c
index d018e38c00..3cfe3c61ff 100644
--- a/video/filter/refqueue.c
+++ b/video/filter/refqueue.c
@@ -39,6 +39,7 @@ struct mp_refqueue {
int needed_past_frames;
int needed_future_frames;
int flags;
+ int field_parity;
bool second_field; // current frame has to output a second field yet
bool eof;
@@ -97,6 +98,11 @@ void mp_refqueue_set_mode(struct mp_refqueue *q, int flags)
q->flags = flags;
}
+void mp_refqueue_set_parity(struct mp_refqueue *q, int parity)
+{
+ q->field_parity = parity;
+}
+
// Whether the current frame should be deinterlaced.
bool mp_refqueue_should_deint(struct mp_refqueue *q)
{
@@ -113,8 +119,14 @@ bool mp_refqueue_is_top_field(struct mp_refqueue *q)
{
if (!mp_refqueue_has_output(q))
return false;
-
- return !!(q->queue[q->pos]->fields & MP_IMGFIELD_TOP_FIRST) ^ q->second_field;
+
+ bool tff = q->field_parity == MP_FIELD_PARITY_TFF;
+ bool bff = q->field_parity == MP_FIELD_PARITY_BFF;
+ bool ret = (!!(q->queue[q->pos]->fields & MP_IMGFIELD_TOP_FIRST) ^ q->second_field
+ && !tff && !bff); // Default parity
+ ret = ret || (tff && !q->second_field); // Check if top field is forced
+ ret = ret || (bff && q->second_field); // Check if bottom field is forced
+ return ret;
}
// Whether top-field-first mode is enabled.
@@ -123,7 +135,9 @@ bool mp_refqueue_top_field_first(struct mp_refqueue *q)
if (!mp_refqueue_has_output(q))
return false;
- return q->queue[q->pos]->fields & MP_IMGFIELD_TOP_FIRST;
+ bool tff = q->field_parity == MP_FIELD_PARITY_TFF;
+ bool bff = q->field_parity == MP_FIELD_PARITY_BFF;
+ return ((q->queue[q->pos]->fields & MP_IMGFIELD_TOP_FIRST) || tff) && !bff;
}
// Discard all state.