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 (12)
Showing
with 277 additions and 67 deletions
......@@ -469,6 +469,7 @@
#define VLC_CODEC_D3D11_OPAQUE_10B VLC_FOURCC('D','X','1','0') /* 4:2:0 10 bpc */
#define VLC_CODEC_D3D11_OPAQUE_RGBA VLC_FOURCC('D','X','R','G')
#define VLC_CODEC_D3D11_OPAQUE_BGRA VLC_FOURCC('D','A','G','R')
#define VLC_CODEC_D3D11_OPAQUE_ALPHA VLC_FOURCC('D','A','1','1') /* 4:2:0 8 bpc with extra alpha plane */
/* NVDEC opaque video format for use the NVDec API */
#define VLC_CODEC_NVDEC_OPAQUE VLC_FOURCC('N','V','D','8') /* 4:2:0 8 bpc */
......
......@@ -248,14 +248,14 @@ int screen_InitCaptureDXGI(demux_t *p_demux)
DXGI_OUTDUPL_DESC outDesc;
p_data->duplication->GetDesc(&outDesc);
p_data->output_format = D3D11_RenderFormat(outDesc.ModeDesc.Format ,true);
p_data->output_format = D3D11_RenderFormat(outDesc.ModeDesc.Format, DXGI_FORMAT_UNKNOWN ,true);
if (unlikely(!p_data->output_format))
{
msg_Err(p_demux, "Unknown texture format %d", outDesc.ModeDesc.Format);
goto error;
}
p_data->vctx = D3D11CreateVideoContext(dec_dev, p_data->output_format->formatTexture);
p_data->vctx = D3D11CreateVideoContext(dec_dev, p_data->output_format->formatTexture, p_data->output_format->alphaTexture);
vlc_decoder_device_Release(dec_dev);
dec_dev = nullptr;
if (unlikely(p_data->vctx == nullptr))
......
......@@ -568,7 +568,14 @@ libvpx_plugin_la_LIBADD = $(VPX_LIBS)
EXTRA_LTLIBRARIES += libvpx_plugin.la
codec_LTLIBRARIES += $(LTLIBvpx)
libvpx_alpha_plugin_la_SOURCES = codec/vpx_alpha.c
libvpx_alpha_plugin_la_SOURCES = codec/vpx_alpha.c codec/alpha_combine.h
if HAVE_WIN32
libvpx_alpha_plugin_la_SOURCES += codec/alpha_d3d11.cpp
libvpx_alpha_plugin_la_LIBADD = $(LIBCOM) libd3d11_common.la
if HAVE_WINSTORE
libvpx_alpha_plugin_la_LIBADD += -ld3d11
endif
endif
codec_LTLIBRARIES += libvpx_alpha_plugin.la
libaom_plugin_la_SOURCES = codec/aom.c \
......
// SPDX-License-Identifier: LGPL-2.1-or-later
// alpha_combine.h : helper to combine D3D11 planes to generate pictures with alpha
// Copyright © 2023 VideoLabs, VLC authors and VideoLAN
// Authors: Steve Lhomme <robux4@videolabs.io>
#ifndef VLC_ALPHA_COMBINE_H
#define VLC_ALPHA_COMBINE_H 1
#include <vlc_common.h>
#include <vlc_codec.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
picture_t *CombineD3D11(decoder_t *bdec, picture_t *opaque, picture_t *alpha, vlc_video_context*);
int SetupD3D11(decoder_t *bdec, vlc_video_context *vctx, vlc_video_context **vctx_out);
#endif // _WIN32
#ifdef __cplusplus
}
#endif
#endif // VLC_ALPHA_COMBINE_H
// SPDX-License-Identifier: LGPL-2.1-or-later
// alpha_d3d11.cpp : helper to combine D3D11 planes to generate pictures with alpha
// Copyright © 2023 VideoLabs, VLC authors and VideoLAN
// Authors: Steve Lhomme <robux4@videolabs.io>
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "alpha_combine.h"
#include "../video_chroma/d3d11_fmt.h"
struct d3d11_alpha_context
{
d3d11_pic_context ctx;
picture_t *opaque;
picture_t *alpha;
};
static void d3d11_alpha_pic_context_destroy(picture_context_t *ctx)
{
d3d11_alpha_context *pic_ctx = container_of(ctx, d3d11_alpha_context, ctx);
picture_Release(pic_ctx->opaque);
picture_Release(pic_ctx->alpha);
auto *picsys_out = &pic_ctx->ctx.picsys;
// texture objects have been be released by their parents
picsys_out->renderSrc[0] = nullptr;
picsys_out->renderSrc[1] = nullptr;
picsys_out->renderSrc[2] = nullptr;
picsys_out->renderSrc[3] = nullptr;
picsys_out->texture[0] = nullptr;
picsys_out->texture[1] = nullptr;
picsys_out->texture[2] = nullptr;
picsys_out->texture[3] = nullptr;
d3d11_pic_context_destroy(ctx);
}
static picture_context_t *d3d11_alpha_pic_context_copy(picture_context_t *)
{
assert(!"unsupported yet!");
return nullptr;
}
picture_t *CombineD3D11(decoder_t *dec, picture_t *opaque, picture_t *alpha, vlc_video_context *vctx)
{
auto *out = decoder_NewPicture(dec);
if (out == nullptr)
return nullptr;
d3d11_alpha_context *pic_ctx = static_cast<d3d11_alpha_context *>(calloc(1, sizeof(*pic_ctx)));
if (unlikely(pic_ctx == NULL))
{
picture_Release(out);
return nullptr;
}
pic_ctx->ctx.picsys.sharedHandle = INVALID_HANDLE_VALUE;
pic_ctx->ctx.s.copy = d3d11_alpha_pic_context_copy;
pic_ctx->ctx.s.destroy = d3d11_alpha_pic_context_destroy;
pic_ctx->ctx.s.vctx = vlc_video_context_Hold(vctx);
pic_ctx->opaque = picture_Hold(opaque);
pic_ctx->alpha = picture_Hold(alpha);
out->context = &pic_ctx->ctx.s;
auto *picsys_out = &pic_ctx->ctx.picsys;
auto *picsys_opaque = ActiveD3D11PictureSys(opaque);
auto *picsys_alpha = ActiveD3D11PictureSys(alpha);
picsys_out->renderSrc[0] = picsys_opaque->renderSrc[0]; // opaque Y
picsys_out->renderSrc[1] = picsys_opaque->renderSrc[1]; // opaque UV
picsys_out->renderSrc[2] = picsys_alpha->renderSrc[0]; // alpha Y
picsys_out->renderSrc[3] = picsys_alpha->renderSrc[1]; // alpha UV
picsys_out->texture[0] = picsys_opaque->texture[0];
picsys_out->texture[1] = picsys_opaque->texture[1];
picsys_out->texture[2] = picsys_alpha->texture[0];
picsys_out->texture[3] = picsys_alpha->texture[1];
return out;
}
int SetupD3D11(decoder_t *dec, vlc_video_context *vctx, vlc_video_context **vctx_out)
{
auto *vctx_sys = GetD3D11ContextPrivate(vctx);
assert(vctx_sys->secondary == DXGI_FORMAT_UNKNOWN);
assert(*vctx_out == nullptr); // TODO handle multiple format updates
auto *dec_dev = vlc_video_context_HoldDevice(vctx);
*vctx_out = D3D11CreateVideoContext(dec_dev, vctx_sys->format, DXGI_FORMAT_NV12);
vlc_decoder_device_Release(dec_dev);
if (unlikely(*vctx_out == nullptr))
{
msg_Dbg(dec,"Failed to create output vctx.");
return VLC_EGENERIC;
}
dec->fmt_out.video.i_chroma = dec->fmt_out.i_codec = VLC_CODEC_D3D11_OPAQUE_ALPHA;
return VLC_SUCCESS;
}
......@@ -292,7 +292,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum AVPixelFormat hwfmt, con
sys->d3d_dev->adapterDesc.VendorId, DxgiVendorStr(sys->d3d_dev->adapterDesc.VendorId),
sys->d3d_dev->adapterDesc.DeviceId, sys->d3d_dev->adapterDesc.Revision);
sys->vctx = D3D11CreateVideoContext(dec_device, sys->render_fmt->formatTexture);
sys->vctx = D3D11CreateVideoContext(dec_device, sys->render_fmt->formatTexture, sys->render_fmt->alphaTexture);
if (sys->vctx == NULL)
{
msg_Dbg(va, "no video context");
......@@ -397,17 +397,20 @@ static int DxSetupOutput(vlc_va_t *va, const directx_va_mode_t *mode, const vide
const d3d_format_t *decoder_format;
UINT supportFlags = D3D11_FORMAT_SUPPORT_DECODER_OUTPUT | D3D11_FORMAT_SUPPORT_SHADER_LOAD;
decoder_format = FindD3D11Format( va, sys->d3d_dev, 0, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT,
mode->bit_depth, mode->log2_chroma_h+1, mode->log2_chroma_w+1,
mode->bit_depth, mode->log2_chroma_h+1, mode->log2_chroma_w+1, 0,
DXGI_CHROMA_GPU, supportFlags );
if (decoder_format == NULL)
// other chroma sub-sampling
decoder_format = FindD3D11Format( va, sys->d3d_dev, 0, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT,
mode->bit_depth, 0, 0, DXGI_CHROMA_GPU, supportFlags );
mode->bit_depth, 0, 0, 0, DXGI_CHROMA_GPU, supportFlags );
if (decoder_format == NULL && mode->bit_depth > 10)
// 10 bits instead of 8/12/14/16
decoder_format = FindD3D11Format( va, sys->d3d_dev, 0, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT,
10, 0, 0, DXGI_CHROMA_GPU, supportFlags );
10, 0, 0, 0, DXGI_CHROMA_GPU, supportFlags );
if (decoder_format == NULL)
// any bit depth
decoder_format = FindD3D11Format( va, sys->d3d_dev, 0, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT,
0, 0, 0, DXGI_CHROMA_GPU, supportFlags );
0, 0, 0, 0, DXGI_CHROMA_GPU, supportFlags );
if (decoder_format != NULL)
{
msg_Dbg(va, "favor decoder format %s", decoder_format->name);
......@@ -415,8 +418,8 @@ static int DxSetupOutput(vlc_va_t *va, const directx_va_mode_t *mode, const vide
}
if (decoder_format == NULL || decoder_format->formatTexture != DXGI_FORMAT_NV12)
processorInput[idx++] = D3D11_RenderFormat(DXGI_FORMAT_NV12 ,true);
processorInput[idx++] = D3D11_RenderFormat(DXGI_FORMAT_420_OPAQUE ,true);
processorInput[idx++] = D3D11_RenderFormat(DXGI_FORMAT_NV12, DXGI_FORMAT_UNKNOWN ,true);
processorInput[idx++] = D3D11_RenderFormat(DXGI_FORMAT_420_OPAQUE, DXGI_FORMAT_UNKNOWN ,true);
processorInput[idx++] = NULL;
/* */
......
......@@ -811,9 +811,16 @@ if vpx_dep.found()
endif
# VP8/VP9 with alpha pseudo-decoder
vpx_alpha_sources = files('vpx_alpha.c')
vpx_alpha_with = [ ]
if host_system == 'windows'
vpx_alpha_sources += files('alpha_d3d11.cpp')
vpx_alpha_with += [ d3d11_common_lib ]
endif
vlc_modules += {
'name' : 'vpx_alpha',
'sources' : files('vpx_alpha.c')
'sources' : vpx_alpha_sources,
'link_with' : vpx_alpha_with
}
......
......@@ -120,7 +120,7 @@ HRESULT MFHW_d3d11::SetupVideoContext(vlc_logger *logger, ComPtr<IMFDXGIBuffer>
D3D11_TEXTURE2D_DESC desc;
d3d11Res->GetDesc(&desc);
vctx_out = D3D11CreateVideoContext( dec_dev, desc.Format );
vctx_out = D3D11CreateVideoContext( dec_dev, desc.Format, DXGI_FORMAT_UNKNOWN );
if (unlikely(vctx_out == NULL))
{
vlc_error(logger, "failed to create a video context");
......@@ -129,7 +129,7 @@ HRESULT MFHW_d3d11::SetupVideoContext(vlc_logger *logger, ComPtr<IMFDXGIBuffer>
fmt_out.video.i_width = desc.Width;
fmt_out.video.i_height = desc.Height;
cfg = D3D11_RenderFormat(desc.Format ,true);
cfg = D3D11_RenderFormat(desc.Format, DXGI_FORMAT_UNKNOWN, true);
fmt_out.i_codec = cfg->fourcc;
fmt_out.video.i_chroma = cfg->fourcc;
......
......@@ -17,6 +17,8 @@
#include <vlc_atomic.h>
#include <vlc_picture_pool.h>
#include "alpha_combine.h"
static int OpenDecoder(vlc_object_t *);
static void CloseDecoder(vlc_object_t *);
......@@ -202,6 +204,44 @@ static int FormatUpdate( decoder_t *dec, vlc_video_context *vctx )
p_sys->pf_combine = CombinePicturesCPU;
}
break;
#ifdef _WIN32
case VLC_CODEC_D3D11_OPAQUE:
if (dec == &p_sys->alpha->dec)
{
switch (p_sys->opaque->dec.fmt_out.video.i_chroma)
{
case VLC_CODEC_D3D11_OPAQUE:
res = SetupD3D11(bdec, vctx, &p_sys->vctx);
if (res == VLC_SUCCESS)
{
p_sys->pf_combine = CombineD3D11;
vctx = p_sys->vctx;
}
break;
default:
msg_Err(dec, "unsupported opaque D3D11 combination %4.4s", (char*)&p_sys->opaque->dec.fmt_out.video.i_chroma);
res = VLC_EGENERIC;
}
}
else
{
switch (p_sys->alpha->dec.fmt_out.video.i_chroma)
{
case VLC_CODEC_D3D11_OPAQUE:
res = SetupD3D11(bdec, vctx, &p_sys->vctx);
if (res == VLC_SUCCESS)
{
p_sys->pf_combine = CombineD3D11;
vctx = p_sys->vctx;
}
break;
default:
msg_Err(dec, "unsupported opaque D3D11 combination %4.4s", (char*)&p_sys->alpha->dec.fmt_out.video.i_chroma);
res = VLC_EGENERIC;
}
}
break;
#endif // _WIN32
default:
msg_Err(dec, "unsupported decoder output %4.4s", (char*)&dec->fmt_out.video.i_chroma);
res = VLC_EGENERIC;
......
......@@ -112,7 +112,7 @@ static int DecodeFrame( decoder_t *p_dec, block_t *p_block )
D3D11_TEXTURE2D_DESC outDesc;
src_sys->texture[0]->GetDesc(&outDesc);
p_sys->output_format = D3D11_RenderFormat(outDesc.Format ,true);
p_sys->output_format = D3D11_RenderFormat(outDesc.Format, DXGI_FORMAT_UNKNOWN ,true);
if (unlikely(!p_sys->output_format->name))
{
msg_Err(p_dec, "Unknown texture format %d", outDesc.Format);
......@@ -124,7 +124,7 @@ static int DecodeFrame( decoder_t *p_dec, block_t *p_block )
if (unlikely(p_sys->vctx == nullptr))
{
p_sys->vctx =
D3D11CreateVideoContext(p_sys->dec_dev, p_sys->output_format->formatTexture);
D3D11CreateVideoContext(p_sys->dec_dev, p_sys->output_format->formatTexture, p_sys->output_format->alphaTexture);
if (!p_sys->vctx)
{
block_Release( p_block );
......@@ -277,7 +277,7 @@ int D3D11OpenBlockDecoder( vlc_object_t *obj )
}
p_sys->vctx =
D3D11CreateVideoContext(p_sys->dec_dev, p_sys->output_format->formatTexture);
D3D11CreateVideoContext(p_sys->dec_dev, p_sys->output_format->formatTexture, p_sys->output_format->alphaTexture);
if (!p_sys->vctx)
{
vlc_decoder_device_Release(dec_dev);
......
......@@ -254,7 +254,7 @@ int D3D11OpenDeinterlace(filter_t *filter)
d3d11_decoder_device_t *dev_sys = GetD3D11OpaqueContext( filter->vctx_in );
sys->d3d_dev = &dev_sys->d3d_dev;
sys->output_format = D3D11_RenderFormat(vctx_sys->format ,true);
sys->output_format = D3D11_RenderFormat(vctx_sys->format, vctx_sys->secondary ,true);
if (unlikely(sys->output_format == NULL))
goto error;
......
......@@ -188,7 +188,7 @@ static picture_t *AllocPicture( filter_t *p_filter )
{
d3d11_video_context_t *vctx_sys = GetD3D11ContextPrivate( p_filter->vctx_out );
const d3d_format_t *cfg = D3D11_RenderFormat(vctx_sys->format ,true);
const d3d_format_t *cfg = D3D11_RenderFormat(vctx_sys->format, vctx_sys->secondary ,true);
if (unlikely(cfg == NULL))
return NULL;
......
......@@ -183,7 +183,7 @@ static int assert_staging(filter_t *p_filter, filter_sys_t *sys, DXGI_FORMAT for
/* failed with the this format, try a different one */
UINT supportFlags = D3D11_FORMAT_SUPPORT_SHADER_LOAD | D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT;
const d3d_format_t *new_fmt =
FindD3D11Format( p_filter, d3d_dev, 0, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT, 0, 0, 0, DXGI_CHROMA_CPU, supportFlags );
FindD3D11Format( p_filter, d3d_dev, 0, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT, 0, 0, 0, 0, DXGI_CHROMA_CPU, supportFlags );
if (new_fmt && texDesc.Format != new_fmt->formatTexture)
{
DXGI_FORMAT srcFormat = texDesc.Format;
......@@ -623,7 +623,7 @@ static picture_t *AllocateCPUtoGPUTexture(filter_t *p_filter, filter_sys_t *p_sy
d3d11_video_context_t *vctx_sys = GetD3D11ContextPrivate( p_filter->vctx_out );
const d3d_format_t *cfg = D3D11_RenderFormat(vctx_sys->format ,false);
const d3d_format_t *cfg = D3D11_RenderFormat(vctx_sys->format, vctx_sys->secondary ,false);
if (unlikely(cfg == NULL))
return NULL;
......@@ -822,7 +822,7 @@ int D3D11OpenCPUConverter( filter_t *p_filter )
default:
vlc_assert_unreachable();
}
p_filter->vctx_out = D3D11CreateVideoContext(dec_device, vctx_fmt);
p_filter->vctx_out = D3D11CreateVideoContext(dec_device, vctx_fmt, DXGI_FORMAT_UNKNOWN);
if ( p_filter->vctx_out == NULL )
{
msg_Dbg(p_filter, "no video context");
......
......@@ -46,13 +46,13 @@
#include <vlc/libvlc_media_player.h>
#define COBJMACROS
#include <d3d11.h>
#include <assert.h>
#include <initguid.h>
#include <d3d11.h>
#include <dxgi1_2.h>
#if !defined(NDEBUG) && defined(HAVE_DXGIDEBUG_H)
# include <dxgidebug.h>
#endif
#include <assert.h>
#include "d3d11_fmt.h"
......@@ -747,6 +747,7 @@ const d3d_format_t *(FindD3D11Format)(vlc_object_t *o,
uint8_t bits_per_channel,
uint8_t widthDenominator,
uint8_t heightDenominator,
uint8_t alpha_bits,
int cpu_gpu,
UINT supportFlags)
{
......@@ -768,6 +769,10 @@ const d3d_format_t *(FindD3D11Format)(vlc_object_t *o,
continue;
if (heightDenominator && heightDenominator < output_format->heightDenominator)
continue;
if (alpha_bits && output_format->bitsForAlpha < alpha_bits)
continue;
if (alpha_bits == 0 && output_format->bitsForAlpha != 0)
continue;
DXGI_FORMAT textureFormat;
if (output_format->formatTexture == DXGI_FORMAT_UNKNOWN)
......@@ -952,7 +957,7 @@ const struct vlc_video_context_operations d3d11_vctx_ops = {
NULL,
};
vlc_video_context *D3D11CreateVideoContext(vlc_decoder_device *dec_dev, DXGI_FORMAT vctx_fmt)
vlc_video_context *D3D11CreateVideoContext(vlc_decoder_device *dec_dev, DXGI_FORMAT vctx_fmt, DXGI_FORMAT alpha)
{
vlc_video_context *vctx = vlc_video_context_Create( dec_dev, VLC_VIDEO_CONTEXT_D3D11VA,
sizeof(d3d11_video_context_t), &d3d11_vctx_ops );
......@@ -961,6 +966,7 @@ vlc_video_context *D3D11CreateVideoContext(vlc_decoder_device *dec_dev, DXGI_FOR
d3d11_video_context_t *priv = GetD3D11ContextPrivate(vctx);
priv->format = vctx_fmt;
priv->secondary = alpha;
return vctx;
}
......
......@@ -100,6 +100,7 @@ typedef struct
typedef struct
{
DXGI_FORMAT format;
DXGI_FORMAT secondary; // alpha source in combined formats
} d3d11_video_context_t;
/* index to use for texture/resource that use a known DXGI format
......@@ -111,7 +112,8 @@ static inline bool is_d3d11_opaque(vlc_fourcc_t chroma)
return chroma == VLC_CODEC_D3D11_OPAQUE ||
chroma == VLC_CODEC_D3D11_OPAQUE_10B ||
chroma == VLC_CODEC_D3D11_OPAQUE_RGBA ||
chroma == VLC_CODEC_D3D11_OPAQUE_BGRA;
chroma == VLC_CODEC_D3D11_OPAQUE_BGRA ||
chroma == VLC_CODEC_D3D11_OPAQUE_ALPHA;
}
extern const struct vlc_video_context_operations d3d11_vctx_ops;
......@@ -145,18 +147,19 @@ static inline d3d11_video_context_t *GetD3D11ContextPrivate(vlc_video_context *v
return (d3d11_video_context_t *) vlc_video_context_GetPrivate( vctx, VLC_VIDEO_CONTEXT_D3D11VA );
}
vlc_video_context *D3D11CreateVideoContext(vlc_decoder_device *, DXGI_FORMAT);
vlc_video_context *D3D11CreateVideoContext(vlc_decoder_device *, DXGI_FORMAT, DXGI_FORMAT);
void AcquireD3D11PictureSys(picture_sys_d3d11_t *p_sys);
void ReleaseD3D11PictureSys(picture_sys_d3d11_t *p_sys);
static inline const d3d_format_t *D3D11_RenderFormat(DXGI_FORMAT opaque, bool gpu_based)
static inline const d3d_format_t *D3D11_RenderFormat(DXGI_FORMAT opaque, DXGI_FORMAT alpha, bool gpu_based)
{
for (const d3d_format_t *output_format = DxgiGetRenderFormatList();
output_format->name != NULL; ++output_format)
{
if (output_format->formatTexture == opaque &&
output_format->alphaTexture == alpha &&
is_d3d11_opaque(output_format->fourcc) == gpu_based)
{
return output_format;
......@@ -194,10 +197,11 @@ const d3d_format_t *FindD3D11Format(vlc_object_t *,
uint8_t bits_per_channel,
uint8_t widthDenominator,
uint8_t heightDenominator,
uint8_t alpha_bits,
int cpu_gpu,
UINT supportFlags);
#define FindD3D11Format(a,b,c,d,e,f,g,h,i) \
FindD3D11Format(VLC_OBJECT(a),b,c,d,e,f,g,h,i)
#define FindD3D11Format(a,b,c,d,e,f,g,h,i,j) \
FindD3D11Format(VLC_OBJECT(a),b,c,d,e,f,g,h,i,j)
int AllocateTextures(vlc_object_t *, d3d11_device_t *, const d3d_format_t *,
const video_format_t *, bool, ID3D11Texture2D *textures[],
......
......@@ -66,43 +66,45 @@ static const dxgi_format_t dxgi_formats[] = {
};
static const d3d_format_t d3d_formats[] = {
{ "NV12", DXGI_FORMAT_NV12, VLC_CODEC_NV12, 8, 2, 2, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM } },
{ "VA_NV12", DXGI_FORMAT_NV12, VLC_CODEC_D3D11_OPAQUE, 8, 2, 2, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM } },
{ "P010", DXGI_FORMAT_P010, VLC_CODEC_P010, 10, 2, 2, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16G16_UNORM } },
{ "VA_P010", DXGI_FORMAT_P010, VLC_CODEC_D3D11_OPAQUE_10B, 10, 2, 2, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16G16_UNORM } },
{ "VA_AYUV", DXGI_FORMAT_AYUV, VLC_CODEC_D3D11_OPAQUE, 8, 1, 1, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "YUY2", DXGI_FORMAT_YUY2, VLC_CODEC_YUYV, 8, 1, 2, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "VA_YUY2", DXGI_FORMAT_YUY2, VLC_CODEC_D3D11_OPAQUE, 8, 1, 2, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "NV12", DXGI_FORMAT_NV12, DXGI_FORMAT_UNKNOWN, VLC_CODEC_NV12, 8, 2, 2, 0, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM } },
{ "VA_NV12", DXGI_FORMAT_NV12, DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE, 8, 2, 2, 0, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM } },
{ "VA_NV12A", DXGI_FORMAT_NV12, DXGI_FORMAT_NV12, VLC_CODEC_D3D11_OPAQUE_ALPHA,8, 2, 2, 8, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "P010", DXGI_FORMAT_P010, DXGI_FORMAT_UNKNOWN, VLC_CODEC_P010, 10, 2, 2, 0, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16G16_UNORM } },
{ "VA_P010", DXGI_FORMAT_P010, DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE_10B, 10, 2, 2, 0, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16G16_UNORM } },
{ "VA_AYUV", DXGI_FORMAT_AYUV, DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE, 8, 1, 1, 8, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "YUY2", DXGI_FORMAT_YUY2, DXGI_FORMAT_UNKNOWN, VLC_CODEC_YUYV, 8, 1, 2, 0, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "VA_YUY2", DXGI_FORMAT_YUY2, DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE, 8, 1, 2, 0, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
#ifdef BROKEN_PIXEL
{ "Y416", DXGI_FORMAT_Y416, VLC_CODEC_I444_16L, 16, 1, 1, 1, { DXGI_FORMAT_R16G16B16A16_UINT } },
{ "Y416", DXGI_FORMAT_Y416, DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_16L, 16, 1, 1, 16, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
#endif
{ "VA_Y210", DXGI_FORMAT_Y210, VLC_CODEC_D3D11_OPAQUE_10B, 10, 1, 2, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
{ "VA_Y410", DXGI_FORMAT_Y410, VLC_CODEC_D3D11_OPAQUE_10B, 10, 1, 1, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "VA_Y210", DXGI_FORMAT_Y210, DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE_10B, 10, 1, 2, 0, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
{ "VA_Y410", DXGI_FORMAT_Y410, DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE_10B, 10, 1, 1, 0, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
#ifdef UNTESTED
{ "Y210", DXGI_FORMAT_Y210, VLC_CODEC_I422_10L, 10, 1, 2, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
{ "Y410", DXGI_FORMAT_Y410, VLC_CODEC_I444, 10, 1, 1, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "NV11", DXGI_FORMAT_NV11, VLC_CODEC_I411, 8, 4, 1, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM} },
{ "Y210", DXGI_FORMAT_Y210, DXGI_FORMAT_UNKNOWN, VLC_CODEC_I422_10L, 10, 1, 2, 0, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
{ "Y410", DXGI_FORMAT_Y410, DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444, 10, 1, 1, 0, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "NV11", DXGI_FORMAT_NV11, DXGI_FORMAT_UNKNOWN, VLC_CODEC_I411, 8, 4, 1, 0, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8G8_UNORM} },
#endif
{ "I420", DXGI_FORMAT_UNKNOWN, VLC_CODEC_I420, 8, 2, 2, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "I420_10", DXGI_FORMAT_UNKNOWN, VLC_CODEC_I420_10L, 10, 2, 2, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "YUVA", DXGI_FORMAT_UNKNOWN, VLC_CODEC_YUVA, 8, 1, 1, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "I444", DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444, 8, 1, 1, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "I444_10", DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_10L, 10, 1, 1, 1 << 6, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "I444_12", DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_12L, 10, 1, 1, 1 << 4, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "I444_16", DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_16L, 16, 1, 1, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "B8G8R8A8", DXGI_FORMAT_B8G8R8A8_UNORM, VLC_CODEC_BGRA, 8, 1, 1, 1, { DXGI_FORMAT_B8G8R8A8_UNORM } },
{ "VA_BGRA", DXGI_FORMAT_B8G8R8A8_UNORM, VLC_CODEC_D3D11_OPAQUE_BGRA, 8, 1, 1, 1, { DXGI_FORMAT_B8G8R8A8_UNORM } },
{ "R8G8B8A8", DXGI_FORMAT_R8G8B8A8_UNORM, VLC_CODEC_RGBA, 8, 1, 1, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "VA_RGBA", DXGI_FORMAT_R8G8B8A8_UNORM, VLC_CODEC_D3D11_OPAQUE_RGBA, 8, 1, 1, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "R8G8B8X8", DXGI_FORMAT_B8G8R8X8_UNORM, VLC_CODEC_BGRX , 8, 1, 1, 1, { DXGI_FORMAT_B8G8R8X8_UNORM } },
{ "RGBA64", DXGI_FORMAT_R16G16B16A16_UNORM, VLC_CODEC_RGBA64, 16, 1, 1, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
{ "RGB10A2", DXGI_FORMAT_R10G10B10A2_UNORM, VLC_CODEC_RGBA10LE, 10, 1, 1, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "VA_RGB10", DXGI_FORMAT_R10G10B10A2_UNORM, VLC_CODEC_D3D11_OPAQUE_RGBA, 10, 1, 1, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "AYUV", DXGI_FORMAT_AYUV, VLC_CODEC_VUYA, 8, 1, 1, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "B5G6R5", DXGI_FORMAT_B5G6R5_UNORM, VLC_CODEC_RGB565LE, 5, 1, 1, 1, { DXGI_FORMAT_B5G6R5_UNORM } },
{ "I420_OPAQUE", DXGI_FORMAT_420_OPAQUE, VLC_CODEC_D3D11_OPAQUE, 8, 2, 2, 1, { DXGI_FORMAT_UNKNOWN } },
{ NULL, 0, 0, 0, 0, 0, 0, { DXGI_FORMAT_UNKNOWN } }
{ "I420", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_I420, 8, 2, 2, 0, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "I420_10", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_I420_10L, 10, 2, 2, 0, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "I40A", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_YUV420A, 8, 2, 2, 8, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "YUVA", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_YUVA, 8, 1, 1, 8, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "I444", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444, 8, 1, 1, 0, 1, { DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM } },
{ "I444_10", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_10L, 10, 1, 1, 0, 1 << 6, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "I444_12", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_12L, 10, 1, 1, 0, 1 << 4, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "I444_16", DXGI_FORMAT_UNKNOWN,DXGI_FORMAT_UNKNOWN, VLC_CODEC_I444_16L, 16, 1, 1, 0, 1, { DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_R16_UNORM } },
{ "B8G8R8A8", DXGI_FORMAT_B8G8R8A8_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_BGRA, 8, 1, 1, 8, 1, { DXGI_FORMAT_B8G8R8A8_UNORM } },
{ "VA_BGRA", DXGI_FORMAT_B8G8R8A8_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE_BGRA, 8, 1, 1, 8, 1, { DXGI_FORMAT_B8G8R8A8_UNORM } },
{ "R8G8B8A8", DXGI_FORMAT_R8G8B8A8_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_RGBA, 8, 1, 1, 8, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "VA_RGBA", DXGI_FORMAT_R8G8B8A8_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE_RGBA, 8, 1, 1, 8, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "R8G8B8X8", DXGI_FORMAT_B8G8R8X8_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_BGRX , 8, 1, 1, 0, 1, { DXGI_FORMAT_B8G8R8X8_UNORM } },
{ "RGBA64", DXGI_FORMAT_R16G16B16A16_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_RGBA64, 16, 1, 1, 16, 1, { DXGI_FORMAT_R16G16B16A16_UNORM } },
{ "RGB10A2", DXGI_FORMAT_R10G10B10A2_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_RGBA10LE, 10, 1, 1, 2, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "VA_RGB10", DXGI_FORMAT_R10G10B10A2_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE_RGBA, 10, 1, 1, 2, 1, { DXGI_FORMAT_R10G10B10A2_UNORM } },
{ "AYUV", DXGI_FORMAT_AYUV, DXGI_FORMAT_UNKNOWN, VLC_CODEC_VUYA, 8, 1, 1, 8, 1, { DXGI_FORMAT_R8G8B8A8_UNORM } },
{ "B5G6R5", DXGI_FORMAT_B5G6R5_UNORM,DXGI_FORMAT_UNKNOWN, VLC_CODEC_RGB565LE, 5, 1, 1, 0, 1, { DXGI_FORMAT_B5G6R5_UNORM } },
{ "I420_OPAQUE", DXGI_FORMAT_420_OPAQUE,DXGI_FORMAT_UNKNOWN, VLC_CODEC_D3D11_OPAQUE, 8, 2, 2, 0, 1, { DXGI_FORMAT_UNKNOWN } },
{ NULL, 0, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, 0, 0, 0, 0, 0, { DXGI_FORMAT_UNKNOWN } }
};
const char *DxgiFormatToStr(DXGI_FORMAT format)
......
......@@ -46,10 +46,12 @@ typedef struct
{
const char *name;
DXGI_FORMAT formatTexture;
DXGI_FORMAT alphaTexture;
vlc_fourcc_t fourcc;
uint8_t bitsPerChannel;
uint8_t widthDenominator;
uint8_t heightDenominator;
uint8_t bitsForAlpha;
uint8_t resourceFactor; // the plane depth doesn't match the resource depth
DXGI_FORMAT resourceFormat[DXGI_MAX_SHADER_VIEW];
} d3d_format_t;
......@@ -63,8 +65,8 @@ UINT DxgiResourceCount(const d3d_format_t *);
bool DxgiIsRGBFormat(const d3d_format_t *);
#define DXGI_RGB_FORMAT 1
#define DXGI_YUV_FORMAT 2
#define DXGI_RGB_FORMAT (1 << 0)
#define DXGI_YUV_FORMAT (1 << 1)
#define DXGI_CHROMA_CPU 1
#define DXGI_CHROMA_GPU 2
......
......@@ -362,6 +362,7 @@ void d3d11_quad_t::UpdateViewport(const RECT *rect, const d3d_format_t *display)
/* fallthrough */
case VLC_CODEC_I420_10L:
case VLC_CODEC_I420:
case VLC_CODEC_YUV420A:
cropViewport[1].TopLeftX = cropViewport[0].TopLeftX / 2;
cropViewport[1].TopLeftY = cropViewport[0].TopLeftY / 2;
cropViewport[1].Width = cropViewport[0].Width / 2;
......
......@@ -40,7 +40,7 @@ struct d3d11_scaler
static const d3d_format_t *GetDirectRenderingFormat(vlc_object_t *vd, d3d11_device_t *d3d_dev, vlc_fourcc_t i_src_chroma)
{
UINT supportFlags = D3D11_FORMAT_SUPPORT_SHADER_LOAD | D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_INPUT;
return FindD3D11Format( vd, d3d_dev, i_src_chroma, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT, 0, 0, 0,
return (FindD3D11Format)( vd, d3d_dev, i_src_chroma, DXGI_RGB_FORMAT|DXGI_YUV_FORMAT, 0, 0, 0, 0,
DXGI_CHROMA_CPU|DXGI_CHROMA_GPU, supportFlags );
}
......
......@@ -84,12 +84,19 @@ static bool UpdateSwapchain( d3d11_local_swapchain *display, const libvlc_video_
/* favor RGB formats first */
newPixelFormat = FindD3D11Format( display->obj, display->d3d_dev, 0, DXGI_RGB_FORMAT,
cfg->bitdepth > 8 ? 10 : 8,
0, 0,
0, 0, 0,
DXGI_CHROMA_CPU, D3D11_FORMAT_SUPPORT_DISPLAY );
if (unlikely(newPixelFormat == NULL))
// try with alpha
newPixelFormat = FindD3D11Format( display->obj, display->d3d_dev, 0, DXGI_RGB_FORMAT,
cfg->bitdepth > 8 ? 10 : 8,
0, 0, 8,
DXGI_CHROMA_CPU, D3D11_FORMAT_SUPPORT_DISPLAY );
if (unlikely(newPixelFormat == NULL))
// try YUV without alpha
newPixelFormat = FindD3D11Format( display->obj, display->d3d_dev, 0, DXGI_YUV_FORMAT,
cfg->bitdepth > 8 ? 10 : 8,
0, 0,
0, 0, 0,
DXGI_CHROMA_CPU, D3D11_FORMAT_SUPPORT_DISPLAY );
if (unlikely(newPixelFormat == NULL)) {
msg_Err(display->obj, "Could not get the SwapChain format.");
......