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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * stream_memory.c: stream_t wrapper around memory buffer
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2008 the VideoLAN team
  5.  * $Id: 8cd3c43725ff27bc2fdc1e7aff810e8f0038678e $
  6.  *
  7.  * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #ifdef HAVE_CONFIG_H
  24. # include "config.h"
  25. #endif
  26. #include "stream.h"
  27. struct stream_sys_t
  28. {
  29.     bool  i_preserve_memory;
  30.     int64_t     i_pos;      /* Current reading offset */
  31.     int64_t     i_size;
  32.     uint8_t    *p_buffer;
  33. };
  34. static int  Read   ( stream_t *, void *p_read, unsigned int i_read );
  35. static int  Peek   ( stream_t *, const uint8_t **pp_peek, unsigned int i_read );
  36. static int  Control( stream_t *, int i_query, va_list );
  37. static void Delete ( stream_t * );
  38. /**
  39.  * Create a stream from a memory buffer
  40.  *
  41.  * param p_this the calling vlc_object
  42.  * param p_buffer the memory buffer for the stream
  43.  * param i_buffer the size of the buffer
  44.  * param i_preserve_memory if this is set to false the memory buffer
  45.  *        pointed to by p_buffer is freed on stream_Destroy
  46.  */
  47. stream_t *__stream_MemoryNew( vlc_object_t *p_this, uint8_t *p_buffer,
  48.                               int64_t i_size, bool i_preserve_memory )
  49. {
  50.     stream_t *s = stream_CommonNew( p_this );
  51.     stream_sys_t *p_sys;
  52.     if( !s )
  53.         return NULL;
  54.     s->psz_path = strdup( "" ); /* N/A */
  55.     s->p_sys = p_sys = malloc( sizeof( stream_sys_t ) );
  56.     if( !s->psz_path || !s->p_sys )
  57.     {
  58.         stream_CommonDelete( s );
  59.         return NULL;
  60.     }
  61.     p_sys->i_pos = 0;
  62.     p_sys->i_size = i_size;
  63.     p_sys->p_buffer = p_buffer;
  64.     p_sys->i_preserve_memory = i_preserve_memory;
  65.     s->pf_read    = Read;
  66.     s->pf_peek    = Peek;
  67.     s->pf_control = Control;
  68.     s->pf_destroy = Delete;
  69.     vlc_object_attach( s, p_this );
  70.     return s;
  71. }
  72. static void Delete( stream_t *s )
  73. {
  74.     if( !s->p_sys->i_preserve_memory ) free( s->p_sys->p_buffer );
  75.     free( s->p_sys );
  76.     vlc_object_detach( s );
  77.     stream_CommonDelete( s );
  78. }
  79. /****************************************************************************
  80.  * AStreamControl:
  81.  ****************************************************************************/
  82. static int Control( stream_t *s, int i_query, va_list args )
  83. {
  84.     stream_sys_t *p_sys = s->p_sys;
  85.     bool *p_bool;
  86.     int64_t    *pi_64, i_64;
  87.     int        i_int;
  88.     switch( i_query )
  89.     {
  90.         case STREAM_GET_SIZE:
  91.             pi_64 = (int64_t*)va_arg( args, int64_t * );
  92.             *pi_64 = p_sys->i_size;
  93.             break;
  94.         case STREAM_CAN_SEEK:
  95.             p_bool = (bool*)va_arg( args, bool * );
  96.             *p_bool = true;
  97.             break;
  98.         case STREAM_CAN_FASTSEEK:
  99.             p_bool = (bool*)va_arg( args, bool * );
  100.             *p_bool = true;
  101.             break;
  102.         case STREAM_GET_POSITION:
  103.             pi_64 = (int64_t*)va_arg( args, int64_t * );
  104.             *pi_64 = p_sys->i_pos;
  105.             break;
  106.         case STREAM_SET_POSITION:
  107.             i_64 = (int64_t)va_arg( args, int64_t );
  108.             i_64 = __MAX( i_64, 0 );
  109.             i_64 = __MIN( i_64, s->p_sys->i_size );
  110.             p_sys->i_pos = i_64;
  111.             break;
  112.         case STREAM_GET_CONTENT_TYPE:
  113.             return VLC_EGENERIC;
  114.         case STREAM_CONTROL_ACCESS:
  115.             i_int = (int) va_arg( args, int );
  116.             msg_Err( s, "Hey, what are you thinking ?"
  117.                      "DON'T USE STREAM_CONTROL_ACCESS !!!" );
  118.             return VLC_EGENERIC;
  119.         default:
  120.             msg_Err( s, "invalid stream_vaControl query=0x%x", i_query );
  121.             return VLC_EGENERIC;
  122.     }
  123.     return VLC_SUCCESS;
  124. }
  125. static int Read( stream_t *s, void *p_read, unsigned int i_read )
  126. {
  127.     stream_sys_t *p_sys = s->p_sys;
  128.     int i_res = __MIN( i_read, p_sys->i_size - p_sys->i_pos );
  129.     memcpy( p_read, p_sys->p_buffer + p_sys->i_pos, i_res );
  130.     p_sys->i_pos += i_res;
  131.     return i_res;
  132. }
  133. static int Peek( stream_t *s, const uint8_t **pp_peek, unsigned int i_read )
  134. {
  135.     stream_sys_t *p_sys = s->p_sys;
  136.     int i_res = __MIN( i_read, p_sys->i_size - p_sys->i_pos );
  137.     *pp_peek = p_sys->p_buffer + p_sys->i_pos;
  138.     return i_res;
  139. }