blob: f39e621805fe7d78ece58a6597402d0064eb9029
1 | /* |
2 | * Vidvox Hap |
3 | * Copyright (C) 2015 Vittorio Giovara <vittorio.giovara@gmail.com> |
4 | * Copyright (C) 2015 Tom Butterworth <bangnoise@gmail.com> |
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_HAP_H |
24 | #define AVCODEC_HAP_H |
25 | |
26 | #include <stdint.h> |
27 | |
28 | #include "libavutil/opt.h" |
29 | |
30 | #include "bytestream.h" |
31 | #include "texturedsp.h" |
32 | |
33 | enum HapTextureFormat { |
34 | HAP_FMT_RGBDXT1 = 0x0B, |
35 | HAP_FMT_RGBADXT5 = 0x0E, |
36 | HAP_FMT_YCOCGDXT5 = 0x0F, |
37 | }; |
38 | |
39 | enum HapCompressor { |
40 | HAP_COMP_NONE = 0xA0, |
41 | HAP_COMP_SNAPPY = 0xB0, |
42 | HAP_COMP_COMPLEX = 0xC0, |
43 | }; |
44 | |
45 | enum HapSectionType { |
46 | HAP_ST_DECODE_INSTRUCTIONS = 0x01, |
47 | HAP_ST_COMPRESSOR_TABLE = 0x02, |
48 | HAP_ST_SIZE_TABLE = 0x03, |
49 | HAP_ST_OFFSET_TABLE = 0x04, |
50 | }; |
51 | |
52 | typedef struct HapChunk { |
53 | enum HapCompressor compressor; |
54 | int compressed_offset; |
55 | size_t compressed_size; |
56 | int uncompressed_offset; |
57 | size_t uncompressed_size; |
58 | } HapChunk; |
59 | |
60 | typedef struct HapContext { |
61 | AVClass *class; |
62 | |
63 | TextureDSPContext dxtc; |
64 | GetByteContext gbc; |
65 | |
66 | enum HapTextureFormat opt_tex_fmt; /* Texture type (encoder only) */ |
67 | int opt_chunk_count; /* User-requested chunk count (encoder only) */ |
68 | int opt_compressor; /* User-requested compressor (encoder only) */ |
69 | |
70 | int chunk_count; |
71 | HapChunk *chunks; |
72 | int *chunk_results; /* Results from threaded operations */ |
73 | |
74 | int tex_rat; /* Compression ratio */ |
75 | const uint8_t *tex_data; /* Compressed texture */ |
76 | uint8_t *tex_buf; /* Buffer for compressed texture */ |
77 | size_t tex_size; /* Size of the compressed texture */ |
78 | |
79 | size_t max_snappy; /* Maximum compressed size for snappy buffer */ |
80 | |
81 | int slice_count; /* Number of slices for threaded operations */ |
82 | |
83 | /* Pointer to the selected compress or decompress function */ |
84 | int (*tex_fun)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block); |
85 | } HapContext; |
86 | |
87 | /* |
88 | * Set the number of chunks in the frame. Returns 0 on success or an error if: |
89 | * - first_in_frame is 0 and the number of chunks has changed |
90 | * - any other error occurs |
91 | */ |
92 | int ff_hap_set_chunk_count(HapContext *ctx, int count, int first_in_frame); |
93 | |
94 | /* |
95 | * Free resources associated with the context |
96 | */ |
97 | av_cold void ff_hap_free_context(HapContext *ctx); |
98 | |
99 | #endif /* AVCODEC_HAP_H */ |
100 |