[FFmpeg-cvslog] dxva2: Retry IDirectXVideoDecoder_BeginFrame()
Sam Lantinga
git at videolan.org
Tue Jan 21 16:01:55 CET 2014
ffmpeg | branch: master | Sam Lantinga <slouken at libsdl.org> | Thu Jan 9 19:59:54 2014 +0000| [5b2b23f2d69e05c5fcd1c933e383fe60e185574d] | committer: Luca Barbato
dxva2: Retry IDirectXVideoDecoder_BeginFrame()
If the function returns E_PENDING retry for a fixed number of times.
Signed-off-by: Luca Barbato <lu_zero at gentoo.org>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5b2b23f2d69e05c5fcd1c933e383fe60e185574d
---
libavcodec/dxva2.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index bc43cae..b6efa15 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -87,12 +87,19 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic,
unsigned buffer_count = 0;
DXVA2_DecodeBufferDesc buffer[4];
DXVA2_DecodeExecuteParams exec = { 0 };
- int result;
-
- if (FAILED(IDirectXVideoDecoder_BeginFrame(ctx->decoder,
- ff_dxva2_get_surface(pic),
- NULL))) {
- av_log(avctx, AV_LOG_ERROR, "Failed to begin frame\n");
+ int result, runs = 0;
+ HRESULT hr;
+
+ do {
+ hr = IDirectXVideoDecoder_BeginFrame(ctx->decoder,
+ ff_dxva2_get_surface(pic),
+ NULL);
+ if (hr == E_PENDING)
+ av_usleep(2000);
+ } while (hr == E_PENDING && ++runs < 50);
+
+ if (FAILED(hr)) {
+ av_log(avctx, AV_LOG_ERROR, "Failed to begin frame: 0x%x\n", hr);
return -1;
}
More information about the ffmpeg-cvslog
mailing list