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
  • abdsaber000/vlc
  • falbrechtskirchinger/vlc
  • b.sullender/vlc
  • hulxv/vlc
  • zyad-ayad/vlc
408 results
Show changes
Commits on Source (8)
Showing
with 514 additions and 321 deletions
......@@ -150,12 +150,19 @@ struct vlc_gl_interop {
void *priv;
const struct vlc_gl_interop_ops *ops;
/* Set by the caller to opengl_interop_init_impl().
* This avoids each module to link against opengl_interop_init_impl()
* directly. */
/* This avoids each module to link against GetTexFormatSize() directly. */
int
(*init)(struct vlc_gl_interop *interop, uint32_t tex_target,
vlc_fourcc_t chroma, video_color_space_t yuv_space);
(*get_tex_format_size)(struct vlc_gl_interop *interop, uint32_t target,
uint32_t format, int32_t internal, uint32_t type);
};
static inline int
vlc_gl_interop_GetTexFormatSize(struct vlc_gl_interop *interop, uint32_t target,
uint32_t format, int32_t internal,
uint32_t type)
{
return interop->get_tex_format_size(interop, target, format, internal,
type);
}
#endif
......@@ -224,13 +224,74 @@ static int Open(vlc_object_t *obj)
default: render_chroma = VLC_CODEC_NV12; break;
}
int ret = opengl_interop_init(interop, GL_TEXTURE_2D, render_chroma, interop->fmt_in.space);
if (ret != VLC_SUCCESS)
switch (render_chroma)
{
vlc_decoder_device_Release(device);
return ret;
case VLC_CODEC_P010:
case VLC_CODEC_P016:
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_R16,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 2},
.internal = GL_RG16,
.format = GL_RG,
.type = GL_UNSIGNED_BYTE,
};
break;
case VLC_CODEC_I444:
interop->tex_count = 3;
interop->texs[0] = interop->texs[1] = interop->texs[2] =
(struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RED,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
break;
case VLC_CODEC_I444_16L:
interop->tex_count = 3;
interop->texs[0] = interop->texs[1] = interop->texs[2] =
(struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_R16,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
break;
case VLC_CODEC_NV12:
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RED,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
.w = {1, 2},
.h = {1, 2},
.internal = GL_RG,
.format = GL_RG,
.type = GL_UNSIGNED_BYTE,
};
break;
}
interop->fmt_out.i_chroma = render_chroma;
interop->fmt_out.space = interop->fmt_in.space;
static const struct vlc_gl_interop_ops ops = {
.allocate_textures = tc_nvdec_gl_allocate_texture,
.update_textures = tc_nvdec_gl_update,
......
......@@ -97,14 +97,9 @@ struct vlc_gl_extension_vt {
PFNGLGETERRORPROC GetError;
};
static inline void
vlc_gl_LoadExtensionFunctions(vlc_gl_t *gl, struct vlc_gl_extension_vt *vt)
static inline unsigned
vlc_gl_GetVersionMajor(struct vlc_gl_extension_vt *vt)
{
vt->GetString = vlc_gl_GetProcAddress(gl, "glGetString");
vt->GetIntegerv = vlc_gl_GetProcAddress(gl, "glGetIntegerv");
vt->GetError = vlc_gl_GetProcAddress(gl, "glGetError");
vt->GetStringi = NULL;
GLint version;
vt->GetIntegerv(GL_MAJOR_VERSION, &version);
uint32_t error = vt->GetError();
......@@ -116,6 +111,20 @@ vlc_gl_LoadExtensionFunctions(vlc_gl_t *gl, struct vlc_gl_extension_vt *vt)
while (error != GL_NO_ERROR)
error = vt->GetError();
return version;
}
static inline void
vlc_gl_LoadExtensionFunctions(vlc_gl_t *gl, struct vlc_gl_extension_vt *vt)
{
vt->GetString = vlc_gl_GetProcAddress(gl, "glGetString");
vt->GetIntegerv = vlc_gl_GetProcAddress(gl, "glGetIntegerv");
vt->GetError = vlc_gl_GetProcAddress(gl, "glGetError");
vt->GetStringi = NULL;
unsigned version = vlc_gl_GetVersionMajor(vt);
/* glGetStringi is available in OpenGL>=3 and GLES>=3.
* https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetString.xhtml
* https://www.khronos.org/registry/OpenGL-Refpages/es3/html/glGetString.xhtml
......
......@@ -253,6 +253,8 @@ vlc_gl_importer_New(struct vlc_gl_interop *interop)
glfmt->tex_widths[j] = vlc_align_pot(w);
glfmt->tex_heights[j] = vlc_align_pot(h);
}
glfmt->formats[j] = interop->texs[j].format;
}
if (!interop->handle_texs_gen)
......
......@@ -49,8 +49,6 @@ struct vlc_gl_interop_private
#define DECLARE_SYMBOL(type, name) type name;
OPENGL_VTABLE_F(DECLARE_SYMBOL)
} gl;
struct vlc_gl_extension_vt extension_vt;
};
int
......@@ -102,8 +100,8 @@ vlc_gl_interop_DeleteTextures(const struct vlc_gl_interop *interop,
memset(textures, 0, interop->tex_count * sizeof(GLuint));
}
static int GetTexFormatSize(struct vlc_gl_interop *interop, int target,
int tex_format, int tex_internal, int tex_type)
static int GetTexFormatSize(struct vlc_gl_interop *interop, GLenum target,
GLenum tex_format, GLint tex_internal, GLenum tex_type)
{
struct vlc_gl_interop_private *priv =
container_of(interop, struct vlc_gl_interop_private, interop);
......@@ -150,224 +148,6 @@ static int GetTexFormatSize(struct vlc_gl_interop *interop, int target,
return size > 0 ? size * mul : size;
}
static inline void
DivideRationalByTwo(vlc_rational_t *r) {
if (r->num % 2 == 0)
r->num /= 2;
else
r->den *= 2;
}
static int
interop_yuv_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma,
const vlc_chroma_description_t *desc)
{
struct vlc_gl_interop_private *priv =
container_of(interop, struct vlc_gl_interop_private, interop);
(void) chroma;
GLint oneplane_texfmt, oneplane16_texfmt,
twoplanes_texfmt, twoplanes16_texfmt;
if (vlc_gl_HasExtension(&priv->extension_vt, "GL_ARB_texture_rg"))
{
oneplane_texfmt = GL_RED;
oneplane16_texfmt = GL_R16;
twoplanes_texfmt = GL_RG;
twoplanes16_texfmt = GL_RG16;
}
else
{
oneplane_texfmt = GL_LUMINANCE;
oneplane16_texfmt = GL_LUMINANCE16;
twoplanes_texfmt = GL_LUMINANCE_ALPHA;
twoplanes16_texfmt = 0;
}
if (desc->pixel_size == 2)
{
if (GetTexFormatSize(interop, tex_target, oneplane_texfmt,
oneplane16_texfmt, GL_UNSIGNED_SHORT) != 16)
return VLC_EGENERIC;
}
if (desc->plane_count == 3)
{
GLint internal = 0;
GLenum type = 0;
if (desc->pixel_size == 1)
{
internal = oneplane_texfmt;
type = GL_UNSIGNED_BYTE;
}
else if (desc->pixel_size == 2)
{
internal = oneplane16_texfmt;
type = GL_UNSIGNED_SHORT;
}
else
return VLC_EGENERIC;
assert(internal != 0 && type != 0);
interop->tex_count = 3;
for (unsigned i = 0; i < interop->tex_count; ++i )
{
interop->texs[i] = (struct vlc_gl_tex_cfg) {
{ desc->p[i].w.num, desc->p[i].w.den },
{ desc->p[i].h.num, desc->p[i].h.den },
internal, oneplane_texfmt, type
};
}
}
else if (desc->plane_count == 2)
{
interop->tex_count = 2;
if (desc->pixel_size == 1)
{
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ desc->p[0].w.num, desc->p[0].w.den },
{ desc->p[0].h.num, desc->p[0].h.den },
oneplane_texfmt, oneplane_texfmt, GL_UNSIGNED_BYTE
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
{ desc->p[1].w.num, desc->p[1].w.den },
{ desc->p[1].h.num, desc->p[1].h.den },
twoplanes_texfmt, twoplanes_texfmt, GL_UNSIGNED_BYTE
};
}
else if (desc->pixel_size == 2)
{
if (twoplanes16_texfmt == 0
|| GetTexFormatSize(interop, tex_target, twoplanes_texfmt,
twoplanes16_texfmt, GL_UNSIGNED_SHORT) != 16)
return VLC_EGENERIC;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ desc->p[0].w.num, desc->p[0].w.den },
{ desc->p[0].h.num, desc->p[0].h.den },
oneplane16_texfmt, oneplane_texfmt, GL_UNSIGNED_SHORT
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
{ desc->p[1].w.num, desc->p[1].w.den },
{ desc->p[1].h.num, desc->p[1].h.den },
twoplanes16_texfmt, twoplanes_texfmt, GL_UNSIGNED_SHORT
};
}
else
return VLC_EGENERIC;
/*
* If plane_count == 2, then the chroma is semiplanar: the U and V
* planes are packed in the second plane. As a consequence, the
* horizontal scaling, as reported in the vlc_chroma_description_t, is
* doubled.
*
* But once imported as an OpenGL texture, both components are stored
* in a single texel (the two first components of the vec4).
* Therefore, from OpenGL, the width is not doubled, so the horizontal
* scaling must be divided by 2 to compensate.
*/
DivideRationalByTwo(&interop->texs[1].w);
}
else if (desc->plane_count == 1)
{
/* Only YUV 4:2:2 formats */
/* The pictures have only 1 plane, but it is uploaded twice, once to
* access the Y components, once to access the UV components. See
* #26712. */
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 },
twoplanes_texfmt, twoplanes_texfmt, GL_UNSIGNED_BYTE
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
{ 1, 2 }, { 1, 1 },
GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
};
}
else
return VLC_EGENERIC;
return VLC_SUCCESS;
}
static int
interop_rgb_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma)
{
(void) tex_target;
switch (chroma)
{
case VLC_CODEC_RGB24:
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE
};
break;
case VLC_CODEC_RGB32:
case VLC_CODEC_RGBA:
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
};
break;
case VLC_CODEC_BGRA: {
if (GetTexFormatSize(interop, tex_target, GL_BGRA, GL_RGBA,
GL_UNSIGNED_BYTE) != 32)
return VLC_EGENERIC;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE
};
break;
}
default:
return VLC_EGENERIC;
}
interop->tex_count = 1;
return VLC_SUCCESS;
}
static void
interop_xyz12_init(struct vlc_gl_interop *interop)
{
interop->tex_count = 1;
interop->tex_target = GL_TEXTURE_2D;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT
};
}
static int
opengl_interop_init_impl(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma, video_color_space_t yuv_space)
{
bool is_yuv = vlc_fourcc_IsYUV(chroma);
const vlc_chroma_description_t *desc =
vlc_fourcc_GetChromaDescription(chroma);
if (!desc)
return VLC_EGENERIC;
assert(!interop->fmt_out.p_palette);
interop->fmt_out.i_chroma = chroma;
interop->fmt_out.space = yuv_space;
interop->tex_target = tex_target;
if (chroma == VLC_CODEC_XYZ12)
{
interop_xyz12_init(interop);
return VLC_SUCCESS;
}
if (is_yuv)
return interop_yuv_base_init(interop, tex_target, chroma, desc);
return interop_rgb_base_init(interop, tex_target, chroma);
}
struct vlc_gl_interop *
vlc_gl_interop_New(struct vlc_gl_t *gl, vlc_video_context *context,
const video_format_t *fmt)
......@@ -378,7 +158,7 @@ vlc_gl_interop_New(struct vlc_gl_t *gl, vlc_video_context *context,
struct vlc_gl_interop *interop = &priv->interop;
interop->init = opengl_interop_init_impl;
interop->get_tex_format_size = GetTexFormatSize;
interop->ops = NULL;
interop->fmt_out = interop->fmt_in = *fmt;
interop->gl = gl;
......@@ -399,8 +179,6 @@ vlc_gl_interop_New(struct vlc_gl_t *gl, vlc_video_context *context,
OPENGL_VTABLE_F(LOAD_SYMBOL);
#undef LOAD_SYMBOL
vlc_gl_LoadExtensionFunctions(interop->gl, &priv->extension_vt);
if (desc->plane_count == 0)
{
/* Opaque chroma: load a module to handle it */
......@@ -433,7 +211,6 @@ vlc_gl_interop_NewForSubpictures(struct vlc_gl_t *gl)
return NULL;
struct vlc_gl_interop *interop = &priv->interop;
interop->init = opengl_interop_init_impl;
interop->ops = NULL;
interop->gl = gl;
......
......@@ -48,11 +48,4 @@ void
vlc_gl_interop_DeleteTextures(const struct vlc_gl_interop *interop,
GLuint *textures);
static inline int
opengl_interop_init(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma, video_color_space_t yuv_space)
{
return interop->init(interop, tex_target, chroma, yuv_space);
}
#endif
......@@ -240,15 +240,18 @@ Open(vlc_object_t *obj)
};
interop->ops = &ops;
int ret = opengl_interop_init(interop, GL_TEXTURE_EXTERNAL_OES,
VLC_CODEC_RGB32,
COLOR_SPACE_UNDEF);
if (ret != VLC_SUCCESS)
{
free(priv);
return VLC_EGENERIC;
}
interop->tex_target = GL_TEXTURE_EXTERNAL_OES;
interop->fmt_out.i_chroma = VLC_CODEC_RGB32;
interop->fmt_out.space = COLOR_SPACE_UNDEF;
interop->tex_count = 1;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RGBA,
.format = GL_RGBA,
.type = GL_UNSIGNED_BYTE,
};
return VLC_SUCCESS;
}
......
......@@ -24,6 +24,7 @@
#include <vlc_common.h>
#include <vlc_plugin.h>
#include "gl_util.h"
#include "interop.h"
#include "../../codec/vt_utils.h"
......@@ -234,7 +235,18 @@ Open(vlc_object_t *obj)
}
#endif
int ret;
struct vlc_gl_extension_vt extension_vt;
vlc_gl_LoadExtensionFunctions(interop->gl, &extension_vt);
/* RG textures are available natively since OpenGL 3.0 and OpenGL ES 3.0 */
bool has_texture_rg = vlc_gl_GetVersionMajor(&extension_vt) >= 3
|| (interop->gl->api_type == VLC_OPENGL
&& vlc_gl_HasExtension(&extension_vt, "GL_ARB_texture_rg"))
|| (interop->gl->api_type == VLC_OPENGL_ES2
&& vlc_gl_HasExtension(&extension_vt, "GL_EXT_texture_rg"));
interop->tex_target = tex_target;
switch (interop->fmt_in.i_chroma)
{
case VLC_CODEC_CVPX_UYVY:
......@@ -244,53 +256,108 @@ Open(vlc_object_t *obj)
* and red color channels, respectively. cf. APPLE_rgb_422 khronos
* extension. */
ret = opengl_interop_init(interop, tex_target, VLC_CODEC_VYUY,
interop->fmt_in.space);
if (ret != VLC_SUCCESS)
goto error;
interop->fmt_out.i_chroma = VLC_CODEC_VYUY;
interop->fmt_out.space = interop->fmt_in.space;
interop->tex_count = 1;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RGB,
.format = GL_RGB_422_APPLE,
.type = GL_UNSIGNED_SHORT_8_8_APPLE,
};
interop->texs[0].internal = GL_RGB;
interop->texs[0].format = GL_RGB_422_APPLE;
interop->texs[0].type = GL_UNSIGNED_SHORT_8_8_APPLE;
interop->texs[0].w = interop->texs[0].h = (vlc_rational_t) { 1, 1 };
break;
case VLC_CODEC_CVPX_NV12:
{
ret = opengl_interop_init(interop, tex_target, VLC_CODEC_NV12,
interop->fmt_in.space);
if (ret != VLC_SUCCESS)
goto error;
interop->fmt_out.i_chroma = VLC_CODEC_NV12;
interop->fmt_out.space = interop->fmt_in.space;
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = has_texture_rg ? GL_RED : GL_LUMINANCE,
.format = has_texture_rg ? GL_RED : GL_LUMINANCE,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
.w = {1, 2},
.h = {1, 2},
.internal = has_texture_rg ? GL_RG : GL_LUMINANCE_ALPHA,
.format = has_texture_rg ? GL_RG : GL_LUMINANCE_ALPHA,
.type = GL_UNSIGNED_BYTE,
};
break;
}
case VLC_CODEC_CVPX_P010:
{
ret = opengl_interop_init(interop, tex_target, VLC_CODEC_P010,
interop->fmt_in.space);
if (ret != VLC_SUCCESS)
if (!has_texture_rg
|| vlc_gl_interop_GetTexFormatSize(interop, tex_target, GL_RG,
GL_RG16, GL_UNSIGNED_SHORT) != 16)
goto error;
interop->fmt_out.i_chroma = VLC_CODEC_P010;
interop->fmt_out.space = interop->fmt_in.space;
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_R16,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 2},
.internal = GL_RG16,
.format = GL_RG,
.type = GL_UNSIGNED_BYTE,
};
break;
}
case VLC_CODEC_CVPX_I420:
ret = opengl_interop_init(interop, tex_target, VLC_CODEC_I420,
interop->fmt_in.space);
if (ret != VLC_SUCCESS)
goto error;
interop->fmt_out.i_chroma = VLC_CODEC_I420;
interop->fmt_out.space = interop->fmt_in.space;
interop->tex_count = 3;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = has_texture_rg ? GL_RED : GL_LUMINANCE,
.format = has_texture_rg ? GL_RED : GL_LUMINANCE,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = interop->texs[2] = (struct vlc_gl_tex_cfg) {
.w = {1, 2},
.h = {1, 2},
.internal = has_texture_rg ? GL_RED : GL_LUMINANCE,
.format = has_texture_rg ? GL_RED : GL_LUMINANCE,
.type = GL_UNSIGNED_BYTE,
};
break;
case VLC_CODEC_CVPX_BGRA:
ret = opengl_interop_init(interop, tex_target, VLC_CODEC_RGB32,
COLOR_SPACE_UNDEF);
if (ret != VLC_SUCCESS)
goto error;
interop->texs[0].internal = GL_RGBA;
interop->texs[0].format = GL_BGRA;
interop->fmt_out.i_chroma = VLC_CODEC_RGB32;
interop->fmt_out.space = COLOR_SPACE_UNDEF;
interop->tex_count = 1;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RGBA,
.format = GL_BGRA,
#if TARGET_OS_IPHONE
interop->texs[0].type = GL_UNSIGNED_BYTE;
.type = GL_UNSIGNED_BYTE,
#else
interop->texs[0].type = GL_UNSIGNED_INT_8_8_8_8_REV;
.type = GL_UNSIGNED_INT_8_8_8_8_REV,
#endif
};
break;
default:
vlc_assert_unreachable();
......
......@@ -530,10 +530,18 @@ GLConvOpen(vlc_object_t *obj)
/* The pictures are uploaded upside-down */
video_format_TransformBy(&interop->fmt_out, TRANSFORM_VFLIP);
int ret = opengl_interop_init(interop, GL_TEXTURE_2D, VLC_CODEC_RGB32,
COLOR_SPACE_UNDEF);
if (ret != VLC_SUCCESS)
goto error;
interop->tex_target = GL_TEXTURE_2D;
interop->fmt_out.i_chroma = VLC_CODEC_RGB32;
interop->fmt_out.space = COLOR_SPACE_UNDEF;
interop->tex_count = 1;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RGBA,
.format = GL_RGBA,
.type = GL_UNSIGNED_BYTE,
};
return VLC_SUCCESS;
......
......@@ -41,6 +41,7 @@ typedef struct
struct priv
{
bool has_texture_rg;
bool has_unpack_subimage;
void * texture_temp_buf;
size_t texture_temp_buf_size;
......@@ -336,6 +337,222 @@ tc_common_update(const struct vlc_gl_interop *interop, uint32_t textures[],
return ret;
}
static inline void
DivideRationalByTwo(vlc_rational_t *r) {
if (r->num % 2 == 0)
r->num /= 2;
else
r->den *= 2;
}
static int
interop_yuv_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma, const vlc_chroma_description_t *desc)
{
struct priv *priv = interop->priv;
(void) chroma;
GLint oneplane_texfmt, oneplane16_texfmt,
twoplanes_texfmt, twoplanes16_texfmt;
if (priv->has_texture_rg)
{
oneplane_texfmt = GL_RED;
oneplane16_texfmt = GL_R16;
twoplanes_texfmt = GL_RG;
twoplanes16_texfmt = GL_RG16;
}
else
{
oneplane_texfmt = GL_LUMINANCE;
oneplane16_texfmt = GL_LUMINANCE16;
twoplanes_texfmt = GL_LUMINANCE_ALPHA;
twoplanes16_texfmt = 0;
}
if (desc->pixel_size == 2)
{
if (vlc_gl_interop_GetTexFormatSize(interop, tex_target, oneplane_texfmt,
oneplane16_texfmt, GL_UNSIGNED_SHORT) != 16)
return VLC_EGENERIC;
}
if (desc->plane_count == 3)
{
GLint internal = 0;
GLenum type = 0;
if (desc->pixel_size == 1)
{
internal = oneplane_texfmt;
type = GL_UNSIGNED_BYTE;
}
else if (desc->pixel_size == 2)
{
internal = oneplane16_texfmt;
type = GL_UNSIGNED_SHORT;
}
else
return VLC_EGENERIC;
assert(internal != 0 && type != 0);
interop->tex_count = 3;
for (unsigned i = 0; i < interop->tex_count; ++i )
{
interop->texs[i] = (struct vlc_gl_tex_cfg) {
{ desc->p[i].w.num, desc->p[i].w.den },
{ desc->p[i].h.num, desc->p[i].h.den },
internal, oneplane_texfmt, type
};
}
}
else if (desc->plane_count == 2)
{
interop->tex_count = 2;
if (desc->pixel_size == 1)
{
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ desc->p[0].w.num, desc->p[0].w.den },
{ desc->p[0].h.num, desc->p[0].h.den },
oneplane_texfmt, oneplane_texfmt, GL_UNSIGNED_BYTE
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
{ desc->p[1].w.num, desc->p[1].w.den },
{ desc->p[1].h.num, desc->p[1].h.den },
twoplanes_texfmt, twoplanes_texfmt, GL_UNSIGNED_BYTE
};
}
else if (desc->pixel_size == 2)
{
if (twoplanes16_texfmt == 0
|| vlc_gl_interop_GetTexFormatSize(interop, tex_target, twoplanes_texfmt,
twoplanes16_texfmt, GL_UNSIGNED_SHORT) != 16)
return VLC_EGENERIC;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ desc->p[0].w.num, desc->p[0].w.den },
{ desc->p[0].h.num, desc->p[0].h.den },
oneplane16_texfmt, oneplane_texfmt, GL_UNSIGNED_SHORT
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
{ desc->p[1].w.num, desc->p[1].w.den },
{ desc->p[1].h.num, desc->p[1].h.den },
twoplanes16_texfmt, twoplanes_texfmt, GL_UNSIGNED_SHORT
};
}
else
return VLC_EGENERIC;
/*
* If plane_count == 2, then the chroma is semiplanar: the U and V
* planes are packed in the second plane. As a consequence, the
* horizontal scaling, as reported in the vlc_chroma_description_t, is
* doubled.
*
* But once imported as an OpenGL texture, both components are stored
* in a single texel (the two first components of the vec4).
* Therefore, from OpenGL, the width is not doubled, so the horizontal
* scaling must be divided by 2 to compensate.
*/
DivideRationalByTwo(&interop->texs[1].w);
}
else if (desc->plane_count == 1)
{
/* Only YUV 4:2:2 formats */
/* The pictures have only 1 plane, but it is uploaded twice, once to
* access the Y components, once to access the UV components. See
* #26712. */
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 },
twoplanes_texfmt, twoplanes_texfmt, GL_UNSIGNED_BYTE
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
{ 1, 2 }, { 1, 1 },
GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
};
}
else
return VLC_EGENERIC;
return VLC_SUCCESS;
}
static int
interop_rgb_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma)
{
(void) tex_target;
switch (chroma)
{
case VLC_CODEC_RGB24:
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE
};
break;
case VLC_CODEC_RGB32:
case VLC_CODEC_RGBA:
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE
};
break;
case VLC_CODEC_BGRA: {
if (vlc_gl_interop_GetTexFormatSize(interop, tex_target, GL_BGRA, GL_RGBA,
GL_UNSIGNED_BYTE) != 32)
return VLC_EGENERIC;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE
};
break;
}
default:
return VLC_EGENERIC;
}
interop->tex_count = 1;
return VLC_SUCCESS;
}
static void
interop_xyz12_init(struct vlc_gl_interop *interop)
{
interop->tex_count = 1;
interop->tex_target = GL_TEXTURE_2D;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
{ 1, 1 }, { 1, 1 }, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT
};
}
static int
opengl_interop_init(struct vlc_gl_interop *interop, GLenum tex_target,
vlc_fourcc_t chroma, video_color_space_t yuv_space)
{
bool is_yuv = vlc_fourcc_IsYUV(chroma);
const vlc_chroma_description_t *desc =
vlc_fourcc_GetChromaDescription(chroma);
if (!desc)
return VLC_EGENERIC;
assert(!interop->fmt_out.p_palette);
interop->fmt_out.i_chroma = chroma;
interop->fmt_out.space = yuv_space;
interop->tex_target = tex_target;
if (chroma == VLC_CODEC_XYZ12)
{
interop_xyz12_init(interop);
return VLC_SUCCESS;
}
if (is_yuv)
return interop_yuv_base_init(interop, tex_target, chroma, desc);
return interop_rgb_base_init(interop, tex_target, chroma);
}
void
opengl_interop_generic_deinit(struct vlc_gl_interop *interop)
{
......@@ -354,12 +571,28 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
if (unlikely(priv == NULL))
return VLC_ENOMEM;
interop->priv = priv;
#define LOAD_SYMBOL(type, name) \
priv->gl.name = vlc_gl_GetProcAddress(interop->gl, "gl" # name); \
assert(priv->gl.name != NULL);
OPENGL_VTABLE_F(LOAD_SYMBOL);
struct vlc_gl_extension_vt extension_vt;
vlc_gl_LoadExtensionFunctions(interop->gl, &extension_vt);
/* OpenGL or OpenGL ES2 with GL_EXT_unpack_subimage ext */
priv->has_unpack_subimage = interop->gl->api_type == VLC_OPENGL
|| vlc_gl_HasExtension(&extension_vt, "GL_EXT_unpack_subimage");
/* RG textures are available natively since OpenGL 3.0 and OpenGL ES 3.0 */
priv->has_texture_rg = vlc_gl_GetVersionMajor(&extension_vt) >= 3
|| (interop->gl->api_type == VLC_OPENGL
&& vlc_gl_HasExtension(&extension_vt, "GL_ARB_texture_rg"))
|| (interop->gl->api_type == VLC_OPENGL_ES2
&& vlc_gl_HasExtension(&extension_vt, "GL_EXT_texture_rg"));
video_color_space_t space;
const vlc_fourcc_t *list;
......@@ -368,7 +601,7 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
GLint max_texture_units = 0;
priv->gl.GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units);
if (max_texture_units < 3)
return VLC_EGENERIC;
goto error;
list = vlc_fourcc_GetYUVFallback(interop->fmt_in.i_chroma);
space = interop->fmt_in.space;
......@@ -406,7 +639,7 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
list++;
}
return VLC_EGENERIC;
goto error;
interop_init:
/* We found a chroma with matching parameters for OpenGL. The interop can
......@@ -432,17 +665,9 @@ interop_init:
.update_textures = tc_common_update,
.close = opengl_interop_generic_deinit,
};
interop->priv = priv;
interop->ops = &ops;
interop->fmt_in.i_chroma = i_chroma;
struct vlc_gl_extension_vt extension_vt;
vlc_gl_LoadExtensionFunctions(interop->gl, &extension_vt);
/* OpenGL or OpenGL ES2 with GL_EXT_unpack_subimage ext */
priv->has_unpack_subimage = interop->gl->api_type == VLC_OPENGL
|| vlc_gl_HasExtension(&extension_vt, "GL_EXT_unpack_subimage");
if (allow_dr && priv->has_unpack_subimage)
{
/* Ensure we do direct rendering / PBO with OpenGL 3.0 or higher. */
......@@ -468,4 +693,9 @@ interop_init:
}
return VLC_SUCCESS;
error:
free(priv);
interop->priv = NULL;
return VLC_EGENERIC;
}
......@@ -464,10 +464,48 @@ Open(vlc_object_t *obj)
case VLC_CODEC_VAAPI_420:
va_fourcc = VA_FOURCC_NV12;
vlc_sw_chroma = VLC_CODEC_NV12;
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RED,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
.w = {1, 2},
.h = {1, 2},
.internal = GL_RG,
.format = GL_RG,
.type = GL_UNSIGNED_BYTE,
};
break;
case VLC_CODEC_VAAPI_420_10BPP:
va_fourcc = VA_FOURCC_P010;
vlc_sw_chroma = VLC_CODEC_P010;
if (vlc_gl_interop_GetTexFormatSize(interop, GL_TEXTURE_2D, GL_RG,
GL_RG16, GL_UNSIGNED_SHORT) != 16)
goto error;
interop->tex_count = 2;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_R16,
.format = GL_RED,
.type = GL_UNSIGNED_BYTE,
};
interop->texs[1] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 2},
.internal = GL_RG16,
.format = GL_RG,
.type = GL_UNSIGNED_BYTE,
};
break;
default:
vlc_assert_unreachable();
......@@ -525,10 +563,9 @@ Open(vlc_object_t *obj)
/* The pictures are uploaded upside-down */
video_format_TransformBy(&interop->fmt_out, TRANSFORM_VFLIP);
int ret = opengl_interop_init(interop, GL_TEXTURE_2D, vlc_sw_chroma,
interop->fmt_in.space);
if (ret != VLC_SUCCESS)
goto error;
interop->tex_target = GL_TEXTURE_2D;
interop->fmt_out.i_chroma = vlc_sw_chroma;
interop->fmt_out.space = interop->fmt_in.space;
static const struct vlc_gl_interop_ops ops = {
.update_textures = tc_vaegl_update,
......
......@@ -191,13 +191,18 @@ Open(vlc_object_t *obj)
/* The pictures are uploaded upside-down */
video_format_TransformBy(&interop->fmt_out, TRANSFORM_VFLIP);
int ret = opengl_interop_init(interop, GL_TEXTURE_2D, VLC_CODEC_RGB32,
COLOR_SPACE_UNDEF);
if (ret != VLC_SUCCESS)
{
Close(interop);
return VLC_EGENERIC;
}
interop->tex_target = GL_TEXTURE_2D;
interop->fmt_out.i_chroma = VLC_CODEC_RGB32;
interop->fmt_out.space = COLOR_SPACE_UNDEF;
interop->tex_count = 1;
interop->texs[0] = (struct vlc_gl_tex_cfg) {
.w = {1, 1},
.h = {1, 1},
.internal = GL_RGBA,
.format = GL_RGBA,
.type = GL_UNSIGNED_BYTE,
};
static const struct vlc_gl_interop_ops ops = {
.update_textures = tc_vdpau_gl_update,
......
......@@ -43,6 +43,8 @@ struct vlc_gl_format {
GLsizei visible_widths[PICTURE_PLANE_MAX];
GLsizei visible_heights[PICTURE_PLANE_MAX];
uint32_t formats[PICTURE_PLANE_MAX];
};
/**
......
......@@ -423,20 +423,12 @@ opengl_init_swizzle(struct vlc_gl_sampler *sampler,
vlc_fourcc_t chroma,
const vlc_chroma_description_t *desc)
{
struct vlc_gl_sampler_priv *priv = PRIV(sampler);
GLint oneplane_texfmt;
if (vlc_gl_HasExtension(&priv->extension_vt, "GL_ARB_texture_rg"))
oneplane_texfmt = GL_RED;
else
oneplane_texfmt = GL_LUMINANCE;
if (desc->plane_count == 3)
swizzle_per_tex[0] = swizzle_per_tex[1] = swizzle_per_tex[2] = "r";
else if (desc->plane_count == 2)
{
swizzle_per_tex[0] = "r";
if (oneplane_texfmt == GL_RED)
if (sampler->glfmt.formats[1] == GL_RG)
swizzle_per_tex[1] = "rg";
else
swizzle_per_tex[1] = "ra";
......