File: layer.cc

package info (click to toggle)
mp3info 0.2.9-1
  • links: PTS
  • area: non-free
  • in suites: hamm, slink
  • size: 104 kB
  • ctags: 130
  • sloc: cpp: 1,013; makefile: 84; sh: 59
file content (99 lines) | stat: -rw-r--r-- 2,504 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 Handling of MPEG Audio Headers.
 */

#include <stdio.h>
#include <stdlib.h>
#include "mp3info.h"

char *mode_names[5] = { "stereo", "j-stereo", "dual-ch", "single-ch" , "multi-ch"};
char *layer_names[3] = { "I", "II", "III" };
char *version_names[3] = { "MPEG-1", "MPEG-2 LSF", "MPEG-2.5" };
char *version_nums[3] = { "1", "2", "2.5" };


unsigned int     bitrates[3][3][15] = {
     {
	  {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
	  {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
	  {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
     },{
	  {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
	  {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
	  {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}
     },{
	  {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
	  {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
	  {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}
     }};


unsigned int  s_freq[3][4] = {
     {44100, 48000, 32000, 0},
     {22050, 24000, 16000, 0},
     {11025, 8000, 8000, 0} 
};

char *Layer::mode_name() {
   return(mode_names[mode]);
}

char *Layer::layer_name() {
   return(layer_names[lay-1]);
}

char *Layer::version_name() {
   return(version_names[version]);
}

char *Layer::version_num() {
   return(version_nums[version]);
}

unsigned int Layer::bitrate() {
   return(bitrates[version][lay-1][bitrate_index]);
}

unsigned int Layer::sfreq() {
   return(s_freq[version][sampling_frequency]);
}

bool Layer::get(FILE *file) {
   unsigned char buffer[5];
   size_t temp;
   
   fseek(file, 0, SEEK_SET) ;
   temp=fread(&buffer,4,1,file);
   
   temp=((buffer[0]<<4) & 0xFF0) | ((buffer[1]>>4) & 0xE);
   if (temp != 0xFFE) {
      return(false);
   } else {
      switch((buffer[1]>>2 & 0x3)) {
        case 2:
          version = 0;
          break;
        case 3:
          version = 1;
          break;
        case 0:
          version = 2;
          break;
        default:
          return(false);
      }
      lay = 4-((buffer[1]>>1) & 0x3);
      error_protection = !(buffer[1] & 0x1);
      bitrate_index = (buffer[2]>>4) & 0x0F;
      sampling_frequency = (buffer[2]>>2) & 0x3;
      padding = (buffer[2]>>1) & 0x01;
      extension = buffer[2] & 0x01;
      mode = (buffer[3]>>6) & 0x3;
      mode_ext = (buffer[3]>>4) & 0x03;
      copyright = (buffer[3]>>3) & 0x01;
      original = (buffer[3]>>2) & 0x1;
      emphasis = ( buffer[3] ) & 0x3;
      stereo = (mode == MPG_MD_MONO) ? 1 : 2; 
      return(true);
   }
}