portbase.h revision 3ca48681b349388346b10abce74c98497d231d04
1/*
2 * Copyright (c) 2009 Wind River Systems, Inc.
3 *
4 * The right to copy, distribute, modify, or otherwise make use
5 * of this software may be licensed only pursuant to the terms
6 * of an applicable Wind River license agreement.
7 */
8
9#ifndef __PORTBASE_H
10#define __PORTBASE_H
11
12#include <pthread.h>
13
14#include <OMX_Core.h>
15#include <OMX_Component.h>
16
17#include <list.h>
18#include <queue.h>
19
20class PortBase
21{
22public:
23    /*
24     * constructor & destructor
25     */
26    PortBase();
27    PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *portdefinition);
28    virtual ~PortBase();
29
30    /* end of constructor & destructor */
31
32    /*
33     * accessor
34     */
35    /* owner */
36    void SetOwner(OMX_COMPONENTTYPE *handle);
37    OMX_COMPONENTTYPE *GetOwner(void);
38
39    /* for ReturnThisBuffer() */
40    OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent,
41                               OMX_CALLBACKTYPE *pCallbacks,
42                               OMX_PTR pAppData);
43    /* end of accessor */
44
45    /*
46     * component methods & helpers
47     */
48    /* Get/SetParameter */
49    OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p,
50                                    bool overwrite_readonly);
51    const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void);
52
53    /* Use/Allocate/FreeBuffer */
54    OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr,
55                            OMX_U32 nPortIndex,
56                            OMX_PTR pAppPrivate,
57                            OMX_U32 nSizeBytes,
58                            OMX_U8 *pBuffer);
59    OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer,
60                                 OMX_U32 nPortIndex,
61                                 OMX_PTR pAppPrivate,
62                                 OMX_U32 nSizeBytes);
63    OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex,
64                             OMX_BUFFERHEADERTYPE *pBuffer);
65
66    /*
67     * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or
68     * in ComponentBase::TransStateToIdle(OMX_StateLoaded)
69     * wokeup by Use/Allocate/FreeBuffer
70     */
71    void WaitPortBufferCompletion(void);
72
73    /* Empty/FillThisBuffer */
74    OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
75    OMX_BUFFERHEADERTYPE *PopBuffer(void);
76    OMX_U32 BufferQueueLength(void);
77
78    /* Empty/FillBufferDone */
79    OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
80
81    /* retain buffer */
82    OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer,
83                                   bool accumulate);
84    /*
85     * components have responsibilty of calling this function to return all
86     * accumulated buffers to omx-il clients.
87     */
88    void ReturnAllRetainedBuffers(void);
89
90    /* flush all buffers not under processing */
91    OMX_ERRORTYPE FlushPort(void);
92
93    bool IsEnabled(void);
94
95    OMX_DIRTYPE GetPortDirection(void);
96    OMX_U32 GetPortBufferCount(void);
97
98    OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark);
99    OMX_MARKTYPE *PopMark(void);
100
101    /* SendCommand(OMX_CommandPortDisable/Enable) */
102    OMX_ERRORTYPE TransState(OMX_U8 state);
103
104    /* EventHandler(OMX_EventPortSettingChanged) */
105    OMX_ERRORTYPE ReportPortSettingsChanged(void);
106
107    /* end of component methods & helpers */
108
109    /* TransState, state */
110    static const OMX_U8 OMX_PortDisabled = 0;
111    static const OMX_U8 OMX_PortEnabled = 1;
112
113private:
114    /* common routines for constructor */
115    void __PortBase(void);
116
117    /*
118     * component methods & helpers
119     */
120    OMX_STATETYPE GetOwnerState(void);
121
122    /* end of component methods & helpers */
123
124    /* buffer headers */
125    struct list *buffer_hdrs;
126    OMX_U32 nr_buffer_hdrs;
127    bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */
128    pthread_mutex_t hdrs_lock;
129    pthread_cond_t hdrs_wait;
130
131    struct queue bufferq;
132    pthread_mutex_t bufferq_lock;
133
134    /* retained buffers (only accumulated buffer) */
135    struct queue retainedbufferq;
136    pthread_mutex_t retainedbufferq_lock;
137
138    struct queue markq;
139    pthread_mutex_t markq_lock;
140
141    /* state */
142    OMX_U8 state;
143    pthread_mutex_t state_lock;
144
145    /* parameter */
146    OMX_PARAM_PORTDEFINITIONTYPE portdefinition;
147    /* room for portdefinition.format.*.cMIMEType */
148    char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE];
149
150    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
151
152    /* owner handle */
153    OMX_COMPONENTTYPE *owner;
154
155    /* omx standard callbacks */
156    OMX_PTR appdata;
157    OMX_CALLBACKTYPE *callbacks;
158};
159
160/* end of PortBase */
161
162#endif /* __PORTBASE_H */
163