annotate libmpdemux/mp3_hdr.c @ 13593:e2dca00374f2

add new control message, that is send after end of stream, to flush all remaining frames in the video system required by xvid4 encoder.
author iive
date Sat, 09 Oct 2004 13:07:18 +0000
parents 2cfd7ef9cb75
children c9e2d75a9013
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
1 #include <stdio.h>
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
2
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
3 #include "config.h"
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
4 #include "../mp_msg.h"
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
5
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
6 //----------------------- mp3 audio frame header parser -----------------------
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
7
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
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
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
16 };
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
17
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
18 static long freqs[9] = { 44100, 48000, 32000, // MPEG 1.0
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
19 22050, 24000, 16000, // MPEG 2.0
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
20 11025, 12000, 8000}; // MPEG 2.5
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
21
5806
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
22 int mp_mp3_get_lsf(unsigned char* hbuf){
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
23 unsigned long newhead =
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
24 hbuf[0] << 24 |
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
25 hbuf[1] << 16 |
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
26 hbuf[2] << 8 |
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
27 hbuf[3];
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
28 if( newhead & ((long)1<<20) ) {
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
29 return (newhead & ((long)1<<19)) ? 0x0 : 0x1;
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
30 }
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
31 return 1;
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
32 }
ef85f6de947c mp_mp3_get_lsf() added - to get decomp. frame size
arpi
parents: 4694
diff changeset
33
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
34 /*
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
35 * return frame size or -1 (bad frame)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
36 */
6763
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5806
diff changeset
37 int mp_get_mp3_header(unsigned char* hbuf,int* chans, int* srate){
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
38 int stereo,ssize,lsf,framesize,padding,bitrate_index,sampling_frequency;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
39 unsigned long newhead =
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
40 hbuf[0] << 24 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
41 hbuf[1] << 16 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
42 hbuf[2] << 8 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
43 hbuf[3];
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
44
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
45 // printf("head=0x%08X\n",newhead);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
46
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
47 #if 1
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
48 // head_check:
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
49 if( (newhead & 0xffe00000) != 0xffe00000 ){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
50 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n");
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
51 return -1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
52 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
53 #endif
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
54
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
55 if((4-((newhead>>17)&3))!=3){
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
56 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"not layer-3\n");
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
57 return -1;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
58 }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
59
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
60 sampling_frequency = ((newhead>>10)&0x3); // valid: 0..2
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
61 if(sampling_frequency==3){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
62 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n");
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
63 return -1;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
64 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
65
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
66 if( newhead & ((long)1<<20) ) {
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
67 // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1)
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
68 lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
69 sampling_frequency += (lsf*3);
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
70 } else {
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
71 // MPEG 2.5
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
72 lsf = 1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
73 sampling_frequency += 6;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
74 }
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
75
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
76 // crc = ((newhead>>16)&0x1)^0x1;
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
77 bitrate_index = ((newhead>>12)&0xf); // valid: 1..14
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
78 padding = ((newhead>>9)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
79 // fr->extension = ((newhead>>8)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
80 // fr->mode = ((newhead>>6)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
81 // fr->mode_ext = ((newhead>>4)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
82 // fr->copyright = ((newhead>>3)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
83 // fr->original = ((newhead>>2)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
84 // fr->emphasis = newhead & 0x3;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
85
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
86 stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
87
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
88 // !checked later through tabsel_123[]!
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
89 // if(!bitrate_index || bitrate_index==15){
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
90 // mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
91 // return -1;
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
92 // }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
93
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
94 if(lsf)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
95 ssize = (stereo == 1) ? 9 : 17;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
96 else
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
97 ssize = (stereo == 1) ? 17 : 32;
10369
b9fdaecc672f better checks
arpi
parents: 7910
diff changeset
98 if(!((newhead>>16)&0x1)) ssize += 2; // CRC
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
99
7910
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
100 framesize = tabsel_123[lsf][2][bitrate_index] * 144000;
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
101
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
102 if(!framesize){
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
103 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid framesize/bitrate_index\n");
10370
2cfd7ef9cb75 codmetics (noticed by Alex)
arpi
parents: 10369
diff changeset
104 return -1;
7910
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
105 }
5a276890cec4 check for framesize validity, return -1 (error) for zero size (bug found by pl)
arpi
parents: 6763
diff changeset
106
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
107 framesize /= freqs[sampling_frequency]<<lsf;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
108 framesize += padding;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
109
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
110 // if(framesize<=0 || framesize>MAXFRAMESIZE) return FALSE;
6763
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5806
diff changeset
111 if(srate) *srate = freqs[sampling_frequency];
e29f95ed5d36 Fix vbr muxing and win32 codec crash on init
albeu
parents: 5806
diff changeset
112 if(chans) *chans = stereo;
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
113
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
114 return framesize;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
115 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
116