00001
00002
00003
00004
00005
00006
00007 #include <stdio.h>
00008 #include <string.h>
00009 #include <ctype.h>
00010 #include <stdlib.h>
00011 #include "common.h"
00012 #include "options.h"
00013 #include "encode_new.h"
00014 #include "tables.h"
00015
00016
00017
00018
00019
00020
00021
00022 char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" };
00023 char *version_names[2] = { "MPEG-2 LSF", "MPEG-1" };
00024
00025
00026 double s_freq[2][4] = { {22.05, 24, 16, 0}, {44.1, 48, 32, 0} };
00027
00028
00029 int bitrate[2][15] = {
00030 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160},
00031 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384}
00032 };
00033
00034 double multiple[64] = {
00035 2.00000000000000, 1.58740105196820, 1.25992104989487,
00036 1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,
00037 0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,
00038 0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,
00039 0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,
00040 0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,
00041 0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,
00042 0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,
00043 0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,
00044 0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,
00045 0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,
00046 0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,
00047 0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,
00048 0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,
00049 0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,
00050 0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,
00051 1E-20
00052 };
00053
00054 enum byte_order NativeByteOrder = order_unknown;
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 int js_bound (int m_ext)
00065 {
00066
00067 static int jsb_table[4] = { 4, 8, 12, 16 };
00068
00069 if (m_ext < 0 || m_ext > 3) {
00070 fprintf (stderr, "js_bound bad modext (%d)\n", m_ext);
00071 exit (1);
00072 }
00073 return (jsb_table[m_ext]);
00074 }
00075
00076 void hdr_to_frps (frame_info * frame)
00077
00078 {
00079 frame_header *hdr = frame->header;
00080
00081 frame->actual_mode = hdr->mode;
00082 frame->nch = (hdr->mode == MPG_MD_MONO) ? 1 : 2;
00083
00084 frame->sblimit = pick_table (frame);
00085
00086 encode_init(frame);
00087
00088 if (hdr->mode == MPG_MD_JOINT_STEREO)
00089 frame->jsbound = js_bound (hdr->mode_ext);
00090 else
00091 frame->jsbound = frame->sblimit;
00092
00093 }
00094
00095 int toolame_BitrateIndex (int bRate,
00096 int version )
00097
00098 {
00099 int index = 0;
00100 int found = 0;
00101
00102 while (!found && index < 15) {
00103 if (bitrate[version][index] == bRate)
00104 found = 1;
00105 else
00106 ++index;
00107 }
00108 if (found)
00109 return (index);
00110 else {
00111 fprintf (stderr,
00112 "toolame_BitrateIndex: %d is not a legal bitrate for version %i\n",
00113 bRate, version);
00114 exit (-1);
00115 }
00116 }
00117
00118 int toolame_SmpFrqIndex (long sRate, int *version)
00119
00120
00121 {
00122 if (sRate == 44100L) {
00123 *version = MPEG_AUDIO_ID;
00124 return (0);
00125 } else if (sRate == 48000L) {
00126 *version = MPEG_AUDIO_ID;
00127 return (1);
00128 } else if (sRate == 32000L) {
00129 *version = MPEG_AUDIO_ID;
00130 return (2);
00131 } else if (sRate == 24000L) {
00132 *version = MPEG_PHASE2_LSF;
00133 return (1);
00134 } else if (sRate == 22050L) {
00135 *version = MPEG_PHASE2_LSF;
00136 return (0);
00137 } else if (sRate == 16000L) {
00138 *version = MPEG_PHASE2_LSF;
00139 return (2);
00140 } else {
00141 fprintf (stderr, "toolame_SmpFrqIndex: %ld is not a legal sample rate\n", sRate);
00142 return (-1);
00143 }
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 void new_ext (char *filename, char *extname, char *newname)
00157 {
00158 int found, dotpos;
00159
00160
00161 dotpos = strlen (filename);
00162 found = 0;
00163 do {
00164 switch (filename[dotpos]) {
00165 case '.':
00166 found = 1;
00167 break;
00168 case '\\':
00169 case '/':
00170 case ':':
00171 found = -1;
00172 break;
00173 default:
00174 dotpos--;
00175 if (dotpos < 0)
00176 found = -1;
00177 break;
00178 }
00179 }
00180 while (found == 0);
00181 if (found == -1)
00182 strcpy (newname, filename);
00183 if (found == 1) {
00184 strncpy (newname, filename, dotpos);
00185 newname[dotpos] = '\0';
00186 }
00187 strcat (newname, extname);
00188 }