shithub: mp3dec

Download patch

ref: dbb7c93d547e3646c6c9456d1b2138a1ba8ac173
parent: a5381007063b6b71dbbf220f630395849129b5d0
author: lieff <[email protected]>
date: Wed Jan 10 12:50:25 EST 2018

enhance compliance test

--- a/minimp3.c
+++ b/minimp3.c
@@ -1637,6 +1637,7 @@
 
 #ifdef minimp3_test
 #include <stdio.h>
+#include <math.h>
 
 static char *wav_header(int hz, int ch, int bips, int data_bytes)
 {
@@ -1655,11 +1656,12 @@
     return hdr;
 }
 
-void decode_file(FILE *file_mp3, FILE *file_wav)
+static void decode_file(FILE *file_mp3, FILE *file_wav, FILE *file_ref)
 {
     static mp3dec_t mp3d = { 0, };
     mp3dec_frame_info_t info;
-    int i, data_bytes, samples, nbuf = 0;
+    int i, data_bytes, samples, total_samples, nbuf = 0;
+    double MSE = 0.0, MSEtemp, psnr;
     unsigned char buf[4096];
 
     mp3dec_init(&mp3d);
@@ -1668,18 +1670,36 @@
 
     do
     {
-        short pcm[2*1152];
+        short pcm[2*1152], pcm2[2*1152];
         nbuf += fread(buf + nbuf, 1, sizeof(buf) - nbuf, file_mp3);
         samples = mp3dec_decode_frame(&mp3d, buf, nbuf, pcm, &info);
         if (samples)
         {
+            fread(pcm2, 1, 2*info.channels*samples, file_ref);
+            total_samples += samples*info.channels;
+            for (i = 0; i < samples*info.channels; i++)
+            {
+                MSEtemp = abs((int)pcm[i] - (int)pcm2[i]);
+                MSE += MSEtemp*MSEtemp;
+            }
             fwrite(pcm, samples, 2*info.channels, file_wav);
-        } else if (0 == info.frame_bytes) info.frame_bytes = nbuf;
-
+        }
         memmove(buf, buf + info.frame_bytes, nbuf -= info.frame_bytes);
-    } while (nbuf);
+    } while (info.frame_bytes);
 
-    data_bytes = ftell(file_wav) - 44;
+    MSE /= total_samples;
+    if (0 == MSE)
+        psnr = 99.0;
+    else
+        psnr = 10.0*log10(((double)0x7fff*0x7fff)/MSE);
+    printf("PSNR=%f\n", psnr);
+    if (psnr < 96)
+    {
+        printf("PSNR compliance failed\n");
+        exit(1);
+    }
+
+    //data_bytes = ftell(file_wav) - 44;
     //rewind(file_wav);
     //fwrite(wav_header(info.hz, info.channels, 16, data_bytes), 1, 44, file_wav);
     fclose(file_wav);
@@ -1690,12 +1710,13 @@
 {
     char *input_file_name  = (argc > 1) ? argv[1] : NULL;
     char *output_file_name = (argc > 2) ? argv[2] : NULL;
-    if (!input_file_name || !output_file_name)
+    char *ref_file_name    = (argc > 3) ? argv[3] : NULL;
+    if (!input_file_name || !output_file_name || !ref_file_name)
     {
         printf("error: no file names given\n");
         return 1;
     }
-    decode_file(fopen(input_file_name, "rb"), fopen(output_file_name, "wb"));
+    decode_file(fopen(input_file_name, "rb"), fopen(output_file_name, "wb"), fopen(ref_file_name, "rb"));
     return 0;
 }
 #endif
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -4,18 +4,16 @@
   wget -np -r --level=1 http://fate-suite.ffmpeg.org/mp3-conformance/
 fi
 
-gcc -Dminimp3_test -O2 -g -o minimp3 minimp3.c
+gcc -Dminimp3_test -O2 -g -o minimp3 minimp3.c -lm
 
 APP=./minimp3
 
 set +e
 for i in fate-suite.ffmpeg.org/mp3-conformance/*.bit; do
-$($APP $i $i.out)
+$APP $i $i.out ${i%.*}.pcm
 retval=$?
 echo $i exited with code=$retval
-cmp -s $i $i.out > /dev/null
-if [ $? -eq 1 ]; then
-    echo test failed
-    exit 1
+if [ ! $retval -eq 0 ]; then
+  exit 1
 fi
 done