Mercurial > mplayer.hg
annotate libmpdemux/mp3_hdr.c @ 30086:f72ea7a67421
Introduce a sh_common struct that contains the parts in common by the audio, video
and sub "stream headers".
One reason for this is to help avoid/make more obvious things like members with
the same function but different name (extradata vs. codecdata etc.), or members
with the same name but different semantics (pts for audio vs. pts for video).
author | reimar |
---|---|
date | Sun, 27 Dec 2009 14:40:56 +0000 |
parents | 0f1b5b68af32 |
children | 321e9ea69b9f |
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 | 19 #include <stdio.h> |
20 | |
21 #include "config.h" | |
17012 | 22 #include "mp_msg.h" |
2588 | 23 |
24 //----------------------- mp3 audio frame header parser ----------------------- | |
25 | |
26 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
|
27 { {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
|
28 {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
|
29 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0} }, |
2588 | 30 |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
31 { {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
|
32 {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
|
33 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0} } |
2588 | 34 }; |
10369 | 35 |
36 static long freqs[9] = { 44100, 48000, 32000, // MPEG 1.0 | |
37 22050, 24000, 16000, // MPEG 2.0 | |
10370 | 38 11025, 12000, 8000}; // MPEG 2.5 |
2588 | 39 |
5806 | 40 int mp_mp3_get_lsf(unsigned char* hbuf){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
41 unsigned long newhead = |
5806 | 42 hbuf[0] << 24 | |
43 hbuf[1] << 16 | | |
44 hbuf[2] << 8 | | |
45 hbuf[3]; | |
46 if( newhead & ((long)1<<20) ) { | |
47 return (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
48 } | |
49 return 1; | |
50 } | |
51 | |
2588 | 52 /* |
53 * return frame size or -1 (bad frame) | |
54 */ | |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
55 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
|
56 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
|
57 int bitrate; |
15039 | 58 int layer, mult[3] = { 12000, 144000, 144000 }; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
59 unsigned long newhead = |
2588 | 60 hbuf[0] << 24 | |
61 hbuf[1] << 16 | | |
62 hbuf[2] << 8 | | |
63 hbuf[3]; | |
64 | |
65 // printf("head=0x%08X\n",newhead); | |
66 | |
67 #if 1 | |
68 // head_check: | |
10369 | 69 if( (newhead & 0xffe00000) != 0xffe00000 ){ |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
70 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n"); |
2588 | 71 return -1; |
72 } | |
73 #endif | |
74 | |
15039 | 75 layer = 4-((newhead>>17)&3); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
76 if(layer==4){ |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
77 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
|
78 return -1; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
79 } |
2588 | 80 |
10370 | 81 sampling_frequency = ((newhead>>10)&0x3); // valid: 0..2 |
10369 | 82 if(sampling_frequency==3){ |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
2589
diff
changeset
|
83 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n"); |
10370 | 84 return -1; |
2588 | 85 } |
86 | |
10369 | 87 if( newhead & ((long)1<<20) ) { |
88 // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1) | |
89 lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
90 sampling_frequency += (lsf*3); | |
91 } else { | |
92 // MPEG 2.5 | |
93 lsf = 1; | |
94 sampling_frequency += 6; | |
95 } | |
96 | |
97 // crc = ((newhead>>16)&0x1)^0x1; | |
10370 | 98 bitrate_index = ((newhead>>12)&0xf); // valid: 1..14 |
2588 | 99 padding = ((newhead>>9)&0x1); |
100 // fr->extension = ((newhead>>8)&0x1); | |
101 // fr->mode = ((newhead>>6)&0x3); | |
102 // fr->mode_ext = ((newhead>>4)&0x3); | |
103 // fr->copyright = ((newhead>>3)&0x1); | |
104 // fr->original = ((newhead>>2)&0x1); | |
105 // fr->emphasis = newhead & 0x3; | |
106 | |
107 stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2; | |
108 | |
10369 | 109 // !checked later through tabsel_123[]! |
110 // if(!bitrate_index || bitrate_index==15){ | |
111 // mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n"); | |
112 // return -1; | |
113 // } | |
2588 | 114 |
115 if(lsf) | |
116 ssize = (stereo == 1) ? 9 : 17; | |
117 else | |
118 ssize = (stereo == 1) ? 17 : 32; | |
10369 | 119 if(!((newhead>>16)&0x1)) ssize += 2; // CRC |
2588 | 120 |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15251
diff
changeset
|
121 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
|
122 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
|
123 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
124 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"FRAMESIZE: %d, layer: %d, bitrate: %d, mult: %d\n", |
15039 | 125 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
|
126 if(!framesize){ |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
127 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid framesize/bitrate_index\n"); |
10370 | 128 return -1; |
7910
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
129 } |
5a276890cec4
check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents:
6763
diff
changeset
|
130 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
131 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
|
132 framesize /= divisor; |
15039 | 133 if(layer==1) |
134 framesize = (framesize+padding)*4; | |
135 else | |
136 framesize += padding; | |
2588 | 137 |
138 // 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
|
139 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
|
140 *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
|
141 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
|
142 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
|
143 *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
|
144 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
|
145 *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
|
146 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
|
147 *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
|
148 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
|
149 *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
|
150 } |
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
|
151 } |
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
|
152 if(mpa_layer) *mpa_layer = layer; |
6763 | 153 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
|
154 if(br) *br = bitrate; |
2588 | 155 |
156 return framesize; | |
157 } | |
158 |