blob: 0e18040b977d0b4130262697c520d02f1ac09838 [file] [log] [blame] [edit]
/*
* Copyright (C) 2021 Amlogic 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.
*/
#ifndef _TOOS_UTILS_H_
#define _TOOS_UTILS_H_
/**
* ROUND_UP_2:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 2.
*/
#define ROUND_UP_2(num) (((num)+1)&~1)
/**
* ROUND_UP_4:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 4.
*/
#define ROUND_UP_4(num) (((num)+3)&~3)
/**
* ROUND_UP_8:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 8.
*/
#define ROUND_UP_8(num) (((num)+7)&~7)
/**
* ROUND_UP_16:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 16.
*/
#define ROUND_UP_16(num) (((num)+15)&~15)
/**
* ROUND_UP_32:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 32.
*/
#define ROUND_UP_32(num) (((num)+31)&~31)
/**
* ROUND_UP_64:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 64.
*/
#define ROUND_UP_64(num) (((num)+63)&~63)
/**
* ROUND_UP_128:
* @num: integer value to round up
*
* Rounds an integer value up to the next multiple of 128.
* Since: 1.4
*/
#define ROUND_UP_128(num) (((num)+127)&~127)
/**
* ROUND_UP_N:
* @num: integrer value to round up
* @align: a power of two to round up to
*
* Rounds an integer value up to the next multiple of @align. @align MUST be a
* power of two.
*/
#define ROUND_UP_N(num,align) ((((num) + ((align) - 1)) & ~((align) - 1)))
/**
* ROUND_DOWN_2:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 2.
*/
#define ROUND_DOWN_2(num) ((num)&(~1))
/**
* ROUND_DOWN_4:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 4.
*/
#define ROUND_DOWN_4(num) ((num)&(~3))
/**
* ROUND_DOWN_8:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 8.
*/
#define ROUND_DOWN_8(num) ((num)&(~7))
/**
* ROUND_DOWN_16:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 16.
*/
#define ROUND_DOWN_16(num) ((num)&(~15))
/**
* ROUND_DOWN_32:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 32.
*/
#define ROUND_DOWN_32(num) ((num)&(~31))
/**
* ROUND_DOWN_64:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 64.
*/
#define ROUND_DOWN_64(num) ((num)&(~63))
/**
* ROUND_DOWN_128:
* @num: integer value to round down
*
* Rounds an integer value down to the next multiple of 128.
* Since: 1.4
*/
#define ROUND_DOWN_128(num) ((num)&(~127))
/**
* ROUND_DOWN_N:
* @num: integrer value to round down
* @align: a power of two to round down to
*
* Rounds an integer value down to the next multiple of @align. @align MUST be a
* power of two.
*/
#define ROUND_DOWN_N(num,align) (((num) & ~((align) - 1)))
/**
* @brief get unsigned int value from char p buffer
*
* @param p char buffer
* @return unsigned int
*/
unsigned int getU32( unsigned char *p );
/**
* @brief put unsigned int n to char *p
*
* @param p the char buffer
* @param n unsigned int value been put
* @return int return 4 bytes that is sizeof(int)
*/
int putU32( unsigned char *p, unsigned n );
/**
* @brief get signed int 64 bit value from char p buffer
*
* @param p char buffer
* @return signed int 64 bit value
*/
int64_t getS64( unsigned char *p );
/**
* @brief put int 64 bit value of n to char *p
*
* @param p the char buffer
* @param n int 64 bit value
* @return int 8 bytes that is sizeof(int64_t)
*/
int putS64( unsigned char *p, int64_t n );
#define TIME_SECOND (1000000000)
#define TIME_INVALID_VALUE ((int64_t) -1)
#define TIME_IS_VALID(time) (((int64_t)(time)) != TIME_INVALID_VALUE)
/* timestamp debugging macros */
/**
* TIME_FORMAT: (skip):
*
* A string that can be used in printf-like format strings to display a
* pts value in h:m:s format. Use TIME_ARGS() to construct
* the matching arguments.
*
* Example:
* printf(GST_TIME_FORMAT "\n", TIME_ARGS(ts));
* ]|
*/
#define TIME_FORMAT "%u:%02u:%02u.%09u"
/**
* TIME_ARGS: (skip):
*
* Format pts for the #TIME_FORMAT format string. Note: pts will be
* evaluated more than once.
*/
#define TIME_ARGS(t) \
TIME_IS_VALID (t) ? \
(uint32_t) (((int64_t)(t)) / (TIME_SECOND * 60 * 60)) : 99, \
TIME_IS_VALID (t) ? \
(uint32_t) ((((int64_t)(t)) / (TIME_SECOND * 60)) % 60) : 99, \
TIME_IS_VALID (t) ? \
(uint32_t) ((((int64_t)(t)) / TIME_SECOND) % 60) : 99, \
TIME_IS_VALID (t) ? \
(uint32_t) (((int64_t)(t)) % TIME_SECOND) : 999999999
#endif /*_TOOS_UTILS_H_*/