minimp3_test.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /*#define MINIMP3_ONLY_MP3*/
  2. /*#define MINIMP3_ONLY_SIMD*/
  3. /*#define MINIMP3_NONSTANDARD_BUT_LOGICAL*/
  4. #define MINIMP3_IMPLEMENTATION
  5. #define MINIMP3_ALLOW_MONO_STEREO_TRANSITION
  6. #include "minimp3_ex.h"
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include <string.h>
  10. #if defined(_MSC_VER)
  11. #define strcasecmp(str1, str2) _strnicmp(str1, str2, strlen(str2))
  12. #else
  13. #include <strings.h>
  14. #endif
  15. static int16_t read16le(const void *p)
  16. {
  17. const uint8_t *src = (const uint8_t *)p;
  18. return ((src[0]) << 0) | ((src[1]) << 8);
  19. }
  20. #ifndef MINIMP3_NO_WAV
  21. static char *wav_header(int hz, int ch, int bips, int data_bytes)
  22. {
  23. static char hdr[44] = "RIFFsizeWAVEfmt \x10\0\0\0\1\0ch_hz_abpsbabsdatasize";
  24. unsigned long nAvgBytesPerSec = bips*ch*hz >> 3;
  25. unsigned int nBlockAlign = bips*ch >> 3;
  26. *(int32_t *)(void*)(hdr + 0x04) = 44 + data_bytes - 8; /* File size - 8 */
  27. *(int16_t *)(void*)(hdr + 0x14) = 1; /* Integer PCM format */
  28. *(int16_t *)(void*)(hdr + 0x16) = ch;
  29. *(int32_t *)(void*)(hdr + 0x18) = hz;
  30. *(int32_t *)(void*)(hdr + 0x1C) = nAvgBytesPerSec;
  31. *(int16_t *)(void*)(hdr + 0x20) = nBlockAlign;
  32. *(int16_t *)(void*)(hdr + 0x22) = bips;
  33. *(int32_t *)(void*)(hdr + 0x28) = data_bytes;
  34. return hdr;
  35. }
  36. #endif
  37. static unsigned char *preload(FILE *file, int *data_size)
  38. {
  39. unsigned char *data;
  40. *data_size = 0;
  41. if (!file)
  42. return 0;
  43. if (fseek(file, 0, SEEK_END))
  44. return 0;
  45. *data_size = (int)ftell(file);
  46. if (*data_size < 0)
  47. return 0;
  48. if (fseek(file, 0, SEEK_SET))
  49. return 0;
  50. data = (unsigned char*)malloc(*data_size);
  51. if (!data)
  52. return 0;
  53. if ((int)fread(data, 1, *data_size, file) != *data_size)
  54. exit(1);
  55. return data;
  56. }
  57. #ifdef MP4_MODE
  58. typedef struct
  59. {
  60. mp3dec_t *mp3d;
  61. mp3dec_file_info_t *info;
  62. size_t allocated;
  63. } frames_iterate_data;
  64. static int frames_iterate_cb(void *user_data, const uint8_t *frame, int frame_size, size_t offset, mp3dec_frame_info_t *info)
  65. {
  66. (void)offset;
  67. frames_iterate_data *d = user_data;
  68. d->info->channels = info->channels;
  69. d->info->hz = info->hz;
  70. d->info->layer = info->layer;
  71. /*printf("%d %d %d\n", frame_size, (int)offset, info->channels);*/
  72. if ((d->allocated - d->info->samples*sizeof(mp3d_sample_t)) < MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t))
  73. {
  74. if (!d->allocated)
  75. d->allocated = 1024*1024;
  76. else
  77. d->allocated *= 2;
  78. d->info->buffer = realloc(d->info->buffer, d->allocated);
  79. }
  80. int samples = mp3dec_decode_frame(d->mp3d, frame, frame_size, d->info->buffer + d->info->samples, info);
  81. if (samples)
  82. {
  83. d->info->samples += samples*info->channels;
  84. }
  85. return 0;
  86. }
  87. #endif
  88. static void decode_file(const char *input_file_name, const unsigned char *buf_ref, int ref_size, FILE *file_out, const int wave_out)
  89. {
  90. mp3dec_t mp3d;
  91. int i, data_bytes, total_samples = 0, maxdiff = 0;
  92. double MSE = 0.0, psnr;
  93. mp3dec_file_info_t info;
  94. #ifdef MP4_MODE
  95. frames_iterate_data d = { &mp3d, &info, 0 };
  96. mp3dec_init(&mp3d);
  97. memset(&info, 0, sizeof(info));
  98. if (mp3dec_iterate(input_file_name, frames_iterate_cb, &d))
  99. #else
  100. if (mp3dec_load(&mp3d, input_file_name, &info, 0, 0))
  101. #endif
  102. {
  103. printf("error: file not found or read error");
  104. exit(1);
  105. }
  106. #ifdef MINIMP3_FLOAT_OUTPUT
  107. int16_t *buffer = malloc(info.samples*sizeof(int16_t));
  108. mp3dec_f32_to_s16(info.buffer, buffer, info.samples);
  109. free(info.buffer);
  110. #else
  111. int16_t *buffer = info.buffer;
  112. #endif
  113. #ifndef MINIMP3_NO_WAV
  114. if (wave_out && file_out)
  115. fwrite(wav_header(0, 0, 0, 0), 1, 44, file_out);
  116. #endif
  117. if (info.samples)
  118. {
  119. total_samples += info.samples;
  120. if (buf_ref)
  121. {
  122. int max_samples = MINIMP3_MIN((size_t)ref_size/2, info.samples);
  123. for (i = 0; i < max_samples; i++)
  124. {
  125. int MSEtemp = abs((int)buffer[i] - (int)(int16_t)read16le(&buf_ref[i*sizeof(int16_t)]));
  126. if (MSEtemp > maxdiff)
  127. maxdiff = MSEtemp;
  128. MSE += (float)MSEtemp*(float)MSEtemp;
  129. }
  130. }
  131. if (file_out)
  132. fwrite(buffer, info.samples, sizeof(int16_t), file_out);
  133. free(buffer);
  134. }
  135. #ifndef LIBFUZZER
  136. MSE /= total_samples ? total_samples : 1;
  137. if (0 == MSE)
  138. psnr = 99.0;
  139. else
  140. psnr = 10.0*log10(((double)0x7fff*0x7fff)/MSE);
  141. printf("rate=%d samples=%d max_diff=%d PSNR=%f\n", info.hz, total_samples, maxdiff, psnr);
  142. if (psnr < 96)
  143. {
  144. printf("PSNR compliance failed\n");
  145. exit(1);
  146. }
  147. #endif
  148. #ifndef MINIMP3_NO_WAV
  149. if (wave_out && file_out)
  150. {
  151. data_bytes = ftell(file_out) - 44;
  152. rewind(file_out);
  153. fwrite(wav_header(info.hz, info.channels, 16, data_bytes), 1, 44, file_out);
  154. }
  155. #endif
  156. #ifdef MP4_MODE
  157. if (!total_samples)
  158. {
  159. printf("error: mp4 test should decode some samples\n");
  160. exit(1);
  161. }
  162. #endif
  163. }
  164. #ifdef LIBFUZZER
  165. int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
  166. {
  167. decode_file(Data, Size, 0, 0, 0, 0);
  168. return 0;
  169. }
  170. #else
  171. #if defined(__arm__) || defined(__aarch64__) || defined(__PPC__)
  172. int main2(int argc, char *argv[]);
  173. int main2(int argc, char *argv[])
  174. #else
  175. int main(int argc, char *argv[])
  176. #endif
  177. {
  178. int wave_out = 0, ref_size;
  179. char *ref_file_name = (argc > 2) ? argv[2] : NULL;
  180. char *output_file_name = (argc > 3) ? argv[3] : NULL;
  181. FILE *file_out = NULL;
  182. if (output_file_name)
  183. {
  184. file_out = fopen(output_file_name, "wb");
  185. #ifndef MINIMP3_NO_WAV
  186. char *ext = strrchr(output_file_name, '.');
  187. if (ext && !strcasecmp(ext + 1, "wav"))
  188. wave_out = 1;
  189. #endif
  190. }
  191. FILE *file_ref = ref_file_name ? fopen(ref_file_name, "rb") : NULL;
  192. unsigned char *buf_ref = preload(file_ref, &ref_size);
  193. if (file_ref)
  194. fclose(file_ref);
  195. #ifdef __AFL_HAVE_MANUAL_CONTROL
  196. __AFL_INIT();
  197. while (__AFL_LOOP(1000)) {
  198. #endif
  199. char *input_file_name = (argc > 1) ? argv[1] : NULL;
  200. if (!input_file_name)
  201. {
  202. printf("error: no file names given\n");
  203. return 1;
  204. }
  205. decode_file(input_file_name, buf_ref, ref_size, file_out, wave_out);
  206. #ifdef __AFL_HAVE_MANUAL_CONTROL
  207. }
  208. #endif
  209. if (buf_ref)
  210. free(buf_ref);
  211. if (file_out)
  212. fclose(file_out);
  213. return 0;
  214. }
  215. #if defined(__arm__) || defined(__aarch64__) || defined(__PPC__)
  216. static const char *g_files[] = {
  217. "vectors/ILL2_center2.bit",
  218. "vectors/ILL2_dual.bit",
  219. "vectors/ILL2_dynx22.bit",
  220. "vectors/ILL2_dynx31.bit",
  221. "vectors/ILL2_dynx32.bit",
  222. "vectors/ILL2_ext_switching.bit",
  223. "vectors/ILL2_layer1.bit",
  224. "vectors/ILL2_layer3.bit",
  225. "vectors/ILL2_mono.bit",
  226. "vectors/ILL2_multilingual.bit",
  227. "vectors/ILL2_overalloc1.bit",
  228. "vectors/ILL2_overalloc2.bit",
  229. "vectors/ILL2_prediction.bit",
  230. "vectors/ILL2_samples.bit",
  231. "vectors/ILL2_scf63.bit",
  232. "vectors/ILL2_tca21.bit",
  233. "vectors/ILL2_tca30.bit",
  234. "vectors/ILL2_tca30_PC.bit",
  235. "vectors/ILL2_tca31_mtx0.bit",
  236. "vectors/ILL2_tca31_mtx2.bit",
  237. "vectors/ILL2_tca31_PC.bit",
  238. "vectors/ILL2_tca32_PC.bit",
  239. "vectors/ILL2_wrongcrc.bit",
  240. "vectors/ILL4_ext_id1.bit",
  241. "vectors/ILL4_sync.bit",
  242. "vectors/ILL4_wrongcrc.bit",
  243. "vectors/ILL4_wrong_length1.bit",
  244. "vectors/ILL4_wrong_length2.bit",
  245. "vectors/l1-fl1.bit",
  246. "vectors/l1-fl2.bit",
  247. "vectors/l1-fl3.bit",
  248. "vectors/l1-fl4.bit",
  249. "vectors/l1-fl5.bit",
  250. "vectors/l1-fl6.bit",
  251. "vectors/l1-fl7.bit",
  252. "vectors/l1-fl8.bit",
  253. "vectors/l2-fl10.bit",
  254. "vectors/l2-fl11.bit",
  255. "vectors/l2-fl12.bit",
  256. "vectors/l2-fl13.bit",
  257. "vectors/l2-fl14.bit",
  258. "vectors/l2-fl15.bit",
  259. "vectors/l2-fl16.bit",
  260. "vectors/l2-nonstandard-fl1_fl2_ff.bit",
  261. "vectors/l2-nonstandard-free_format.bit",
  262. "vectors/l2-nonstandard-test32-size.bit",
  263. "vectors/l2-test32.bit",
  264. "vectors/l3-compl.bit",
  265. "vectors/l3-he_32khz.bit",
  266. "vectors/l3-he_44khz.bit",
  267. "vectors/l3-he_48khz.bit",
  268. "vectors/l3-hecommon.bit",
  269. "vectors/l3-he_free.bit",
  270. "vectors/l3-he_mode.bit",
  271. "vectors/l3-nonstandard-big-iscf.bit",
  272. "vectors/l3-nonstandard-compl-sideinfo-bigvalues.bit",
  273. "vectors/l3-nonstandard-compl-sideinfo-blocktype.bit",
  274. "vectors/l3-nonstandard-compl-sideinfo-size.bit",
  275. "vectors/l3-nonstandard-sideinfo-size.bit",
  276. "vectors/l3-si.bit",
  277. "vectors/l3-si_block.bit",
  278. "vectors/l3-si_huff.bit",
  279. "vectors/l3-sin1k0db.bit",
  280. "vectors/l3-test45.bit",
  281. "vectors/l3-test46.bit",
  282. "vectors/M2L3_bitrate_16_all.bit",
  283. "vectors/M2L3_bitrate_22_all.bit",
  284. "vectors/M2L3_bitrate_24_all.bit",
  285. "vectors/M2L3_compl24.bit",
  286. "vectors/M2L3_noise.bit"
  287. };
  288. int main()
  289. {
  290. size_t i;
  291. char buf[256];
  292. char *v[3];
  293. v[2] = buf;
  294. for (i = 0; i < sizeof(g_files)/sizeof(g_files[0]); i++)
  295. {
  296. int ret;
  297. const char *file = g_files[i];
  298. size_t len = strlen(file);
  299. strcpy(buf, file);
  300. buf[len - 3] = 'p';
  301. buf[len - 2] = 'c';
  302. buf[len - 1] = 'm';
  303. v[1] = (char*)file;
  304. printf("%s\n", file);
  305. ret = main2(3, v);
  306. if (ret)
  307. return ret;
  308. }
  309. return 0;
  310. }
  311. #endif
  312. #endif