dynamicoverlay_list.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * dynamicoverlay_list.h : dynamic overlay list
  3.  *****************************************************************************
  4.  * Copyright (C) 2008-2009 the VideoLAN team
  5.  * $Id: 985d3c415fedf04141b9333574e976c069d12b05 $
  6.  *
  7.  * Author: Søren Bøg <avacore@videolan.org>
  8.  *         Jean-Paul Saman <jpsaman@videolan.org>
  9.  *
  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.
  14.  *
  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.
  19.  *
  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.  *****************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include <vlc_common.h>
  28. #include <vlc_osd.h>
  29. #include <fcntl.h>
  30. #include "dynamicoverlay.h"
  31. /*****************************************************************************
  32.  * list_t: Command queue
  33.  *****************************************************************************/
  34. int ListInit( list_t *p_list )
  35. {
  36.     p_list->pp_head = malloc( 16 * sizeof( overlay_t * ) );
  37.     if( p_list->pp_head == NULL )
  38.         return VLC_ENOMEM;
  39.     p_list->pp_tail = p_list->pp_head + 16;
  40.     memset( p_list->pp_head, 0, 16 * sizeof( overlay_t * ) );
  41.     return VLC_SUCCESS;
  42. }
  43. int ListDestroy( list_t *p_list )
  44. {
  45.     for( overlay_t **pp_cur = p_list->pp_head;
  46.          pp_cur < p_list->pp_tail;
  47.          ++pp_cur )
  48.     {
  49.         if( *pp_cur != NULL )
  50.         {
  51.             OverlayDestroy( *pp_cur );
  52.             free( *pp_cur );
  53.         }
  54.     }
  55.     free( p_list->pp_head );
  56.     return VLC_SUCCESS;
  57. }
  58. ssize_t ListAdd( list_t *p_list, overlay_t *p_new )
  59. {
  60.     /* Find an available slot */
  61.     for( overlay_t **pp_cur = p_list->pp_head;
  62.          pp_cur < p_list->pp_tail;
  63.          ++pp_cur )
  64.     {
  65.         if( *pp_cur == NULL )
  66.         {
  67.             *pp_cur = p_new;
  68.             return pp_cur - p_list->pp_head;
  69.         }
  70.     }
  71.     /* Have to expand */
  72.     size_t i_size = p_list->pp_tail - p_list->pp_head;
  73.     size_t i_newsize = i_size * 2;
  74.     p_list->pp_head = realloc( p_list->pp_head,
  75.                                i_newsize * sizeof( overlay_t * ) );
  76.     if( p_list->pp_head == NULL )
  77.         return VLC_ENOMEM;
  78.     p_list->pp_tail = p_list->pp_head + i_newsize;
  79.     memset( p_list->pp_head + i_size, 0, i_size * sizeof( overlay_t * ) );
  80.     p_list->pp_head[i_size] = p_new;
  81.     return i_size;
  82. }
  83. int ListRemove( list_t *p_list, size_t i_idx )
  84. {
  85.     int ret;
  86.     if( ( i_idx >= (size_t)( p_list->pp_tail - p_list->pp_head ) ) ||
  87.         ( p_list->pp_head[i_idx] == NULL ) )
  88.     {
  89.         return VLC_EGENERIC;
  90.     }
  91.     ret = OverlayDestroy( p_list->pp_head[i_idx] );
  92.     free( p_list->pp_head[i_idx] );
  93.     p_list->pp_head[i_idx] = NULL;
  94.     return ret;
  95. }
  96. overlay_t *ListGet( list_t *p_list, size_t i_idx )
  97. {
  98.     if( ( i_idx >= (size_t)( p_list->pp_tail - p_list->pp_head ) ) ||
  99.         ( p_list->pp_head[i_idx] == NULL ) )
  100.     {
  101.         return NULL;
  102.     }
  103.     return p_list->pp_head[i_idx];
  104. }
  105. overlay_t *ListWalk( list_t *p_list )
  106. {
  107.     static overlay_t **pp_cur = NULL;
  108.     if( pp_cur == NULL )
  109.         pp_cur = p_list->pp_head;
  110.     else
  111.         pp_cur = pp_cur + 1;
  112.     for( ; pp_cur < p_list->pp_tail; ++pp_cur )
  113.     {
  114.         if( ( *pp_cur != NULL ) &&
  115.             ( (*pp_cur)->b_active == true )&&
  116.             ( (*pp_cur)->format.i_chroma != VLC_FOURCC( '','','','') ) )
  117.         {
  118.             return *pp_cur;
  119.         }
  120.     }
  121.     pp_cur = NULL;
  122.     return NULL;
  123. }