1
/*****************************************************************************
2
* dynamicoverlay_list.h : dynamic overlay list
3
*****************************************************************************
4
* Copyright (C) 2008 the VideoLAN team
7
* Author: Søren Bøg <avacore@videolan.org>
8
* Jean-Paul Saman <jpsaman@videolan.org>
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; either version 2 of the License, or
13
* (at your option) any later version.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23
*****************************************************************************/
29
#include <vlc_common.h>
33
#include "dynamicoverlay.h"
35
/*****************************************************************************
36
* list_t: Command queue
37
*****************************************************************************/
39
int ListInit( list_t *p_list )
41
p_list->pp_head = malloc( 16 * sizeof( overlay_t * ) );
42
if( p_list->pp_head == NULL )
45
p_list->pp_tail = p_list->pp_head + 16;
46
memset( p_list->pp_head, 0, 16 * sizeof( overlay_t * ) );
51
int ListDestroy( list_t *p_list )
53
for( overlay_t **pp_cur = p_list->pp_head;
54
pp_cur < p_list->pp_tail;
59
OverlayDestroy( *pp_cur );
63
free( p_list->pp_head );
68
ssize_t ListAdd( list_t *p_list, overlay_t *p_new )
70
/* Find an available slot */
71
for( overlay_t **pp_cur = p_list->pp_head;
72
pp_cur < p_list->pp_tail;
78
return pp_cur - p_list->pp_head;
83
size_t i_size = p_list->pp_tail - p_list->pp_head;
84
size_t i_newsize = i_size * 2;
85
p_list->pp_head = realloc( p_list->pp_head,
86
i_newsize * sizeof( overlay_t * ) );
87
if( p_list->pp_head == NULL )
90
p_list->pp_tail = p_list->pp_head + i_newsize;
91
memset( p_list->pp_head + i_size, 0, i_size * sizeof( overlay_t * ) );
92
p_list->pp_head[i_size] = p_new;
96
int ListRemove( list_t *p_list, size_t i_idx )
100
if( ( i_idx >= (size_t)( p_list->pp_tail - p_list->pp_head ) ) ||
101
( p_list->pp_head[i_idx] == NULL ) )
106
ret = OverlayDestroy( p_list->pp_head[i_idx] );
107
free( p_list->pp_head[i_idx] );
108
p_list->pp_head[i_idx] = NULL;
113
overlay_t *ListGet( list_t *p_list, size_t i_idx )
115
if( ( i_idx >= (size_t)( p_list->pp_tail - p_list->pp_head ) ) ||
116
( p_list->pp_head[i_idx] == NULL ) )
120
return p_list->pp_head[i_idx];
123
overlay_t *ListWalk( list_t *p_list )
125
static overlay_t **pp_cur = NULL;
128
pp_cur = p_list->pp_head;
132
for( ; pp_cur < p_list->pp_tail; ++pp_cur )
134
if( ( *pp_cur != NULL ) &&
135
( (*pp_cur)->b_active == true )&&
136
( (*pp_cur)->format.i_chroma != VLC_FOURCC( '\0','\0','\0','\0') ) )