This commit is contained in:
Ziyang Zhou
2022-05-21 23:08:36 +08:00
commit 3fa6b71f87
42 changed files with 15332 additions and 0 deletions

16
codecs/avcenc/Android.bp Normal file
View File

@@ -0,0 +1,16 @@
cc_library_shared {
name: "libstagefright_redroid_avcenc",
defaults: ["libstagefright_redroid_omx-defaults"],
srcs: ["RedroidAVCEnc.cpp"],
header_libs: [
"libnativebase_headers",
],
cflags: [
"-Wall",
"-Wno-unused-variable",
],
ldflags: ["-Wl,-Bsymbolic"],
}

View File

@@ -0,0 +1,465 @@
/*
* Copyright 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//#define LOG_NDEBUG 0
#define LOG_TAG "RedroidAVCEnc"
#include <utils/Log.h>
#include <utils/misc.h>
#include "OMX_Video.h"
#include <media/hardware/HardwareAPI.h>
#include <media/hardware/MetadataBufferType.h>
#include <media/stagefright/foundation/ADebug.h>
#include <OMX_IndexExt.h>
#include <OMX_VideoExt.h>
#include <nativebase/nativebase.h>
#include <dlfcn.h>
#include "RedroidAVCEnc.h"
#define d(...) ALOGD(__VA_ARGS__)
#define i(...) ALOGI(__VA_ARGS__)
#define e(...) ALOGE(__VA_ARGS__)
namespace android {
static ANativeWindowBuffer *getANWBuffer(void *src, size_t srcSize) {
MetadataBufferType bufferType = *(MetadataBufferType *)src;
bool usingANWBuffer = bufferType == kMetadataBufferTypeANWBuffer;
if (!usingANWBuffer && bufferType != kMetadataBufferTypeGrallocSource) {
ALOGE("Unsupported metadata type (%d)", bufferType);
return NULL;
}
if (usingANWBuffer) {
if (srcSize < sizeof(VideoNativeMetadata)) {
ALOGE("Metadata is too small (%zu vs %zu)", srcSize, sizeof(VideoNativeMetadata));
return NULL;
}
VideoNativeMetadata &nativeMeta = *(VideoNativeMetadata *)src;
return nativeMeta.pBuffer;
}
return nullptr;
}
static const CodecProfileLevel kProfileLevels[] = {
{ OMX_VIDEO_AVCProfileConstrainedBaseline, OMX_VIDEO_AVCLevel41 },
{ OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 },
{ OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel41 },
};
RedroidAVCEnc::RedroidAVCEnc(
const char *name,
const OMX_CALLBACKTYPE *callbacks,
OMX_PTR appData,
OMX_COMPONENTTYPE **component)
: RedroidVideoEncoderOMXComponent(
name, "video_encoder.avc", OMX_VIDEO_CodingAVC,
kProfileLevels, NELEM(kProfileLevels),
176 /* width */, 144 /* height */,
callbacks, appData, component),
mUpdateFlag(0),
mStarted(false),
mCodecLibHandle(nullptr),
mCodec(nullptr),
mCodecCtx(nullptr),
mSawInputEOS(false),
mSawOutputEOS(false),
mSignalledError(false) {
initPorts(kNumBuffers, kNumBuffers, ((mWidth * mHeight * 3) >> 1),
"video/avc", 2);
// If dump is enabled, then open create an empty file
GENERATE_FILE_NAMES();
CREATE_DUMP_FILE(mInFile);
CREATE_DUMP_FILE(mOutFile);
memset(mConversionBuffers, 0, sizeof(mConversionBuffers));
memset(mInputBufferInfo, 0, sizeof(mInputBufferInfo));
}
RedroidAVCEnc::~RedroidAVCEnc() {
d(__func__);
releaseEncoder();
List<BufferInfo *> &outQueue = getPortQueue(1);
List<BufferInfo *> &inQueue = getPortQueue(0);
CHECK(outQueue.empty());
CHECK(inQueue.empty());
}
OMX_ERRORTYPE RedroidAVCEnc::setBitRate() {
ALOGW("TODO unsupported setBitRate()");
return OMX_ErrorNone;
}
OMX_ERRORTYPE RedroidAVCEnc::initEncoder() {
mCodecLibHandle = dlopen("libmedia_codec.so", RTLD_NOW|RTLD_NODELETE);
CHECK(mCodecLibHandle);
// extern "C" media_codec_t *get_media_codec()
typedef media_codec_t *(*get_media_codec_func)();
get_media_codec_func func = (get_media_codec_func) dlsym(mCodecLibHandle, "get_media_codec");
CHECK(func);
mCodec = func();
CHECK(mCodec);
mCodecCtx = mCodec->codec_alloc(H264_ENCODE, nullptr);
CHECK(mCodecCtx);
return OMX_ErrorNone;
}
OMX_ERRORTYPE RedroidAVCEnc::releaseEncoder() {
d(__func__);
if (mCodecCtx) {
mCodec->codec_free(mCodecCtx);
mCodecCtx = nullptr;
}
if (mCodecLibHandle) {
dlclose(mCodecLibHandle);
mCodecLibHandle = nullptr;
mCodec = nullptr;
}
return OMX_ErrorNone;
}
OMX_ERRORTYPE RedroidAVCEnc::internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params) {
switch (index) {
case OMX_IndexParamVideoBitrate:
{
OMX_VIDEO_PARAM_BITRATETYPE *bitRate =
(OMX_VIDEO_PARAM_BITRATETYPE *)params;
if (!isValidOMXParam(bitRate)) {
return OMX_ErrorBadParameter;
}
if (bitRate->nPortIndex != 1) {
return OMX_ErrorUndefined;
}
bitRate->eControlRate = OMX_Video_ControlRateVariable;
bitRate->nTargetBitrate = mBitrate;
return OMX_ErrorNone;
}
case OMX_IndexParamVideoAvc:
{
OMX_VIDEO_PARAM_AVCTYPE *avcParams = (OMX_VIDEO_PARAM_AVCTYPE *)params;
if (!isValidOMXParam(avcParams)) {
return OMX_ErrorBadParameter;
}
if (avcParams->nPortIndex != 1) {
return OMX_ErrorUndefined;
}
// TODO: maintain profile
avcParams->eProfile = (OMX_VIDEO_AVCPROFILETYPE)OMX_VIDEO_AVCProfileConstrainedBaseline;
avcParams->eLevel = OMX_VIDEO_AVCLevel41;
avcParams->nRefFrames = 1;
avcParams->bUseHadamard = OMX_TRUE;
avcParams->nAllowedPictureTypes = (OMX_VIDEO_PictureTypeI
| OMX_VIDEO_PictureTypeP | OMX_VIDEO_PictureTypeB);
avcParams->nRefIdx10ActiveMinus1 = 0;
avcParams->nRefIdx11ActiveMinus1 = 0;
avcParams->bWeightedPPrediction = OMX_FALSE;
avcParams->bconstIpred = OMX_FALSE;
avcParams->bDirect8x8Inference = OMX_FALSE;
avcParams->bDirectSpatialTemporal = OMX_FALSE;
avcParams->nCabacInitIdc = 0;
return OMX_ErrorNone;
}
default:
return RedroidVideoEncoderOMXComponent::internalGetParameter(index, params);
}
}
OMX_ERRORTYPE RedroidAVCEnc::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) {
int32_t indexFull = index;
switch (indexFull) {
case OMX_IndexParamVideoBitrate:
{
OMX_VIDEO_PARAM_BITRATETYPE *bitRate =
(OMX_VIDEO_PARAM_BITRATETYPE *)params;
if (!isValidOMXParam(bitRate)) {
return OMX_ErrorBadParameter;
}
return internalSetBitrateParams(bitRate);
}
case OMX_IndexParamVideoAvc:
{
ALOGW("TODO unsupported settings [OMX_IndexParamVideoAvc]");
return OMX_ErrorNone;
}
default:
return RedroidVideoEncoderOMXComponent::internalSetParameter(index, params);
}
}
OMX_ERRORTYPE RedroidAVCEnc::getConfig(
OMX_INDEXTYPE index, OMX_PTR _params) {
switch ((int)index) {
case OMX_IndexConfigAndroidIntraRefresh:
{
OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intraRefreshParams =
(OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)_params;
if (!isValidOMXParam(intraRefreshParams)) {
return OMX_ErrorBadParameter;
}
if (intraRefreshParams->nPortIndex != kOutputPortIndex) {
return OMX_ErrorUndefined;
}
intraRefreshParams->nRefreshPeriod = 0;
return OMX_ErrorNone;
}
default:
return RedroidVideoEncoderOMXComponent::getConfig(index, _params);
}
}
OMX_ERRORTYPE RedroidAVCEnc::internalSetConfig(
OMX_INDEXTYPE index, const OMX_PTR _params, bool *frameConfig) {
switch ((int)index) {
case OMX_IndexConfigVideoIntraVOPRefresh:
{
OMX_CONFIG_INTRAREFRESHVOPTYPE *params =
(OMX_CONFIG_INTRAREFRESHVOPTYPE *)_params;
if (!isValidOMXParam(params)) {
return OMX_ErrorBadParameter;
}
if (params->nPortIndex != kOutputPortIndex) {
return OMX_ErrorBadPortIndex;
}
if (params->IntraRefreshVOP) {
mUpdateFlag |= kRequestKeyFrame;
}
return OMX_ErrorNone;
}
case OMX_IndexConfigVideoBitrate:
{
OMX_VIDEO_CONFIG_BITRATETYPE *params =
(OMX_VIDEO_CONFIG_BITRATETYPE *)_params;
if (!isValidOMXParam(params)) {
return OMX_ErrorBadParameter;
}
if (params->nPortIndex != kOutputPortIndex) {
return OMX_ErrorBadPortIndex;
}
if (mBitrate != params->nEncodeBitrate) {
mBitrate = params->nEncodeBitrate;
mUpdateFlag |= kUpdateBitrate;
}
return OMX_ErrorNone;
}
case OMX_IndexConfigAndroidIntraRefresh:
{
const OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intraRefreshParams =
(const OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)_params;
if (!isValidOMXParam(intraRefreshParams)) {
return OMX_ErrorBadParameter;
}
if (intraRefreshParams->nPortIndex != kOutputPortIndex) {
return OMX_ErrorUndefined;
}
return OMX_ErrorNone;
}
default:
return SimpleRedroidOMXComponent::internalSetConfig(index, _params, frameConfig);
}
}
OMX_ERRORTYPE RedroidAVCEnc::internalSetBitrateParams(
const OMX_VIDEO_PARAM_BITRATETYPE *bitrate) {
if (bitrate->nPortIndex != kOutputPortIndex) {
return OMX_ErrorUnsupportedIndex;
}
mBitrate = bitrate->nTargetBitrate;
mUpdateFlag |= kUpdateBitrate;
return OMX_ErrorNone;
}
void RedroidAVCEnc::onQueueFilled(OMX_U32 portIndex) {
UNUSED(portIndex);
if (mSignalledError) {
return;
}
if (!mCodecCtx) initEncoder();
List<BufferInfo *> &inQueue = getPortQueue(0);
List<BufferInfo *> &outQueue = getPortQueue(1);
if (outQueue.empty()) {
ALOGW("outQueue is empty");
return;
}
BufferInfo *outputBufferInfo = *outQueue.begin();
OMX_BUFFERHEADERTYPE *outputBufferHeader = outputBufferInfo->mHeader;
BufferInfo *inputBufferInfo;
OMX_BUFFERHEADERTYPE *inputBufferHeader;
if (mSawInputEOS) {
inputBufferHeader = NULL;
inputBufferInfo = NULL;
} else if (!inQueue.empty()) {
inputBufferInfo = *inQueue.begin();
inputBufferHeader = inputBufferInfo->mHeader;
} else {
return;
}
outputBufferHeader->nTimeStamp = 0;
outputBufferHeader->nFlags = 0;
outputBufferHeader->nOffset = 0;
outputBufferHeader->nFilledLen = 0;
outputBufferHeader->nOffset = 0;
if (inputBufferHeader != NULL) {
outputBufferHeader->nFlags = inputBufferHeader->nFlags;
}
if (mUpdateFlag) {
if (mUpdateFlag & kUpdateBitrate) {
setBitRate();
}
if (mUpdateFlag & kRequestKeyFrame) {
mCodec->request_key_frame(mCodecCtx);
}
mUpdateFlag = 0;
}
if ((inputBufferHeader != NULL)
&& (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS)) {
mSawInputEOS = true;
}
if ((inputBufferHeader != NULL) && inputBufferHeader->nFilledLen) {
OMX_ERRORTYPE error = validateInputBuffer(inputBufferHeader);
if (error != OMX_ErrorNone) {
ALOGE("b/69065651");
android_errorWriteLog(0x534e4554, "69065651");
return;
}
if (mInputDataIsMeta) {
ANativeWindowBuffer *buffer = getANWBuffer(inputBufferHeader->pBuffer + inputBufferHeader->nOffset,
inputBufferHeader->nFilledLen);
if (!buffer) {
ALOGE("ANativeWindowBuffer null!");
return;
}
buffer_handle_t handle = buffer->handle;
if (!handle) {
ALOGE("buffer_handle_t handle is null!");
return;
}
ALOGV("before encode");
void *out_buf = outputBufferHeader->pBuffer + outputBufferHeader->nFilledLen;
int out_size = 0;
mCodec->encode_frame(mCodecCtx, (void *) handle, out_buf, &out_size);
outputBufferHeader->nFilledLen += out_size;
ALOGV("after encode");
}
//DUMP_TO_FILE();
}
if (inputBufferHeader != NULL) {
inQueue.erase(inQueue.begin());
/* If in meta data, call EBD on input */
/* In case of normal mode, EBD will be done once encoder
releases the input buffer */
if (mInputDataIsMeta) {
inputBufferInfo->mOwnedByUs = false;
notifyEmptyBufferDone(inputBufferHeader);
}
}
if (false) { // TODO
outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS;
mSawOutputEOS = true;
} else {
outputBufferHeader->nFlags &= ~OMX_BUFFERFLAG_EOS;
}
if (outputBufferHeader->nFilledLen) {
if (inputBufferHeader) outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp;
outputBufferInfo->mOwnedByUs = false;
outQueue.erase(outQueue.begin());
DUMP_TO_FILE(mOutFile, outputBufferHeader->pBuffer,
outputBufferHeader->nFilledLen);
notifyFillBufferDone(outputBufferHeader);
}
}
void RedroidAVCEnc::onReset() {
d(__func__);
RedroidVideoEncoderOMXComponent::onReset();
if (releaseEncoder() != OMX_ErrorNone) {
ALOGW("releaseEncoder failed");
}
}
} // namespace android
extern "C"
android::RedroidOMXComponent *createRedroidOMXComponent(
const char *name, const OMX_CALLBACKTYPE *callbacks,
OMX_PTR appData, OMX_COMPONENTTYPE **component) {
return new android::RedroidAVCEnc(name, callbacks, appData, component);
}

View File

@@ -0,0 +1,298 @@
/*
* Copyright 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <media/stagefright/foundation/ABase.h>
#include <utils/Vector.h>
#include <media/stagefright/omx/RedroidVideoEncoderOMXComponent.h>
#include "media_codec.h"
namespace android {
#define MAX_INPUT_BUFFER_HEADERS 4
#define MAX_CONVERSION_BUFFERS 4
#define CODEC_MAX_CORES 4
#define LEN_STATUS_BUFFER (10 * 1024)
#define MAX_VBV_BUFF_SIZE (120 * 16384)
#define MAX_NUM_IO_BUFS 3
#define DEFAULT_MAX_REF_FRM 2
#define DEFAULT_MAX_REORDER_FRM 0
#define DEFAULT_QP_MIN 10
#define DEFAULT_QP_MAX 40
#define DEFAULT_MAX_BITRATE 240000000
#define DEFAULT_MAX_SRCH_RANGE_X 256
#define DEFAULT_MAX_SRCH_RANGE_Y 256
#define DEFAULT_MAX_FRAMERATE 120000
#define DEFAULT_NUM_CORES 1
#define DEFAULT_NUM_CORES_PRE_ENC 0
#define DEFAULT_FPS 30
#define DEFAULT_ENC_SPEED IVE_NORMAL
#define DEFAULT_MEM_REC_CNT 0
#define DEFAULT_RECON_ENABLE 0
#define DEFAULT_CHKSUM_ENABLE 0
#define DEFAULT_START_FRM 0
#define DEFAULT_NUM_FRMS 0xFFFFFFFF
#define DEFAULT_INP_COLOR_FORMAT IV_YUV_420SP_VU
#define DEFAULT_RECON_COLOR_FORMAT IV_YUV_420P
#define DEFAULT_LOOPBACK 0
#define DEFAULT_SRC_FRAME_RATE 30
#define DEFAULT_TGT_FRAME_RATE 30
#define DEFAULT_MAX_WD 1920
#define DEFAULT_MAX_HT 1920
#define DEFAULT_MAX_LEVEL 41
#define DEFAULT_STRIDE 0
#define DEFAULT_WD 1280
#define DEFAULT_HT 720
#define DEFAULT_PSNR_ENABLE 0
#define DEFAULT_ME_SPEED 100
#define DEFAULT_ENABLE_FAST_SAD 0
#define DEFAULT_ENABLE_ALT_REF 0
#define DEFAULT_RC_MODE IVE_RC_STORAGE
#define DEFAULT_BITRATE 6000000
#define DEFAULT_I_QP 22
#define DEFAULT_I_QP_MAX DEFAULT_QP_MAX
#define DEFAULT_I_QP_MIN DEFAULT_QP_MIN
#define DEFAULT_P_QP 28
#define DEFAULT_P_QP_MAX DEFAULT_QP_MAX
#define DEFAULT_P_QP_MIN DEFAULT_QP_MIN
#define DEFAULT_B_QP 22
#define DEFAULT_B_QP_MAX DEFAULT_QP_MAX
#define DEFAULT_B_QP_MIN DEFAULT_QP_MIN
#define DEFAULT_AIR IVE_AIR_MODE_NONE
#define DEFAULT_AIR_REFRESH_PERIOD 30
#define DEFAULT_SRCH_RNG_X 64
#define DEFAULT_SRCH_RNG_Y 48
#define DEFAULT_I_INTERVAL 30
#define DEFAULT_IDR_INTERVAL 1000
#define DEFAULT_B_FRAMES 0
#define DEFAULT_DISABLE_DEBLK_LEVEL 0
#define DEFAULT_HPEL 1
#define DEFAULT_QPEL 1
#define DEFAULT_I4 1
#define DEFAULT_EPROFILE IV_PROFILE_BASE
#define DEFAULT_ENTROPY_MODE 0
#define DEFAULT_SLICE_MODE IVE_SLICE_MODE_NONE
#define DEFAULT_SLICE_PARAM 256
#define DEFAULT_ARCH ARCH_ARM_A9Q
#define DEFAULT_SOC SOC_GENERIC
#define DEFAULT_INTRA4x4 0
#define STRLENGTH 500
#define DEFAULT_CONSTRAINED_INTRA 0
#define MIN(a, b) ((a) < (b))? (a) : (b)
#define MAX(a, b) ((a) > (b))? (a) : (b)
#define ALIGN16(x) ((((x) + 15) >> 4) << 4)
#define ALIGN128(x) ((((x) + 127) >> 7) << 7)
#define ALIGN4096(x) ((((x) + 4095) >> 12) << 12)
/** Used to remove warnings about unused parameters */
#define UNUSED(x) ((void)(x))
/** Get time */
#define GETTIME(a, b) gettimeofday(a, b);
/** Compute difference between start and end */
#define TIME_DIFF(start, end, diff) \
diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
((end).tv_usec - (start).tv_usec);
#define ive_aligned_malloc(alignment, size) memalign(alignment, size)
#define ive_aligned_free(buf) free(buf)
struct RedroidAVCEnc : public RedroidVideoEncoderOMXComponent {
RedroidAVCEnc(
const char *name,
const OMX_CALLBACKTYPE *callbacks,
OMX_PTR appData,
OMX_COMPONENTTYPE **component);
// Override SimpleRedroidOMXComponent methods
virtual OMX_ERRORTYPE internalGetParameter(
OMX_INDEXTYPE index, OMX_PTR params);
virtual OMX_ERRORTYPE internalSetParameter(
OMX_INDEXTYPE index, const OMX_PTR params);
virtual void onQueueFilled(OMX_U32 portIndex);
protected:
virtual ~RedroidAVCEnc();
virtual void onReset();
private:
enum {
kNumBuffers = 2,
};
enum {
kUpdateBitrate = 1 << 0,
kRequestKeyFrame = 1 << 1,
kUpdateAIRMode = 1 << 2,
};
// OMX input buffer's timestamp and flags
typedef struct {
int64_t mTimeUs;
int32_t mFlags;
} InputBufferInfo;
int32_t mStride;
struct timeval mTimeStart; // Time at the start of decode()
struct timeval mTimeEnd; // Time at the end of decode()
int mUpdateFlag;
#ifdef FILE_DUMP_ENABLE
char mInFile[200];
char mOutFile[200];
#endif /* FILE_DUMP_ENABLE */
bool mKeyFrameRequest;
bool mStarted;
bool mSpsPpsHeaderReceived;
// redroid codec
void *mCodecLibHandle;
media_codec_t *mCodec;
void *mCodecCtx;
bool mSawInputEOS;
bool mSawOutputEOS;
bool mSignalledError;
bool mIntra4x4;
bool mEnableFastSad;
bool mEnableAltRef;
bool mReconEnable;
bool mPSNREnable;
bool mEntropyMode;
bool mConstrainedIntraFlag;
uint8_t *mConversionBuffers[MAX_CONVERSION_BUFFERS];
bool mConversionBuffersFree[MAX_CONVERSION_BUFFERS];
BufferInfo *mInputBufferInfo[MAX_INPUT_BUFFER_HEADERS];
size_t mNumMemRecords; // Number of memory records requested by codec
size_t mNumCores; // Number of cores used by the codec
void initEncParams();
OMX_ERRORTYPE initEncoder();
OMX_ERRORTYPE releaseEncoder();
// Verifies the component role tried to be set to this OMX component is
// strictly video_encoder.avc
OMX_ERRORTYPE internalSetRoleParams(
const OMX_PARAM_COMPONENTROLETYPE *role);
// Updates bitrate to reflect port settings.
OMX_ERRORTYPE internalSetBitrateParams(
const OMX_VIDEO_PARAM_BITRATETYPE *bitrate);
OMX_ERRORTYPE internalSetConfig(
OMX_INDEXTYPE index, const OMX_PTR _params, bool *frameConfig);
OMX_ERRORTYPE getConfig(
OMX_INDEXTYPE index, const OMX_PTR _params);
// Handles port definition changes.
OMX_ERRORTYPE internalSetPortParams(
const OMX_PARAM_PORTDEFINITIONTYPE *port);
OMX_ERRORTYPE internalSetFormatParams(
const OMX_VIDEO_PARAM_PORTFORMATTYPE *format);
OMX_ERRORTYPE setQp();
OMX_ERRORTYPE setDimensions();
OMX_ERRORTYPE setNumCores();
OMX_ERRORTYPE setFrameRate();
OMX_ERRORTYPE setIpeParams();
OMX_ERRORTYPE setBitRate();
OMX_ERRORTYPE setAirParams();
OMX_ERRORTYPE setMeParams();
OMX_ERRORTYPE setGopParams();
OMX_ERRORTYPE setProfileParams();
OMX_ERRORTYPE setDeblockParams();
OMX_ERRORTYPE setVbvParams();
void logVersion();
DISALLOW_EVIL_CONSTRUCTORS(RedroidAVCEnc);
};
#ifdef FILE_DUMP_ENABLE
#define INPUT_DUMP_PATH "/sdcard/media/avce_input"
#define INPUT_DUMP_EXT "yuv"
#define OUTPUT_DUMP_PATH "/sdcard/media/avce_output"
#define OUTPUT_DUMP_EXT "h264"
#define GENERATE_FILE_NAMES() { \
GETTIME(&mTimeStart, NULL); \
strcpy(mInFile, ""); \
sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH, \
mTimeStart.tv_sec, mTimeStart.tv_usec, \
INPUT_DUMP_EXT); \
strcpy(mOutFile, ""); \
sprintf(mOutFile, "%s_%ld.%ld.%s", OUTPUT_DUMP_PATH,\
mTimeStart.tv_sec, mTimeStart.tv_usec, \
OUTPUT_DUMP_EXT); \
}
#define CREATE_DUMP_FILE(m_filename) { \
FILE *fp = fopen(m_filename, "wb"); \
if (fp != NULL) { \
ALOGD("Opened file %s", m_filename); \
fclose(fp); \
} else { \
ALOGD("Could not open file %s", m_filename); \
} \
}
#define DUMP_TO_FILE(m_filename, m_buf, m_size) \
{ \
FILE *fp = fopen(m_filename, "ab"); \
if (fp != NULL && m_buf != NULL) { \
int i; \
i = fwrite(m_buf, 1, m_size, fp); \
ALOGD("fwrite ret %d to write %d", i, m_size); \
if (i != (int)m_size) { \
ALOGD("Error in fwrite, returned %d", i); \
perror("Error in write to file"); \
} \
fclose(fp); \
} else { \
ALOGD("Could not write to file %s", m_filename);\
if (fp != NULL) \
fclose(fp); \
} \
}
#else /* FILE_DUMP_ENABLE */
#define INPUT_DUMP_PATH
#define INPUT_DUMP_EXT
#define OUTPUT_DUMP_PATH
#define OUTPUT_DUMP_EXT
#define GENERATE_FILE_NAMES()
#define CREATE_DUMP_FILE(m_filename)
#define DUMP_TO_FILE(m_filename, m_buf, m_size)
#endif /* FILE_DUMP_ENABLE */
} // namespace android

View File

@@ -0,0 +1,5 @@
{
global:
createRedroidOMXComponent;
local: *;
};