portbase.h revision 5e6d63b7252c7bc59567ea764b1b30b76554dcd4
1c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu/*
2c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu * Copyright (C) 2009 Wind River Systems.
3c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu */
4c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
5c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#ifndef __PORTBASE_H
6c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#define __PORTBASE_H
7c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
8974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu#include <pthread.h>
9974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu
10c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#include <OMX_Core.h>
11c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#include <OMX_Component.h>
12c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
13974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu#include <list.h>
147951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu#include <queue.h>
15974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu
16c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryuclass PortBase
17c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu{
18c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryupublic:
19c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    /*
20c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu     * constructor & destructor
21c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu     */
22c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    PortBase();
23c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *param);
24c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    virtual ~PortBase();
25c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
26c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    /* end of constructor & destructor */
27c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
28cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /*
297b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu     * accessor
307b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu     */
317b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    /* owner */
327b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    void SetOwner(OMX_COMPONENTTYPE *handle);
337b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    OMX_COMPONENTTYPE *GetOwner(void);
347b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu
3519b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    /* for ReturnThisBuffer() */
3619b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent,
3719b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu                               OMX_CALLBACKTYPE *pCallbacks,
3819b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu                               OMX_PTR pAppData);
3919b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    /* end of accessor */
4019b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu
417b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    /*
42cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu     * component methods & helpers
43cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu     */
44cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* Get/SetParameter */
458b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu    OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p,
468b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu                                    bool isclient);
478b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu    const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void);
48cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    void SetPortParam(
49cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu        const OMX_PARAM_PORTDEFINITIONTYPE *pComponentParameterStructure);
50a85b1f78b03f7027fe94d624ff1b54de9e7d5dadHo-Eun Ryu    const OMX_PARAM_PORTDEFINITIONTYPE *GetPortParam(void);
51cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* audio parameter */
52cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    void SetAudioPortParam(
53cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu        const OMX_AUDIO_PARAM_PORTFORMATTYPE *pComponentParameterStructure);
54a85b1f78b03f7027fe94d624ff1b54de9e7d5dadHo-Eun Ryu    const OMX_AUDIO_PARAM_PORTFORMATTYPE *GetAudioPortParam(void);
55cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu
56cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    /* Use/Allocate/FreeBuffer */
57cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr,
58cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_U32 nPortIndex,
59cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_PTR pAppPrivate,
60cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_U32 nSizeBytes,
61cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_U8 *pBuffer);
62cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer,
63cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                                 OMX_U32 nPortIndex,
64cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                                 OMX_PTR pAppPrivate,
65cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                                 OMX_U32 nSizeBytes);
66cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex,
67cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                             OMX_BUFFERHEADERTYPE *pBuffer);
68cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu
696fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu    /*
706fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or
716fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     * in ComponentBase::TransStateToIdle(OMX_StateLoaded)
726fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     * wokeup by Use/Allocate/FreeBuffer
736fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     */
746fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu    void WaitPortBufferCompletion(void);
756fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu
767951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    /* Empty/FillThisBuffer */
777951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
787951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_BUFFERHEADERTYPE *PopBuffer(void);
797951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_U32 BufferQueueLength(void);
807951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu
81fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu    /* Empty/FillBufferDone */
827951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
837951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu
84fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu    /* flush all buffers not under processing */
85fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu    OMX_ERRORTYPE FlushPort(void);
86fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu
87b2b1b8e0c1425cde2025791cfb74d9053170845cHo-Eun Ryu    bool IsEnabled(void);
88b2b1b8e0c1425cde2025791cfb74d9053170845cHo-Eun Ryu
894f4d5a8c4138b7ebfa624eaad8dea29332ed97a0Ho-Eun Ryu    OMX_DIRTYPE GetPortDirection(void);
904f4d5a8c4138b7ebfa624eaad8dea29332ed97a0Ho-Eun Ryu
915e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark);
925e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu
93cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* end of component methods & helpers */
94cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu
95c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryuprivate:
96c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    /* common routines for constructor */
97c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    void __PortBase(void);
98cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu
9965f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu    /*
10065f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu     * component methods & helpers
10165f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu     */
10265f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu    OMX_STATETYPE GetOwnerState(void);
10365f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu
1045e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    OMX_MARKTYPE *PopMark(void);
1055e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu
10665f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu    /* end of component methods & helpers */
10765f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu
108974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    /* buffer headers */
109974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    struct list *buffer_hdrs;
110974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    OMX_U32 nr_buffer_hdrs;
111974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */
112974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    pthread_mutex_t hdrs_lock;
113974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    pthread_cond_t hdrs_wait;
114974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu
1157951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    struct queue bufferq;
1167951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    pthread_mutex_t bufferq_lock;
1177951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu
1185e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    struct queue markq;
1195e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    pthread_mutex_t markq_lock;
1205e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu
121cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* parameter */
1228b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu    OMX_PARAM_PORTDEFINITIONTYPE *portdefinition;
123cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    OMX_PARAM_PORTDEFINITIONTYPE portparam;
124cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
1257b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu
1267b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    /* owner handle */
1277b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    OMX_COMPONENTTYPE *owner;
12819b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu
12919b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    /* omx standard callbacks */
13019b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    OMX_PTR appdata;
13119b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    OMX_CALLBACKTYPE *callbacks;
132c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu};
133c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
134c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#endif /* __PORTBASE_H */
135