1 /*
2  * portbase.h, port base class
3  *
4  * Copyright (c) 2009-2010 Wind River Systems, Inc.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #ifndef __PORTBASE_H
20 #define __PORTBASE_H
21 
22 #include <pthread.h>
23 
24 #include <OMX_Core.h>
25 #include <OMX_Component.h>
26 
27 #include <list.h>
28 #include <queue.h>
29 
30 typedef OMX_U8* CustomMemAlloc(OMX_U32 nSizeBytes, OMX_PTR pUserData);
31 typedef void  CustomMemFree(OMX_U8 *pBuffer, OMX_PTR pUserData);
32 
33 class PortBase
34 {
35 public:
36     /*
37      * constructor & destructor
38      */
39     PortBase();
40     PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *portdefinition);
41     virtual ~PortBase();
42 
43     /* end of constructor & destructor */
44 
45     /*
46      * accessor
47      */
48     /* owner */
49     void SetOwner(OMX_COMPONENTTYPE *handle);
50     OMX_COMPONENTTYPE *GetOwner(void);
51 
52     /* for ReturnThisBuffer() */
53     OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent,
54                                OMX_CALLBACKTYPE *pCallbacks,
55                                OMX_PTR pAppData);
56     /* end of accessor */
57 
58     OMX_ERRORTYPE SetMemAllocator(CustomMemAlloc *pMemAlloc, CustomMemFree *pMemFree, OMX_PTR pUserData);
59 
60     /* set port buffer alignment, nAlignment=0 means alignment disabled */
61     OMX_ERRORTYPE SetMemAlignment(OMX_U32 nAlignment);
62 
63     /*
64      * component methods & helpers
65      */
66     /* Get/SetParameter */
67     OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p,
68                                     bool overwrite_readonly);
69     const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void);
70 
71     /* Use/Allocate/FreeBuffer */
72     OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr,
73                             OMX_U32 nPortIndex,
74                             OMX_PTR pAppPrivate,
75                             OMX_U32 nSizeBytes,
76                             OMX_U8 *pBuffer);
77     OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer,
78                                  OMX_U32 nPortIndex,
79                                  OMX_PTR pAppPrivate,
80                                  OMX_U32 nSizeBytes);
81     OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex,
82                              OMX_BUFFERHEADERTYPE *pBuffer);
83 
84     /*
85      * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or
86      * in ComponentBase::TransStateToIdle(OMX_StateLoaded)
87      * wokeup by Use/Allocate/FreeBuffer
88      */
89     void WaitPortBufferCompletion(void);
90 
91     OMX_ERRORTYPE WaitPortBufferCompletionTimeout(int64_t mSec);
92     /* Empty/FillThisBuffer */
93     OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
94     OMX_BUFFERHEADERTYPE *PopBuffer(void);
95     OMX_U32 BufferQueueLength(void);
96     OMX_U32 RetainedBufferQueueLength(void);
97 
98     /* Empty/FillBufferDone */
99     OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
100 
101     OMX_ERRORTYPE RetainAndReturnBuffer(OMX_BUFFERHEADERTYPE *pRetain, OMX_BUFFERHEADERTYPE *pReturn);
102 
103     /* retain buffer */
104     OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer,
105                                    bool accumulate);
106     /*
107      * components have responsibilty of calling this function to return all
108      * accumulated buffers to omx-il clients.
109      */
110     void ReturnAllRetainedBuffers(void);
111     void ReturnOneRetainedBuffer(void);
112 
113     /* flush all buffers not under processing */
114     OMX_ERRORTYPE FlushPort(void);
115 
116     bool IsEnabled(void);
117 
118     OMX_DIRTYPE GetPortDirection(void);
119     OMX_U32 GetPortBufferCount(void);
120 
121     OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark);
122     OMX_MARKTYPE *PopMark(void);
123 
124     /* SendCommand(OMX_CommandPortDisable/Enable) */
125     OMX_ERRORTYPE TransState(OMX_U8 state);
126 
127     /* EventHandler(OMX_EventPortSettingChanged) */
128     OMX_ERRORTYPE ReportPortSettingsChanged(void);
129     OMX_ERRORTYPE ReportOutputCrop(void);
130     /* get frame size */
131     OMX_U32 getFrameBufSize(OMX_COLOR_FORMATTYPE colorFormat, OMX_U32 width, OMX_U32 height);
132 
133     /* end of component methods & helpers */
134 
135     /* TransState, state */
136     static const OMX_U8 OMX_PortDisabled = 0;
137     static const OMX_U8 OMX_PortEnabled = 1;
138 
139 private:
140     /* common routines for constructor */
141     void __PortBase(void);
142 
143     /*
144      * component methods & helpers
145      */
146     OMX_STATETYPE GetOwnerState(void);
147 
148     /* end of component methods & helpers */
149 
150     /* buffer headers */
151     struct list *buffer_hdrs;
152     OMX_U32 nr_buffer_hdrs;
153     bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */
154     pthread_mutex_t hdrs_lock;
155     pthread_cond_t hdrs_wait;
156 
157     struct queue bufferq;
158     pthread_mutex_t bufferq_lock;
159 
160     /* retained buffers (only accumulated buffer) */
161     struct queue retainedbufferq;
162     pthread_mutex_t retainedbufferq_lock;
163 
164     struct queue markq;
165     pthread_mutex_t markq_lock;
166 
167     /* state */
168     OMX_U8 state;
169     pthread_mutex_t state_lock;
170 
171     CustomMemAlloc *custom_mem_alloc;
172     CustomMemFree *custom_mem_free;
173     OMX_PTR custom_mem_userdata;
174 
175     OMX_U32 mem_alignment;
176 
177     /* parameter */
178     OMX_PARAM_PORTDEFINITIONTYPE portdefinition;
179     /* room for portdefinition.format.*.cMIMEType */
180     char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE];
181 
182     OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
183 
184     /* owner handle */
185     OMX_COMPONENTTYPE *owner;
186 
187     /* omx standard callbacks */
188     OMX_PTR appdata;
189     OMX_CALLBACKTYPE *callbacks;
190 
191     /* wrs component handle */
192     class ComponentBase *cbase;
193 
194     /* Input port size limit. The limit is set to be the size of a 1080P 4:4:4 raw image size,
195        which is 1920x1080x3. */
196     enum {
197         MAX_INPUT_PORT_SIZE = 6220800
198     };
199 };
200 
201 /* end of PortBase */
202 
203 #endif /* __PORTBASE_H */
204