mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-01-14 03:23:37 +00:00
StreamClipItem: use base class refcounting
PipeItem already implements refcounting. Use it.
This commit is contained in:
parent
889a0b880f
commit
e09598ec75
10
server/dcc.c
10
server/dcc.c
@ -497,7 +497,7 @@ void dcc_stop(DisplayChannelClient *dcc)
|
||||
|
||||
void dcc_stream_agent_clip(DisplayChannelClient* dcc, StreamAgent *agent)
|
||||
{
|
||||
StreamClipItem *item = stream_clip_item_new(dcc, agent);
|
||||
StreamClipItem *item = stream_clip_item_new(agent);
|
||||
int n_rects;
|
||||
|
||||
item->clip_type = SPICE_CLIP_TYPE_RECTS;
|
||||
@ -1601,10 +1601,8 @@ static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item)
|
||||
switch (item->type) {
|
||||
case PIPE_ITEM_TYPE_DRAW:
|
||||
case PIPE_ITEM_TYPE_IMAGE:
|
||||
pipe_item_unref(item);
|
||||
break;
|
||||
case PIPE_ITEM_TYPE_STREAM_CLIP:
|
||||
stream_clip_item_unref(dcc, (StreamClipItem *)item);
|
||||
pipe_item_unref(item);
|
||||
break;
|
||||
case PIPE_ITEM_TYPE_UPGRADE:
|
||||
upgrade_item_unref(display, (UpgradeItem *)item);
|
||||
@ -1645,14 +1643,12 @@ static void release_item_before_push(DisplayChannelClient *dcc, PipeItem *item)
|
||||
stream_agent_unref(display, agent);
|
||||
break;
|
||||
}
|
||||
case PIPE_ITEM_TYPE_STREAM_CLIP:
|
||||
stream_clip_item_unref(dcc, (StreamClipItem *)item);
|
||||
break;
|
||||
case PIPE_ITEM_TYPE_STREAM_DESTROY: {
|
||||
StreamAgent *agent = SPICE_CONTAINEROF(item, StreamAgent, destroy_item);
|
||||
stream_agent_unref(display, agent);
|
||||
break;
|
||||
}
|
||||
case PIPE_ITEM_TYPE_STREAM_CLIP:
|
||||
case PIPE_ITEM_TYPE_UPGRADE:
|
||||
upgrade_item_unref(display, (UpgradeItem *)item);
|
||||
break;
|
||||
|
||||
@ -1972,10 +1972,8 @@ static void hold_item(RedChannelClient *rcc, PipeItem *item)
|
||||
switch (item->type) {
|
||||
case PIPE_ITEM_TYPE_DRAW:
|
||||
case PIPE_ITEM_TYPE_IMAGE:
|
||||
pipe_item_ref(item);
|
||||
break;
|
||||
case PIPE_ITEM_TYPE_STREAM_CLIP:
|
||||
((StreamClipItem *)item)->refs++;
|
||||
pipe_item_ref(item);
|
||||
break;
|
||||
case PIPE_ITEM_TYPE_UPGRADE:
|
||||
((UpgradeItem *)item)->refs++;
|
||||
|
||||
@ -133,29 +133,29 @@ void stream_agent_unref(DisplayChannel *display, StreamAgent *agent)
|
||||
stream_unref(display, agent->stream);
|
||||
}
|
||||
|
||||
StreamClipItem *stream_clip_item_new(DisplayChannelClient* dcc, StreamAgent *agent)
|
||||
void stream_clip_item_free(StreamClipItem *item)
|
||||
{
|
||||
StreamClipItem *item = spice_new(StreamClipItem, 1);
|
||||
pipe_item_init((PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP);
|
||||
g_return_if_fail(item != NULL);
|
||||
DisplayChannel *display = DCC_TO_DC(item->stream_agent->dcc);
|
||||
|
||||
item->stream_agent = agent;
|
||||
agent->stream->refs++;
|
||||
item->refs = 1;
|
||||
return item;
|
||||
}
|
||||
|
||||
void stream_clip_item_unref(DisplayChannelClient *dcc, StreamClipItem *item)
|
||||
{
|
||||
DisplayChannel *display = DCC_TO_DC(dcc);
|
||||
|
||||
if (--item->refs != 0)
|
||||
return;
|
||||
g_return_if_fail(item->base.refcount == 0);
|
||||
|
||||
stream_agent_unref(display, item->stream_agent);
|
||||
free(item->rects);
|
||||
free(item);
|
||||
}
|
||||
|
||||
StreamClipItem *stream_clip_item_new(StreamAgent *agent)
|
||||
{
|
||||
StreamClipItem *item = spice_new(StreamClipItem, 1);
|
||||
pipe_item_init_full((PipeItem *)item, PIPE_ITEM_TYPE_STREAM_CLIP,
|
||||
(GDestroyNotify)stream_clip_item_free);
|
||||
|
||||
item->stream_agent = agent;
|
||||
agent->stream->refs++;
|
||||
return item;
|
||||
}
|
||||
|
||||
static int is_stream_start(Drawable *drawable)
|
||||
{
|
||||
return ((drawable->frames_count >= RED_STREAM_FRAMES_START_CONDITION) &&
|
||||
|
||||
@ -101,16 +101,12 @@ typedef struct StreamAgent {
|
||||
|
||||
typedef struct StreamClipItem {
|
||||
PipeItem base;
|
||||
int refs;
|
||||
StreamAgent *stream_agent;
|
||||
int clip_type;
|
||||
SpiceClipRects *rects;
|
||||
} StreamClipItem;
|
||||
|
||||
StreamClipItem * stream_clip_item_new (DisplayChannelClient* dcc,
|
||||
StreamAgent *agent);
|
||||
void stream_clip_item_unref (DisplayChannelClient *dcc,
|
||||
StreamClipItem *item);
|
||||
StreamClipItem * stream_clip_item_new (StreamAgent *agent);
|
||||
|
||||
typedef struct ItemTrace {
|
||||
red_time_t time;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user