X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Favcodec%2Fdxva2.c;h=15849c5220a11d2c5ab40c77f359811f610c770e;hb=bc368cb418feb3c5ce8a1afd1699cad3fbf00acf;hp=faae53f260b1cc2c6d9eb78be7bc4bbf26ebcefd;hpb=9abcaacf83bd53b1f4b6569f7952e7025ddd0860;p=vlc diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index faae53f260..15849c5220 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -66,127 +66,74 @@ #include #include -/* */ -#define DXVA2_E_NOT_INITIALIZED MAKE_HRESULT(1, 4, 4096) -#define DXVA2_E_NEW_VIDEO_DEVICE MAKE_HRESULT(1, 4, 4097) -#define DXVA2_E_VIDEO_DEVICE_LOCKED MAKE_HRESULT(1, 4, 4098) -#define DXVA2_E_NOT_AVAILABLE MAKE_HRESULT(1, 4, 4099) - -static const GUID DXVA2_ModeMPEG2_MoComp = { - 0xe6a9f44b, 0x61b0,0x4563, {0x9e,0xa4,0x63,0xd2,0xa3,0xc6,0xfe,0x66} -}; -static const GUID DXVA2_ModeMPEG2_IDCT = { - 0xbf22ad00, 0x03ea,0x4690, {0x80,0x77,0x47,0x33,0x46,0x20,0x9b,0x7e} -}; -static const GUID DXVA2_ModeMPEG2_VLD = { - 0xee27417f, 0x5e28,0x4e65, {0xbe,0xea,0x1d,0x26,0xb5,0x08,0xad,0xc9} -}; -static const GUID DXVA2_ModeMPEG2and1_VLD = { - 0x86695f12, 0x340e,0x4f04, {0x9f,0xd3,0x92,0x53,0xdd,0x32,0x74,0x60} -}; -static const GUID DXVA2_ModeMPEG1_VLD = { - 0x6f3ec719, 0x3735,0x42cc, {0x80,0x63,0x65,0xcc,0x3c,0xb3,0x66,0x16} -}; - -static const GUID DXVA2_ModeH264_A = { - 0x1b81be64, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeH264_B = { - 0x1b81be65, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeH264_C = { - 0x1b81be66, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeH264_D = { - 0x1b81be67, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeH264_E = { - 0x1b81be68, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeH264_F = { - 0x1b81be69, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA_ModeH264_VLD_WithFMOASO_NoFGT = { - 0xd5f04ff9, 0x3418,0x45d8, {0x95,0x61,0x32,0xa7,0x6a,0xae,0x2d,0xdd} -}; -static const GUID DXVADDI_Intel_ModeH264_A = { - 0x604F8E64, 0x4951,0x4c54, {0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6} -}; -static const GUID DXVADDI_Intel_ModeH264_C = { - 0x604F8E66, 0x4951,0x4c54, {0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6} -}; -static const GUID DXVADDI_Intel_ModeH264_E = { // DXVA_Intel_H264_NoFGT_ClearVideo - 0x604F8E68, 0x4951,0x4c54, {0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6} -}; -static const GUID DXVA_ModeH264_VLD_NoFGT_Flash = { - 0x4245F676, 0x2BBC,0x4166, {0xa0,0xBB,0x54,0xE7,0xB8,0x49,0xC3,0x80} -}; +#include /* must be last included to not redefine existing GUIDs */ -static const GUID DXVA2_ModeWMV8_A = { - 0x1b81be80, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeWMV8_B = { - 0x1b81be81, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeWMV9_A = { - 0x1b81be90, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeWMV9_B = { - 0x1b81be91, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeWMV9_C = { - 0x1b81be94, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; +/* dxva2api.h GUIDs: http://msdn.microsoft.com/en-us/library/windows/desktop/ms697067(v=vs100).aspx + * assume that they are declared in dxva2api.h */ +#define MS_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) -static const GUID DXVA2_ModeVC1_A = { - 0x1b81beA0, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeVC1_B = { - 0x1b81beA1, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeVC1_C = { - 0x1b81beA2, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -static const GUID DXVA2_ModeVC1_D = { - 0x1b81beA3, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; -/* Conformity to the August 2010 update of the specification, ModeVC1_VLD2010 */ -static const GUID DXVA2_ModeVC1_D2010 = { - 0x1b81beA4, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; +#ifdef __MINGW32__ +# include <_mingw.h> -static const GUID DXVA_NoEncrypt = { - 0x1b81bed0, 0xa0c7,0x11d3, {0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5} -}; +# if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 3 +# undef IDirect3DDeviceManager9_Release +# define IDirect3DDeviceManager9_Release(This) (This)->lpVtbl->Release(This) +# endif -static const GUID DXVA_Intel_VC1_ClearVideo = { - 0xBCC5DB6D, 0xA2B6,0x4AF0, {0xAC,0xE4,0xAD,0xB1,0xF7,0x87,0xBC,0x89} -}; -static const GUID DXVA_Intel_VC1_ClearVideo_2 = { - 0xE07EC519, 0xE651,0x4CD6, {0xAC,0x84,0x13,0x70,0xCC,0xEE,0xC8,0x51} -}; +# if !defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 3 +# undef MS_GUID +# define MS_GUID DEFINE_GUID /* dxva2api.h fails to declare those, redefine as static */ +# define DXVA2_E_NEW_VIDEO_DEVICE MAKE_HRESULT(1, 4, 4097) +# endif +#endif /* __MINGW32__ */ + +MS_GUID(IID_IDirectXVideoDecoderService, 0xfc51a551, 0xd5e7, 0x11d9, 0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02); +MS_GUID(IID_IDirectXVideoAccelerationService, 0xfc51a550, 0xd5e7, 0x11d9, 0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02); + +MS_GUID (DXVA_NoEncrypt, 0x1b81bed0, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); + +/* Codec capabilities GUID, sorted by codec */ +MS_GUID (DXVA2_ModeMPEG2_MoComp, 0xe6a9f44b, 0x61b0, 0x4563, 0x9e, 0xa4, 0x63, 0xd2, 0xa3, 0xc6, 0xfe, 0x66); +MS_GUID (DXVA2_ModeMPEG2_IDCT, 0xbf22ad00, 0x03ea, 0x4690, 0x80, 0x77, 0x47, 0x33, 0x46, 0x20, 0x9b, 0x7e); +MS_GUID (DXVA2_ModeMPEG2_VLD, 0xee27417f, 0x5e28, 0x4e65, 0xbe, 0xea, 0x1d, 0x26, 0xb5, 0x08, 0xad, 0xc9); +DEFINE_GUID(DXVA2_ModeMPEG2and1_VLD, 0x86695f12, 0x340e, 0x4f04, 0x9f, 0xd3, 0x92, 0x53, 0xdd, 0x32, 0x74, 0x60); +DEFINE_GUID(DXVA2_ModeMPEG1_VLD, 0x6f3ec719, 0x3735, 0x42cc, 0x80, 0x63, 0x65, 0xcc, 0x3c, 0xb3, 0x66, 0x16); + +MS_GUID (DXVA2_ModeH264_A, 0x1b81be64, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeH264_B, 0x1b81be65, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeH264_C, 0x1b81be66, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeH264_D, 0x1b81be67, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeH264_E, 0x1b81be68, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeH264_F, 0x1b81be69, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +DEFINE_GUID(DXVA_ModeH264_VLD_Multiview, 0x9901CCD3, 0xca12, 0x4b7e, 0x86, 0x7a, 0xe2, 0x22, 0x3d, 0x92, 0x55, 0xc3); // MVC +DEFINE_GUID(DXVA_ModeH264_VLD_WithFMOASO_NoFGT, 0xd5f04ff9, 0x3418, 0x45d8, 0x95, 0x61, 0x32, 0xa7, 0x6a, 0xae, 0x2d, 0xdd); +DEFINE_GUID(DXVADDI_Intel_ModeH264_A, 0x604F8E64, 0x4951, 0x4c54, 0x88, 0xFE, 0xAB, 0xD2, 0x5C, 0x15, 0xB3, 0xD6); +DEFINE_GUID(DXVADDI_Intel_ModeH264_C, 0x604F8E66, 0x4951, 0x4c54, 0x88, 0xFE, 0xAB, 0xD2, 0x5C, 0x15, 0xB3, 0xD6); +DEFINE_GUID(DXVADDI_Intel_ModeH264_E, 0x604F8E68, 0x4951, 0x4c54, 0x88, 0xFE, 0xAB, 0xD2, 0x5C, 0x15, 0xB3, 0xD6); // DXVA_Intel_H264_NoFGT_ClearVideo +DEFINE_GUID(DXVA_ModeH264_VLD_NoFGT_Flash, 0x4245F676, 0x2BBC, 0x4166, 0xa0, 0xBB, 0x54, 0xE7, 0xB8, 0x49, 0xC3, 0x80); + +MS_GUID (DXVA2_ModeWMV8_A, 0x1b81be80, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeWMV8_B, 0x1b81be81, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); + +MS_GUID (DXVA2_ModeWMV9_A, 0x1b81be90, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeWMV9_B, 0x1b81be91, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeWMV9_C, 0x1b81be94, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); + +MS_GUID (DXVA2_ModeVC1_A, 0x1b81beA0, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeVC1_B, 0x1b81beA1, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeVC1_C, 0x1b81beA2, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +MS_GUID (DXVA2_ModeVC1_D, 0x1b81beA3, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); +DEFINE_GUID(DXVA2_ModeVC1_D2010, 0x1b81beA4, 0xa0c7, 0x11d3, 0xb9, 0x84, 0x00, 0xc0, 0x4f, 0x2e, 0x73, 0xc5); // August 2010 update +DEFINE_GUID(DXVA_Intel_VC1_ClearVideo, 0xBCC5DB6D, 0xA2B6, 0x4AF0, 0xAC, 0xE4, 0xAD, 0xB1, 0xF7, 0x87, 0xBC, 0x89); +DEFINE_GUID(DXVA_Intel_VC1_ClearVideo_2, 0xE07EC519, 0xE651, 0x4CD6, 0xAC, 0x84, 0x13, 0x70, 0xCC, 0xEE, 0xC8, 0x51); + +DEFINE_GUID(DXVA_nVidia_MPEG4_ASP, 0x9947EC6F, 0x689B, 0x11DC, 0xA3, 0x20, 0x00, 0x19, 0xDB, 0xBC, 0x41, 0x84); +DEFINE_GUID(DXVA_ModeMPEG4pt2_VLD_Simple, 0xefd64d74, 0xc9e8, 0x41d7, 0xa5, 0xe9, 0xe9, 0xb0, 0xe3, 0x9f, 0xa3, 0x19); +DEFINE_GUID(DXVA_ModeMPEG4pt2_VLD_AdvSimple_NoGMC, 0xed418a9f, 0x010d, 0x4eda, 0x9a, 0xe3, 0x9a, 0x65, 0x35, 0x8d, 0x8d, 0x2e); +DEFINE_GUID(DXVA_ModeMPEG4pt2_VLD_AdvSimple_GMC, 0xab998b5b, 0x4258, 0x44a9, 0x9f, 0xeb, 0x94, 0xe5, 0x97, 0xa6, 0xba, 0xae); +DEFINE_GUID(DXVA_ModeMPEG4pt2_VLD_AdvSimple_Avivo, 0x7C74ADC6, 0xe2ba, 0x4ade, 0x86, 0xde, 0x30, 0xbe, 0xab, 0xb4, 0x0c, 0xc1); -static const GUID DXVA_nVidia_MPEG4_ASP = { - 0x9947EC6F, 0x689B,0x11DC, {0xA3,0x20,0x00,0x19,0xDB,0xBC,0x41,0x84} -}; -static const GUID DXVA_ModeMPEG4pt2_VLD_Simple = { - 0xefd64d74, 0xc9e8,0x41d7, {0xa5,0xe9,0xe9,0xb0,0xe3,0x9f,0xa3,0x19} -}; -static const GUID DXVA_ModeMPEG4pt2_VLD_AdvSimple_NoGMC = { - 0xed418a9f, 0x10d,0x4eda, {0x9a,0xe3,0x9a,0x65,0x35,0x8d,0x8d,0x2e} -}; -static const GUID DXVA_ModeMPEG4pt2_VLD_AdvSimple_GMC = { - 0xab998b5b, 0x4258,0x44a9, {0x9f,0xeb,0x94,0xe5,0x97,0xa6,0xba,0xae} -}; -static const GUID DXVA_ModeMPEG4pt2_VLD_AdvSimple_Avivo = { - 0x7C74ADC6, 0xe2ba,0x4ade, {0x86,0xde,0x30,0xbe,0xab,0xb4,0x0c,0xc1} -}; - -/* MVC */ -static const GUID DXVA_ModeH264_VLD_Multiview = { - 0x9901CCD3, 0xca12,0x4b7e, {0x86,0x7a,0xe2,0x22,0x3d,0x92,0x55,0xc3} -}; /* */ typedef struct { @@ -268,6 +215,7 @@ typedef struct { static const d3d_format_t d3d_formats[] = { { "YV12", MAKEFOURCC('Y','V','1','2'), VLC_CODEC_YV12 }, { "NV12", MAKEFOURCC('N','V','1','2'), VLC_CODEC_NV12 }, + { "IMC3", MAKEFOURCC('I','M','C','3'), VLC_CODEC_YV12 }, { NULL, 0, 0 } }; @@ -281,13 +229,6 @@ static const d3d_format_t *D3dFindFormat(D3DFORMAT format) return NULL; } -static const GUID IID_IDirectXVideoDecoderService = { - 0xfc51a551, 0xd5e7, 0x11d9, {0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02} -}; -static const GUID IID_IDirectXVideoAccelerationService = { - 0xfc51a550, 0xd5e7, 0x11d9, {0xaf,0x55,0x00,0x05,0x4e,0x43,0xff,0x02} -}; - /* */ typedef struct { LPDIRECT3DSURFACE9 d3d; @@ -440,18 +381,29 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff) return VLC_EGENERIC; } - if (va->render == MAKEFOURCC('Y','V','1','2')) { - uint8_t *plane[3] = { - lock.pBits, - (uint8_t*)lock.pBits + lock.Pitch * va->surface_height, - (uint8_t*)lock.pBits + lock.Pitch * va->surface_height - + (lock.Pitch/2) * (va->surface_height/2) - }; - size_t pitch[3] = { + if (va->render == MAKEFOURCC('Y','V','1','2') || + va->render == MAKEFOURCC('I','M','C','3')) { + bool imc3 = va->render == MAKEFOURCC('I','M','C','3'); + size_t chroma_pitch = imc3 ? lock.Pitch : (lock.Pitch / 2); + + size_t pitch[3] = { lock.Pitch, - lock.Pitch / 2, - lock.Pitch / 2, + chroma_pitch, + chroma_pitch, + }; + + uint8_t *plane[3] = { + (uint8_t*)lock.pBits, + (uint8_t*)lock.pBits + pitch[0] * va->surface_height, + (uint8_t*)lock.pBits + pitch[0] * va->surface_height + + pitch[1] * va->surface_height / 2, }; + + if (imc3) { + uint8_t *V = plane[1]; + plane[1] = plane[2]; + plane[2] = V; + } CopyFromYv12(picture, plane, pitch, va->width, va->height, &va->surface_cache); @@ -709,7 +661,7 @@ static char *DxDescribe(vlc_va_dxva2_t *va) } char *description; - if (asprintf(&description, "DXVA2 (%.*s, vendor %d(%s), device %d, revision %d)", + if (asprintf(&description, "DXVA2 (%.*s, vendor %lu(%s), device %lu, revision %lu)", sizeof(id->Description), id->Description, id->VendorId, vendor, id->DeviceId, id->Revision) < 0) return NULL; @@ -1050,6 +1002,7 @@ static void DxCreateVideoConversion(vlc_va_dxva2_t *va) { switch (va->render) { case MAKEFOURCC('N','V','1','2'): + case MAKEFOURCC('I','M','C','3'): va->output = MAKEFOURCC('Y','V','1','2'); break; default: @@ -1062,11 +1015,4 @@ static void DxDestroyVideoConversion(vlc_va_dxva2_t *va) { CopyCleanCache(&va->surface_cache); } -#else -vlc_va_t *vlc_va_NewDxva2(vlc_object_t *log, int codec_id) -{ - (void)log; - (void)codec_id; - return NULL; -} #endif