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