portbase.h revision 1e23923a42d574088787d8bed30df25f032e3ffb
1c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu/*
230bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * Copyright (c) 2009 Wind River Systems, Inc.
330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu *
430bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * The right to copy, distribute, modify, or otherwise make use
530bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * of this software may be licensed only pursuant to the terms
630bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * of an applicable Wind River license agreement.
7c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu */
8c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
9c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#ifndef __PORTBASE_H
10c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#define __PORTBASE_H
11c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
12974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu#include <pthread.h>
13974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu
14c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#include <OMX_Core.h>
15c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#include <OMX_Component.h>
16c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
17974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu#include <list.h>
187951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu#include <queue.h>
19974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu
20c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryuclass PortBase
21c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu{
22c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryupublic:
23c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    /*
24c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu     * constructor & destructor
25c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu     */
26c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    PortBase();
2776e479a9ee63cff7cf200aceb2f52296fe63c588Ho-Eun Ryu    PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *portdefinition);
28c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    virtual ~PortBase();
29c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
30c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    /* end of constructor & destructor */
31c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
32cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /*
337b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu     * accessor
347b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu     */
357b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    /* owner */
367b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    void SetOwner(OMX_COMPONENTTYPE *handle);
377b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    OMX_COMPONENTTYPE *GetOwner(void);
387b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu
3919b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    /* for ReturnThisBuffer() */
4019b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent,
4119b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu                               OMX_CALLBACKTYPE *pCallbacks,
4219b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu                               OMX_PTR pAppData);
4319b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    /* end of accessor */
4419b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu
457b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    /*
46cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu     * component methods & helpers
47cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu     */
48cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* Get/SetParameter */
498b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu    OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p,
503759c620f3e8325d1fdd741caad7c397e797ad2cHo-Eun Ryu                                    bool overwrite_readonly);
518b0c69f6315328521b722a6ceb19f354e867124aHo-Eun Ryu    const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void);
52cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu
53cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    /* Use/Allocate/FreeBuffer */
54cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr,
55cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_U32 nPortIndex,
56cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_PTR pAppPrivate,
57cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_U32 nSizeBytes,
58cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                            OMX_U8 *pBuffer);
59cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer,
60cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                                 OMX_U32 nPortIndex,
61cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                                 OMX_PTR pAppPrivate,
62cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                                 OMX_U32 nSizeBytes);
63cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu    OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex,
64cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu                             OMX_BUFFERHEADERTYPE *pBuffer);
65cf575e55ba6597c77cf2413245e3f626f75b5005Ho-Eun Ryu
666fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu    /*
676fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or
686fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     * in ComponentBase::TransStateToIdle(OMX_StateLoaded)
696fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     * wokeup by Use/Allocate/FreeBuffer
706fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu     */
716fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu    void WaitPortBufferCompletion(void);
726fc911638847488e09f42bdd125fbb79fc754cbdHo-Eun Ryu
737951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    /* Empty/FillThisBuffer */
747951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
757951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_BUFFERHEADERTYPE *PopBuffer(void);
767951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_U32 BufferQueueLength(void);
777951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu
78fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu    /* Empty/FillBufferDone */
797951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
807951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu
811e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    /* retain buffer */
821e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer,
831e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu                                   bool accumulate);
841e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    /*
851e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu     * components have responsibilty of calling this function to return all
861e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu     * accumulated buffers to omx-il clients.
871e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu     */
881e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    void ReturnAllRetainedBuffers(void);
891e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu
90fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu    /* flush all buffers not under processing */
91fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu    OMX_ERRORTYPE FlushPort(void);
92fa693d49884f9188809c3a185ecd4cd38a878cb7Ho-Eun Ryu
93b2b1b8e0c1425cde2025791cfb74d9053170845cHo-Eun Ryu    bool IsEnabled(void);
94b2b1b8e0c1425cde2025791cfb74d9053170845cHo-Eun Ryu
954f4d5a8c4138b7ebfa624eaad8dea29332ed97a0Ho-Eun Ryu    OMX_DIRTYPE GetPortDirection(void);
964f4d5a8c4138b7ebfa624eaad8dea29332ed97a0Ho-Eun Ryu
975e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark);
985170f7519e52abd32252552df72fa16b12651a39Ho-Eun Ryu    OMX_MARKTYPE *PopMark(void);
995e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu
100df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu    /* SendCommand(OMX_CommandPortDisable/Enable) */
101df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu    OMX_ERRORTYPE TransState(OMX_U8 state);
102df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu
103cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* end of component methods & helpers */
104cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu
105df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu    /* TransState, state */
1066eef19eccd390d878724188ac5b62f4656a97110Ho-Eun Ryu    static const OMX_U8 OMX_PortDisabled = 0;
1076eef19eccd390d878724188ac5b62f4656a97110Ho-Eun Ryu    static const OMX_U8 OMX_PortEnabled = 1;
108df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu
109c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryuprivate:
110c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    /* common routines for constructor */
111c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu    void __PortBase(void);
112cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu
11365f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu    /*
11465f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu     * component methods & helpers
11565f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu     */
11665f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu    OMX_STATETYPE GetOwnerState(void);
11765f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu
11865f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu    /* end of component methods & helpers */
11965f90f13a4ae2f113daf17558f01ffda1a0d05afHo-Eun Ryu
120974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    /* buffer headers */
121974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    struct list *buffer_hdrs;
122974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    OMX_U32 nr_buffer_hdrs;
123974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */
124974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    pthread_mutex_t hdrs_lock;
125974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu    pthread_cond_t hdrs_wait;
126974e5777ef2f549722c11ef999d5bb52bfcf199aHo-Eun Ryu
1277951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    struct queue bufferq;
1287951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu    pthread_mutex_t bufferq_lock;
1297951efc74d2bac005b683460c159f34403a355b1Ho-Eun Ryu
1301e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    /* retained buffers (only accumulated buffer) */
1311e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    struct queue retainedbufferq;
1321e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu    pthread_mutex_t retainedbufferq_lock;
1331e23923a42d574088787d8bed30df25f032e3ffbHo-Eun Ryu
1345e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    struct queue markq;
1355e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu    pthread_mutex_t markq_lock;
1365e6d63b7252c7bc59567ea764b1b30b76554dcd4Ho-Eun Ryu
137df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu    /* state */
138df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu    OMX_U8 state;
139df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu    pthread_mutex_t state_lock;
140df459a0924eb9309157e4bffa9fe26d0513b800bHo-Eun Ryu
141cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    /* parameter */
1426c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu    OMX_PARAM_PORTDEFINITIONTYPE portdefinition;
1436c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu    /* room for portdefinition.format.*.cMIMEType */
1446c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu    char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE];
1456c7f4263fbe4a642fb0a5c21b9e98c5c59c05468Ho-Eun Ryu
146cf05610bceb8d988f80ec9696104a8afceb1edfdHo-Eun Ryu    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
1477b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu
1487b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    /* owner handle */
1497b94bb78335b52b812d8b4137ce80799bb6b9125Ho-Eun Ryu    OMX_COMPONENTTYPE *owner;
15019b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu
15119b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    /* omx standard callbacks */
15219b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    OMX_PTR appdata;
15319b0e5f37c63579e9ad52b2538cddb90d601775aHo-Eun Ryu    OMX_CALLBACKTYPE *callbacks;
154c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu};
155c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu
156904a08909b5c3870414fde9faec0d74d0edd536cHo-Eun Ryu/* end of PortBase */
157904a08909b5c3870414fde9faec0d74d0edd536cHo-Eun Ryu
158c8c36c18719f55a4fbb3c1efbad24a3644c0d54eHo-Eun Ryu#endif /* __PORTBASE_H */
159