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
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"
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
23
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
24 //----------------------- mp3 audio frame header parser -----------------------
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
25
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
34 };
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
35
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
36 static long freqs[9] = { 44100, 48000, 32000, // MPEG 1.0
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
37 22050, 24000, 16000, // MPEG 2.0
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
38 11025, 12000, 8000}; // MPEG 2.5
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
39
5806
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
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
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
42 hbuf[0] << 24 |
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
43 hbuf[1] << 16 |
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
44 hbuf[2] << 8 |
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
45 hbuf[3];
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
46 if( newhead & ((long)1<<20) ) {
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
47 return (newhead & ((long)1<<19)) ? 0x0 : 0x1;
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
48 }
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
49 return 1;
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
50 }
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
51
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
52 /*
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
53 * return frame size or -1 (bad frame)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
60 hbuf[0] << 24 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
61 hbuf[1] << 16 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
62 hbuf[2] << 8 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
63 hbuf[3];
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
64
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
65 // printf("head=0x%08X\n",newhead);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
66
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
67 #if 1
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
68 // head_check:
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
71 return -1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
72 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
73 #endif
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
74
15039
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
80
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
81 sampling_frequency = ((newhead>>10)&0x3); // valid: 0..2
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
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
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
84 return -1;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
85 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
86
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
87 if( newhead & ((long)1<<20) ) {
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
88 // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1)
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
89 lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
90 sampling_frequency += (lsf*3);
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
91 } else {
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
92 // MPEG 2.5
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
93 lsf = 1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
94 sampling_frequency += 6;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
95 }
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
96
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
97 // crc = ((newhead>>16)&0x1)^0x1;
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
98 bitrate_index = ((newhead>>12)&0xf); // valid: 1..14
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
99 padding = ((newhead>>9)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
100 // fr->extension = ((newhead>>8)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
101 // fr->mode = ((newhead>>6)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
102 // fr->mode_ext = ((newhead>>4)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
103 // fr->copyright = ((newhead>>3)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
104 // fr->original = ((newhead>>2)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
105 // fr->emphasis = newhead & 0x3;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
106
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
107 stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
108
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
109 // !checked later through tabsel_123[]!
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
110 // if(!bitrate_index || bitrate_index==15){
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
111 // mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
112 // return -1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
113 // }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
114
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
115 if(lsf)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
116 ssize = (stereo == 1) ? 9 : 17;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
117 else
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
118 ssize = (stereo == 1) ? 17 : 32;
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
119 if(!((newhead>>16)&0x1)) ssize += 2; // CRC
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
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
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
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
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
133 if(layer==1)
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
134 framesize = (framesize+padding)*4;
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
135 else
c9e2d75a9013 added support for mpa layers 1 and 2
nicodvb
parents: 10370
diff changeset
136 framesize += padding;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
137
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5806
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
155
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
156 return framesize;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
157 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
158