1 /* 2 * 3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /* 19 * @file Exynos_OSAL_ETC.c 20 * @brief 21 * @author SeungBeom Kim (sbcrux.kim (at) samsung.com) 22 * @version 2.0.0 23 * @history 24 * 2012.02.20 : Create 25 */ 26 27 #include <stdio.h> 28 #include <stdlib.h> 29 #include <string.h> 30 #include <sys/time.h> 31 32 #include "Exynos_OSAL_Memory.h" 33 #include "Exynos_OSAL_ETC.h" 34 #include "Exynos_OSAL_Log.h" 35 36 static struct timeval perfStart[PERF_ID_MAX+1], perfStop[PERF_ID_MAX+1]; 37 static unsigned long perfTime[PERF_ID_MAX+1], totalPerfTime[PERF_ID_MAX+1]; 38 static unsigned int perfFrameCount[PERF_ID_MAX+1], perfOver30ms[PERF_ID_MAX+1]; 39 40 #ifndef HAVE_GETLINE 41 ssize_t getline(char **ppLine, size_t *pLen, FILE *pStream) 42 { 43 char *pCurrentPointer = NULL; 44 size_t const chunk = 512; 45 46 size_t defaultBufferSize = chunk + 1; 47 size_t retSize = 0; 48 49 if (*ppLine == NULL) { 50 *ppLine = (char *)malloc(defaultBufferSize); 51 if (*ppLine == NULL) { 52 retSize = -1; 53 goto EXIT; 54 } 55 *pLen = defaultBufferSize; 56 } 57 else { 58 if (*pLen < defaultBufferSize) { 59 *ppLine = (char *)realloc(*ppLine, defaultBufferSize); 60 if (*ppLine == NULL) { 61 retSize = -1; 62 goto EXIT; 63 } 64 *pLen = defaultBufferSize; 65 } 66 } 67 68 while (1) { 69 size_t i; 70 size_t j = 0; 71 size_t readByte = 0; 72 73 pCurrentPointer = *ppLine + readByte; 74 75 i = fread(pCurrentPointer, 1, chunk, pStream); 76 if (i < chunk && ferror(pStream)) { 77 retSize = -1; 78 goto EXIT; 79 } 80 while (j < i) { 81 ++j; 82 if (*pCurrentPointer++ == (char)'\n') { 83 *pCurrentPointer = '\0'; 84 if (j != i) { 85 if (fseek(pStream, j - i, SEEK_CUR)) { 86 retSize = -1; 87 goto EXIT; 88 } 89 if (feof(pStream)) 90 clearerr(pStream); 91 } 92 readByte += j; 93 retSize = readByte; 94 goto EXIT; 95 } 96 } 97 98 readByte += j; 99 if (feof(pStream)) { 100 if (readByte) { 101 retSize = readByte; 102 goto EXIT; 103 } 104 if (!i) { 105 retSize = -1; 106 goto EXIT; 107 } 108 } 109 110 i = ((readByte + (chunk * 2)) / chunk) * chunk; 111 if (i != *pLen) { 112 *ppLine = (char *)realloc(*ppLine, i); 113 if (*ppLine == NULL) { 114 retSize = -1; 115 goto EXIT; 116 } 117 *pLen = i; 118 } 119 } 120 121 EXIT: 122 return retSize; 123 } 124 #endif /* HAVE_GETLINE */ 125 126 OMX_PTR Exynos_OSAL_Strcpy(OMX_PTR dest, OMX_PTR src) 127 { 128 return strcpy(dest, src); 129 } 130 131 OMX_PTR Exynos_OSAL_Strncpy(OMX_PTR dest, OMX_PTR src, size_t num) 132 { 133 return strncpy(dest, src, num); 134 } 135 136 OMX_S32 Exynos_OSAL_Strcmp(OMX_PTR str1, OMX_PTR str2) 137 { 138 return strcmp(str1, str2); 139 } 140 141 OMX_S32 Exynos_OSAL_Strncmp(OMX_PTR str1, OMX_PTR str2, size_t num) 142 { 143 return strncmp(str1, str2, num); 144 } 145 146 OMX_PTR Exynos_OSAL_Strcat(OMX_PTR dest, OMX_PTR src) 147 { 148 return strcat(dest, src); 149 } 150 151 OMX_PTR Exynos_OSAL_Strncat(OMX_PTR dest, OMX_PTR src, size_t num) 152 { 153 return strncat(dest, src, num); 154 } 155 156 size_t Exynos_OSAL_Strlen(const char *str) 157 { 158 return strlen(str); 159 } 160 161 static OMX_U32 MeasureTime(struct timeval *start, struct timeval *stop) 162 { 163 unsigned long sec, usec, time; 164 165 sec = stop->tv_sec - start->tv_sec; 166 if (stop->tv_usec >= start->tv_usec) { 167 usec = stop->tv_usec - start->tv_usec; 168 } else { 169 usec = stop->tv_usec + 1000000 - start->tv_usec; 170 sec--; 171 } 172 173 time = sec * 1000000 + (usec); 174 175 return time; 176 } 177 178 void Exynos_OSAL_PerfInit(PERF_ID_TYPE id) 179 { 180 memset(&perfStart[id], 0, sizeof(perfStart[id])); 181 memset(&perfStop[id], 0, sizeof(perfStop[id])); 182 perfTime[id] = 0; 183 totalPerfTime[id] = 0; 184 perfFrameCount[id] = 0; 185 perfOver30ms[id] = 0; 186 } 187 188 void Exynos_OSAL_PerfStart(PERF_ID_TYPE id) 189 { 190 gettimeofday(&perfStart[id], NULL); 191 } 192 193 void Exynos_OSAL_PerfStop(PERF_ID_TYPE id) 194 { 195 gettimeofday(&perfStop[id], NULL); 196 197 perfTime[id] = MeasureTime(&perfStart[id], &perfStop[id]); 198 totalPerfTime[id] += perfTime[id]; 199 perfFrameCount[id]++; 200 201 if (perfTime[id] > 30000) 202 perfOver30ms[id]++; 203 } 204 205 OMX_U32 Exynos_OSAL_PerfFrame(PERF_ID_TYPE id) 206 { 207 return perfTime[id]; 208 } 209 210 OMX_U32 Exynos_OSAL_PerfTotal(PERF_ID_TYPE id) 211 { 212 return totalPerfTime[id]; 213 } 214 215 OMX_U32 Exynos_OSAL_PerfFrameCount(PERF_ID_TYPE id) 216 { 217 return perfFrameCount[id]; 218 } 219 220 int Exynos_OSAL_PerfOver30ms(PERF_ID_TYPE id) 221 { 222 return perfOver30ms[id]; 223 } 224 225 void Exynos_OSAL_PerfPrint(OMX_STRING prefix, PERF_ID_TYPE id) 226 { 227 OMX_U32 perfTotal; 228 int frameCount; 229 230 frameCount = Exynos_OSAL_PerfFrameCount(id); 231 perfTotal = Exynos_OSAL_PerfTotal(id); 232 233 Exynos_OSAL_Log(EXYNOS_LOG_INFO, "%s Frame Count: %d", prefix, frameCount); 234 Exynos_OSAL_Log(EXYNOS_LOG_INFO, "%s Avg Time: %.2f ms, Over 30ms: %d", 235 prefix, (float)perfTotal / (float)(frameCount * 1000), 236 Exynos_OSAL_PerfOver30ms(id)); 237 } 238