| @@ -13,6 +13,10 @@ libavutil: 2015-08-28 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2015-xx-xx - xxxxxxx - lavc 57.2.0 - d3d11va.h | |||||
| Add av_d3d11va_alloc_context(). This function must from now on be used for | |||||
| allocating AVD3D11VAContext. | |||||
| 2015-xx-xx - lavu 55.0.0 | 2015-xx-xx - lavu 55.0.0 | ||||
| xxxxxxx - Change type of AVPixFmtDescriptor.flags from uint8_t to uint64_t. | xxxxxxx - Change type of AVPixFmtDescriptor.flags from uint8_t to uint64_t. | ||||
| xxxxxxx - Change type of AVComponentDescriptor fields from uint16_t to int | xxxxxxx - Change type of AVComponentDescriptor fields from uint16_t to int | ||||
| @@ -581,7 +581,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER) += adpcm.o adpcm_data.o | |||||
| OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o | ||||
| # hardware accelerators | # hardware accelerators | ||||
| OBJS-$(CONFIG_D3D11VA) += dxva2.o | |||||
| OBJS-$(CONFIG_D3D11VA) += d3d11va.o dxva2.o | |||||
| OBJS-$(CONFIG_DXVA2) += dxva2.o | OBJS-$(CONFIG_DXVA2) += dxva2.o | ||||
| OBJS-$(CONFIG_VAAPI) += vaapi.o | OBJS-$(CONFIG_VAAPI) += vaapi.o | ||||
| OBJS-$(CONFIG_VDA) += vda.o | OBJS-$(CONFIG_VDA) += vda.o | ||||
| @@ -0,0 +1,33 @@ | |||||
| /* | |||||
| * Direct3D11 HW acceleration | |||||
| * | |||||
| * copyright (c) 2015 Steve Lhomme | |||||
| * | |||||
| * This file is part of Libav. | |||||
| * | |||||
| * Libav is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * Libav is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with Libav; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include "config.h" | |||||
| #include "libavutil/mem.h" | |||||
| #include "d3d11va.h" | |||||
| AVD3D11VAContext *av_d3d11va_alloc_context(void) | |||||
| { | |||||
| AVD3D11VAContext* res = av_mallocz(sizeof(AVD3D11VAContext)); | |||||
| res->context_mutex = INVALID_HANDLE_VALUE; | |||||
| return res; | |||||
| } | |||||
| @@ -53,8 +53,10 @@ | |||||
| * to the Direct3D11 Libav HWAccel implementation. | * to the Direct3D11 Libav HWAccel implementation. | ||||
| * | * | ||||
| * The application must make it available as AVCodecContext.hwaccel_context. | * The application must make it available as AVCodecContext.hwaccel_context. | ||||
| * | |||||
| * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext. | |||||
| */ | */ | ||||
| struct AVD3D11VAContext { | |||||
| typedef struct AVD3D11VAContext { | |||||
| /** | /** | ||||
| * D3D11 decoder object | * D3D11 decoder object | ||||
| */ | */ | ||||
| @@ -89,7 +91,19 @@ struct AVD3D11VAContext { | |||||
| * Private to the Libav AVHWAccel implementation | * Private to the Libav AVHWAccel implementation | ||||
| */ | */ | ||||
| unsigned report_id; | unsigned report_id; | ||||
| }; | |||||
| /** | |||||
| * Mutex to access video_context | |||||
| */ | |||||
| HANDLE context_mutex; | |||||
| } AVD3D11VAContext; | |||||
| /** | |||||
| * Allocate an AVD3D11VAContext. | |||||
| * | |||||
| * @return Newly-allocated AVD3D11VAContext or NULL on failure. | |||||
| */ | |||||
| AVD3D11VAContext *av_d3d11va_alloc_context(void); | |||||
| /** | /** | ||||
| * @} | * @} | ||||
| @@ -144,10 +144,13 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, | |||||
| do { | do { | ||||
| #if CONFIG_D3D11VA | #if CONFIG_D3D11VA | ||||
| if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) | |||||
| if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) { | |||||
| if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE) | |||||
| WaitForSingleObjectEx(D3D11VA_CONTEXT(ctx)->context_mutex, INFINITE, FALSE); | |||||
| hr = ID3D11VideoContext_DecoderBeginFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder, | hr = ID3D11VideoContext_DecoderBeginFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder, | ||||
| ff_dxva2_get_surface(frame), | ff_dxva2_get_surface(frame), | ||||
| 0, NULL); | 0, NULL); | ||||
| } | |||||
| #endif | #endif | ||||
| #if CONFIG_DXVA2 | #if CONFIG_DXVA2 | ||||
| if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) | if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) | ||||
| @@ -161,6 +164,11 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, | |||||
| if (FAILED(hr)) { | if (FAILED(hr)) { | ||||
| av_log(avctx, AV_LOG_ERROR, "Failed to begin frame: 0x%lx\n", hr); | av_log(avctx, AV_LOG_ERROR, "Failed to begin frame: 0x%lx\n", hr); | ||||
| #if CONFIG_D3D11VA | |||||
| if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) | |||||
| if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE) | |||||
| ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex); | |||||
| #endif | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -260,8 +268,11 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame, | |||||
| end: | end: | ||||
| #if CONFIG_D3D11VA | #if CONFIG_D3D11VA | ||||
| if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) | |||||
| if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) { | |||||
| hr = ID3D11VideoContext_DecoderEndFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder); | hr = ID3D11VideoContext_DecoderEndFrame(D3D11VA_CONTEXT(ctx)->video_context, D3D11VA_CONTEXT(ctx)->decoder); | ||||
| if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE) | |||||
| ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex); | |||||
| } | |||||
| #endif | #endif | ||||
| #if CONFIG_DXVA2 | #if CONFIG_DXVA2 | ||||
| if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) | if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) | ||||
| @@ -29,7 +29,7 @@ | |||||
| #include "libavutil/version.h" | #include "libavutil/version.h" | ||||
| #define LIBAVCODEC_VERSION_MAJOR 57 | #define LIBAVCODEC_VERSION_MAJOR 57 | ||||
| #define LIBAVCODEC_VERSION_MINOR 1 | |||||
| #define LIBAVCODEC_VERSION_MINOR 2 | |||||
| #define LIBAVCODEC_VERSION_MICRO 0 | #define LIBAVCODEC_VERSION_MICRO 0 | ||||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||