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
  • shocknovaa/vlc
  • gremlinflat/vlc
  • Pratham24D/vlc
411 results
Show changes
Commits on Source (4)
......@@ -229,6 +229,8 @@ static bool picture_InitPrivate(const video_format_t *restrict p_fmt,
else
priv->gc.destroy = picture_DestroyDummy;
priv->pool = NULL;
vlc_ancillary_array_Init(&priv->ancillaries);
return true;
......
......@@ -22,6 +22,7 @@
#include <stddef.h>
#include <vlc_picture.h>
#include <vlc_list.h>
struct vlc_ancillary;
typedef struct
......@@ -33,6 +34,9 @@ typedef struct
void *opaque;
} gc;
void *pool; /* Only used by picture_pool.c */
struct vlc_list pool_node; /* Only used by picture_pool.c */
/** Private ancillary struct. Don't use it directly, but use it via
* picture_AttachAncillary() and picture_GetAncillary(). */
struct vlc_ancillary **ancillaries;
......
......@@ -35,20 +35,18 @@
#include <vlc_threads.h>
#include <vlc_picture_pool.h>
#include <vlc_atomic.h>
#include <vlc_list.h>
#include "picture.h"
#define POOL_MAX (CHAR_BIT * sizeof (unsigned long long))
static_assert ((POOL_MAX & (POOL_MAX - 1)) == 0, "Not a power of two");
#define POOL_MAX 256
struct picture_pool_t {
vlc_mutex_t lock;
vlc_cond_t wait;
unsigned long long available;
vlc_atomic_rc_t refs;
unsigned short picture_count;
picture_t *picture[];
struct vlc_list inuse_list;
struct vlc_list available_list;
};
static void picture_pool_Destroy(picture_pool_t *pool)
......@@ -56,29 +54,39 @@ static void picture_pool_Destroy(picture_pool_t *pool)
if (!vlc_atomic_rc_dec(&pool->refs))
return;
aligned_free(pool);
assert(vlc_list_is_empty(&pool->inuse_list));
free(pool);
}
void picture_pool_Release(picture_pool_t *pool)
{
for (unsigned i = 0; i < pool->picture_count; i++)
picture_Release(pool->picture[i]);
picture_priv_t *priv;
vlc_list_foreach(priv, &pool->available_list, pool_node)
{
assert(priv->pool == pool);
priv->pool = NULL;
picture_Release(&priv->picture);
}
picture_pool_Destroy(pool);
}
static void picture_pool_ReleaseClone(picture_t *clone)
{
picture_priv_t *priv = (picture_priv_t *)clone;
uintptr_t sys = (uintptr_t)priv->gc.opaque;
picture_pool_t *pool = (void *)(sys & ~(POOL_MAX - 1));
unsigned offset = sys & (POOL_MAX - 1);
picture_t *picture = pool->picture[offset];
picture_priv_t *priv = container_of(clone, picture_priv_t, picture);
/* Retrieve the original pic that was cloned */
picture_t *original = priv->gc.opaque;
picture_priv_t *original_priv = container_of(original, picture_priv_t, picture);
picture_Release(picture);
picture_pool_t *pool = original_priv->pool;
assert(pool != NULL);
vlc_mutex_lock(&pool->lock);
assert(!(pool->available & (1ULL << offset)));
pool->available |= 1ULL << offset;
vlc_list_remove(&original_priv->pool_node);
vlc_list_append(&original_priv->pool_node, &pool->available_list);
vlc_cond_signal(&pool->wait);
vlc_mutex_unlock(&pool->lock);
......@@ -86,13 +94,10 @@ static void picture_pool_ReleaseClone(picture_t *clone)
}
static picture_t *picture_pool_ClonePicture(picture_pool_t *pool,
unsigned offset)
picture_t *picture)
{
picture_t *picture = pool->picture[offset];
uintptr_t sys = ((uintptr_t)pool) + offset;
picture_t *clone = picture_InternalClone(picture, picture_pool_ReleaseClone,
(void*)sys);
picture);
if (clone != NULL) {
assert(!picture_HasChainedPics(clone));
vlc_atomic_rc_inc(&pool->refs);
......@@ -100,28 +105,43 @@ static picture_t *picture_pool_ClonePicture(picture_pool_t *pool,
return clone;
}
picture_pool_t *picture_pool_New(unsigned count, picture_t *const *tab)
static void picture_pool_AppendPic(picture_pool_t *pool, picture_t *pic)
{
if (unlikely(count > POOL_MAX))
return NULL;
picture_priv_t *priv = container_of(pic, picture_priv_t, picture);
assert(priv->pool == NULL);
vlc_list_append(&priv->pool_node, &pool->available_list);
priv->pool = pool;
}
picture_pool_t *pool;
size_t size = sizeof (*pool) + count * sizeof (picture_t *);
static picture_pool_t *
picture_pool_NewCommon(void)
{
picture_pool_t *pool = malloc(sizeof(*pool));
size += (-size) & (POOL_MAX - 1);
pool = aligned_alloc(POOL_MAX, size);
if (unlikely(pool == NULL))
return NULL;
vlc_list_init(&pool->inuse_list);
vlc_list_init(&pool->available_list);
vlc_mutex_init(&pool->lock);
vlc_cond_init(&pool->wait);
if (count == POOL_MAX)
pool->available = ~0ULL;
else
pool->available = (1ULL << count) - 1;
vlc_atomic_rc_init(&pool->refs);
pool->picture_count = count;
memcpy(pool->picture, tab, count * sizeof (picture_t *));
return pool;
}
picture_pool_t *picture_pool_New(unsigned count, picture_t *const *tab)
{
if (unlikely(count > POOL_MAX))
return NULL;
picture_pool_t *pool = picture_pool_NewCommon();
if (unlikely(pool == NULL))
return NULL;
for (unsigned i = 0; i < count; ++i)
picture_pool_AppendPic(pool, tab[i]);
return pool;
}
......@@ -133,25 +153,37 @@ picture_pool_t *picture_pool_NewFromFormat(const video_format_t *fmt,
if (unlikely(count > POOL_MAX))
return NULL;
picture_t *picture[POOL_MAX];
unsigned i;
picture_pool_t *pool = picture_pool_NewCommon();
if (unlikely(pool == NULL))
return NULL;
for (i = 0; i < count; i++) {
picture[i] = picture_NewFromFormat(fmt);
if (picture[i] == NULL)
goto error;
for (unsigned i = 0; i < count; ++i)
{
picture_t *pic = picture_NewFromFormat(fmt);
if (pic == NULL)
{
picture_pool_Release(pool);
return NULL;
}
picture_pool_AppendPic(pool, pic);
}
picture_pool_t *pool = picture_pool_New(count, picture);
if (!pool)
goto error;
return pool;
}
static picture_t *picture_pool_GetAvailableLocked(picture_pool_t *pool)
{
picture_priv_t *priv = vlc_list_first_entry_or_null(&pool->available_list,
picture_priv_t,
pool_node);
assert(priv != NULL);
error:
while (i > 0)
picture_Release(picture[--i]);
return NULL;
assert(priv->pool == pool);
vlc_list_remove(&priv->pool_node);
vlc_list_append(&priv->pool_node, &pool->inuse_list);
return &priv->picture;
}
picture_t *picture_pool_Get(picture_pool_t *pool)
......@@ -160,17 +192,17 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
vlc_mutex_lock(&pool->lock);
assert(vlc_atomic_rc_get(&pool->refs) > 0);
if (pool->available == 0)
if (vlc_list_is_empty(&pool->available_list))
{
vlc_mutex_unlock(&pool->lock);
return NULL;
}
int i = stdc_trailing_zeros(pool->available);
pool->available &= ~(1ULL << i);
picture_t *pic = picture_pool_GetAvailableLocked(pool);
vlc_mutex_unlock(&pool->lock);
return picture_pool_ClonePicture(pool, i);
return picture_pool_ClonePicture(pool, pic);
}
picture_t *picture_pool_Wait(picture_pool_t *pool)
......@@ -178,12 +210,12 @@ picture_t *picture_pool_Wait(picture_pool_t *pool)
vlc_mutex_lock(&pool->lock);
assert(vlc_atomic_rc_get(&pool->refs) > 0);
while (pool->available == 0)
while (vlc_list_is_empty(&pool->available_list))
vlc_cond_wait(&pool->wait, &pool->lock);
int i = stdc_trailing_zeros(pool->available);
pool->available &= ~(1ULL << i);
picture_t *pic = picture_pool_GetAvailableLocked(pool);
vlc_mutex_unlock(&pool->lock);
return picture_pool_ClonePicture(pool, i);
return picture_pool_ClonePicture(pool, pic);
}