/* 
 | 
 * xcam_obj_debug.h - object profiling and debug 
 | 
 * 
 | 
 *  Copyright (c) 2015 Intel Corporation 
 | 
 * 
 | 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 | 
 * you may not use this file except in compliance with the License. 
 | 
 * You may obtain a copy of the License at 
 | 
 * 
 | 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 | 
 * 
 | 
 * Unless required by applicable law or agreed to in writing, software 
 | 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 | 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 | 
 * See the License for the specific language governing permissions and 
 | 
 * limitations under the License. 
 | 
 * 
 | 
 * Author: Wind Yuan <feng.yuan@intel.com> 
 | 
 */ 
 | 
  
 | 
#ifndef XCAM_OBJ_DEBUG_H 
 | 
#define XCAM_OBJ_DEBUG_H 
 | 
  
 | 
#include <stdio.h> 
 | 
  
 | 
// default duration of frame numbers 
 | 
#define XCAM_OBJ_DUR_FRAME_NUM 30 
 | 
  
 | 
#define XCAM_STATIC_FPS_CALCULATION(objname, count) \ 
 | 
    do{                                             \ 
 | 
        static uint32_t num_frame = 0;              \ 
 | 
        static struct timeval last_sys_time;        \ 
 | 
        static struct timeval first_sys_time;       \ 
 | 
        static bool b_last_sys_time_init = false;   \ 
 | 
        if (!b_last_sys_time_init) {                \ 
 | 
            gettimeofday (&last_sys_time, NULL);    \ 
 | 
            gettimeofday (&first_sys_time, NULL);   \ 
 | 
            b_last_sys_time_init = true;            \ 
 | 
        } else {                                    \ 
 | 
            if ((num_frame%count)==0) {             \ 
 | 
                double total, current;              \ 
 | 
                struct timeval cur_sys_time;        \ 
 | 
                gettimeofday (&cur_sys_time, NULL); \ 
 | 
                total = (cur_sys_time.tv_sec - first_sys_time.tv_sec)*1.0f +     \ 
 | 
                    (cur_sys_time.tv_usec - first_sys_time.tv_usec)/1000000.0f;  \ 
 | 
                current = (cur_sys_time.tv_sec - last_sys_time.tv_sec)*1.0f +    \ 
 | 
                    (cur_sys_time.tv_usec - last_sys_time.tv_usec)/1000000.0f;   \ 
 | 
                LOGI("%s Current fps: %.2f, Total avg fps: %.2f\n",            \ 
 | 
                    #objname, ((float)(count))/current, (float)num_frame/total); \ 
 | 
                last_sys_time = cur_sys_time;       \ 
 | 
            }                                       \ 
 | 
        }                                           \ 
 | 
        ++num_frame;                                \ 
 | 
    }while(0) 
 | 
  
 | 
#define XCAM_STATIC_PROFILING_START(name)               \ 
 | 
    static unsigned int name##_times = 0;               \ 
 | 
    static struct timeval name##_start_time;            \ 
 | 
    static struct timeval name##_end_time;              \ 
 | 
    gettimeofday (& name##_start_time, NULL);           \ 
 | 
    ++ name##_times; 
 | 
  
 | 
#define XCAM_STATIC_PROFILING_END(name, times_of_print) \ 
 | 
    static double name##_sum_time = 0;                  \ 
 | 
    gettimeofday (& name##_end_time, NULL);             \ 
 | 
    name##_sum_time += (name##_end_time.tv_sec - name##_start_time.tv_sec)*1000.0f +  \ 
 | 
                   (name##_end_time.tv_usec - name##_start_time.tv_usec)/1000.0f; \ 
 | 
    if (name##_times >= times_of_print) {               \ 
 | 
        LOGI("profiling %s, fps:%.2f duration:%.2fms\n", #name, \ 
 | 
            (name##_times*1000.0f/name##_sum_time), name##_sum_time/name##_times); \ 
 | 
        name##_times = 0;                               \ 
 | 
        name##_sum_time = 0.0;                          \ 
 | 
    } 
 | 
  
 | 
#if ENABLE_PROFILING 
 | 
#define XCAM_OBJ_PROFILING_DEFINES          \ 
 | 
    struct timeval   _profiling_start_time; \ 
 | 
    uint32_t         _profiling_times;      \ 
 | 
    double           _profiling_sum_duration 
 | 
  
 | 
#define XCAM_OBJ_PROFILING_INIT             \ 
 | 
    xcam_mem_clear (_profiling_start_time); \ 
 | 
    _profiling_times = 0;                   \ 
 | 
    _profiling_sum_duration = 0.0 
 | 
  
 | 
#define XCAM_OBJ_PROFILING_START \ 
 | 
    gettimeofday (&_profiling_start_time, NULL) 
 | 
  
 | 
#define XCAM_OBJ_PROFILING_END(name, times) \ 
 | 
    struct timeval profiling_now;           \ 
 | 
    gettimeofday (&profiling_now, NULL);    \ 
 | 
    _profiling_sum_duration +=              \ 
 | 
        (profiling_now.tv_sec - _profiling_start_time.tv_sec) * 1000.0f +  \ 
 | 
        (profiling_now.tv_usec - _profiling_start_time.tv_usec) / 1000.0f; \ 
 | 
    ++_profiling_times;                     \ 
 | 
    if (_profiling_times >= times) {        \ 
 | 
        char buf[1024];                     \ 
 | 
        snprintf (buf, 1024, "profiling %s,average duration:%.2fms\n", \ 
 | 
        (name), (_profiling_sum_duration/times)); \ 
 | 
        LOGI("%s", buf);                 \ 
 | 
        _profiling_times = 0;               \ 
 | 
        _profiling_sum_duration = 0.0;      \ 
 | 
    } 
 | 
#else 
 | 
#define XCAM_OBJ_PROFILING_DEFINES 
 | 
#define XCAM_OBJ_PROFILING_INIT 
 | 
#define XCAM_OBJ_PROFILING_START 
 | 
#define XCAM_OBJ_PROFILING_END(name, times) 
 | 
#endif 
 | 
  
 | 
#endif //XCAM_OBJ_DEBUG_H 
 |