1d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian/* 2d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * Copyright (C) 2016 The Android Open Source Project 3d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * 4d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * Licensed under the Apache License, Version 2.0 (the "License"); 5d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * you may not use this file except in compliance with the License. 6d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * You may obtain a copy of the License at 7d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * 8d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * http://www.apache.org/licenses/LICENSE-2.0 9d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * 10d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * Unless required by applicable law or agreed to in writing, software 11d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * distributed under the License is distributed on an "AS IS" BASIS, 12d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * See the License for the specific language governing permissions and 14d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian * limitations under the License. 15d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian */ 16d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 17d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian// #define LOG_NDEBUG 0 18d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#define LOG_TAG "SoftVP8Encoder" 19d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include "SoftVP8Encoder.h" 20d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 21d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include <utils/Log.h> 22d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include <utils/misc.h> 23d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 24d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include <media/hardware/HardwareAPI.h> 25d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include <media/hardware/MetadataBufferType.h> 26d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include <media/stagefright/foundation/ADebug.h> 27d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#include <media/stagefright/MediaDefs.h> 28d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 29d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#ifndef INT32_MAX 30d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#define INT32_MAX 2147483647 31d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian#endif 32d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 33d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramaniannamespace android { 34d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 35d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanianstatic const CodecProfileLevel kVp8ProfileLevels[] = { 36d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version0 }, 37d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version1 }, 38d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version2 }, 39d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian { OMX_VIDEO_VP8ProfileMain, OMX_VIDEO_VP8Level_Version3 }, 40d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian}; 41d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 42d8274ce8759faa21b10e9c027745774fefc9d993Vignesh VenkatasubramanianSoftVP8Encoder::SoftVP8Encoder(const char *name, 43d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian const OMX_CALLBACKTYPE *callbacks, 44d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian OMX_PTR appData, 45d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian OMX_COMPONENTTYPE **component) 46d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian : SoftVPXEncoder( 47d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian name, callbacks, appData, component, "video_encoder.vp8", 48d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian OMX_VIDEO_CodingVP8, MEDIA_MIMETYPE_VIDEO_VP8, 2, 49d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian kVp8ProfileLevels, NELEM(kVp8ProfileLevels)), 504f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mDCTPartitions(0), 514f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mLevel(OMX_VIDEO_VP8Level_Version0) { 52d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 53d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 54d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanianvoid SoftVP8Encoder::setCodecSpecificInterface() { 55d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian mCodecInterface = vpx_codec_vp8_cx(); 56d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 57d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 58328597abaecff9722dcfb4bb4c67964bd82a072aVignesh Venkatasubramanianvoid SoftVP8Encoder::setCodecSpecificConfiguration() { 594f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian switch (mLevel) { 604f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian case OMX_VIDEO_VP8Level_Version0: 614f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mCodecConfiguration->g_profile = 0; 624f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian break; 634f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian 644f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian case OMX_VIDEO_VP8Level_Version1: 654f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mCodecConfiguration->g_profile = 1; 664f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian break; 674f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian 684f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian case OMX_VIDEO_VP8Level_Version2: 694f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mCodecConfiguration->g_profile = 2; 704f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian break; 714f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian 724f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian case OMX_VIDEO_VP8Level_Version3: 734f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mCodecConfiguration->g_profile = 3; 744f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian break; 754f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian 764f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian default: 774f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian mCodecConfiguration->g_profile = 0; 784f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian } 794f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian} 804f61e52d32f05db3cb04a0e29f9a2507ceffaf99Vignesh Venkatasubramanian 81d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanianvpx_codec_err_t SoftVP8Encoder::setCodecSpecificControls() { 82d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vpx_codec_err_t codec_return = vpx_codec_control(mCodecContext, 83d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian VP8E_SET_TOKEN_PARTITIONS, 84d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian mDCTPartitions); 85d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian if (codec_return != VPX_CODEC_OK) { 86d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian ALOGE("Error setting dct partitions for vpx encoder."); 87d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 88d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return codec_return; 89d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 90d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 91d8274ce8759faa21b10e9c027745774fefc9d993Vignesh VenkatasubramanianOMX_ERRORTYPE SoftVP8Encoder::internalGetParameter(OMX_INDEXTYPE index, 92d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian OMX_PTR param) { 93d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian // can include extension index OMX_INDEXEXTTYPE 94d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian const int32_t indexFull = index; 95d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 96d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian switch (indexFull) { 97d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian case OMX_IndexParamVideoVp8: 98d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return internalGetVp8Params( 99d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian (OMX_VIDEO_PARAM_VP8TYPE *)param); 100d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 101d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian default: 102d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return SoftVPXEncoder::internalGetParameter(index, param); 103d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 104d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 105d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 106d8274ce8759faa21b10e9c027745774fefc9d993Vignesh VenkatasubramanianOMX_ERRORTYPE SoftVP8Encoder::internalSetParameter(OMX_INDEXTYPE index, 107d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian const OMX_PTR param) { 108d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian // can include extension index OMX_INDEXEXTTYPE 109d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian const int32_t indexFull = index; 110d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 111d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian switch (indexFull) { 112d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian case OMX_IndexParamVideoVp8: 113d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return internalSetVp8Params( 114d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian (const OMX_VIDEO_PARAM_VP8TYPE *)param); 115d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 116d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian default: 117d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return SoftVPXEncoder::internalSetParameter(index, param); 118d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 119d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 120d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 121d8274ce8759faa21b10e9c027745774fefc9d993Vignesh VenkatasubramanianOMX_ERRORTYPE SoftVP8Encoder::internalGetVp8Params( 122d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian OMX_VIDEO_PARAM_VP8TYPE* vp8Params) { 123d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian if (vp8Params->nPortIndex != kOutputPortIndex) { 124d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorUnsupportedIndex; 125d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 126d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 127d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->eProfile = OMX_VIDEO_VP8ProfileMain; 128d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->eLevel = mLevel; 129d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->bErrorResilientMode = mErrorResilience; 130d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->nDCTPartitions = mDCTPartitions; 131d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorNone; 132d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 133d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 134d8274ce8759faa21b10e9c027745774fefc9d993Vignesh VenkatasubramanianOMX_ERRORTYPE SoftVP8Encoder::internalSetVp8Params( 135d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian const OMX_VIDEO_PARAM_VP8TYPE* vp8Params) { 136d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian if (vp8Params->nPortIndex != kOutputPortIndex) { 137d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorUnsupportedIndex; 138d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 139d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 140d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian if (vp8Params->eProfile != OMX_VIDEO_VP8ProfileMain) { 141d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorBadParameter; 142d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 143d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 144d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian if (vp8Params->eLevel == OMX_VIDEO_VP8Level_Version0 || 145d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->eLevel == OMX_VIDEO_VP8Level_Version1 || 146d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->eLevel == OMX_VIDEO_VP8Level_Version2 || 147d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian vp8Params->eLevel == OMX_VIDEO_VP8Level_Version3) { 148d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian mLevel = vp8Params->eLevel; 149d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } else { 150d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorBadParameter; 151d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 152d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 153d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian mErrorResilience = vp8Params->bErrorResilientMode; 154d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian if (vp8Params->nDCTPartitions <= kMaxDCTPartitions) { 155d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian mDCTPartitions = vp8Params->nDCTPartitions; 156d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } else { 157d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorBadParameter; 158d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian } 159d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian return OMX_ErrorNone; 160d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} 161d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian 162d8274ce8759faa21b10e9c027745774fefc9d993Vignesh Venkatasubramanian} // namespace android 163