diff options
Diffstat (limited to 'debian/transcode/transcode-1.1.7/libtc/libtc.h')
| -rw-r--r-- | debian/transcode/transcode-1.1.7/libtc/libtc.h | 862 |
1 files changed, 862 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/libtc/libtc.h b/debian/transcode/transcode-1.1.7/libtc/libtc.h new file mode 100644 index 00000000..8e2c6938 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/libtc/libtc.h @@ -0,0 +1,862 @@ +/* + * libtc.h - include file for utilities library for transcode + * + * Copyright (C) Thomas Oestreich - August 2003 + * Copyright (C) Transcode Team - 2005-2010 + * + * This file is part of transcode, a video stream processing tool + * + * transcode is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * transcode is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef LIBTC_H +#define LIBTC_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdarg.h> +#include <stdlib.h> +#include <stdint.h> +#include <sys/types.h> +#include <sys/param.h> +#include <string.h> +#include <pthread.h> + +#ifndef OS_BSD +# ifdef HAVE_MALLOC_H +# include <malloc.h> +# endif +#endif + +#include "tccodecs.h" +#include "tcformats.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + TC_FALSE, + TC_TRUE +}; + +#define TC_NULL_MATCH -1 + +#define TC_BUF_MAX 1024 +#define TC_BUF_LINE 256 +#define TC_BUF_MIN 128 + +#define TC_MAX(a, b) (((a) > (b)) ?(a) :(b)) +#define TC_MIN(a, b) (((a) < (b)) ?(a) :(b)) +/* clamp x between a and b */ +#define TC_CLAMP(x, a, b) TC_MIN(TC_MAX((a), (x)), (b)) + +/* colors macros */ +#define COL(x) "\033[" #x ";1m" +#define COL_RED COL(31) +#define COL_GREEN COL(32) +#define COL_YELLOW COL(33) +#define COL_BLUE COL(34) +#define COL_WHITE COL(37) +#define COL_GRAY "\033[0m" + +#define TC_LOG_COLOR_ENV_VAR "TRANSCODE_LOG_NO_COLOR" +#define TC_LOG_COLOR_OPTION "--log_no_color" + +/* + * Made to be compatible with + * TC_IMPORT_{OK,ERROR,UNKNOWN} + * TC_EXPORT_{OK,ERROR,UNKNOWN} + * see src/transcode.h + */ +typedef enum { + TC_ERROR = -1, + TC_OK = 0, + TC_INTERRUPT = 1, + TC_UNKNOWN, /* MUST always be the last one */ +} TCReturnCode; + + +typedef enum { + TC_LOG_ERR = 0, /* critical error condition */ + TC_LOG_WARN, /* non-critical error condition */ + TC_LOG_INFO, /* informative highlighted message */ + TC_LOG_MSG, /* regular message */ + + TC_LOG_EXTRA, /* must always be the last */ + /* + * on this special log level is guaranteed that message will be logged + * verbatim: no tag, no colours, anything + */ +} TCLogLevel; + + +/* + * libtc_init: + * tune up some libtc settings. + * You DO NOT always NEED to use this function because libtc has it + * (most of time) sane defaults; just use this function to adapt + * libtc behaviour to some unusual conditions, like if stderr is a file + * and not a terminal. + * If you use this function, you MUST call it BEFORE any other libtc call, + * or you will experience undefined behaviours. + * It's safe to call libtc_setup multiple times BEFORE to call any other + * libtc function. + * + * Parameters: + * flags: flag to tune libtc behaviour (see above) + * Return Value: + * N/A + * Side effects: + * various. See description of flags above. + * Preconditions: + * this function, IF used, MUST be called BEFORE any other libtc function. + */ +void libtc_init(int *argc, char ***argv); + +/* + * tc_log: + * main libtc logging function. Log arbitrary messages according + * to a printf-like format chosen by the caller. + * + * Parameters: + * level: priority of message to log; see TCLogLevel definition + * above. + * tag: header of message, to identify subsystem originating + * the message. It's suggested to use __FILE__ as + * fallback default tag. + * fmt: printf-like format string. You must provide enough + * further arguments to fullfill format string, doing + * otherwise will cause an undefined behaviour, most + * likely a crash. + * Return Value: + * 0 if message succesfully logged. + * -1 if message was truncated. + * (message too large and buffer allocation failed). + * Side effects: + * this function store final message in an intermediate string + * before to log it to destination. If such intermediate string + * is wider than a given amount (TC_BUF_MIN * 2 at moment + * of writing), tc_log needs to dinamically allocate some memory. + * This allocation can fail, and as result log message will be + * truncated to fit in avalaible static buffer. + */ +int tc_log(TCLogLevel level, const char *tag, const char *fmt, ...) +#ifdef HAVE_GCC_ATTRIBUTES +__attribute__((format(printf,3,4))) +#endif +; + +/* + * When to use tc_log*() stuff? + * + * tc_log() family should be used for non-output status messages, like + * the ones coming from the various modules and components of transcode. + * For actual output use printf() (or fprintf(), etc.) as appropriate. + * (yes, this means that transcode prints a lot of status and a very + * few output messages). + */ + +/* compatibility macros */ +#define tc_error(format, args...) do { \ + tc_log(TC_LOG_ERR, PACKAGE, format , ## args); \ + exit(1); \ +} while(0) +#define tc_info(format, args...) \ + tc_log(TC_LOG_INFO, PACKAGE, format , ## args) +#define tc_warn(format, args...) \ + tc_log(TC_LOG_WARN, PACKAGE, format , ## args) + +/* macro goodies */ +#define tc_log_error(tag, format, args...) \ + tc_log(TC_LOG_ERR, tag, format , ## args) +#define tc_log_info(tag, format, args...) \ + tc_log(TC_LOG_INFO, tag, format , ## args) +#define tc_log_warn(tag, format, args...) \ + tc_log(TC_LOG_WARN, tag, format , ## args) +#define tc_log_msg(tag, format, args...) \ + tc_log(TC_LOG_MSG, tag, format , ## args) + +#define tc_log_perror(tag, string) do { \ + const char *__s = (string); /* watch out for side effects */ \ + tc_log_error(tag, "%s%s%s", __s ? __s : "", \ + (__s && *__s) ? ": " : "", strerror(errno)); \ +} while (0) + +/*************************************************************************/ + +/* + * tc_mangle_cmdline: + * parse a command line option array looking for a given option. + * Given option can be short or long but must be given literally. + * So, if you want to mangle "--foobar", give "--foobar" not + * "foobar". Same story for short options "-V": use "-V" not "V". + * If given option isn't found in string option array, do nothing + * and return succesfull (see below). If option is found but + * its argument isn't found, don't mangle string options array + * but return failure. + * If BOTH option and its value is found, store a pointer to + * option value into "optval" parameter and remove both option + * and value from string options array. + * Parameters: + * argc: pointer to number of values present into option string + * array. This parameter must be !NULL and it's updated + * by a succesfull call of this function. + * argv: pointer to array of option string items. This parameter + * must be !NULL and it's updated by a succesfull call of + * this function + * opt: option to look for. + * optval: if !NULL, this function will expect a value for given option; + * if such value is found, `optval' will point to it. + * Return value: + * 1: no option found + * 0: succesfull + * -1: bad parameter(s) (NULL) + * -2: bad usage: expected value for option, but not found, + * Postconditions: + * this function must operate trasparently by always leaving + * argc/argv in an usable and consistent state. + */ +int tc_mangle_cmdline(int *argc, char ***argv, + const char *opt, const char **optval); + +/* + * tc_test_program: + * check if a given program is avalaible in current PATH. + * This function of course needs to read (and copy) the PATH + * environment variable + * + * Parameters: + * name: name of program to look for. + * Return Value: + * 0 if program was found in PATH. + * ENOENT if program was not found in PATH + * value of errno if program was found in PATH but it wasn't accessible + * for some reason. + */ +int tc_test_program(const char *name); + +/* + * Safer string functions from OpenBSD, because these are not in all + * libc implementations. + */ + +#ifndef HAVE_STRLCPY +size_t strlcpy(char *dst, const char *src, size_t size); +#endif + +#ifndef HAVE_STRLCAT +size_t strlcat(char *dst, const char *src, size_t size); +#endif + +/* + * tc_strsplit: + * split a given string into tokens using given separator character. + * Return NULL-terminated array of splitted tokens, and optionally + * return (via a out parameter) size of returned array. + * + * Parameters: + * str: string to split + * sep: separator CHARACTER: cut string when sep is found + * pieces_num: if not NULL, store here the size of returned array + * Return value: + * NULL-terminated array of splitted pieces. + * You must explicitely free this returned array by using tc_strfreev + * (see below) in order to avoid memleaks. + */ +char **tc_strsplit(const char *str, char sep, size_t *pieces_num); + +/* + * tc_strfreev: + * return an array of strings as returned by tc_strsplit + * + * Parameters: + * pieces: return value of tc_strsplit to be freed. + * Return value: + * None. + */ +void tc_strfreev(char **pieces); + +/* + * tc_strstrip: + * remove IN PLACE heading and trailing whitespaces from a given + * C-string. This means that given string will be mangled to + * remove such whitespace while moving pointer to first element + * and terminating '\0'. + * It's safe to supply a NULL string. + * Parameters: + * s: string to strip. + * Return Value: + * None + */ +void tc_strstrip(char *s); + +/* + * tc_test_string: + * check the return value of snprintf, strlcpy, and strlcat. + * If an error is detected, prints reason. + * + * Parameters: + * file: name of source code file on which this function is called + * (this parameter is usually equal to __FILE__). + * line: line of source code file on which this function is called + * (this parameter is usually equal to __LINE__). + * limit: maximum size of char buffer previously used. + * ret: return code of one of above function. + * errnum: error code (this parameter is usually equal to errno) + * Return Value: + * < 0 is an internal error. + * >= limit means characters were truncated. + * 0 if not problems. + * 1 if error. + */ +int tc_test_string(const char *file, int line, int limit, + long ret, int errnum); + + +/* + * These versions of [v]snprintf() return -1 if the string was truncated, + * printing a message to stderr in case of truncation (or other error). + */ +#define tc_vsnprintf(buf,limit,format,args...) \ + _tc_vsnprintf(__FILE__, __LINE__, buf, limit, format , ## args) +#define tc_snprintf(buf,limit,format,args...) \ + _tc_snprintf(__FILE__, __LINE__, buf, limit, format , ## args) + +int _tc_vsnprintf(const char *file, int line, char *buf, size_t limit, + const char *format, va_list args); +int _tc_snprintf(const char *file, int line, char *buf, size_t limit, + const char *format, ...); + +/*************************************************************************/ + +/* + * tc_malloc: just a simple wrapper on libc's malloc(), with emits + * an additional warning, specifying calling context, + * if allocation fails + * tc_zalloc: like tc_malloc, but zeroes all acquired memory before + * returning to the caller (this is quite common in + * transcode codebase) + * tc_realloc: the same thing for realloc() + * tc_free: the companion memory releasing wrapper. + */ +#define tc_malloc(size) \ + _tc_malloc(__FILE__, __LINE__, size) +#define tc_zalloc(size) \ + _tc_zalloc(__FILE__, __LINE__, size) +#define tc_realloc(p,size) \ + _tc_realloc(__FILE__, __LINE__, p, size) +#define tc_free(ptr) \ + free(ptr); + +/* + * _tc_malloc: + * do the real work behind tc_malloc macro + * + * Parameters: + * file: name of the file on which call occurs + * line: line of above file on which call occurs + * (above two parameters are intended to be, and usually + * are, filled by tc_malloc macro) + * size: size of desired chunk of memory + * Return Value: + * a pointer of acquired memory, or NULL if acquisition fails + * Side effects: + * a message is printed on stderr if acquisition fails + * Preconditions: + * file param not null + */ +void *_tc_malloc(const char *file, int line, size_t size); + +/* + * _tc_zalloc: + * do the real work behind tc_zalloc macro + * + * Parameters: + * file: name of the file on which call occurs + * line: line of above file on which call occurs + * (above two parameters are intended to be, and usually + * are, filled by tc_malloc macro) + * size: size of desired chunk of memory + * Return Value: + * a pointer of acquired memory, or NULL if acquisition fails + * Side effects: + * a message is printed on stderr if acquisition fails + * Preconditions: + * file param not null + * Postconditions: + * if call succeed, acquired memory contains all zeros + */ +void *_tc_zalloc(const char *file, int line, size_t size); + +/* + * _tc_realloc: + * do the real work behind tc_realloc macro + * + * Parameters: + * file: name of the file on which call occurs + * line: line of above file on which call occurs + * (above two parameters are intended to be, and usually + * are, filled by tc_malloc macro) + * p: pointer to reallocate + * size: size of desired chunk of memory + * Return Value: + * a pointer of acquired memory, or NULL if acquisition fails + * Side effects: + * a message is printed on stderr if acquisition fails + * Preconditions: + * file param not null + */ +void *_tc_realloc(const char *file, int line, void *p, size_t size); + +/* + * Allocate a buffer aligned to the machine's page size, if known. The + * buffer must be freed with buffree() (not free()). + */ + +#define tc_bufalloc(size) \ + _tc_bufalloc(__FILE__, __LINE__, size) + +/* + * _tc_malloc: + * do the real work behind _tc_bufalloc macro + * + * Parameters: + * file: name of the file on which call occurs + * line: line of above file on which call occurs + * (above two parameters are intended to be, and usually + * are, filled by tc_malloc macro) + * size: size of desired chunk of memory + * Return Value: + * a pointer of acquired, aligned, memory, or NULL if acquisition fails + * Side effects: + * a message is printed on stderr (20051017) + * Preconditions: + * file param not null + */ + +void *_tc_bufalloc(const char *file, int line, size_t size); + +/* + * tc_buffree: + * release a memory buffer acquired using tc_bufalloc + * + * Parameters: + * ptr: pointer obtained as return value of a succesfull + * tc_bufalloc() call + * Return Value: + * none + * Preconditions: + * ptr is acquired via tc_bufalloc(). Really BAD things will happen + * if a buffer acquired via tc_bufalloc() is released using anything + * but tc_buffree(), or vice versa. + */ +void tc_buffree(void *ptr); + +/*************************************************************************/ + +/* + * tc_strdup: a macro wrapper on top of _tc_strndup, like tc_malloc, above + * tc_strndup: like tc_strdup, but copies only N byte of given string + * + * This function does the same thing of libc's standard function + * strdup(3) and the GNU extension strndup(3), but using libtc's + * tc_malloc features. + */ +#define tc_strdup(s) \ + _tc_strndup(__FILE__, __LINE__, s, strlen(s)) +#define tc_strndup(s, n) \ + _tc_strndup(__FILE__, __LINE__, s, n) + +/* + * _tc_strndup: + * do the real work behind tc_strdup/tc_strndup macro. This function + * adds automatically and implicitely a '\0' terminator at end of + * copied string. + * + * Parameters: + * file: name of the file on which call occurs + * line: line of above file on which call occurs (above two parameters + * are intended to be, and usually are, filled by tc_malloc macro) + * s: null-terminated string to copy + * n: copy at most 'n' characters of original string. + * Return Value: + * a pointer to a copy of given string. This pointer must be freed using + * tc_free() to avoid memory leaks + * Side effects: + * a message is printed on stderr (20051017) + * Preconditions: + * file param not null + * Postconditions: + * none + */ +char *_tc_strndup(const char *file, int line, const char *s, size_t n); + +/* + * tc_file_check: + * verify the type of a given file (path) this function will be + * deprecated very soon, replaced by a powered tc_probe_path(). + * + * Parameters: + * file: the file (really: path) to verify. + * Return Value: + * -1 if an internal error occur + * 0 if given path is really a file + * 1 if given path is a directory + * Side effects: + * none + * Preconditions: + * none + * Postconditions: + * none + */ +int tc_file_check(const char *file); + +/* + * tc_pread: + * read an entire buffer from a file descriptor, restarting + * automatically if interrupted. This function is basically a wrapper + * around posix read(2); read(2) can be interrupted by a signal, + * so doesn't guarantee that all requested bytes are effectively readed + * when read(2) returns; this function ensures so, except for critical + * errors. + * Parameters: + * fd: read data from this file descriptor + * buf: pointer to a buffer which will hold readed data + * len: how much data function must read from fd + * Return Value: + * size of effectively readed data + * Side effects: + * errno is readed internally + * Postconditions: + * read exactly the requested bytes, if no *critical* + * (tipically I/O related) error occurs. + */ +ssize_t tc_pread(int fd, uint8_t *buf, size_t len); + +/* + * tc_pwrite: + * write an entire buffer from a file descriptor, restarting + * automatically if interrupted. This function is basically a wrapper + * around posix write(2); write(2) can be interrupted by a signal, + * so doesn't guarantee that all requested bytes are effectively writed + * when write(2) returns; this function ensures so, except for critical + * errors. + * Parameters: + * fd: write data on this file descriptor + * buf: pointer to a buffer which hold data to be written + * len: how much data function must write in fd + * Return Value: + * size of effectively written data + * Side effects: + * errno is readed internally + * Postconditions: + * write exactly the requested bytes, if no *critical* (tipically I/O + * related) error occurs. + */ +ssize_t tc_pwrite(int fd, const uint8_t *buf, size_t len); + +/* + * tc_preadwrite: + * read all data avalaible from a file descriptor, putting it on the + * other one. + * Parameters: + * in: read data from this file descriptor + * out: write readed data on this file descriptor + * Return Value: + * -1 if a read error happens + * 0 if no error happens + * Postconditions: + * move the entire content of 'in' into 'out', if no *critical* + * (tipically I/O related) error occurs. + */ +int tc_preadwrite(int in, int out); + +enum { + TC_PROBE_PATH_INVALID = 0, + TC_PROBE_PATH_ABSPATH, + TC_PROBE_PATH_RELDIR, + TC_PROBE_PATH_FILE, + TC_PROBE_PATH_BKTR, + TC_PROBE_PATH_SUNAU, + TC_PROBE_PATH_V4L_VIDEO, + TC_PROBE_PATH_V4L_AUDIO, + TC_PROBE_PATH_OSS, + /* add more elements here */ +}; + +/* + * tc_probe_path: + * verify the type of a given path. + * + * Parameters: + * path: the path to probe. + * Return Value: + * the probed type of path. Can be TC_PROBE_PATH_INVALID if given path + * doesn't exists or an internal error occur. + * Side effects: + * if function fails, one or more debug message can be issued using + * tc_log*(). A name resolve request can be issued to system. + */ +int tc_probe_path(const char *name); + +/* codec helpers ***********************************************************/ + +/* + * tc_translate_codec_id: + * translate a CODEC_* value to corresponding TC_CODEC_* one. + * + * Parameters: + * codec: CODEC_* value to translate. + * Return value: + * corresponding TC_CODEC_* value, or + * TC_CODEC_ERROR if given CODEC_XXX hasn't corresponding TC_CODEC_XXX + * or if it;s just unknown. + */ +int tc_translate_codec_id(TCCodecID codec); + +/* + * tc_codec_to_comment: + * return a short constant descriptive string given the codec identifier. + * + * Parameters: + * codec: TC_CODEC_* value to represent. + * Return value: + * a constant string describing the given codec (there is no need to + * free() it). + * Postconditions: + * Always return something sensible, even if unknown codec id was given. + */ +const char* tc_codec_to_comment(TCCodecID codec); + +/* + * tc_codec_to_string: + * return the codec name as a lowercase constant string, + * given the codec identifier. + * + * Parameters: + * codec: the TC_CODEC_* value to represent. + * Return value: + * a constant string representing the given codec (there is no need to + * free() it). + * NULL if codec is (yet) unknown. + */ +const char* tc_codec_to_string(TCCodecID codec); + +/* + * tc_codec_from_string: + * extract codec identifier from its string representation + * + * Parameters: + * codec: string representation of codec, lowercase (name). + * Return value: + * the correspinding TC_CODEC_* of given string representation, + * or TC_CODEC_ERROR if string is unknown or wrong. + */ +TCCodecID tc_codec_from_string(const char *codec); + +/* + * tc_codec_fourcc: + * extract the FOURCC code for a given codec, if exists. + * + * Parameters: + * codec: TC_CODEC_* value to get the FOURCC for. + * Return value: + * a constant string representing the FOURCC for a given codec (there + * is no need to free() it NULL of codec's FOURCC is (yet) unknown or + * given codec has _not_ FOURCC (es: audio codec identifiers). + */ +const char* tc_codec_fourcc(TCCodecID codec); + +/* + * tc_codec_description: + * describe a codec, given its ID. + * + * Parameters: + * codec: TC_CODEC_* value to get the description for. + * buf: buffer provided to caller. Description will be stored here. + * bufsize: size of the given buffer. + * Return value: + * -1 if requested codec isn't known. + * 0 truncation error (given buffer too small). + * >0 no errors. + */ +int tc_codec_description(TCCodecID codec, char *buf, size_t bufsize); + +/* + * tc_codec_is_multipass: + * tell if a given codec is multipass capable or not. + * + * Parameters: + * codec: TC_CODEC_* value to inquiry. + * Return value: + * TC_TRUE: given codec is multipass capable. + * TC_FALSE: given codec is NOT multipass capable OR is not known. + */ +int tc_codec_is_multipass(TCCodecID codec); + +/*************************************************************************/ + +/* + * tc_compute_fast_resize_values: + * compute internal values needed for video frame fast resize (-B/-X) + * given base resolution (ex_v_{width,height}) and target one + * (zoom_{width,height}). + * WARNING: at moment of writing there are some back compatibility + * constraints, nevethless this function interface (notabley I/O + * parameters passing) needs a SERIOUS rethink. + * + * Parameters: + * _vob: pointer to a structure on which read/store values for + * computation. + * Should ALWAYS really be a pointer to a vob_t structure, + * but vob_t pointer isn't used (yet) in order to avoid + * libtc/transcode.h interdependency. + * I'm not yet convinced that those informations should go + * in TCExportInfo because only transcode core needs them. + * Perhaps the cleanest solution is to introduce yet + * another structure :\. + * If anyone has a better solution just let me know -- FR. + * vob_t fields used: + * ex_v_{width, height}: base resolution (In) + * zoom_{width, height}: target resolution (In) + * resize{1,2}_mult, vert_resize{1,2}, hori_resize{1,2}: + * computed parameters (Out) + * strict: if !0, allow only enlarging and shrinking of frame in + * both dimensions, and fail otherwise. + * Return value: + * 0 succesfull + * -1 error, computation failed + * (i.e. width or height not multiple of 8) + * Side effects: + * if succesfull, zoom_{width,height} will be set to 0. + */ +int tc_compute_fast_resize_values(void *_vob, int strict); + +/*************************************************************************/ + +/** + * tc_find_best_aspect_ratio: + * set sar_num and sar_den to the sample aspect ratio (also called + * pixel aspect ratio) described by vob->ex_par, + * vob->ex_par_width, vob->ex_par_height and vob->ex_asr. + * + * This function might return quite high values in sar_num and + * sar_den. Depending on what codec these parameters are given to, + * eventually a common factor should be reduced first. In case of x264 + * this is not needed, because it's done in x264's code. + * + * Parameters: + * vob: constant pointer to vob structure. + * sar_num: integer to store SAR-numerator in. + * sar_den: integer to store SAR-denominator in. + * tag: tag to use in log messages (if any). + * + * Returns: + * 0 on success, nonzero otherwise (this means bad parameters). + */ +int tc_find_best_aspect_ratio(const void *_vob, + int *sar_num, int *sar_den, + const char *tag); + +/*************************************************************************/ + +/* + * XXX: add some general notes about quantization matrices stored + * into files (format etc. etc.) + * + * tc_*_matrix GOTCHA: + * Why _two_ allowed elements wideness? Why this mess? + * The problem is that XviD and libavcodec wants elements for + * quantization matrix in two different wideness. Obviously + * we DON'T want to patch such sources, so we must handle in + * some way this difference. + * Of course we are looking for cleaner solutions. + * -- fromani 20060305 + */ + +/* + * Total size (=number of elements) of quantization matrix + * for following two support functions + */ +#define TC_MATRIX_SIZE (64) + +/* + * tc_read_matrix: + * read a quantization matrix from given file. + * Can read 8-bit wide or 16-bit wide matrix elements. + * Store readed matrix in a caller-provided buffer. + * + * Caller can select the elements wideness just + * providing a not-NULL buffer for corresponding buffer. + * For example, if caller wants to read a quantization matrix + * from 'matrix.txt', and want 16-bit wide elements, it + * will call + * + * uint16_t matrix[TC_MATRIX_SIZE]; + * tc_read_matrix('matrix.txt', NULL, matrix); + * + * Parameters: + * filename: read quantization matrix from this file. + * m8: buffer for 8-bit wide elements quantization matrix + * m16: buffer for 16-bit wide elements quantization matrix + * + * NOTE: if m8 AND m16 BOTH refers to valid buffers, 8-bit + * wideness is preferred. + * Return value: + * -1 filename not found, or neither buffers is valid. + * +1 read error: matrix incomplete or badly formatted. + * 0 no errors. + * Side effects: + * a file on disk is open, readed, closed. + * Preconditions: + * buffer provided by caller MUST be large enough to hold + * TC_MATRIX_SIZE elements of requested wideness. + * At least one given buffer is valid. + */ +int tc_read_matrix(const char *filename, uint8_t *m8, uint16_t *m16); + +/* + * tc_print_matrix: + * print (using tc_log*) a quantization matrix. + * Can print 8-bit wide or 16-bit wide matrix elements. + * + * Caller must provide a valid pointer correspoinding to + * wideness of elements of matrix to be printed. + * Example: quantization matrix has 8-bit wide elements: + * + * uint8_t matrix[TC_MATRIX_SIZE]; + * // already filled with something useful + * tc_print_matrix(matrix, NULL); + * + * Parameters: + * m8: pointer to 8-bit wide elements quantization matrix. + * m16: pointer to 16-bit wide elements quantization matrix. + * + * NOTE: if m8 AND m16 BOTH refers to valid buffers, 8-bit + * wideness is preferred. + * Preconditions: + * At least one given pointer is valid. + */ +void tc_print_matrix(uint8_t *m8, uint16_t *m16); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBTC_H */ |
