summaryrefslogtreecommitdiff
path: root/libavcodec/crystalhd.c
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2012-05-05 09:58:39 -0700
committerMichael Niedermayer <michaelni@gmx.at>2012-05-06 17:25:52 +0200
commitd1ac8e10340f30b6989cfd64ed1f91dae5a54e2d (patch)
tree37b394f60c3ab5e49a654d8e030ca6d0460b6eff /libavcodec/crystalhd.c
parent67a316bbdad4b9a42d2055a586abd6f61680cabc (diff)
CrystalHD: Improve detection of field pair -> two fields content.
Istvan Sebok provided a sample where field pair -> two fields content was being misdetected by the existing logic. I added an additional test to check the input picture type as identified by our h.264 parser. Signed-off-by: Philip Langdale <philipl@overt.org> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/crystalhd.c')
-rw-r--r--libavcodec/crystalhd.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/libavcodec/crystalhd.c b/libavcodec/crystalhd.c
index 9acb5122e8..62e713ed91 100644
--- a/libavcodec/crystalhd.c
+++ b/libavcodec/crystalhd.c
@@ -713,11 +713,20 @@ static inline CopyRet copy_frame(AVCodecContext *avctx,
}
/*
- * Testing has shown that in all cases where we don't want to return the
- * full frame immediately, VDEC_FLAG_UNKNOWN_SRC is set.
+ * The logic here is purely based on empirical testing with samples.
+ * If we need a second field, it could come from a second input packet,
+ * or it could come from the same field-pair input packet at the current
+ * field. In the first case, we should return and wait for the next time
+ * round to get the second field, while in the second case, we should
+ * ask the decoder for it immediately.
+ *
+ * Testing has shown that we are dealing with the fieldpair -> two fields
+ * case if the VDEC_FLAG_UNKNOWN_SRC is not set or if the input picture
+ * type was PICT_FRAME (in this second case, the flag might still be set)
*/
return priv->need_second_field &&
- !(output->PicInfo.flags & VDEC_FLAG_UNKNOWN_SRC) ?
+ (!(output->PicInfo.flags & VDEC_FLAG_UNKNOWN_SRC) ||
+ pic_type == PICT_FRAME) ?
RET_COPY_NEXT_FIELD : RET_OK;
}