portbase.h revision 5170f7519e52abd32252552df72fa16b12651a39
1/*
2 * Copyright (C) 2009 Wind River Systems.
3 */
4
5#ifndef __PORTBASE_H
6#define __PORTBASE_H
7
8#include <pthread.h>
9
10#include <OMX_Core.h>
11#include <OMX_Component.h>
12
13#include <list.h>
14#include <queue.h>
15
16class PortBase
17{
18public:
19    /*
20     * constructor & destructor
21     */
22    PortBase();
23    PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *param);
24    virtual ~PortBase();
25
26    /* end of constructor & destructor */
27
28    /*
29     * accessor
30     */
31    /* owner */
32    void SetOwner(OMX_COMPONENTTYPE *handle);
33    OMX_COMPONENTTYPE *GetOwner(void);
34
35    /* for ReturnThisBuffer() */
36    OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent,
37                               OMX_CALLBACKTYPE *pCallbacks,
38                               OMX_PTR pAppData);
39    /* end of accessor */
40
41    /*
42     * component methods & helpers
43     */
44    /* Get/SetParameter */
45    OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p,
46                                    bool isclient);
47    const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void);
48    void SetPortParam(
49        const OMX_PARAM_PORTDEFINITIONTYPE *pComponentParameterStructure);
50    const OMX_PARAM_PORTDEFINITIONTYPE *GetPortParam(void);
51    /* audio parameter */
52    void SetAudioPortParam(
53        const OMX_AUDIO_PARAM_PORTFORMATTYPE *pComponentParameterStructure);
54    const OMX_AUDIO_PARAM_PORTFORMATTYPE *GetAudioPortParam(void);
55
56    /* Use/Allocate/FreeBuffer */
57    OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr,
58                            OMX_U32 nPortIndex,
59                            OMX_PTR pAppPrivate,
60                            OMX_U32 nSizeBytes,
61                            OMX_U8 *pBuffer);
62    OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer,
63                                 OMX_U32 nPortIndex,
64                                 OMX_PTR pAppPrivate,
65                                 OMX_U32 nSizeBytes);
66    OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex,
67                             OMX_BUFFERHEADERTYPE *pBuffer);
68
69    /*
70     * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or
71     * in ComponentBase::TransStateToIdle(OMX_StateLoaded)
72     * wokeup by Use/Allocate/FreeBuffer
73     */
74    void WaitPortBufferCompletion(void);
75
76    /* Empty/FillThisBuffer */
77    OMX_ERRORTYPE PushThisBuffer(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    /* end of component methods & helpers */
95
96private:
97    /* common routines for constructor */
98    void __PortBase(void);
99
100    /*
101     * component methods & helpers
102     */
103    OMX_STATETYPE GetOwnerState(void);
104
105    /* end of component methods & helpers */
106
107    /* buffer headers */
108    struct list *buffer_hdrs;
109    OMX_U32 nr_buffer_hdrs;
110    bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */
111    pthread_mutex_t hdrs_lock;
112    pthread_cond_t hdrs_wait;
113
114    struct queue bufferq;
115    pthread_mutex_t bufferq_lock;
116
117    struct queue markq;
118    pthread_mutex_t markq_lock;
119
120    /* parameter */
121    OMX_PARAM_PORTDEFINITIONTYPE *portdefinition;
122    OMX_PARAM_PORTDEFINITIONTYPE portparam;
123    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
124
125    /* owner handle */
126    OMX_COMPONENTTYPE *owner;
127
128    /* omx standard callbacks */
129    OMX_PTR appdata;
130    OMX_CALLBACKTYPE *callbacks;
131};
132
133#endif /* __PORTBASE_H */
134