• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /************************************************************************/
19 /*  file name       : media_fragment.h                                           */
20 /*  file contents   : media fragment class & utilities       */
21 /*  draw            : '96.10.29                                         */
22 /*----------------------------------------------------------------------*/
23 /*  amendment       :                                                   */
24 /*      Copyright (C) 2002 PacketVideo                                   */
25 /************************************************************************/
26 
27 #ifndef MEDIA_FRAGMENT_H
28 #define MEDIA_FRAGMENT_H
29 
30 #include "oscl_mem.h"
31 #include "oscl_media_data.h"
32 
33 class DefaultBufferMgr : public BufferMgr
34 {
35     public:
DefaultBufferMgr()36         DefaultBufferMgr()
37         {
38 
39         }
~DefaultBufferMgr()40         virtual ~DefaultBufferMgr()
41         {
42 
43         }
44         OsclAny BufferReleased(OsclAny* ptr, BufferState* state = NULL)
45         {
46             OSCL_DEFAULT_FREE(ptr);
47             if (state)
48                 OSCL_DELETE(state);
49         }
50 };
51 
52 
53 /* the memory pool manager should allocate this.  The free function pointer iin the
54 buffer_state should point to a routine that returns it to the pool */
55 
56 class MediaFragment
57 {
58     public:
MediaFragment()59         MediaFragment(): _state(NULL)
60         {
61             _fragment.ptr = NULL;
62             _fragment.len = 0;
63         }
64         OSCL_IMPORT_REF MediaFragment(const MediaFragment& that, OsclAny* ptr = NULL, int32 len = 0);
65 
~MediaFragment()66         virtual ~MediaFragment()
67         {
68             if (_state)
69                 _state->decrement_refcnt();
70         }
GetPtr()71         inline uint8* GetPtr()
72         {
73             return (uint8*)_fragment.ptr;
74         }
GetLen()75         inline int32 GetLen()
76         {
77             return _fragment.len;
78         }
79 
Trim(uint8 * ptr,int32 len)80         OsclAny Trim(uint8* ptr, int32 len)
81         {
82 //      if( (ptr >= _fragment.ptr && ptr < ((uint8*)_fragment.ptr+_fragment.len)) &&
83 //          (((uint8*)ptr +len) <= ((uint8*)_fragment.ptr+_fragment.len)) ){
84             _fragment.ptr = ptr;
85             _fragment.len = len;
86 //      }
87         }
88 
GetFragment()89         virtual BufferFragment* GetFragment()
90         {
91             return &_fragment;
92         }
GetState()93         virtual BufferState* GetState()
94         {
95             return _state;
96         }
97 
98     protected:
99         BufferFragment _fragment;
100         BufferState* _state;
101     private:
MediaFragment(BufferFragment & frag,BufferState * state)102         MediaFragment(BufferFragment& frag, BufferState* state):
103                 _fragment(frag), _state(state)
104         {
105             if (state)
106                 _state->increment_refcnt();
107         }
108 
Set(BufferFragment & frag,BufferState * state)109         OsclAny Set(BufferFragment& frag, BufferState* state)
110         {
111             BufferState* old_state = _state;
112             _state = state;
113 
114             if (_state)
115             {
116                 _state->increment_refcnt();
117             }
118             _fragment = frag;
119             if (old_state)
120             {
121                 old_state->decrement_refcnt();
122             }
123         }
124 
Set(OsclAny * ptr,int32 len,BufferState * state)125         OsclAny Set(OsclAny* ptr, int32 len, BufferState* state)
126         {
127             BufferState* old_state = _state;
128             _state = state;
129 
130             if (_state)
131             {
132                 _state->increment_refcnt();
133             }
134             _fragment.len = len;
135             _fragment.ptr = ptr;
136 
137             if (old_state)
138             {
139                 old_state->decrement_refcnt();
140             }
141         }
142 
143         friend class DefFragmentAllocator;
144         friend class PoolFragmentAllocator;
145         friend class MediaPacket;
146 
147         friend class AudioEncodeFragmentAllocator;
148         friend class VideoEncodeFragmentAllocator;
149 };
150 
151 typedef int32 FragmentType;
152 const FragmentType FRAG_TYPE_DEFAULT = 0;
153 
154 /* Default media fragment and allocator. */
155 class FragmentAllocator
156 {
157     public:
~FragmentAllocator()158         virtual ~FragmentAllocator() {}
159         OSCL_IMPORT_REF virtual MediaFragment* allocate_fragment(uint32 sz) = 0;
160         OSCL_IMPORT_REF virtual MediaFragment* allocate_fragment(MediaFragment* fragment,
161                 OsclAny* ptr = NULL, uint32 len = 0) = 0;
162         OSCL_IMPORT_REF virtual int32 deallocate_fragment(MediaFragment* fragment) = 0;
163 };
164 
165 class DefFragmentAllocator :  public FragmentAllocator
166 {
167     public:
DefFragmentAllocator()168         DefFragmentAllocator()
169         {
170 
171         }
~DefFragmentAllocator()172         ~DefFragmentAllocator()
173         {
174 
175         }
176         OSCL_IMPORT_REF virtual MediaFragment* allocate_fragment(uint32 sz);
177         OSCL_IMPORT_REF virtual MediaFragment* allocate_fragment(MediaFragment* fragment,
178                 OsclAny* ptr = NULL, uint32 len = 0);
179         OSCL_IMPORT_REF virtual int32 deallocate_fragment(MediaFragment* fragment);
180     private:
181         DefaultBufferMgr buffer_state_listener;
182 };
183 
184 
185 /* Media fragment pool and allocator. */
186 
187 class BufferStateEntry
188 {
189     public:
BufferStateEntry()190         BufferStateEntry() : next_entry(NULL)
191         {
192             frag.ptr = NULL;
193             frag.len = 0;
194         };
~BufferStateEntry()195         ~BufferStateEntry() {};
196         BufferState buf_state;
197         BufferFragment frag;
198         MediaFragment media_frag;
199         BufferStateEntry *next_entry;
200 };
201 
202 class PoolFragmentAllocator;
203 
204 class BufferPoolMgr : public BufferMgr
205 {
206     public:
BufferPoolMgr(PoolFragmentAllocator * pPool)207         BufferPoolMgr(PoolFragmentAllocator *pPool)
208         {
209             pBufferPool = pPool;
210         }
~BufferPoolMgr()211         virtual ~BufferPoolMgr() {};
212         OSCL_IMPORT_REF OsclAny BufferReleased(OsclAny* ptr, BufferState* state = NULL);
213     private:
214         PoolFragmentAllocator *pBufferPool;
215 };
216 
217 
218 class PoolFragmentAllocator :  public FragmentAllocator
219 {
220     public:
221         OSCL_IMPORT_REF PoolFragmentAllocator(int32 max_frags, int32 max_frag_size);
222         OSCL_IMPORT_REF ~PoolFragmentAllocator();
223 
224         OSCL_IMPORT_REF virtual MediaFragment* allocate_fragment(uint32 sz);
225         OSCL_IMPORT_REF virtual MediaFragment* allocate_fragment(MediaFragment* fragment,
226                 OsclAny* ptr = NULL, uint32 len = 0);
227         OSCL_IMPORT_REF virtual int32 deallocate_fragment(MediaFragment* fragment);
228 
229         OsclAny free_buffer_to_pool(BufferStateEntry *entry);
230     private:
231 
232         int32 num_frags;
233         int32 frag_size;
234         BufferPoolMgr *buffer_state_listener;
235         BufferStateEntry *free_list;
236         BufferStateEntry *entire_list;
237         uint8 *buffer;
238 };
239 
240 
241 
242 #endif /* MEDIA_FRAGMENT_H */
243