18c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk/* 28c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * Copyright 2014 The Android Open Source Project 38c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * 48c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 58c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * you may not use this file except in compliance with the License. 68c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * You may obtain a copy of the License at 78c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * 88c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * http://www.apache.org/licenses/LICENSE-2.0 98c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * 108c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * Unless required by applicable law or agreed to in writing, software 118c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * distributed under the License is distributed on an "AS IS" BASIS, 128c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * See the License for the specific language governing permissions and 148c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk * limitations under the License. 158c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk */ 168c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 178c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk#ifndef SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_ 188c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 198c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk#define SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_ 208c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 218c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk#include <media/IOMX.h> 228c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 238c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk#include "SimpleSoftOMXComponent.h" 248c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk#include <system/window.h> 258c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 268c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkstruct hw_module_t; 278c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 288c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monknamespace android { 298c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 308c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkstruct SoftVideoEncoderOMXComponent : public SimpleSoftOMXComponent { 318c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk SoftVideoEncoderOMXComponent( 328c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const char *name, 3325a52b65b2cac1f49f37f4532cfa62282432957aJason Monk const char *componentRole, 348c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_VIDEO_CODINGTYPE codingType, 358c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const CodecProfileLevel *profileLevels, 368c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk size_t numProfileLevels, 378c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk int32_t width, 388c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk int32_t height, 398c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const OMX_CALLBACKTYPE *callbacks, 408c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_PTR appData, 418c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_COMPONENTTYPE **component); 428c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 438c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk virtual OMX_ERRORTYPE internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR param); 448c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk virtual OMX_ERRORTYPE internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params); 458c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 468c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkprotected: 478c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk void initPorts( 488c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_U32 numInputBuffers, OMX_U32 numOutputBuffers, OMX_U32 outputBufferSize, 498c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const char *mime, OMX_U32 minCompressionRatio = 1); 508c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 518c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk static void setRawVideoSize(OMX_PARAM_PORTDEFINITIONTYPE *def); 5225a52b65b2cac1f49f37f4532cfa62282432957aJason Monk 538c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk static void ConvertFlexYUVToPlanar( 548c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint8_t *dst, size_t dstStride, size_t dstVStride, 558c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk struct android_ycbcr *ycbcr, int32_t width, int32_t height); 568c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 578c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk static void ConvertYUV420SemiPlanarToYUV420Planar( 588c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const uint8_t *inYVU, uint8_t* outYUV, int32_t width, int32_t height); 598c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 608c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk static void ConvertRGB32ToPlanar( 618c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint8_t *dstY, size_t dstStride, size_t dstVStride, 628c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const uint8_t *src, size_t width, size_t height, size_t srcStride, 638c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk bool bgr); 648c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 658c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const uint8_t *extractGraphicBuffer( 668c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint8_t *dst, size_t dstSize, const uint8_t *src, size_t srcSize, 678c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk size_t width, size_t height) const; 688c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 698c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk virtual OMX_ERRORTYPE getExtensionIndex(const char *name, OMX_INDEXTYPE *index); 708c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 718c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk enum { 728c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk kInputPortIndex = 0, 738c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk kOutputPortIndex = 1, 748c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk }; 758c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 768c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk bool mInputDataIsMeta; 778c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk int32_t mWidth; // width of the input frames 788c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk int32_t mHeight; // height of the input frames 798c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint32_t mBitrate; // target bitrate set for the encoder, in bits per second 808c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint32_t mFramerate; // target framerate set for the encoder, in Q16 format 818c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_COLOR_FORMATTYPE mColorFormat; // Color format for the input port 828c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 838c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monkprivate: 848c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk void updatePortParams(); 858c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_ERRORTYPE internalSetPortParams(const OMX_PARAM_PORTDEFINITIONTYPE* port); 868c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 878c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk static const uint32_t kInputBufferAlignment = 1; 888c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk static const uint32_t kOutputBufferAlignment = 2; 898c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 908c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk mutable const hw_module_t *mGrallocModule; 918c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 928c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint32_t mMinOutputBufferSize; 938c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk uint32_t mMinCompressionRatio; 948c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 958c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const char *mComponentRole; 968c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk OMX_VIDEO_CODINGTYPE mCodingType; 978c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk const CodecProfileLevel *mProfileLevels; 988c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk size_t mNumProfileLevels; 998c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1008c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk DISALLOW_EVIL_CONSTRUCTORS(SoftVideoEncoderOMXComponent); 1018c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk}; 1028c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1038c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk} // namespace android 1048c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk 1058c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk#endif // SOFT_VIDEO_ENCODER_OMX_COMPONENT_H_ 1068c09ac7435c62a8ba2e34d57a7ac3be2ddf23adcJason Monk