MPEGring.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SMPEG - SDL MPEG Player Library
  3.     Copyright (C) 1999  Loki Entertainment Software
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. /* A ring-buffer class for multi-threaded applications.
  17.    This assumes a single reader and a single writer, with blocking reads.
  18.  */
  19. #ifndef _MPEGRING_H
  20. #define _MPEGRING_H
  21. #include "SDL_types.h"
  22. #include "SDL_thread.h"
  23. class MPEG_ring {
  24. public:
  25.     /* Create a ring with 'count' buffers, each 'size' bytes long */
  26.     MPEG_ring(Uint32 size, Uint32 count = 16);
  27.     /* Release any waiting threads on the ring so they can be cleaned up.
  28.        The ring isn't valid after this call, so when threads are done you
  29.        should call MPRing_sdelete() on the ring.
  30.      */
  31.     void ReleaseThreads(void);
  32.     /* Destroy a ring after all threads are no longer using it */
  33.     virtual ~MPEG_ring();
  34.     /* Returns the maximum size of each buffer */
  35.     Uint32 BufferSize( void ) {
  36.         return(bufSize);
  37.     }
  38.     /* Returns how many buffers have available data */
  39.     int BuffersWritten(void) {
  40.         return(SDL_SemValue(ring->readwait));
  41.     }
  42.     /* Reserve a buffer for writing in the ring */
  43.     Uint8 *NextWriteBuffer( void );
  44.     /* Release a buffer, written to in the ring */
  45.     void WriteDone( Uint32 len, double timestamp=-1 );
  46.     /* Reserve a buffer for reading in the ring */
  47.     Uint32 NextReadBuffer( Uint8** buffer );
  48.     /* Read the timestamp of the current buffer */
  49.     double ReadTimeStamp(void);
  50.     /* Release a buffer having read some of it */
  51.     void ReadSome( Uint32 used );
  52.     /* Release a buffer having read all of it */
  53.     void ReadDone( void );
  54. protected:
  55.     MPEG_ring *ring;    /* Converted from C code, an alias for 'this' */
  56.     /* read only */
  57.     Uint32 bufSize;
  58.     
  59.     /* private */
  60.     Uint8 *begin;
  61.     Uint8 *end;
  62.     double *timestamps;
  63.     double *timestamp_read;
  64.     double *timestamp_write;
  65.  
  66.     Uint8 *read;
  67.     Uint8 *write;
  68.     /* For read/write synchronization */
  69.     int active;
  70.     SDL_semaphore *readwait;
  71.     SDL_semaphore *writewait;
  72. };
  73. #endif /* _MPEGRING_H */