| 1 | /* |
| 2 | * Generate a file for hardcoded tables |
| 3 | * |
| 4 | * Copyright (c) 2009 Reimar Döffinger <Reimar.Doeffinger@gmx.de> |
| 5 | * |
| 6 | * This file is part of FFmpeg. |
| 7 | * |
| 8 | * FFmpeg is free software; you can redistribute it and/or |
| 9 | * modify it under the terms of the GNU Lesser General Public |
| 10 | * License as published by the Free Software Foundation; either |
| 11 | * version 2.1 of the License, or (at your option) any later version. |
| 12 | * |
| 13 | * FFmpeg is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 | * Lesser General Public License for more details. |
| 17 | * |
| 18 | * You should have received a copy of the GNU Lesser General Public |
| 19 | * License along with FFmpeg; if not, write to the Free Software |
| 20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 21 | */ |
| 22 | |
| 23 | #ifndef AVCODEC_TABLEPRINT_H |
| 24 | #define AVCODEC_TABLEPRINT_H |
| 25 | |
| 26 | #include <inttypes.h> |
| 27 | #include <stdio.h> |
| 28 | |
| 29 | #include "libavutil/common.h" |
| 30 | |
| 31 | #define WRITE_1D_FUNC_ARGV(type, linebrk, fmtstr, ...)\ |
| 32 | void write_##type##_array(const type *data, int len)\ |
| 33 | {\ |
| 34 | int i;\ |
| 35 | printf(" ");\ |
| 36 | for (i = 0; i < len - 1; i++) {\ |
| 37 | printf(" "fmtstr",", __VA_ARGS__);\ |
| 38 | if ((i & linebrk) == linebrk) printf("\n ");\ |
| 39 | }\ |
| 40 | printf(" "fmtstr"\n", __VA_ARGS__);\ |
| 41 | } |
| 42 | |
| 43 | #define WRITE_1D_FUNC(type, fmtstr, linebrk)\ |
| 44 | WRITE_1D_FUNC_ARGV(type, linebrk, fmtstr, data[i]) |
| 45 | |
| 46 | #define WRITE_2D_FUNC(type)\ |
| 47 | void write_##type##_2d_array(const void *arg, int len, int len2)\ |
| 48 | {\ |
| 49 | const type *data = arg;\ |
| 50 | int i;\ |
| 51 | printf(" {\n");\ |
| 52 | for (i = 0; i < len; i++) {\ |
| 53 | write_##type##_array(data + i * len2, len2);\ |
| 54 | printf(i == len - 1 ? " }\n" : " }, {\n");\ |
| 55 | }\ |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * @name Predefined functions for printing tables |
| 60 | * |
| 61 | * @{ |
| 62 | */ |
| 63 | void write_int8_t_array (const int8_t *, int); |
| 64 | void write_uint8_t_array (const uint8_t *, int); |
| 65 | void write_uint16_t_array (const uint16_t *, int); |
| 66 | void write_uint32_t_array (const uint32_t *, int); |
| 67 | void write_float_array (const float *, int); |
| 68 | void write_int8_t_2d_array (const void *, int, int); |
| 69 | void write_uint8_t_2d_array (const void *, int, int); |
| 70 | void write_uint32_t_2d_array(const void *, int, int); |
| 71 | void write_float_2d_array (const void *, int, int); |
| 72 | /** @} */ // end of printfuncs group |
| 73 | |
| 74 | /* |
| 75 | * MSVC doesn't have %zu, since it was introduced in C99, |
| 76 | * but has its own %Iu for printing size_t values. |
| 77 | */ |
| 78 | #if defined(_MSC_VER) |
| 79 | #define FMT "Iu" |
| 80 | #else |
| 81 | #define FMT "zu" |
| 82 | #endif |
| 83 | |
| 84 | #define WRITE_ARRAY_ALIGNED(prefix, align, type, name) \ |
| 85 | do { \ |
| 86 | const size_t array_size = FF_ARRAY_ELEMS(name); \ |
| 87 | printf(prefix" DECLARE_ALIGNED("#align", " \ |
| 88 | #type", "#name")[%"FMT"] = {\n", \ |
| 89 | array_size); \ |
| 90 | write_##type##_array(name, array_size); \ |
| 91 | printf("};\n"); \ |
| 92 | } while(0) |
| 93 | |
| 94 | #define WRITE_ARRAY(prefix, type, name) \ |
| 95 | do { \ |
| 96 | const size_t array_size = FF_ARRAY_ELEMS(name); \ |
| 97 | printf(prefix" "#type" "#name"[%"FMT"] = {\n", \ |
| 98 | array_size); \ |
| 99 | write_##type##_array(name, array_size); \ |
| 100 | printf("};\n"); \ |
| 101 | } while(0) |
| 102 | |
| 103 | #define WRITE_2D_ARRAY(prefix, type, name) \ |
| 104 | do { \ |
| 105 | const size_t array_size1 = FF_ARRAY_ELEMS(name); \ |
| 106 | const size_t array_size2 = FF_ARRAY_ELEMS(name[0]); \ |
| 107 | printf(prefix" "#type" "#name"[%"FMT"][%"FMT"] = {\n", \ |
| 108 | array_size1, array_size2 ); \ |
| 109 | write_##type##_2d_array(name, array_size1, array_size2); \ |
| 110 | printf("};\n"); \ |
| 111 | } while(0) |
| 112 | |
| 113 | |
| 114 | WRITE_1D_FUNC(int8_t, "%3"PRIi8, 15) |
| 115 | WRITE_1D_FUNC(uint8_t, "0x%02"PRIx8, 15) |
| 116 | WRITE_1D_FUNC(uint16_t, "0x%08"PRIx16, 7) |
| 117 | WRITE_1D_FUNC(uint32_t, "0x%08"PRIx32, 7) |
| 118 | WRITE_1D_FUNC(float, "%.18e", 3) |
| 119 | |
| 120 | WRITE_2D_FUNC(int8_t) |
| 121 | WRITE_2D_FUNC(uint8_t) |
| 122 | WRITE_2D_FUNC(uint32_t) |
| 123 | WRITE_2D_FUNC(float) |
| 124 | |
| 125 | static inline void write_fileheader(void) |
| 126 | { |
| 127 | printf("/* This file was automatically generated. */\n"); |
| 128 | printf("#include <stdint.h>\n"); |
| 129 | } |
| 130 | |
| 131 | #endif /* AVCODEC_TABLEPRINT_H */ |