summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/ffmpeg/libavcodec/dxva2.c
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/ffmpeg/libavcodec/dxva2.c')
-rw-r--r--chromium/third_party/ffmpeg/libavcodec/dxva2.c66
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;
}