# HG changeset patch # User reimar # Date 1320783875 0 # Node ID 43b60a64debf3a2de098e5cc50b66e177c7fe2d9 # Parent 4e2f4bd081ce6fb9fbd8c0e61ba079ee945d1544 Detect codecs requiring too many references for DR also when they use buffer_hints. diff -r 4e2f4bd081ce -r 43b60a64debf libmpcodecs/vd_ffmpeg.c --- a/libmpcodecs/vd_ffmpeg.c Mon Nov 07 19:54:49 2011 +0000 +++ b/libmpcodecs/vd_ffmpeg.c Tue Nov 08 20:24:35 2011 +0000 @@ -540,11 +540,9 @@ type = MP_IMGTYPE_TEMP; if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE) flags |= MP_IMGFLAG_READABLE; - if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) { - type = MP_IMGTYPE_IP; - flags |= MP_IMGFLAG_PRESERVE; - } - if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) { + if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE || + pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) { + ctx->ip_count++; type = MP_IMGTYPE_IP; flags |= MP_IMGFLAG_PRESERVE; } @@ -561,6 +559,11 @@ flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE | (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0); } + if(avctx->has_b_frames || ctx->b_count){ + type= MP_IMGTYPE_IPB; + }else{ + type= MP_IMGTYPE_IP; + } } if(init_vo(sh, avctx->pix_fmt) < 0){ @@ -575,7 +578,7 @@ if (IMGFMT_IS_HWACCEL(ctx->best_csp)) { type = MP_IMGTYPE_NUMBERED | (0xffff << 16); } else - if (!pic->buffer_hints) { + if (type == MP_IMGTYPE_IP || type == MP_IMGTYPE_IPB) { if(ctx->b_count>1 || ctx->ip_count>2){ mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_DRIFailure); @@ -591,11 +594,6 @@ return avctx->get_buffer(avctx, pic); } - if(avctx->has_b_frames || ctx->b_count){ - type= MP_IMGTYPE_IPB; - }else{ - type= MP_IMGTYPE_IP; - } mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type== MP_IMGTYPE_IPB ? "using IPB\n" : "using IP\n"); }