📄 encpreprocess.c
字号:
/*------------------------------------------------------------------------------
-- --
-- This software is confidential and proprietary and may be used --
-- only as expressly authorized by a licensing agreement from --
-- --
-- Hantro Products Oy. --
-- --
-- In the event of publication, the following notice is applicable: --
-- --
-- (C) COPYRIGHT 2004 HANTRO PRODUCTS OY --
-- ALL RIGHTS RESERVED --
-- --
-- The entire notice above must be reproduced on all copies. --
-- --
--------------------------------------------------------------------------------
--
-- Description : Encoder internal
--
-------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
Table of context
1. Include headers
2. External compiler flags
3. Module defines
4. Local function prototypes
5. Functions
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
1. Include headers
------------------------------------------------------------------------------*/
#include "EncPreProcess.h"
#include "basetype.h"
#include "encregdrv.h"
/*------------------------------------------------------------------------------
2. External compiler flags
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
3. Module defines
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
4. Local function prototypes
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
EncPreProcessCheck
Check image size: Stabilization frame _must_ fit inside of source image
Stabilization frame width is videoObjectLayerWidth+2*stabFrame
Stabilization frame height is videoObjectLayerHeight+2*stabFrame
Input preProcess Pointer to preProcess_s structure.
Return OK No errors.
NOK Error condition.
------------------------------------------------------------------------------*/
bool_e EncPreProcessCheck(preProcess_s * preProcess)
{
bool_e status = OK;
i32 tmp;
/* Top left corner */
if (preProcess->horOffsetSrc < 0 ||
preProcess->verOffsetSrc < 0 ||
preProcess->stabFrame < 0)
return NOK;
/* Bottom right corner */
tmp = preProcess->horOffsetSrc + preProcess->lumWidth +
2 * preProcess->stabFrame;
if (tmp > preProcess->lumWidthSrc) {
status = NOK;
}
tmp = preProcess->verOffsetSrc + preProcess->lumHeight +
2 * preProcess->stabFrame;
if (tmp > preProcess->lumHeightSrc) {
status = NOK;
}
if (status == OK) {
preProcess->chWidthSrc = (preProcess->lumWidthSrc + 1) / 2;
}
return status;
}
/*------------------------------------------------------------------------------
EncPreProcess
Perform crop.
Input
preProcess Pointer to preProcess_s structure.
------------------------------------------------------------------------------*/
void EncPreProcess(preProcess_s * preProcess)
{
i32 tmp;
/* For correct stabilization the base addresses must be 4-byte aligned
* and the luma row length must be multiple of 4-bytes */
ASSERT((preProcess->busAddrLumaY & 0x3) == 0);
ASSERT((preProcess->busAddrChromaU & 0x3) == 0);
ASSERT((preProcess->busAddrChromaV & 0x3) == 0);
ASSERT((preProcess->lumWidthSrc & 0x3) == 0);
/* Input image position after crop and stabilization */
tmp = preProcess->verOffsetSrc + preProcess->verOffset;
tmp *= preProcess->lumWidthSrc;
tmp += preProcess->horOffsetSrc + preProcess->horOffset;
preProcess->busAddrLumaY += tmp;
/* Chroma */
tmp = (preProcess->verOffsetSrc + preProcess->verOffset)/2;
tmp *= preProcess->chWidthSrc;
tmp += (preProcess->horOffsetSrc + preProcess->horOffset)/2;
preProcess->busAddrChromaU += tmp;
preProcess->busAddrChromaV += tmp;
PTRACE("horOffsetSrc = %d, horOffset = %d, Total = %d\n",
preProcess->horOffsetSrc, preProcess->horOffset,
preProcess->horOffsetSrc + preProcess->horOffset);
PTRACE("verOffsetSrc = %d, verOffset = %d, Total = %d\n",
preProcess->verOffsetSrc, preProcess->verOffset,
preProcess->verOffsetSrc + preProcess->verOffset);
/* 2 LSB bits of chromaV stabilization is taken from chromaU */
ASSERT((preProcess->busAddrChromaU & 0x3) ==
(preProcess->busAddrChromaV & 0x3));
preProcess->busAddrChromaV &= 0xFFFFFFFC;
return;
}
/*------------------------------------------------------------------------------
EncStabilization
------------------------------------------------------------------------------*/
void EncStabilization(preProcess_s * preProcess)
{
i32 stabFrame;
i32 gmvHor = 0;
i32 gmvVer = 0;
i32 speed;
i32 offset;
stabFrame = preProcess->stabFrame;
if (stabFrame > 0) {
/* Gmv */
if (GetEncVopType() == 0 || GetEncVopType() == 1) {
/* ASIC returns the GMV in range [0, 31] where
* 16 stands for zero vector */
gmvHor = GetEncCamStabGmvX() - 16;
gmvVer = GetEncCamStabGmvY() - 16;
}
PTRACE("gmvHor = %d, gmvVer %d\n", gmvHor, gmvVer);
/* Horizontal position */
speed = preProcess->horSpeed + gmvHor;
if (speed < 0) {
speed = (speed - 1) / 2;
} else {
speed = (speed + 1) / 2;
}
offset = preProcess->horOffset - speed;
if ((offset >= 0) && (offset <= 2*stabFrame)) {
preProcess->horOffset = offset;
preProcess->horSpeed = speed;
} else {
preProcess->horSpeed = 0;
}
/* Vertical position */
speed = preProcess->verSpeed + gmvVer;
if (speed < 0) {
speed = (speed - 1) / 2;
} else {
speed = (speed + 1) / 2;
}
offset = preProcess->verOffset - speed;
if ((offset >= 0) && (offset <= 2*stabFrame)) {
preProcess->verOffset = offset;
preProcess->verSpeed = speed;
} else {
preProcess->verSpeed = 0;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -