annotate libmpdemux/mp3_hdr.c @ 5623:cdf5b88bdaa8

Most of informational printk's ifdef'd. Now without debug only initial and error messages go to syslog. eyck added to list of people who messed with this file(?).
author eyck
date Sun, 14 Apr 2002 23:14:26 +0000
parents a21735031d6a
children ef85f6de947c
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] = {
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
9 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
10 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
11 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
12
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
13 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
14 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
15 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
16 };
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
17 static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
18
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
19 /*
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
20 * return frame size or -1 (bad frame)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
21 */
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
22 int mp_decode_mp3_header(unsigned char* hbuf){
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
23 int stereo,ssize,crc,lsf,mpeg25,framesize,padding,bitrate_index,sampling_frequency;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
24 unsigned long newhead =
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
25 hbuf[0] << 24 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
26 hbuf[1] << 16 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
27 hbuf[2] << 8 |
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
28 hbuf[3];
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
29
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
30 // printf("head=0x%08X\n",newhead);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
31
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
32 #if 1
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
33 // head_check:
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
34 if( (newhead & 0xffe00000) != 0xffe00000 ||
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
35 (newhead & 0x0000fc00) == 0x0000fc00){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
36 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n");
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
37 return -1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
38 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
39 #endif
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
40
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
41 if((4-((newhead>>17)&3))!=3){
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
42 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"not layer-3\n");
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
43 return -1;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
44 }
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
45
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
46 if( newhead & ((long)1<<20) ) {
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
47 lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
48 mpeg25 = 0;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
49 } else {
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
50 lsf = 1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
51 mpeg25 = 1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
52 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
53
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
54 if(mpeg25)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
55 sampling_frequency = 6 + ((newhead>>10)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
56 else
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
57 sampling_frequency = ((newhead>>10)&0x3) + (lsf*3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
58
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
59 if(sampling_frequency>8){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
60 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n");
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
61 return -1; // valid: 0..8
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
62 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
63
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
64 crc = ((newhead>>16)&0x1)^0x1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
65 bitrate_index = ((newhead>>12)&0xf);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
66 padding = ((newhead>>9)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
67 // fr->extension = ((newhead>>8)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
68 // fr->mode = ((newhead>>6)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
69 // fr->mode_ext = ((newhead>>4)&0x3);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
70 // fr->copyright = ((newhead>>3)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
71 // fr->original = ((newhead>>2)&0x1);
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
72 // fr->emphasis = newhead & 0x3;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
73
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
74 stereo = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
75
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
76 if(!bitrate_index){
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 2589
diff changeset
77 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
2588
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
78 return -1;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
79 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
80
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
81 if(lsf)
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
82 ssize = (stereo == 1) ? 9 : 17;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
83 else
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
84 ssize = (stereo == 1) ? 17 : 32;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
85 if(crc) ssize += 2;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
86
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
87 framesize = (long) tabsel_123[lsf][2][bitrate_index] * 144000;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
88 framesize /= freqs[sampling_frequency]<<lsf;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
89 framesize += padding;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
90
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
91 // if(framesize<=0 || framesize>MAXFRAMESIZE) return FALSE;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
92
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
93 return framesize;
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
94 }
19731609ea59 mp3 header parser
arpi
parents:
diff changeset
95