Mercurial > mplayer.hg
annotate libmpdemux/mp3_hdr.c @ 27319:09cf111f68b8
Revert to previous dependency checking behavior.
Take included header files into account when generating dependency files.
This has problems when header files are removed or renamed, but does not
silently miscompile files.
author | diego |
---|---|
date | Sat, 26 Jul 2008 18:36:48 +0000 |
parents | 6ff3379a0862 |
children | d643e4643313 |
rev | line source |
---|---|
2588 | 1 #include <stdio.h> |
2 | |
3 #include "config.h" | |
17012 | 4 #include "mp_msg.h" |
2588 | 5 |
6 //----------------------- mp3 audio frame header parser ----------------------- | |
7 | |
8 static int tabsel_123[2][3][16] = { | |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
9 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0}, |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
10 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0}, |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
11 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0} }, |
2588 | 12 |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
13 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,0}, |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
14 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0}, |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
15 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0} } |
2588 | 16 }; |
10369 | 17 |
18 static long freqs[9] = { 44100, 48000, 32000, // MPEG 1.0 | |
19 22050, 24000, 16000, // MPEG 2.0 | |
10370 | 20 11025, 12000, 8000}; // MPEG 2.5 |
2588 | 21 |
5806 | 22 int mp_mp3_get_lsf(unsigned char* hbuf){ |
23 unsigned long newhead = | |
24 hbuf[0] << 24 | | |
25 hbuf[1] << 16 | | |
26 hbuf[2] << 8 | | |
27 hbuf[3]; | |
28 if( newhead & ((long)1<<20) ) { | |
29 return (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
30 } | |
31 return 1; | |
32 } | |
33 | |
2588 | 34 /* |
35 * return frame size or -1 (bad frame) | |
36 */ | |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
37 int mp_get_mp3_header(unsigned char* hbuf,int* chans, int* srate, int* spf, int* mpa_layer, int* br){ |
15251
c39173a67cbb
wrong framesize calculation for layers 1 and 2 with lsf set
nicodvb
parents:
15199
diff
changeset
|
38 int stereo,ssize,lsf,framesize,padding,bitrate_index,sampling_frequency, divisor; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
39 int bitrate; |
15039 | 40 int layer, mult[3] = { 12000, 144000, 144000 }; |
2588 | 41 unsigned long newhead = |
42 hbuf[0] << 24 | | |
43 hbuf[1] << 16 | | |
44 hbuf[2] << 8 | | |
45 hbuf[3]; | |
46 | |
47 // printf("head=0x%08X\n",newhead); | |
48 | |
49 #if 1 | |
50 // head_check: | |
10369 | 51 if( (newhead & 0xffe00000) != 0xffe00000 ){ |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
52 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n"); |
2588 | 53 return -1; |
54 } | |
55 #endif | |
56 | |
15039 | 57 layer = 4-((newhead>>17)&3); |
58 if(layer==4){ | |
59 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"not layer-1/2/3\n"); | |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
60 return -1; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
61 } |
2588 | 62 |
10370 | 63 sampling_frequency = ((newhead>>10)&0x3); // valid: 0..2 |
10369 | 64 if(sampling_frequency==3){ |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
65 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n"); |
10370 | 66 return -1; |
2588 | 67 } |
68 | |
10369 | 69 if( newhead & ((long)1<<20) ) { |
70 // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1) | |
71 lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
72 sampling_frequency += (lsf*3); | |
73 } else { | |
74 // MPEG 2.5 | |
75 lsf = 1; | |
76 sampling_frequency += 6; | |
77 } | |
78 | |
79 // crc = ((newhead>>16)&0x1)^0x1; | |
10370 | 80 bitrate_index = ((newhead>>12)&0xf); // valid: 1..14 |
2588 | 81 padding = ((newhead>>9)&0x1); |
82 // fr->extension = ((newhead>>8)&0x1); | |
83 // fr->mode = ((newhead>>6)&0x3); | |
84 // fr->mode_ext = ((newhead>>4)&0x3); | |
85 // fr->copyright = ((newhead>>3)&0x1); | |
86 // fr->original = ((newhead>>2)&0x1); | |
87 // fr->emphasis = newhead & 0x3; | |
88 | |
89 stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2; | |
90 | |
10369 | 91 // !checked later through tabsel_123[]! |
92 // if(!bitrate_index || bitrate_index==15){ | |
93 // mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n"); | |
94 // return -1; | |
95 // } | |
2588 | 96 |
97 if(lsf) | |
98 ssize = (stereo == 1) ? 9 : 17; | |
99 else | |
100 ssize = (stereo == 1) ? 17 : 32; | |
10369 | 101 if(!((newhead>>16)&0x1)) ssize += 2; // CRC |
2588 | 102 |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
103 bitrate = tabsel_123[lsf][layer-1][bitrate_index]; |
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
104 framesize = bitrate * mult[layer-1]; |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
105 |
15039 | 106 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"FRAMESIZE: %d, layer: %d, bitrate: %d, mult: %d\n", |
107 framesize, layer, tabsel_123[lsf][layer-1][bitrate_index], mult[layer-1]); | |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
108 if(!framesize){ |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
109 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid framesize/bitrate_index\n"); |
10370 | 110 return -1; |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
111 } |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
112 |
15251
c39173a67cbb
wrong framesize calculation for layers 1 and 2 with lsf set
nicodvb
parents:
15199
diff
changeset
|
113 divisor = (layer == 3 ? (freqs[sampling_frequency] << lsf) : freqs[sampling_frequency]); |
c39173a67cbb
wrong framesize calculation for layers 1 and 2 with lsf set
nicodvb
parents:
15199
diff
changeset
|
114 framesize /= divisor; |
15039 | 115 if(layer==1) |
116 framesize = (framesize+padding)*4; | |
117 else | |
118 framesize += padding; | |
2588 | 119 |
120 // if(framesize<=0 || framesize>MAXFRAMESIZE) return FALSE; | |
15199
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
121 if(srate) { |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
122 *srate = freqs[sampling_frequency]; |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
123 if(spf) { |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
124 if(layer == 1) |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
125 *spf = 384; |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
126 else if(layer == 2) |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
127 *spf = 1152; |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
128 else if(*srate < 32000) |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
129 *spf = 576; |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
130 else |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
131 *spf = 1152; |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
132 } |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
133 } |
980910eb6f0c
assign correct tag, dwScale and dwBlockAlign to mpeg audio; optionally assign layer and samples_per_frame when parsing mpa header
nicodvb
parents:
15039
diff
changeset
|
134 if(mpa_layer) *mpa_layer = layer; |
6763 | 135 if(chans) *chans = stereo; |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
136 if(br) *br = bitrate; |
2588 | 137 |
138 return framesize; | |
139 } | |
140 |