blob: d5c2d4802772475dfaf20835bc6cc4ce748bf981 [file] [log] [blame]
/*
* drivers/amlogic/media/deinterlace/film_mode_fmw/film_vof_soft.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _FLMVOFSFT_H_
#define _FLMVOFSFT_H_
#include <linux/kernel.h>
/* Film Detection and VOF detection Software implementation */
/* Designer: Xin.Hu@amlogic.com */
/* Date: 12/06/13 */
/* Difference Windows Number (Last one is the global/total dif) */
/* 5wind+global */
/* #define DIFWNDNUM 6 */
#define HISDIFNUM 10
#define HISCMBNUM 10
/* detection history information */
#define HISDETNUM 6
/* The number of VOF window */
#define VOFWNDNUM 4
#define PDXX_PT_NUM 7
/* 288Row, 1bit/row -> (288/32)=9 */
#define ROWCMBNUM 288
#define ROWCMBLEN 9
#ifndef UINT32
#define UINT32 unsigned int
#endif
#ifndef UINT8
#define UINT8 unsigned char
#endif
#ifndef UShort
#define UShort unsigned short
#endif
extern uint pr_pd;
extern bool prt_flg;
extern char debug_str[];
/* Software: Film Detection and VOF parameters */
struct sFlmDatSt {
UINT8 pFlg32[HISDETNUM]; /* history information */
UINT8 pMod32[HISDETNUM];
UINT8 mNum32[HISDETNUM];
UINT8 pFld32[HISDETNUM];
UINT8 pFrm32[HISDETNUM];
UINT8 pFrm32t[HISDETNUM]; /* history information: spacial processing */
UINT8 pFlg22[HISDETNUM];
UINT8 pMod22[HISDETNUM];
UINT8 mNum22[HISDETNUM];
UINT8 pStp22[HISDETNUM];
UINT8 pSmp22[HISDETNUM];
UINT8 pModXx[HISDETNUM]; /* mode */
UINT8 pFlgXx[HISDETNUM]; /* pre-1, nxt-0 */
UINT8 pLvlXx[HISDETNUM]; /* mode level */
int TCNm[HISCMBNUM];/* history: the number of combing-rows */
UINT32 *rROFrmDif02;
/* size of the image */
int iHeight;
int iWidth;
};
/* Software parameters */
struct sFlmSftPar {
/* software */
int sFrmDifAvgRat; /* 16; //0~32 */
/* 4096; //The Large Decision should be: (large>average+LgDifThrd) */
int sFrmDifLgTDif;
int sF32StpWgt01; /* 15; */
int sF32StpWgt02; /* 15; */
int sF32DifLgRat; /* 16; //Dif>Rat*Min --> Larger */
int sFlm2MinAlpha; /* = 32; // [0~63] */
int sFlm2MinBelta; /* = 32; // [0~63] */
int sFlm20ftAlpha; /* = 16; // [0~63] */
int sFlm2LgDifThd; /* = 4096; // [0~63] %LgDifThrd */
int sFlm2LgFlgThd; /* = 8; */
int sF32Dif01A1; /* 65; */
int sF32Dif01T1; /* 128; */
int sF32Dif01A2; /* 65; */
int sF32Dif01T2; /* 128; */
int rCmbRwMinCt0; /* 8; //for film 3-2 */
int rCmbRwMinCt1; /* =7; //for film 2-2 */
UINT8 sFlm32NCmb; /* absolute no combing for film 32 */
/* pre-processing (t-0), post-processing f(t-mPstDlyPre); // No RTL */
int mPstDlyPre;
/* pre-processing (t-0), pre-processing f(t+mNxtDlySft); default=1 */
int mNxtDlySft;
int cmb22_nocmb_num;
int flm22_en;
int flm32_en;
int flm22_flag;
int flm2224_flag;
int flm22_comlev;
int flm22_comlev1;
int flm22_comlev2;
int flm22_comnum;
int flm22_comth;
int flm22_dif01_avgth;
int dif01rate;
int flag_di01th;
int numthd;
UINT32 sF32Dif02M0; /* mpeg-4096, cvbs-8192 */
UINT32 sF32Dif02M1; /* mpeg-4096, cvbs-8192 */
unsigned int field_count;
unsigned short width;
unsigned short height;
};
struct FlmModReg_t {
UINT32 rROFrmDif02[6]; /* Read only */
UINT32 rROFldDif01[6]; /* Read only */
UINT32 rROCmbInf[9];/* Inf[0]-[31:0], First-[31], Lst-[0] (Only 0/1) */
};
struct FlmDectRes {
UINT8 rCmb32Spcl;
UINT8 rFlmPstGCm;
UINT8 rFlmSltPre;
UINT8 rFlmPstMod;
UINT8 dif01flag;
UShort rPstCYWnds[5][3];
UShort rF22Flag;
};
UINT8 FlmVOFSftInt(struct sFlmSftPar *pPar);
int FlmModsDet(struct sFlmDatSt *pRDat, int nDif01, int nDif02);
/* */
int FlmVOFSftTop(UINT8 *rCmb32Spcl, unsigned short *rPstCYWnd0,
unsigned short *rPstCYWnd1, unsigned short *rPstCYWnd2,
unsigned short *rPstCYWnd3, unsigned short *rPstCYWnd4,
UINT8 *rFlmPstGCm, UINT8 *rFlmSltPre, UINT8 *rFlmPstMod,
UINT8 *dif01flag, UINT32 *rROFldDif01, UINT32 *rROFrmDif02,
UINT32 *rROCmbInf, UINT32 glb_frame_mot_num,
UINT32 glb_field_mot_num, unsigned int *cmb_row_num,
unsigned int *frame_diff_avg, struct sFlmSftPar *pPar, bool reverse);
/* length of pFlm01/nDif01: [0:5]; */
/* iDx: index of minimum dif02 ([0:5] */
int Cal32Flm01(UINT8 *pFlm01, int *nDif01, int iDx, struct sFlmSftPar *pPar);
/* Film Detection Software implementation */
/* nDif01: Fild Difference */
/* nDif02: Frame Difference */
/* WND: The index of Window */
int FlmDetSft(struct sFlmDatSt *pRDat, int *nDif01, int *nDif02, int WND,
struct sFlmSftPar *pPar);
int VOFDetSub1(int *PREWV, int *nCNum, int nMod, UINT32 *nRCmb, int nROW,
struct sFlmSftPar *pPar);
/* Video on Film Detection Software implementaion */
int VOFDetSft(int *VOFWnd, int *nCNum, int *nGCmb,
UINT32 HSCMB[HISCMBNUM][ROWCMBLEN], int nMod, UINT8 *PREWV,
int nROW, struct sFlmSftPar *pPar);
/* */
int Flm32DetSft(struct sFlmDatSt *pRDat, int *nDif02, int *nDif01,
struct sFlmSftPar *pPar);
/* Film2-2 Detection */
int Flm22DetSft(struct sFlmDatSt *pRDat, int *nDif02,
int *nDif01, struct sFlmSftPar *pPar);
/* length: [0:5] */
/* MIX: [1~5] */
int Flm32DetSub1(struct sFlmDatSt *pRDat, UINT8 *nFlg12, UINT8 *pFlm02t,
UINT8 *nFlg01, UINT8 *nFlg02, UINT8 MIX);
int VOFSftTop(UINT8 *rFlmPstGCm, UINT8 *rFlmSltPre, UINT8 *rFlmPstMod,
UShort *rPstCYWnd0, UShort *rPstCYWnd1, UShort *rPstCYWnd2,
UShort *rPstCYWnd3, int nMod, UINT32 *rROCmbInf,
struct sFlmDatSt *pRDat, struct sFlmSftPar *pPar,
int nROW, int nCOL, bool reverse);
#endif