xref: /utopia/UTPA2-700.0.x/modules/vdec_v3/hal/maserati/vpu_v3/FieldDetection.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
2*53ee8cc1Swenshuai.xi #include <stdlib.h>
3*53ee8cc1Swenshuai.xi #include <stdio.h>
4*53ee8cc1Swenshuai.xi #include <string.h>
5*53ee8cc1Swenshuai.xi #include <limits.h>
6*53ee8cc1Swenshuai.xi #else
7*53ee8cc1Swenshuai.xi #include <linux/string.h>
8*53ee8cc1Swenshuai.xi #endif
9*53ee8cc1Swenshuai.xi #include "Film.h"
10*53ee8cc1Swenshuai.xi #include "FieldDetection.h"
11*53ee8cc1Swenshuai.xi //#define SIMULATE_MEMCPY
12*53ee8cc1Swenshuai.xi #define REMOVE_Duplicate_Detect /*Enable: it is the original code flow  */
13*53ee8cc1Swenshuai.xi #define Fix_CropRegion
14*53ee8cc1Swenshuai.xi //#define CONSOLE_DBG
15*53ee8cc1Swenshuai.xi #define RING_BUFF_SIZE 3
16*53ee8cc1Swenshuai.xi 
17*53ee8cc1Swenshuai.xi #if (!defined(MSOS_TYPE_NUTTX) && !defined(MSOS_TYPE_OPTEE) && !defined(MSOS_TYPE_LINUX_KERNEL)&& !defined(ANDROID)) || defined(SUPPORT_X_MODEL_FEATURE)
18*53ee8cc1Swenshuai.xi 
19*53ee8cc1Swenshuai.xi #if 0
20*53ee8cc1Swenshuai.xi static unsigned char* g_ringbuf[RING_BUFF_SIZE];
21*53ee8cc1Swenshuai.xi static unsigned char* g_curTop = NULL;
22*53ee8cc1Swenshuai.xi static unsigned char* g_curBot = NULL;
23*53ee8cc1Swenshuai.xi static unsigned char* g_nxtTop = NULL;
24*53ee8cc1Swenshuai.xi static unsigned char* g_nxtBot = NULL;
25*53ee8cc1Swenshuai.xi static unsigned char* g_nxt2Top = NULL;
26*53ee8cc1Swenshuai.xi static unsigned char* g_nxt2Bot = NULL;
27*53ee8cc1Swenshuai.xi #endif
28*53ee8cc1Swenshuai.xi 
29*53ee8cc1Swenshuai.xi static unsigned char* g_16_ringbuf[RING_BUFF_SIZE];
30*53ee8cc1Swenshuai.xi static unsigned char* g_16_curTop = NULL;
31*53ee8cc1Swenshuai.xi static unsigned char* g_16_curBot = NULL;
32*53ee8cc1Swenshuai.xi static unsigned char* g_16_nxtTop = NULL;
33*53ee8cc1Swenshuai.xi static unsigned char* g_16_nxtBot = NULL;
34*53ee8cc1Swenshuai.xi static unsigned char* g_16_nxt2Top = NULL;
35*53ee8cc1Swenshuai.xi static unsigned char* g_16_nxt2Bot = NULL;
36*53ee8cc1Swenshuai.xi #ifdef SIMULATE_MEMCPY
37*53ee8cc1Swenshuai.xi #ifdef __arm__
38*53ee8cc1Swenshuai.xi static unsigned char* g_sim_buf    = NULL;
39*53ee8cc1Swenshuai.xi static unsigned char* g_16_sim_buf = NULL;
40*53ee8cc1Swenshuai.xi 
41*53ee8cc1Swenshuai.xi static unsigned char* g_sim_crop_buf    = NULL;
42*53ee8cc1Swenshuai.xi static unsigned char* g_16_sim_crop_buf = NULL;
43*53ee8cc1Swenshuai.xi 
44*53ee8cc1Swenshuai.xi #endif
45*53ee8cc1Swenshuai.xi #endif
46*53ee8cc1Swenshuai.xi 
47*53ee8cc1Swenshuai.xi static int bInit = 0;
48*53ee8cc1Swenshuai.xi static int g_bufidx = 0;
49*53ee8cc1Swenshuai.xi static int g_prvFieldOrderSet = -1; //0-> bottom first, 1-> top first, -1: initial
50*53ee8cc1Swenshuai.xi 
AsKOneBuffer(void)51*53ee8cc1Swenshuai.xi static unsigned char * AsKOneBuffer(void)
52*53ee8cc1Swenshuai.xi {
53*53ee8cc1Swenshuai.xi   unsigned char *tmp = g_16_ringbuf[g_bufidx];
54*53ee8cc1Swenshuai.xi   g_bufidx++;
55*53ee8cc1Swenshuai.xi   g_bufidx = g_bufidx % RING_BUFF_SIZE;
56*53ee8cc1Swenshuai.xi   return tmp;
57*53ee8cc1Swenshuai.xi }
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi #if 0
60*53ee8cc1Swenshuai.xi static void ReleaseMem (unsigned char* pbuf)
61*53ee8cc1Swenshuai.xi {
62*53ee8cc1Swenshuai.xi   if (pbuf != NULL)
63*53ee8cc1Swenshuai.xi     free(pbuf);
64*53ee8cc1Swenshuai.xi }
65*53ee8cc1Swenshuai.xi #endif
ReleaseBuffer(void)66*53ee8cc1Swenshuai.xi static void ReleaseBuffer(void)
67*53ee8cc1Swenshuai.xi {
68*53ee8cc1Swenshuai.xi #if 0
69*53ee8cc1Swenshuai.xi   ReleaseMem(g_ringbuf[0]);
70*53ee8cc1Swenshuai.xi   ReleaseMem(g_ringbuf[1]);
71*53ee8cc1Swenshuai.xi   ReleaseMem(g_ringbuf[2]);
72*53ee8cc1Swenshuai.xi #endif
73*53ee8cc1Swenshuai.xi #ifdef SIMULATE_MEMCPY
74*53ee8cc1Swenshuai.xi #ifdef __arm__
75*53ee8cc1Swenshuai.xi   ReleaseMem(g_sim_buf);
76*53ee8cc1Swenshuai.xi   ReleaseMem(g_sim_crop_buf);
77*53ee8cc1Swenshuai.xi #endif
78*53ee8cc1Swenshuai.xi #endif
79*53ee8cc1Swenshuai.xi }
80*53ee8cc1Swenshuai.xi 
81*53ee8cc1Swenshuai.xi 
InitMemoryFromVPU(MS_PHY phyAddr1,MS_PHY phyAddr2,MS_PHY phyAddr3)82*53ee8cc1Swenshuai.xi void InitMemoryFromVPU(MS_PHY phyAddr1, MS_PHY phyAddr2, MS_PHY phyAddr3)
83*53ee8cc1Swenshuai.xi {
84*53ee8cc1Swenshuai.xi     g_16_ringbuf[0] = (unsigned char*)MsOS_PA2KSEG0(phyAddr1);
85*53ee8cc1Swenshuai.xi     g_16_ringbuf[1] = (unsigned char*)MsOS_PA2KSEG0(phyAddr2);
86*53ee8cc1Swenshuai.xi     g_16_ringbuf[2] = (unsigned char*)MsOS_PA2KSEG0(phyAddr3);
87*53ee8cc1Swenshuai.xi }
88*53ee8cc1Swenshuai.xi 
InitMemory(int width,int height,int tile_height,int tile_width)89*53ee8cc1Swenshuai.xi static void InitMemory(int width, int height, int tile_height, int tile_width)
90*53ee8cc1Swenshuai.xi {
91*53ee8cc1Swenshuai.xi //  int remain_h = (height % tile_height);
92*53ee8cc1Swenshuai.xi //  int remain_w = (width % tile_width);
93*53ee8cc1Swenshuai.xi //  int pad_w    = (remain_w != 0) ? tile_width - remain_w : 0;
94*53ee8cc1Swenshuai.xi //  int pad_h    = (remain_h != 0) ? tile_height - remain_h : 0;
95*53ee8cc1Swenshuai.xi   if (bInit == 1) {
96*53ee8cc1Swenshuai.xi     ReleaseBuffer();
97*53ee8cc1Swenshuai.xi   }
98*53ee8cc1Swenshuai.xi 
99*53ee8cc1Swenshuai.xi #if 0
100*53ee8cc1Swenshuai.xi #if 1
101*53ee8cc1Swenshuai.xi     g_16_ringbuf[0] = MsOS_PA2KSEG0(0x84600000);
102*53ee8cc1Swenshuai.xi     g_16_ringbuf[1] = MsOS_PA2KSEG0(0x85600000);
103*53ee8cc1Swenshuai.xi     g_16_ringbuf[2] = MsOS_PA2KSEG0(0x86600000);
104*53ee8cc1Swenshuai.xi //    g_16_ringbuf[0] = (0x84600000);
105*53ee8cc1Swenshuai.xi //    g_16_ringbuf[1] = (0x85600000);
106*53ee8cc1Swenshuai.xi //    g_16_ringbuf[2] = (0x86600000);
107*53ee8cc1Swenshuai.xi #else
108*53ee8cc1Swenshuai.xi #ifdef SUPPORT_TILE
109*53ee8cc1Swenshuai.xi   g_16_ringbuf[0] = Create16ByteAligned(&g_ringbuf[0], (width + pad_w) * (height + pad_h));
110*53ee8cc1Swenshuai.xi   g_16_ringbuf[1] = Create16ByteAligned(&g_ringbuf[1], (width + pad_w) * (height + pad_h));
111*53ee8cc1Swenshuai.xi   g_16_ringbuf[2] = Create16ByteAligned(&g_ringbuf[2], (width + pad_w) * (height + pad_h));
112*53ee8cc1Swenshuai.xi #else
113*53ee8cc1Swenshuai.xi   g_16_ringbuf[0] = Create16ByteAligned(&g_ringbuf[0], width * height);
114*53ee8cc1Swenshuai.xi   g_16_ringbuf[1] = Create16ByteAligned(&g_ringbuf[1], width * height);
115*53ee8cc1Swenshuai.xi   g_16_ringbuf[2] = Create16ByteAligned(&g_ringbuf[2], width * height);
116*53ee8cc1Swenshuai.xi #endif
117*53ee8cc1Swenshuai.xi #endif
118*53ee8cc1Swenshuai.xi #endif
119*53ee8cc1Swenshuai.xi 
120*53ee8cc1Swenshuai.xi }
121*53ee8cc1Swenshuai.xi 
RunDI(MS_BOOL field_order_set,unsigned char * curFieldTop,unsigned char * curFieldBot,unsigned char * nxtFieldTop,unsigned char * nxtFieldBot,unsigned char * nx2FieldTop,unsigned char * nx2FieldBot)122*53ee8cc1Swenshuai.xi static int RunDI( MS_BOOL field_order_set,
123*53ee8cc1Swenshuai.xi                   unsigned char *curFieldTop,
124*53ee8cc1Swenshuai.xi                   unsigned char *curFieldBot,
125*53ee8cc1Swenshuai.xi                   unsigned char *nxtFieldTop,
126*53ee8cc1Swenshuai.xi                   unsigned char *nxtFieldBot,
127*53ee8cc1Swenshuai.xi                   unsigned char *nx2FieldTop,
128*53ee8cc1Swenshuai.xi                   unsigned char *nx2FieldBot)
129*53ee8cc1Swenshuai.xi {
130*53ee8cc1Swenshuai.xi   int field_inv;
131*53ee8cc1Swenshuai.xi #ifndef REMOVE_Duplicate_Detect
132*53ee8cc1Swenshuai.xi   if(field_order_set == 1)//top field first
133*53ee8cc1Swenshuai.xi   {
134*53ee8cc1Swenshuai.xi     detFieldOrderTop(curFieldBot, nxtFieldTop, nxtFieldBot, nx2FieldTop, 0);
135*53ee8cc1Swenshuai.xi     dumpDetFieldOrder_status(0);
136*53ee8cc1Swenshuai.xi   }
137*53ee8cc1Swenshuai.xi   else//bot field first
138*53ee8cc1Swenshuai.xi   {
139*53ee8cc1Swenshuai.xi     detFieldOrderBot(curFieldTop, nxtFieldBot, nxtFieldTop, nx2FieldBot, 1);
140*53ee8cc1Swenshuai.xi     dumpDetFieldOrder_status(1);
141*53ee8cc1Swenshuai.xi   }
142*53ee8cc1Swenshuai.xi #endif
143*53ee8cc1Swenshuai.xi   if(field_order_set == 1)//top field first
144*53ee8cc1Swenshuai.xi   {
145*53ee8cc1Swenshuai.xi     detFieldOrderBot(nxtFieldTop, nxtFieldBot, nx2FieldTop, nx2FieldBot, 1);
146*53ee8cc1Swenshuai.xi     dumpDetFieldOrder_status(1);
147*53ee8cc1Swenshuai.xi     field_inv = detFieldOrderFW();
148*53ee8cc1Swenshuai.xi   }
149*53ee8cc1Swenshuai.xi   else//bot field first
150*53ee8cc1Swenshuai.xi   {
151*53ee8cc1Swenshuai.xi     detFieldOrderTop(nxtFieldBot, nxtFieldTop, nx2FieldBot, nx2FieldTop, 0);
152*53ee8cc1Swenshuai.xi     dumpDetFieldOrder_status(0);
153*53ee8cc1Swenshuai.xi     field_inv = detFieldOrderFW();
154*53ee8cc1Swenshuai.xi   }
155*53ee8cc1Swenshuai.xi #ifdef FILE_DBG
156*53ee8cc1Swenshuai.xi   {
157*53ee8cc1Swenshuai.xi     FILE *fptr = fopen("/usb/sda1/field-firmware.txt","a");
158*53ee8cc1Swenshuai.xi     fprintf(fptr, "%d\n", field_inv);
159*53ee8cc1Swenshuai.xi     fclose(fptr);
160*53ee8cc1Swenshuai.xi   }
161*53ee8cc1Swenshuai.xi #endif
162*53ee8cc1Swenshuai.xi #ifdef CONSOLE_DBG
163*53ee8cc1Swenshuai.xi   printf("[FOD-inv] ret=%d\n", field_inv);
164*53ee8cc1Swenshuai.xi #endif
165*53ee8cc1Swenshuai.xi   return field_inv;
166*53ee8cc1Swenshuai.xi }
167*53ee8cc1Swenshuai.xi 
IsFieldOrderInverse(FrameInfo * stFieldInfo)168*53ee8cc1Swenshuai.xi eIsFieldOrderInverse IsFieldOrderInverse (FrameInfo *stFieldInfo)
169*53ee8cc1Swenshuai.xi {
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi   unsigned char *p_curbuff = AsKOneBuffer();
172*53ee8cc1Swenshuai.xi   unsigned char *p_curTop, *p_curBot;
173*53ee8cc1Swenshuai.xi   int field_order_set;
174*53ee8cc1Swenshuai.xi   eIsFieldOrderInverse bRet = E_VDEC_IFOI_FALSE;
175*53ee8cc1Swenshuai.xi   int isInv;
176*53ee8cc1Swenshuai.xi   int Fod_win_enable = getFodWinEnable();
177*53ee8cc1Swenshuai.xi #ifdef Fix_CropRegion
178*53ee8cc1Swenshuai.xi   if (Fod_win_enable == 1) {
179*53ee8cc1Swenshuai.xi     field_order_set = (g_prvFieldOrderSet != -1) ? g_prvFieldOrderSet : stFieldInfo->bFieldOrderSet;
180*53ee8cc1Swenshuai.xi   }
181*53ee8cc1Swenshuai.xi   else
182*53ee8cc1Swenshuai.xi #endif
183*53ee8cc1Swenshuai.xi   {
184*53ee8cc1Swenshuai.xi     field_order_set = stFieldInfo->bFieldOrderSet;
185*53ee8cc1Swenshuai.xi   }
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi   copyFrameBuffer(p_curbuff, (unsigned char *) MsOS_PA2KSEG0(stFieldInfo->phyBuffAddr), stFieldInfo->u32BuffSize);
188*53ee8cc1Swenshuai.xi   if (bInit == 0) {
189*53ee8cc1Swenshuai.xi     p_curTop = p_curbuff;
190*53ee8cc1Swenshuai.xi #ifdef SUPPORT_TILE
191*53ee8cc1Swenshuai.xi     p_curBot = p_curbuff + getTileWidth();
192*53ee8cc1Swenshuai.xi #else
193*53ee8cc1Swenshuai.xi     p_curBot = p_curbuff + stFieldInfo->u16Width;
194*53ee8cc1Swenshuai.xi #endif
195*53ee8cc1Swenshuai.xi 
196*53ee8cc1Swenshuai.xi     g_16_nxtTop = g_16_curTop = p_curTop;
197*53ee8cc1Swenshuai.xi     g_16_nxtBot = g_16_curBot = p_curBot;
198*53ee8cc1Swenshuai.xi     bInit = 1;
199*53ee8cc1Swenshuai.xi     return E_VDEC_IFOI_FALSE;
200*53ee8cc1Swenshuai.xi   }
201*53ee8cc1Swenshuai.xi   g_16_nxt2Top = p_curbuff;
202*53ee8cc1Swenshuai.xi #ifdef SUPPORT_TILE
203*53ee8cc1Swenshuai.xi   g_16_nxt2Bot = p_curbuff + getTileWidth();
204*53ee8cc1Swenshuai.xi #else
205*53ee8cc1Swenshuai.xi   g_16_nxt2Bot = p_curbuff + stFieldInfo->u16Width;
206*53ee8cc1Swenshuai.xi #endif
207*53ee8cc1Swenshuai.xi 
208*53ee8cc1Swenshuai.xi   isInv = RunDI(field_order_set,
209*53ee8cc1Swenshuai.xi                 g_16_curTop,
210*53ee8cc1Swenshuai.xi                 g_16_curBot,
211*53ee8cc1Swenshuai.xi                 g_16_nxtTop,
212*53ee8cc1Swenshuai.xi                 g_16_nxtBot,
213*53ee8cc1Swenshuai.xi                 g_16_nxt2Top,
214*53ee8cc1Swenshuai.xi                 g_16_nxt2Bot);
215*53ee8cc1Swenshuai.xi 
216*53ee8cc1Swenshuai.xi   g_16_curTop = g_16_nxtTop;
217*53ee8cc1Swenshuai.xi   g_16_curBot = g_16_nxtBot;
218*53ee8cc1Swenshuai.xi   g_16_nxtTop = g_16_nxt2Top;
219*53ee8cc1Swenshuai.xi   g_16_nxtBot = g_16_nxt2Bot;
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi #ifdef Fix_CropRegion
222*53ee8cc1Swenshuai.xi   if (Fod_win_enable == 1) {
223*53ee8cc1Swenshuai.xi     g_prvFieldOrderSet = (isInv == 1) ? (1 - field_order_set) : field_order_set;
224*53ee8cc1Swenshuai.xi     if (g_prvFieldOrderSet != stFieldInfo->bFieldOrderSet) {
225*53ee8cc1Swenshuai.xi       bRet = E_VDEC_IFOI_TRUE;
226*53ee8cc1Swenshuai.xi     }
227*53ee8cc1Swenshuai.xi   } else {
228*53ee8cc1Swenshuai.xi     if (isInv == 1) {
229*53ee8cc1Swenshuai.xi       bRet = E_VDEC_IFOI_TRUE;
230*53ee8cc1Swenshuai.xi     }
231*53ee8cc1Swenshuai.xi   }
232*53ee8cc1Swenshuai.xi #else
233*53ee8cc1Swenshuai.xi   if (isInv == 1) {
234*53ee8cc1Swenshuai.xi     bRet = E_VDEC_IFOI_TRUE;
235*53ee8cc1Swenshuai.xi   }
236*53ee8cc1Swenshuai.xi #endif
237*53ee8cc1Swenshuai.xi #ifdef CONSOLE_DBG
238*53ee8cc1Swenshuai.xi   if (bRet == E_VDEC_IFOI_TRUE)
239*53ee8cc1Swenshuai.xi     printf("[FOD] field_inv 1\n");
240*53ee8cc1Swenshuai.xi   else
241*53ee8cc1Swenshuai.xi     printf("[FOD] field_inv 0\n");
242*53ee8cc1Swenshuai.xi #endif
243*53ee8cc1Swenshuai.xi   return bRet;
244*53ee8cc1Swenshuai.xi }
245*53ee8cc1Swenshuai.xi 
InitFieldDetection(FODInfo * fod)246*53ee8cc1Swenshuai.xi int InitFieldDetection(FODInfo *fod)
247*53ee8cc1Swenshuai.xi {
248*53ee8cc1Swenshuai.xi   bInit = 0;
249*53ee8cc1Swenshuai.xi   g_bufidx = 0;
250*53ee8cc1Swenshuai.xi   g_prvFieldOrderSet = -1;
251*53ee8cc1Swenshuai.xi   InitFilmDetection();
252*53ee8cc1Swenshuai.xi   InitMemory(fod->width, fod->height, fod->tile_height, fod->tile_width);
253*53ee8cc1Swenshuai.xi   return setHeight_Width(fod);
254*53ee8cc1Swenshuai.xi }
255*53ee8cc1Swenshuai.xi 
FInitFieldDetection(void)256*53ee8cc1Swenshuai.xi void FInitFieldDetection(void)
257*53ee8cc1Swenshuai.xi {
258*53ee8cc1Swenshuai.xi   bInit = 0;
259*53ee8cc1Swenshuai.xi   g_bufidx = 0;
260*53ee8cc1Swenshuai.xi   g_prvFieldOrderSet = -1;
261*53ee8cc1Swenshuai.xi   ReleaseBuffer();
262*53ee8cc1Swenshuai.xi }
263*53ee8cc1Swenshuai.xi #endif