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