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