portbase.h revision f4ab90019707fb84477f62dd3093eaff0ac466eb
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
50    /* Use/Allocate/FreeBuffer */
51    OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr,
52                            OMX_U32 nPortIndex,
53                            OMX_PTR pAppPrivate,
54                            OMX_U32 nSizeBytes,
55                            OMX_U8 *pBuffer);
56    OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer,
57                                 OMX_U32 nPortIndex,
58                                 OMX_PTR pAppPrivate,
59                                 OMX_U32 nSizeBytes);
60    OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex,
61                             OMX_BUFFERHEADERTYPE *pBuffer);
62
63    /*
64     * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or
65     * in ComponentBase::TransStateToIdle(OMX_StateLoaded)
66     * wokeup by Use/Allocate/FreeBuffer
67     */
68    void WaitPortBufferCompletion(void);
69
70    /* Empty/FillThisBuffer */
71    OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
72    /* push buffer at head */
73    OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
74    OMX_BUFFERHEADERTYPE *PopBuffer(void);
75    OMX_U32 BufferQueueLength(void);
76
77    /* Empty/FillBufferDone */
78    OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
79
80    /* flush all buffers not under processing */
81    OMX_ERRORTYPE FlushPort(void);
82
83    bool IsEnabled(void);
84
85    OMX_DIRTYPE GetPortDirection(void);
86
87    OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark);
88    OMX_MARKTYPE *PopMark(void);
89
90    /* SendCommand(OMX_CommandPortDisable/Enable) */
91    OMX_ERRORTYPE TransState(OMX_U8 state);
92
93    /* end of component methods & helpers */
94
95    /* TransState, state */
96    static const OMX_U8 OMX_PortDisabled = 0;
97    static const OMX_U8 OMX_PortEnabled = 1;
98
99private:
100    /* common routines for constructor */
101    void __PortBase(void);
102
103    /*
104     * component methods & helpers
105     */
106    OMX_STATETYPE GetOwnerState(void);
107
108    /* end of component methods & helpers */
109
110    /* buffer headers */
111    struct list *buffer_hdrs;
112    OMX_U32 nr_buffer_hdrs;
113    bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */
114    pthread_mutex_t hdrs_lock;
115    pthread_cond_t hdrs_wait;
116
117    struct queue bufferq;
118    pthread_mutex_t bufferq_lock;
119
120    struct queue markq;
121    pthread_mutex_t markq_lock;
122
123    /* state */
124    OMX_U8 state;
125    pthread_mutex_t state_lock;
126
127    /* parameter */
128    OMX_PARAM_PORTDEFINITIONTYPE portdefinition;
129    /* room for portdefinition.format.*.cMIMEType */
130    char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE];
131
132    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
133
134    /* owner handle */
135    OMX_COMPONENTTYPE *owner;
136
137    /* omx standard callbacks */
138    OMX_PTR appdata;
139    OMX_CALLBACKTYPE *callbacks;
140};
141
142/* end of PortBase */
143
144#endif /* __PORTBASE_H */
145