Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (13)
......@@ -74,10 +74,16 @@ vlc_module_end()
typedef HRESULT (WINAPI *pf_MFCreateDXGIDeviceManager)(UINT *, IMFDXGIDeviceManager **);
struct decoder_sys_t
class mft_dec_sys_t
{
public:
ComPtr<IMFTransform> mft;
~mft_dec_sys_t()
{
assert(!streamStarted);
}
const GUID* major_type = nullptr;
const GUID* subtype = nullptr;
/* Container for a dynamically constructed subtype */
......@@ -85,10 +91,10 @@ struct decoder_sys_t
// Direct3D
vlc_video_context *vctx_out = nullptr;
HRESULT (WINAPI *fptr_MFCreateDXGIDeviceManager)(UINT *resetToken, IMFDXGIDeviceManager **ppDeviceManager);
HRESULT (WINAPI *fptr_MFCreateDXGIDeviceManager)(UINT *resetToken, IMFDXGIDeviceManager **ppDeviceManager) = nullptr;
UINT dxgi_token = 0;
ComPtr<IMFDXGIDeviceManager> dxgi_manager;
HANDLE d3d_handle = 0;
HANDLE d3d_handle = INVALID_HANDLE_VALUE;
// D3D11
ComPtr<ID3D11Texture2D> cached_tex;
......@@ -130,18 +136,48 @@ struct decoder_sys_t
return false;
}
void DoRelease()
/// Required for Async MFTs
HRESULT startStream()
{
assert(!streamStarted);
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, (ULONG_PTR)0);
if (SUCCEEDED(hr))
streamStarted = true;
return hr;
}
/// Used for Async MFTs
HRESULT endStream()
{
mft->SetInputType(input_stream_id, nullptr, 0);
mft->SetOutputType(output_stream_id, nullptr, 0);
assert(streamStarted);
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, (ULONG_PTR)0);
if (SUCCEEDED(hr))
streamStarted = false;
return hr;
}
HRESULT flushStream()
{
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH, 0);
if (SUCCEEDED(hr))
streamStarted = false;
return hr;
}
private:
void DoRelease()
{
if (output_sample.Get())
output_sample->RemoveAllBuffers();
if (vctx_out)
mft->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)0);
if (mft.Get())
{
// mft->SetInputType(input_stream_id, nullptr, 0);
// mft->SetOutputType(output_stream_id, nullptr, 0);
endStreaming();
if (vctx_out)
mft->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, (ULONG_PTR)0);
}
for (size_t i=0; i < ARRAY_SIZE(cachedSRV); i++)
{
......@@ -154,7 +190,7 @@ struct decoder_sys_t
if (vctx_out && dxgi_manager.Get())
{
if (d3d_handle)
if (d3d_handle != INVALID_HANDLE_VALUE)
dxgi_manager->CloseDeviceHandle(d3d_handle);
}
......@@ -166,54 +202,14 @@ struct decoder_sys_t
MFShutdown();
}
bool isStreaming = false;
HRESULT beginStreaming()
{
assert(!isStreaming);
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, (ULONG_PTR)0);
isStreaming = SUCCEEDED(hr);
return hr;
}
HRESULT endStreaming()
{
assert(isStreaming);
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_NOTIFY_END_STREAMING, (ULONG_PTR)0);
isStreaming = SUCCEEDED(hr);
return hr;
}
bool streamStarted = false;
HRESULT startStream()
{
assert(!streamStarted);
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, (ULONG_PTR)0);
streamStarted = SUCCEEDED(hr);
return hr;
}
HRESULT endStream()
{
assert(streamStarted);
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, (ULONG_PTR)0);
if (SUCCEEDED(hr))
streamStarted = false;
return hr;
}
HRESULT flushStream()
{
HRESULT hr = mft->ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH, 0);
if (streamStarted)
{
streamStarted = false;
startStream();
}
return hr;
}
};
struct mf_d3d11_pic_ctx
{
struct d3d11_pic_context ctx;
IMFMediaBuffer *out_media;
decoder_sys_t *mfdec;
mft_dec_sys_t *mfdec;
};
#define MF_D3D11_PICCONTEXT_FROM_PICCTX(pic_ctx) \
container_of(pic_ctx, mf_d3d11_pic_ctx, ctx.s)
......@@ -335,7 +331,7 @@ static vlc_fourcc_t GUIDToFormat(const pair_format_guid table[], const GUID & gu
static int SetInputType(decoder_t *p_dec, DWORD stream_id, ComPtr<IMFMediaType> & result)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
result.Reset();
......@@ -466,7 +462,7 @@ error:
static int SetOutputType(decoder_t *p_dec, DWORD stream_id)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
ComPtr<IMFMediaType> output_media_type;
......@@ -592,7 +588,7 @@ error:
static int AllocateInputSample(decoder_t *p_dec, DWORD stream_id, ComPtr<IMFSample> & result, DWORD size)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
result.Reset();
......@@ -630,7 +626,7 @@ error:
static int AllocateOutputSample(decoder_t *p_dec, DWORD stream_id, ComPtr<IMFSample> & result)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
result.Reset();
......@@ -690,7 +686,7 @@ error:
static int ProcessInputStream(decoder_t *p_dec, DWORD stream_id, block_t *p_block)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr = S_OK;
ComPtr<IMFSample> input_sample;
......@@ -794,7 +790,7 @@ static void CopyPackedBufferToPicture(picture_t *p_pic, const uint8_t *p_src)
static void d3d11mf_pic_context_destroy(picture_context_t *ctx)
{
mf_d3d11_pic_ctx *pic_ctx = MF_D3D11_PICCONTEXT_FROM_PICCTX(ctx);
decoder_sys_t *mfdec = pic_ctx->mfdec;
mft_dec_sys_t *mfdec = pic_ctx->mfdec;
pic_ctx->out_media->Release();
static_assert(offsetof(mf_d3d11_pic_ctx, ctx.s) == 0, "Cast assumption failure");
d3d11_pic_context_destroy(ctx);
......@@ -822,7 +818,7 @@ static picture_context_t *d3d11mf_pic_context_copy(picture_context_t *ctx)
static mf_d3d11_pic_ctx *CreatePicContext(ID3D11Texture2D *texture, UINT slice,
ComPtr<IMFMediaBuffer> &media_buffer,
decoder_sys_t *mfdec,
mft_dec_sys_t *mfdec,
ID3D11ShaderResourceView *renderSrc[DXGI_MAX_SHADER_VIEW],
vlc_video_context *vctx)
{
......@@ -850,7 +846,7 @@ static mf_d3d11_pic_ctx *CreatePicContext(ID3D11Texture2D *texture, UINT slice,
static int ProcessOutputStream(decoder_t *p_dec, DWORD stream_id, bool & keep_reading)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
DWORD output_status = 0;
......@@ -1004,7 +1000,7 @@ static int ProcessOutputStream(decoder_t *p_dec, DWORD stream_id, bool & keep_re
return VLC_EGENERIC;
}
UINT32 interlaced = false;
UINT32 interlaced = FALSE;
hr = output_sample->GetUINT32(MFSampleExtension_Interlaced, &interlaced);
if (FAILED(hr))
picture->b_progressive = true;
......@@ -1109,13 +1105,14 @@ error:
static void Flush(decoder_t *p_dec)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
p_sys->flushStream();
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
if (SUCCEEDED(p_sys->flushStream()))
p_sys->startStream();
}
static int DecodeSync(decoder_t *p_dec, block_t *p_block)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
if (p_block && p_block->i_flags & (BLOCK_FLAG_CORRUPTED))
{
......@@ -1128,7 +1125,10 @@ static int DecodeSync(decoder_t *p_dec, block_t *p_block)
HRESULT hr;
hr = p_sys->mft->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0);
if (FAILED(hr))
{
msg_Warn(p_dec, "draining failed (hr=0x%lX)", hr);
return VLC_EGENERIC;
}
}
/* Drain the output stream before sending the input packet. */
......@@ -1151,13 +1151,14 @@ static int DecodeSync(decoder_t *p_dec, block_t *p_block)
error:
msg_Err(p_dec, "Error in DecodeSync()");
block_Release(p_block);
if (p_block)
block_Release(p_block);
return VLCDEC_SUCCESS;
}
static HRESULT DequeueMediaEvent(decoder_t *p_dec)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
ComPtr<IMFMediaEvent> event;
......@@ -1181,7 +1182,7 @@ static HRESULT DequeueMediaEvent(decoder_t *p_dec)
static int DecodeAsync(decoder_t *p_dec, block_t *p_block)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
if (!p_block) /* No Drain */
......@@ -1253,11 +1254,42 @@ error:
return VLCDEC_SUCCESS;
}
static int EnableHardwareAcceleration(decoder_t *p_dec, ComPtr<IMFAttributes> & attributes)
{
HRESULT hr = S_OK;
#if defined(STATIC_CODECAPI_AVDecVideoAcceleration_H264)
switch (p_dec->fmt_in.i_codec)
{
case VLC_CODEC_H264:
hr = attributes->SetUINT32(CODECAPI_AVDecVideoAcceleration_H264, TRUE);
break;
case VLC_CODEC_WMV1:
case VLC_CODEC_WMV2:
case VLC_CODEC_WMV3:
case VLC_CODEC_VC1:
hr = attributes->SetUINT32(CODECAPI_AVDecVideoAcceleration_VC1, TRUE);
break;
case VLC_CODEC_MPGV:
case VLC_CODEC_MP2V:
hr = attributes->SetUINT32(CODECAPI_AVDecVideoAcceleration_MPEG2, TRUE);
break;
default:
hr = S_OK;
break;
}
#else
VLC_UNUSED(p_dec);
VLC_UNUSED(attributes);
#endif // STATIC_CODECAPI_AVDecVideoAcceleration_H264
return SUCCEEDED(hr) ? VLC_SUCCESS : VLC_EGENERIC;
}
static void DestroyMFT(decoder_t *p_dec);
static int SetD3D11(decoder_t *p_dec, d3d11_device_t *d3d_dev)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
hr = p_sys->fptr_MFCreateDXGIDeviceManager(&p_sys->dxgi_token, p_sys->dxgi_manager.GetAddressOf());
if (FAILED(hr))
......@@ -1280,7 +1312,7 @@ static int SetD3D11(decoder_t *p_dec, d3d11_device_t *d3d_dev)
static int InitializeMFT(decoder_t *p_dec)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
ComPtr<IMFAttributes> attributes;
......@@ -1289,14 +1321,14 @@ static int InitializeMFT(decoder_t *p_dec)
goto error;
if (SUCCEEDED(hr))
{
UINT32 is_async = false;
UINT32 is_async = FALSE;
hr = attributes->GetUINT32(MF_TRANSFORM_ASYNC, &is_async);
if (hr != MF_E_ATTRIBUTENOTFOUND && FAILED(hr))
goto error;
p_sys->is_async = is_async;
if (p_sys->is_async)
{
hr = attributes->SetUINT32(MF_TRANSFORM_ASYNC_UNLOCK, true);
hr = attributes->SetUINT32(MF_TRANSFORM_ASYNC_UNLOCK, TRUE);
if (FAILED(hr))
goto error;
hr = p_sys->mft.As(&p_sys->event_generator);
......@@ -1336,6 +1368,7 @@ static int InitializeMFT(decoder_t *p_dec)
if (attributes.Get() && p_dec->fmt_in.i_cat == VIDEO_ES)
{
EnableHardwareAcceleration(p_dec, attributes);
if (p_sys->fptr_MFCreateDXGIDeviceManager)
{
vlc_decoder_device *dec_dev = decoder_GetDecoderDevice(p_dec);
......@@ -1374,11 +1407,6 @@ static int InitializeMFT(decoder_t *p_dec)
if (SetInputType(p_dec, p_sys->input_stream_id, p_sys->input_type) || p_sys->input_type.Get() == nullptr)
goto error;
/* This call can be a no-op for some MFT decoders, but it can potentially reduce starting time. */
hr = p_sys->beginStreaming();
if (FAILED(hr))
goto error;
/* This event is required for asynchronous MFTs, optional otherwise. */
hr = p_sys->startStream();
if (FAILED(hr))
......@@ -1406,18 +1434,53 @@ error:
static void DestroyMFT(decoder_t *p_dec)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
if (p_sys->mft.Get())
{
p_sys->endStream();
if (p_sys->output_sample.Get() == nullptr)
{
// the MFT produces the output and may still have some left, we need to drain them
HRESULT hr;
hr = p_sys->mft->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0);
if (FAILED(hr))
{
msg_Warn(p_dec, "exit draining failed (hr=0x%lX)", hr);
}
else
{
for (;;)
{
DWORD output_status = 0;
MFT_OUTPUT_DATA_BUFFER output_buffer = { p_sys->output_stream_id, p_sys->output_sample.Get(), 0, NULL };
hr = p_sys->mft->ProcessOutput(0, 1, &output_buffer, &output_status);
if (output_buffer.pEvents)
output_buffer.pEvents->Release();
if (output_buffer.pSample)
{
output_buffer.pSample->Release();
}
if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT)
break;
if (hr == MF_E_TRANSFORM_TYPE_NOT_SET)
break;
}
}
}
// make sure don't have any input pending
p_sys->flushStream();
}
if (p_dec->fmt_in.i_codec == VLC_CODEC_H264)
hxxx_helper_clean(&p_sys->hh);
}
static int FindMFT(decoder_t *p_dec)
{
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr;
/* Try to create a MFT using MFTEnumEx. */
......@@ -1479,12 +1542,23 @@ static int FindMFT(decoder_t *p_dec)
return VLC_EGENERIC;
}
static int LoadMFTLibrary(decoder_sys_t *p_sys)
static int LoadMFTLibrary(decoder_t *p_dec)
{
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
HRESULT hr = MFStartup(MF_VERSION, MFSTARTUP_NOSOCKET);
if (FAILED(hr))
return VLC_EGENERIC;
if (p_dec->fmt_in.i_cat != VIDEO_ES) // nothing left to do
return VLC_SUCCESS;
if (p_dec->fmt_in.video.i_width == 0) // don't consume D3D resource for a fake decoder
{
msg_Dbg(p_dec, "skip D3D handling for dummy decoder");
return VLC_SUCCESS;
}
#if _WIN32_WINNT < _WIN32_WINNT_WIN8
HINSTANCE mfplat_dll = LoadLibrary(TEXT("mfplat.dll"));
if (mfplat_dll)
......@@ -1503,9 +1577,9 @@ static int LoadMFTLibrary(decoder_sys_t *p_sys)
static int Open(vlc_object_t *p_this)
{
decoder_t *p_dec = (decoder_t *)p_this;
decoder_sys_t *p_sys;
mft_dec_sys_t *p_sys;
p_sys = new (std::nothrow) decoder_sys_t();
p_sys = new (std::nothrow) mft_dec_sys_t();
if (unlikely(p_sys == nullptr))
return VLC_ENOMEM;
p_dec->p_sys = p_sys;
......@@ -1516,7 +1590,7 @@ static int Open(vlc_object_t *p_this)
return VLC_EGENERIC;
}
if (LoadMFTLibrary(p_sys))
if (LoadMFTLibrary(p_dec))
{
msg_Err(p_dec, "Failed to load MFT library.");
goto error;
......@@ -1545,7 +1619,7 @@ error:
static void Close(vlc_object_t *p_this)
{
decoder_t *p_dec = (decoder_t *)p_this;
decoder_sys_t *p_sys = static_cast<decoder_sys_t*>(p_dec->p_sys);
mft_dec_sys_t *p_sys = static_cast<mft_dec_sys_t*>(p_dec->p_sys);
DestroyMFT(p_dec);
......