⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encpreprocess.c

📁 freescale i.mx31 BSP CE5.0全部源码
💻 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 + -