annotate libmpdemux/mp3_hdr.c @ 34175:a345e7162d0a

Move TranslateFilename() to util/string.c. Now that the Win32 GUI uses symbolic constants for its messages, the code of TranslateFilename() both GUIs use is almost identical. So, share the code.
author ib
date Wed, 26 Oct 2011 15:14:06 +0000
parents 355873f64ce7
children becaa4804918
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
2 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
3 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
5 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
7 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
8 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
12 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
13 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
14 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
17 */
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 17012
diff changeset
18
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
19 #include <stdio.h>
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
20
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
21 #include "config.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16162
diff changeset
22 #include "mp_msg.h"
30554
321e9ea69b9f #include corresponding .h files in .c files.
diego
parents: 29263
diff changeset
23 #include "mp3_hdr.h"
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
24
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
25 //----------------------- mp3 audio frame header parser -----------------------
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
26
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
27 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
28 { {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
29 {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
30 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0} },
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
31
7910
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
32 { {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
33 {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
34 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0} }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
35 };
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
36
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
37 static long freqs[9] = { 44100, 48000, 32000, // MPEG 1.0
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
38 22050, 24000, 16000, // MPEG 2.0
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
39 11025, 12000, 8000}; // MPEG 2.5
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
40
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
41 /*
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
42 * return frame size or -1 (bad frame)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
43 */
16162
b5c2254d13f8 set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents: 15251
diff changeset
44 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
45 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
46 int bitrate;
15039
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
47 int layer, mult[3] = { 12000, 144000, 144000 };
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
48 unsigned long newhead =
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
49 hbuf[0] << 24 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
50 hbuf[1] << 16 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
51 hbuf[2] << 8 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
52 hbuf[3];
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
53
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
54 // printf("head=0x%08X\n",newhead);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
55
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
56 // head_check:
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
57 if( (newhead & 0xffe00000) != 0xffe00000 ){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
58 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n");
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
59 return -1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
60 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
61
15039
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
62 layer = 4-((newhead>>17)&3);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
63 if(layer==4){
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
64 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
65 return -1;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
66 }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
67
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
68 sampling_frequency = ((newhead>>10)&0x3); // valid: 0..2
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
69 if(sampling_frequency==3){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
70 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n");
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
71 return -1;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
72 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
73
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
74 if( newhead & ((long)1<<20) ) {
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
75 // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1)
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
76 lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
77 sampling_frequency += (lsf*3);
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
78 } else {
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
79 // MPEG 2.5
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
80 lsf = 1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
81 sampling_frequency += 6;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
82 }
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
83
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
84 // crc = ((newhead>>16)&0x1)^0x1;
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
85 bitrate_index = ((newhead>>12)&0xf); // valid: 1..14
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
86 padding = ((newhead>>9)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
87 // fr->extension = ((newhead>>8)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
88 // fr->mode = ((newhead>>6)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
89 // fr->mode_ext = ((newhead>>4)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
90 // fr->copyright = ((newhead>>3)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
91 // fr->original = ((newhead>>2)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
92 // fr->emphasis = newhead & 0x3;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
93
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
94 stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
95
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
96 // !checked later through tabsel_123[]!
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
97 // if(!bitrate_index || bitrate_index==15){
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
98 // mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
99 // return -1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
100 // }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
101
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
102 if(lsf)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
103 ssize = (stereo == 1) ? 9 : 17;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
104 else
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
105 ssize = (stereo == 1) ? 17 : 32;
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
106 if(!((newhead>>16)&0x1)) ssize += 2; // CRC
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
107
16162
b5c2254d13f8 set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents: 15251
diff changeset
108 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
109 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
110
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
111 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"FRAMESIZE: %d, layer: %d, bitrate: %d, mult: %d\n",
15039
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
112 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
113 if(!framesize){
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
114 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid framesize/bitrate_index\n");
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
115 return -1;
7910
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
116 }
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
117
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
118 divisor = (layer == 3 ? (freqs[sampling_frequency] << lsf) : freqs[sampling_frequency]);
15251
c39173a67cbb wrong framesize calculation for layers 1 and 2 with lsf set
nicodvb
parents: 15199
diff changeset
119 framesize /= divisor;
15039
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
120 if(layer==1)
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
121 framesize = (framesize+padding)*4;
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
122 else
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
123 framesize += padding;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
124
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
125 // 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
126 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
127 *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
128 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
129 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
130 *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
131 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
132 *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
133 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
134 *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
135 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
136 *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
137 }
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
138 }
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
139 if(mpa_layer) *mpa_layer = layer;
6763
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5806
diff changeset
140 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
141 if(br) *br = bitrate;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
142
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
143 return framesize;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
144 }