00001
00007 #include <stddef.h>
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 #include <string.h>
00011
00012 #include "check.h"
00013 #include "file.h"
00014 #include "mp3_mpeg.h"
00015
00016
00017
00021 const unsigned int bitrate_index[16][2][3] =
00022 {
00023 { {0 , 0 , 0 }, { 0 , 0 , 0 } },
00024 { {32 , 32 , 32 }, { 32 , 8 , 8 } },
00025 { {64 , 48 , 40 }, { 48 , 16 , 16 } },
00026 { {96 , 56 , 48 }, { 56 , 24 , 24 } },
00027 { {128, 64 , 56 }, { 64 , 32 , 32 } },
00028 { {160, 80 , 64 }, { 80 , 40 , 40 } },
00029 { {192, 96 , 80 }, { 96 , 48 , 48 } },
00030 { {224, 112, 96 }, { 112, 56 , 56 } },
00031 { {256, 128, 112}, { 128, 64 , 64 } },
00032 { {288, 160, 128}, { 144, 80 , 80 } },
00033 { {320, 192, 160}, { 160, 96 , 96 } },
00034 { {352, 224, 192}, { 176, 112, 112 } },
00035 { {384, 256, 224}, { 192, 128, 128 } },
00036 { {416, 320, 256}, { 224, 144, 144 } },
00037 { {448, 384, 320}, { 256, 160, 160 } },
00038 { {0 , 0 , 0 }, { 0 , 0 , 0 } },
00039 };
00040
00044 const unsigned int samplerate_index[4][3] =
00045 {
00046 {44100, 22050, 11025 },
00047 {48000, 24000, 12000 },
00048 {32000, 16000, 8000 },
00049 {0, 0, 0 }
00050 };
00051
00052 ptrdiff_t mp3_next_frame(char *buffer, size_t len)
00053 {
00054 size_t result;
00055
00056 check(buffer != NULL);
00057 check(sizeof(mp3_frame) >= 2);
00058
00059 result = 0;
00060 while(result < (len - sizeof(mp3_frame)))
00061 {
00062 if ((buffer[result] & 0xFF) == 0xFF)
00063 {
00064 if ((buffer[result+1] & 0xE0) == 0xE0)
00065 {
00066 return result;
00067 }
00068 }
00069 result++;
00070 }
00071
00072 return len;
00073 }
00074
00080 static unsigned int mp3_version(mp3_frame *frame)
00081 {
00082 check(frame != NULL);
00083
00084 switch (frame->version)
00085 {
00086 case MP3_VER_1:
00087 return 1;
00088 break;
00089 case MP3_VER_2:
00090 case MP3_VER_2_5:
00091 return 2;
00092 break;
00093 }
00094 return 0;
00095 }
00096
00102 static unsigned int mp3_layer(mp3_frame *frame)
00103 {
00104 check(frame != NULL);
00105
00106 switch (frame->layer)
00107 {
00108 case MP3_LAYER_1:
00109 return 1;
00110 break;
00111 case MP3_LAYER_2:
00112 return 2;
00113 break;
00114 case MP3_LAYER_3:
00115 return 3;
00116 break;
00117 }
00118 return 0;
00119 }
00120
00121 unsigned int mp3_bitrate(mp3_frame *frame)
00122 {
00123 check(frame != NULL);
00124
00125 return 1000 * bitrate_index[frame->bitrate][mp3_version(frame)-1][mp3_layer(frame)-1];
00126 }
00127
00128 unsigned int mp3_samplerate(mp3_frame *frame)
00129 {
00130 check(frame != NULL);
00131
00132 switch (frame->version)
00133 {
00134 case MP3_VER_1:
00135 return samplerate_index[frame->samplerate][0];
00136 break;
00137 case MP3_VER_2:
00138 return samplerate_index[frame->samplerate][1];
00139 break;
00140 case MP3_VER_2_5:
00141 return samplerate_index[frame->samplerate][2];
00142 break;
00143 }
00144 return 0;
00145 }
00146
00147 #ifdef FRAMESIZE
00148
00153 unsigned int mp3_framesize(mp3_frame *frame)
00154 {
00155 unsigned int bitrate;
00156 unsigned int samplerate;
00157
00158 check(frame != NULL);
00159
00160 bitrate = mp3_bitrate(frame);
00161 samplerate = mp3_samplerate(frame);
00162
00163 switch (frame->layer)
00164 {
00165 case MP3_LAYER_1:
00166 return 4*((12 * bitrate)/samplerate + frame->padding);
00167 break;
00168 case MP3_LAYER_2:
00169 case MP3_LAYER_3:
00170 return (144 * bitrate)/samplerate + frame->padding;
00171 break;
00172 }
00173 return 0;
00174 }
00175 #endif
00176
00177 unsigned int mp3_length(mp3_frame *frame, unsigned long filesize)
00178 {
00179 check(frame != NULL);
00180
00181 return (filesize/(mp3_bitrate(frame)/8));
00182 }
00183