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