SoftAVC.h revision d94e716af0e49d775f0c0c4f36dd2c136ba5f2b2
1e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber/* 2e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * Copyright (C) 2011 The Android Open Source Project 3e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * 4e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * you may not use this file except in compliance with the License. 6e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * You may obtain a copy of the License at 7e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * 8e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * 10e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * See the License for the specific language governing permissions and 14e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber * limitations under the License. 15e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber */ 16e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 17e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber#ifndef SOFT_AVC_H_ 18e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 19e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber#define SOFT_AVC_H_ 20e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 21e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber#include "SimpleSoftOMXComponent.h" 22e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber#include <utils/KeyedVector.h> 23e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 2489bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih#include "H264SwDecApi.h" 25e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber#include "basetype.h" 26e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 27e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Hubernamespace android { 28e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 29e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huberstruct SoftAVC : public SimpleSoftOMXComponent { 30e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber SoftAVC(const char *name, 31e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber const OMX_CALLBACKTYPE *callbacks, 32e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber OMX_PTR appData, 33e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber OMX_COMPONENTTYPE **component); 34e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 35e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huberprotected: 36bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber virtual ~SoftAVC(); 37b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 38309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih virtual OMX_ERRORTYPE internalGetParameter( 39e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber OMX_INDEXTYPE index, OMX_PTR params); 40e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 41e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber virtual OMX_ERRORTYPE internalSetParameter( 42e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber OMX_INDEXTYPE index, const OMX_PTR params); 43e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 44e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber virtual OMX_ERRORTYPE getConfig(OMX_INDEXTYPE index, OMX_PTR params); 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 46dcb89b3b505522efde173c105a851c412f947178Chong Zhang virtual void onQueueFilled(OMX_U32 portIndex); 47404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang virtual void onPortFlushCompleted(OMX_U32 portIndex); 48404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang virtual void onPortEnableCompleted(OMX_U32 portIndex, bool enabled); 49dcb89b3b505522efde173c105a851c412f947178Chong Zhang virtual void onReset(); 5089bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih 5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 528ca002eedc747dd854b61cbe364b52c06869273fRobert Shih enum { 53d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang kInputPortIndex = 0, 5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kOutputPortIndex = 1, 55e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber kNumInputBuffers = 8, 56e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber kNumOutputBuffers = 2, 57e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber }; 58e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum EOSStatus { 6014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber INPUT_DATA_AVAILABLE, 61e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber INPUT_EOS_SEEN, 62e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber OUTPUT_FRAMES_FLUSHED, 63e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber }; 64e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 65e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber void *mHandle; 66e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 67e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber size_t mInputBufferCount; 68e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 69e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber uint32_t mWidth, mHeight, mPictureSize; 70e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber uint32_t mCropLeft, mCropTop; 71bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber uint32_t mCropWidth, mCropHeight; 72b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 73309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih uint8_t *mFirstPicture; 74c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang int32_t mFirstPictureId; 75e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 76e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber int32_t mPicId; // Which output picture is for which input buffer? 77e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 78dcb89b3b505522efde173c105a851c412f947178Chong Zhang // OMX_BUFFERHEADERTYPE may be overkill, but it is convenient 79e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber // for tracking the following fields: nFlags, nTimeStamp, etc. 8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<int32_t, OMX_BUFFERHEADERTYPE *> mPicToHeaderMap; 8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mHeadersDecoded; 8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 83e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber EOSStatus mEOSStatus; 84e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 85e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber enum OutputPortSettingChange { 86e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber NONE, 87e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber AWAITING_DISABLED, 889067e30b3ccb3a07e41b61af22c036378053a9a3Andreas Huber AWAITING_ENABLED 899067e30b3ccb3a07e41b61af22c036378053a9a3Andreas Huber }; 909067e30b3ccb3a07e41b61af22c036378053a9a3Andreas Huber OutputPortSettingChange mOutputPortSettingsChange; 9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mSignalledError; 932a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber 94e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber void initPorts(); 95decd96988e495133e4a1728f612d4c9fdb4d218eAndreas Huber status_t initDecoder(); 96e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber void updatePortDefinitions(); 972aa4cc04154d82f6658fb86f394f13bb488b0468Andreas Huber bool drainAllOutputBuffers(); 982aa4cc04154d82f6658fb86f394f13bb488b0468Andreas Huber void drainOneOutputBuffer(int32_t picId, uint8_t *data); 992aa4cc04154d82f6658fb86f394f13bb488b0468Andreas Huber void saveFirstOutputBuffer(int32_t pidId, uint8_t *data); 1002aa4cc04154d82f6658fb86f394f13bb488b0468Andreas Huber bool handleCropRectEvent(const CropParams* crop); 10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool handlePortSettingChangeEvent(const H264SwDecInfo *info); 10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 103309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih DISALLOW_EVIL_CONSTRUCTORS(SoftAVC); 104309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih}; 105e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 1069067e30b3ccb3a07e41b61af22c036378053a9a3Andreas Huber} // namespace android 107e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber 108ef8adf8ce4ece039a839f42a22b436d8ae077f37Robert Shih#endif // SOFT_AVC_H_ 109ef8adf8ce4ece039a839f42a22b436d8ae077f37Robert Shih 110ef8adf8ce4ece039a839f42a22b436d8ae077f37Robert Shih