diff options
Diffstat (limited to 'chromium/third_party/ffmpeg/libavcodec/dxva2.c')
-rw-r--r-- | chromium/third_party/ffmpeg/libavcodec/dxva2.c | 66 |
1 files changed, 45 insertions, 21 deletions
diff --git a/chromium/third_party/ffmpeg/libavcodec/dxva2.c b/chromium/third_party/ffmpeg/libavcodec/dxva2.c index 0997c736778..c1c7681402a 100644 --- a/chromium/third_party/ffmpeg/libavcodec/dxva2.c +++ b/chromium/third_party/ffmpeg/libavcodec/dxva2.c @@ -20,17 +20,25 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include <assert.h> +#include <string.h> + +#include "libavutil/log.h" +#include "libavutil/time.h" + +#include "avcodec.h" +#include "mpegvideo.h" #include "dxva2_internal.h" -void *ff_dxva2_get_surface(const Picture *picture) +void *ff_dxva2_get_surface(const AVFrame *frame) { - return picture->f.data[3]; + return frame->data[3]; } unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx, - const Picture *picture) + const AVFrame *frame) { - void *surface = ff_dxva2_get_surface(picture); + void *surface = ff_dxva2_get_surface(frame); unsigned i; for (i = 0; i < ctx->surface_count; i++) @@ -50,10 +58,13 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx, void *dxva_data; unsigned dxva_size; int result; + HRESULT hr; - if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder, type, - &dxva_data, &dxva_size))) { - av_log(avctx, AV_LOG_ERROR, "Failed to get a buffer for %d\n", type); + hr = IDirectXVideoDecoder_GetBuffer(ctx->decoder, type, + &dxva_data, &dxva_size); + if (FAILED(hr)) { + av_log(avctx, AV_LOG_ERROR, "Failed to get a buffer for %u: 0x%lx\n", + type, hr); return -1; } if (size <= dxva_size) { @@ -66,17 +77,21 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx, result = 0; } else { - av_log(avctx, AV_LOG_ERROR, "Buffer for type %d was too small\n", type); + av_log(avctx, AV_LOG_ERROR, "Buffer for type %u was too small\n", type); result = -1; } - if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, type))) { - av_log(avctx, AV_LOG_ERROR, "Failed to release buffer type %d\n", type); + + hr = IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, type); + if (FAILED(hr)) { + av_log(avctx, AV_LOG_ERROR, + "Failed to release buffer type %u: 0x%lx\n", + type, hr); result = -1; } return result; } -int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic, +int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, const void *pp, unsigned pp_size, const void *qm, unsigned qm_size, int (*commit_bs_si)(AVCodecContext *, @@ -87,12 +102,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(frame), + 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%lx\n", hr); return -1; } @@ -135,14 +157,16 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, Picture *pic, exec.NumCompBuffers = buffer_count; exec.pCompressedBuffers = buffer; exec.pExtensionData = NULL; - if (FAILED(IDirectXVideoDecoder_Execute(ctx->decoder, &exec))) { - av_log(avctx, AV_LOG_ERROR, "Failed to execute\n"); + hr = IDirectXVideoDecoder_Execute(ctx->decoder, &exec); + if (FAILED(hr)) { + av_log(avctx, AV_LOG_ERROR, "Failed to execute: 0x%lx\n", hr); result = -1; } end: - if (FAILED(IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL))) { - av_log(avctx, AV_LOG_ERROR, "Failed to end frame\n"); + hr = IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL); + if (FAILED(hr)) { + av_log(avctx, AV_LOG_ERROR, "Failed to end frame: 0x%lx\n", hr); result = -1; } |