chd 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +30 -0
  3. data/chd.gemspec +29 -0
  4. data/ext/chd.c +1008 -0
  5. data/ext/extconf.rb +60 -0
  6. data/lib/chd/cd.rb +272 -0
  7. data/lib/chd/metadata.rb +196 -0
  8. data/lib/chd/version.rb +4 -0
  9. data/lib/chd.rb +21 -0
  10. data/libchdr/CMakeLists.txt +104 -0
  11. data/libchdr/LICENSE.txt +24 -0
  12. data/libchdr/README.md +7 -0
  13. data/libchdr/deps/lzma-19.00/CMakeLists.txt +33 -0
  14. data/libchdr/deps/lzma-19.00/LICENSE +3 -0
  15. data/libchdr/deps/lzma-19.00/include/7zTypes.h +375 -0
  16. data/libchdr/deps/lzma-19.00/include/Alloc.h +51 -0
  17. data/libchdr/deps/lzma-19.00/include/Bra.h +64 -0
  18. data/libchdr/deps/lzma-19.00/include/Compiler.h +33 -0
  19. data/libchdr/deps/lzma-19.00/include/CpuArch.h +336 -0
  20. data/libchdr/deps/lzma-19.00/include/Delta.h +19 -0
  21. data/libchdr/deps/lzma-19.00/include/LzFind.h +121 -0
  22. data/libchdr/deps/lzma-19.00/include/LzHash.h +57 -0
  23. data/libchdr/deps/lzma-19.00/include/Lzma86.h +111 -0
  24. data/libchdr/deps/lzma-19.00/include/LzmaDec.h +234 -0
  25. data/libchdr/deps/lzma-19.00/include/LzmaEnc.h +76 -0
  26. data/libchdr/deps/lzma-19.00/include/LzmaLib.h +131 -0
  27. data/libchdr/deps/lzma-19.00/include/Precomp.h +10 -0
  28. data/libchdr/deps/lzma-19.00/include/Sort.h +18 -0
  29. data/libchdr/deps/lzma-19.00/lzma-history.txt +446 -0
  30. data/libchdr/deps/lzma-19.00/lzma.txt +328 -0
  31. data/libchdr/deps/lzma-19.00/lzma.vcxproj +543 -0
  32. data/libchdr/deps/lzma-19.00/lzma.vcxproj.filters +17 -0
  33. data/libchdr/deps/lzma-19.00/src/Alloc.c +455 -0
  34. data/libchdr/deps/lzma-19.00/src/Bra86.c +82 -0
  35. data/libchdr/deps/lzma-19.00/src/BraIA64.c +53 -0
  36. data/libchdr/deps/lzma-19.00/src/CpuArch.c +218 -0
  37. data/libchdr/deps/lzma-19.00/src/Delta.c +64 -0
  38. data/libchdr/deps/lzma-19.00/src/LzFind.c +1127 -0
  39. data/libchdr/deps/lzma-19.00/src/Lzma86Dec.c +54 -0
  40. data/libchdr/deps/lzma-19.00/src/LzmaDec.c +1185 -0
  41. data/libchdr/deps/lzma-19.00/src/LzmaEnc.c +1330 -0
  42. data/libchdr/deps/lzma-19.00/src/Sort.c +141 -0
  43. data/libchdr/deps/zlib-1.2.11/CMakeLists.txt +29 -0
  44. data/libchdr/deps/zlib-1.2.11/ChangeLog +1515 -0
  45. data/libchdr/deps/zlib-1.2.11/FAQ +368 -0
  46. data/libchdr/deps/zlib-1.2.11/INDEX +68 -0
  47. data/libchdr/deps/zlib-1.2.11/Makefile +5 -0
  48. data/libchdr/deps/zlib-1.2.11/Makefile.in +410 -0
  49. data/libchdr/deps/zlib-1.2.11/README +115 -0
  50. data/libchdr/deps/zlib-1.2.11/adler32.c +186 -0
  51. data/libchdr/deps/zlib-1.2.11/compress.c +86 -0
  52. data/libchdr/deps/zlib-1.2.11/configure +921 -0
  53. data/libchdr/deps/zlib-1.2.11/crc32.c +442 -0
  54. data/libchdr/deps/zlib-1.2.11/crc32.h +441 -0
  55. data/libchdr/deps/zlib-1.2.11/deflate.c +2163 -0
  56. data/libchdr/deps/zlib-1.2.11/deflate.h +349 -0
  57. data/libchdr/deps/zlib-1.2.11/doc/algorithm.txt +209 -0
  58. data/libchdr/deps/zlib-1.2.11/doc/rfc1950.txt +619 -0
  59. data/libchdr/deps/zlib-1.2.11/doc/rfc1951.txt +955 -0
  60. data/libchdr/deps/zlib-1.2.11/doc/rfc1952.txt +675 -0
  61. data/libchdr/deps/zlib-1.2.11/doc/txtvsbin.txt +107 -0
  62. data/libchdr/deps/zlib-1.2.11/gzclose.c +25 -0
  63. data/libchdr/deps/zlib-1.2.11/gzguts.h +218 -0
  64. data/libchdr/deps/zlib-1.2.11/gzlib.c +637 -0
  65. data/libchdr/deps/zlib-1.2.11/gzread.c +654 -0
  66. data/libchdr/deps/zlib-1.2.11/gzwrite.c +665 -0
  67. data/libchdr/deps/zlib-1.2.11/infback.c +640 -0
  68. data/libchdr/deps/zlib-1.2.11/inffast.c +323 -0
  69. data/libchdr/deps/zlib-1.2.11/inffast.h +11 -0
  70. data/libchdr/deps/zlib-1.2.11/inffixed.h +94 -0
  71. data/libchdr/deps/zlib-1.2.11/inflate.c +1561 -0
  72. data/libchdr/deps/zlib-1.2.11/inflate.h +125 -0
  73. data/libchdr/deps/zlib-1.2.11/inftrees.c +304 -0
  74. data/libchdr/deps/zlib-1.2.11/inftrees.h +62 -0
  75. data/libchdr/deps/zlib-1.2.11/make_vms.com +867 -0
  76. data/libchdr/deps/zlib-1.2.11/treebuild.xml +116 -0
  77. data/libchdr/deps/zlib-1.2.11/trees.c +1203 -0
  78. data/libchdr/deps/zlib-1.2.11/trees.h +128 -0
  79. data/libchdr/deps/zlib-1.2.11/uncompr.c +93 -0
  80. data/libchdr/deps/zlib-1.2.11/zconf.h +534 -0
  81. data/libchdr/deps/zlib-1.2.11/zconf.h.cmakein +536 -0
  82. data/libchdr/deps/zlib-1.2.11/zconf.h.in +534 -0
  83. data/libchdr/deps/zlib-1.2.11/zlib.3 +149 -0
  84. data/libchdr/deps/zlib-1.2.11/zlib.3.pdf +0 -0
  85. data/libchdr/deps/zlib-1.2.11/zlib.h +1912 -0
  86. data/libchdr/deps/zlib-1.2.11/zlib.map +94 -0
  87. data/libchdr/deps/zlib-1.2.11/zlib.pc.cmakein +13 -0
  88. data/libchdr/deps/zlib-1.2.11/zlib.pc.in +13 -0
  89. data/libchdr/deps/zlib-1.2.11/zlib2ansi +152 -0
  90. data/libchdr/deps/zlib-1.2.11/zutil.c +325 -0
  91. data/libchdr/deps/zlib-1.2.11/zutil.h +271 -0
  92. data/libchdr/include/dr_libs/dr_flac.h +12280 -0
  93. data/libchdr/include/libchdr/bitstream.h +43 -0
  94. data/libchdr/include/libchdr/cdrom.h +110 -0
  95. data/libchdr/include/libchdr/chd.h +427 -0
  96. data/libchdr/include/libchdr/chdconfig.h +10 -0
  97. data/libchdr/include/libchdr/coretypes.h +60 -0
  98. data/libchdr/include/libchdr/flac.h +50 -0
  99. data/libchdr/include/libchdr/huffman.h +90 -0
  100. data/libchdr/pkg-config.pc.in +10 -0
  101. data/libchdr/src/libchdr_bitstream.c +125 -0
  102. data/libchdr/src/libchdr_cdrom.c +415 -0
  103. data/libchdr/src/libchdr_chd.c +2744 -0
  104. data/libchdr/src/libchdr_flac.c +302 -0
  105. data/libchdr/src/libchdr_huffman.c +545 -0
  106. data/libchdr/src/link.T +5 -0
  107. data/libchdr/tests/CMakeLists.txt +2 -0
  108. data/libchdr/tests/benchmark.c +52 -0
  109. metadata +183 -0
@@ -0,0 +1,50 @@
1
+ /* license:BSD-3-Clause
2
+ * copyright-holders:Aaron Giles
3
+ ***************************************************************************
4
+
5
+ flac.h
6
+
7
+ FLAC compression wrappers
8
+
9
+ ***************************************************************************/
10
+
11
+ #pragma once
12
+
13
+ #ifndef __FLAC_H__
14
+ #define __FLAC_H__
15
+
16
+ #include <stdint.h>
17
+
18
+ /***************************************************************************
19
+ * TYPE DEFINITIONS
20
+ ***************************************************************************
21
+ */
22
+
23
+ typedef struct _flac_decoder flac_decoder;
24
+ struct _flac_decoder {
25
+ /* output state */
26
+ void * decoder; /* actual encoder */
27
+ uint32_t sample_rate; /* decoded sample rate */
28
+ uint8_t channels; /* decoded number of channels */
29
+ uint8_t bits_per_sample; /* decoded bits per sample */
30
+ uint32_t compressed_offset; /* current offset in compressed data */
31
+ const uint8_t * compressed_start; /* start of compressed data */
32
+ uint32_t compressed_length; /* length of compressed data */
33
+ const uint8_t * compressed2_start; /* start of compressed data */
34
+ uint32_t compressed2_length; /* length of compressed data */
35
+ int16_t * uncompressed_start[8]; /* pointer to start of uncompressed data (up to 8 streams) */
36
+ uint32_t uncompressed_offset; /* current position in uncompressed data */
37
+ uint32_t uncompressed_length; /* length of uncompressed data */
38
+ int uncompressed_swap; /* swap uncompressed sample data */
39
+ uint8_t custom_header[0x2a]; /* custom header */
40
+ };
41
+
42
+ /* ======================> flac_decoder */
43
+
44
+ int flac_decoder_init(flac_decoder* decoder);
45
+ void flac_decoder_free(flac_decoder* decoder);
46
+ int flac_decoder_reset(flac_decoder* decoder, uint32_t sample_rate, uint8_t num_channels, uint32_t block_size, const void *buffer, uint32_t length);
47
+ int flac_decoder_decode_interleaved(flac_decoder* decoder, int16_t *samples, uint32_t num_samples, int swap_endian);
48
+ uint32_t flac_decoder_finish(flac_decoder* decoder);
49
+
50
+ #endif /* __FLAC_H__ */
@@ -0,0 +1,90 @@
1
+ /* license:BSD-3-Clause
2
+ * copyright-holders:Aaron Giles
3
+ ***************************************************************************
4
+
5
+ huffman.h
6
+
7
+ Static Huffman compression and decompression helpers.
8
+
9
+ ***************************************************************************/
10
+
11
+ #pragma once
12
+
13
+ #ifndef __HUFFMAN_H__
14
+ #define __HUFFMAN_H__
15
+
16
+ #include <libchdr/bitstream.h>
17
+
18
+
19
+ /***************************************************************************
20
+ * CONSTANTS
21
+ ***************************************************************************
22
+ */
23
+
24
+ enum huffman_error
25
+ {
26
+ HUFFERR_NONE = 0,
27
+ HUFFERR_TOO_MANY_BITS,
28
+ HUFFERR_INVALID_DATA,
29
+ HUFFERR_INPUT_BUFFER_TOO_SMALL,
30
+ HUFFERR_OUTPUT_BUFFER_TOO_SMALL,
31
+ HUFFERR_INTERNAL_INCONSISTENCY,
32
+ HUFFERR_TOO_MANY_CONTEXTS
33
+ };
34
+
35
+ /***************************************************************************
36
+ * TYPE DEFINITIONS
37
+ ***************************************************************************
38
+ */
39
+
40
+ typedef uint16_t lookup_value;
41
+
42
+ /* a node in the huffman tree */
43
+ struct node_t
44
+ {
45
+ struct node_t* parent; /* pointer to parent node */
46
+ uint32_t count; /* number of hits on this node */
47
+ uint32_t weight; /* assigned weight of this node */
48
+ uint32_t bits; /* bits used to encode the node */
49
+ uint8_t numbits; /* number of bits needed for this node */
50
+ };
51
+
52
+ /* ======================> huffman_context_base */
53
+
54
+ /* context class for decoding */
55
+ struct huffman_decoder
56
+ {
57
+ /* internal state */
58
+ uint32_t numcodes; /* number of total codes being processed */
59
+ uint8_t maxbits; /* maximum bits per code */
60
+ uint8_t prevdata; /* value of the previous data (for delta-RLE encoding) */
61
+ int rleremaining; /* number of RLE bytes remaining (for delta-RLE encoding) */
62
+ lookup_value * lookup; /* pointer to the lookup table */
63
+ struct node_t * huffnode; /* array of nodes */
64
+ uint32_t * datahisto; /* histogram of data values */
65
+
66
+ /* array versions of the info we need */
67
+ #if 0
68
+ node_t* huffnode_array; /* [_NumCodes]; */
69
+ lookup_value* lookup_array; /* [1 << _MaxBits]; */
70
+ #endif
71
+ };
72
+
73
+ /* ======================> huffman_decoder */
74
+
75
+ struct huffman_decoder* create_huffman_decoder(int numcodes, int maxbits);
76
+ void delete_huffman_decoder(struct huffman_decoder* decoder);
77
+
78
+ /* single item operations */
79
+ uint32_t huffman_decode_one(struct huffman_decoder* decoder, struct bitstream* bitbuf);
80
+
81
+ enum huffman_error huffman_import_tree_rle(struct huffman_decoder* decoder, struct bitstream* bitbuf);
82
+ enum huffman_error huffman_import_tree_huffman(struct huffman_decoder* decoder, struct bitstream* bitbuf);
83
+
84
+ int huffman_build_tree(struct huffman_decoder* decoder, uint32_t totaldata, uint32_t totalweight);
85
+ enum huffman_error huffman_assign_canonical_codes(struct huffman_decoder* decoder);
86
+ enum huffman_error huffman_compute_tree_from_histo(struct huffman_decoder* decoder);
87
+
88
+ void huffman_build_lookup_table(struct huffman_decoder* decoder);
89
+
90
+ #endif
@@ -0,0 +1,10 @@
1
+ prefix=@CMAKE_INSTALL_PREFIX@
2
+ libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
3
+ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/libchdr
4
+
5
+ Name: libchdr
6
+ Description: Standalone library for reading MAME's CHDv1-v5 formats
7
+ Version: @PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@
8
+ Libs: -L${libdir} -lchdr @LIBS@
9
+ Cflags: -I${includedir}
10
+
@@ -0,0 +1,125 @@
1
+ /* license:BSD-3-Clause
2
+ * copyright-holders:Aaron Giles
3
+ ***************************************************************************
4
+
5
+ bitstream.c
6
+
7
+ Helper classes for reading/writing at the bit level.
8
+
9
+ ***************************************************************************/
10
+
11
+ #include <stdlib.h>
12
+ #include <libchdr/bitstream.h>
13
+
14
+ /***************************************************************************
15
+ * INLINE FUNCTIONS
16
+ ***************************************************************************
17
+ */
18
+
19
+ int bitstream_overflow(struct bitstream* bitstream) { return ((bitstream->doffset - bitstream->bits / 8) > bitstream->dlength); }
20
+
21
+ /*-------------------------------------------------
22
+ * create_bitstream - constructor
23
+ *-------------------------------------------------
24
+ */
25
+
26
+ struct bitstream* create_bitstream(const void *src, uint32_t srclength)
27
+ {
28
+ struct bitstream* bitstream = (struct bitstream*)malloc(sizeof(struct bitstream));
29
+ bitstream->buffer = 0;
30
+ bitstream->bits = 0;
31
+ bitstream->read = (const uint8_t*)src;
32
+ bitstream->doffset = 0;
33
+ bitstream->dlength = srclength;
34
+ return bitstream;
35
+ }
36
+
37
+
38
+ /*-----------------------------------------------------
39
+ * bitstream_peek - fetch the requested number of bits
40
+ * but don't advance the input pointer
41
+ *-----------------------------------------------------
42
+ */
43
+
44
+ uint32_t bitstream_peek(struct bitstream* bitstream, int numbits)
45
+ {
46
+ if (numbits == 0)
47
+ return 0;
48
+
49
+ /* fetch data if we need more */
50
+ if (numbits > bitstream->bits)
51
+ {
52
+ while (bitstream->bits <= 24)
53
+ {
54
+ if (bitstream->doffset < bitstream->dlength)
55
+ bitstream->buffer |= bitstream->read[bitstream->doffset] << (24 - bitstream->bits);
56
+ bitstream->doffset++;
57
+ bitstream->bits += 8;
58
+ }
59
+ }
60
+
61
+ /* return the data */
62
+ return bitstream->buffer >> (32 - numbits);
63
+ }
64
+
65
+
66
+ /*-----------------------------------------------------
67
+ * bitstream_remove - advance the input pointer by the
68
+ * specified number of bits
69
+ *-----------------------------------------------------
70
+ */
71
+
72
+ void bitstream_remove(struct bitstream* bitstream, int numbits)
73
+ {
74
+ bitstream->buffer <<= numbits;
75
+ bitstream->bits -= numbits;
76
+ }
77
+
78
+
79
+ /*-----------------------------------------------------
80
+ * bitstream_read - fetch the requested number of bits
81
+ *-----------------------------------------------------
82
+ */
83
+
84
+ uint32_t bitstream_read(struct bitstream* bitstream, int numbits)
85
+ {
86
+ uint32_t result = bitstream_peek(bitstream, numbits);
87
+ bitstream_remove(bitstream, numbits);
88
+ return result;
89
+ }
90
+
91
+
92
+ /*-------------------------------------------------
93
+ * read_offset - return the current read offset
94
+ *-------------------------------------------------
95
+ */
96
+
97
+ uint32_t bitstream_read_offset(struct bitstream* bitstream)
98
+ {
99
+ uint32_t result = bitstream->doffset;
100
+ int bits = bitstream->bits;
101
+ while (bits >= 8)
102
+ {
103
+ result--;
104
+ bits -= 8;
105
+ }
106
+ return result;
107
+ }
108
+
109
+
110
+ /*-------------------------------------------------
111
+ * flush - flush to the nearest byte
112
+ *-------------------------------------------------
113
+ */
114
+
115
+ uint32_t bitstream_flush(struct bitstream* bitstream)
116
+ {
117
+ while (bitstream->bits >= 8)
118
+ {
119
+ bitstream->doffset--;
120
+ bitstream->bits -= 8;
121
+ }
122
+ bitstream->bits = bitstream->buffer = 0;
123
+ return bitstream->doffset;
124
+ }
125
+