From d1ac8e10340f30b6989cfd64ed1f91dae5a54e2d Mon Sep 17 00:00:00 2001 From: Philip Langdale Date: Sat, 5 May 2012 09:58:39 -0700 Subject: [PATCH] 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 Signed-off-by: Michael Niedermayer --- libavcodec/crystalhd.c | 15 ++++++++++++--- 1 file 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; }