2
// C++ Implementation: ADM_MP3Info
5
// Decode an mp3 frame an fill the info field
6
// The second is a template to check we do not do bogus frame detection
8
// Author: mean <fixounet@free.fr>, (C) 2004
10
// Copyright: See COPYING file that comes with this distribution
13
/***************************************************************************
15
* This program is free software; you can redistribute it and/or modify *
16
* it under the terms of the GNU General Public License as published by *
17
* the Free Software Foundation; either version 2 of the License, or *
18
* (at your option) any later version. *
20
***************************************************************************/
26
#include <ADM_assert.h>
30
#include "ADM_library/default.h"
31
#include "aviaudio.hxx"
32
#include "ADM_audio/ADM_mp3info.h"
34
static uint32_t MP3Fq[4] = { 44100, 48000, 32000, 0 };
35
static uint32_t MP2Fq[4] = { 22050, 24000, 16000, 0 };
36
static uint32_t Bitrate[8][16]=
39
{0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0},
41
{0,32,64,96,128,160,192,224 ,256,288,320,352,384,416,448,0},
43
{ 0, 32, 48, 56,64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0},
45
{ 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0},
47
{0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0},
49
{ 0, 32, 48, 56,64, 80, 96, 112, 128, 144, 160,176, 192, 224, 256, 0},
51
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 },
53
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 },
57
uint8_t getMpegFrameInfo(uint8_t *stream,uint32_t maxSearch, MpegAudioInfo *mpegInfo,MpegAudioInfo *templ,uint32_t *offset)
59
uint32_t start=0,found=0;
61
uint32_t nfq,fqindex,brindex,index;
68
if(start>=maxSearch-3) break;
70
if(a[0]==0xff && ((a[1]&0xF0)==0xF0))
73
mpegInfo->layer=4-(a[1]>>1)&3;
74
mpegInfo->level=4-(a[1]>>3)&3;
75
if(mpegInfo->level==3) continue;
76
if(mpegInfo->level==4) mpegInfo->level=3;
77
mpegInfo->protect=(a[1]&1)^1;
78
mpegInfo->padding=(a[2]>>1)&1;
79
mpegInfo->mode=(a[3])>>6;
84
// Remove impossible case
85
if(mpegInfo->layer==0) continue;
87
switch(mpegInfo->level)
89
case 1: mpegInfo->samplerate=MP3Fq[fqindex];break;
90
case 2: mpegInfo->samplerate=MP2Fq[fqindex];break;
91
case 3: mpegInfo->samplerate=MP2Fq[fqindex]>>1;break;
92
default: mpegInfo->samplerate=0;break;
95
if(!mpegInfo->samplerate) continue;
99
switch(mpegInfo->level)
103
index=4+mpegInfo->layer;
106
index=mpegInfo->layer;
112
mpegInfo->bitrate=Bitrate[index][brindex];
113
if(!mpegInfo->bitrate) continue;
118
if(templ->samplerate!=mpegInfo->samplerate) continue;
124
}while(!found && start<maxSearch-4);
130
// Sample in the packet
131
if(mpegInfo->level==1)
133
if(1==mpegInfo->layer)
134
mpegInfo->samples=384;
136
mpegInfo->samples=1152;
141
if(1==mpegInfo->layer)
142
mpegInfo->samples=384;
144
mpegInfo->samples=576;
150
//L1:FrameLengthInBytes = (12 * BitRate / SampleRate + Padding) * 4
152
switch(mpegInfo->layer)
155
mpegInfo->size=((12*1000*mpegInfo->bitrate)/mpegInfo->samplerate)
157
mpegInfo->size=mpegInfo->size*4;
160
//FrameLengthInBytes = 144 * BitRate / SampleRate + Padding
161
mpegInfo->size=(144*mpegInfo->bitrate*1000)/mpegInfo->samplerate;
162
mpegInfo->size+=mpegInfo->padding;
166
printf("MP3: Skipped %lu bytes\n",*offset);
170
printf("%02x %02x %02x %02x\n",a[0],a[1],a[2],a[3]);
171
printf("Packet found : at :%d level:%d layer:%d fq:%d bitrate:%d mode:%d\n",
172
start-1,mpegInfo->level,mpegInfo->layer,mpegInfo->samplerate,
173
mpegInfo->bitrate,mpegInfo->mode);
174
printf("Padd:%lu, crc on:%lu size:%lu\n",mpegInfo->padding,mpegInfo->protect,
2
// C++ Implementation: ADM_MP3Info
5
// Decode an mp3 frame an fill the info field
6
// The second is a template to check we do not do bogus frame detection
8
// Author: mean <fixounet@free.fr>, (C) 2004
10
// Copyright: See COPYING file that comes with this distribution
13
/***************************************************************************
15
* This program is free software; you can redistribute it and/or modify *
16
* it under the terms of the GNU General Public License as published by *
17
* the Free Software Foundation; either version 2 of the License, or *
18
* (at your option) any later version. *
20
***************************************************************************/
26
#include <ADM_assert.h>
30
#include "ADM_library/default.h"
31
#include "aviaudio.hxx"
32
#include "ADM_audio/ADM_mp3info.h"
34
static uint32_t MP3Fq[4] = { 44100, 48000, 32000, 0 };
35
static uint32_t MP2Fq[4] = { 22050, 24000, 16000, 0 };
36
static uint32_t Bitrate[8][16]=
39
{0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0},
41
{0,32,64,96,128,160,192,224 ,256,288,320,352,384,416,448,0},
43
{ 0, 32, 48, 56,64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0},
45
{ 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0},
47
{0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0},
49
{ 0, 32, 48, 56,64, 80, 96, 112, 128, 144, 160,176, 192, 224, 256, 0},
51
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 },
53
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 },
57
uint8_t getMpegFrameInfo(uint8_t *stream,uint32_t maxSearch, MpegAudioInfo *mpegInfo,MpegAudioInfo *templ,uint32_t *offset)
59
uint32_t start=0,found=0;
61
uint32_t nfq,fqindex,brindex,index;
68
if(start>=maxSearch-3) break;
70
if(a[0]==0xff && ((a[1]&0xF0)==0xF0))
73
mpegInfo->layer=4-(a[1]>>1)&3;
74
mpegInfo->level=4-(a[1]>>3)&3;
75
if(mpegInfo->level==3) continue;
76
if(mpegInfo->level==4) mpegInfo->level=3;
77
mpegInfo->protect=(a[1]&1)^1;
78
mpegInfo->padding=(a[2]>>1)&1;
79
mpegInfo->privatebit=(a[2]&1);
80
mpegInfo->mode=(a[3])>>6;
81
mpegInfo->mode_extension=((a[3])>>4)&3;
86
// Remove impossible case
87
if(mpegInfo->layer==0) continue;
96
switch(mpegInfo->level)
98
case 1: mpegInfo->samplerate=MP3Fq[fqindex];break;
99
case 2: mpegInfo->samplerate=MP2Fq[fqindex];break;
100
case 3: mpegInfo->samplerate=MP2Fq[fqindex]>>1;break;
101
default: mpegInfo->samplerate=0;break;
104
if(!mpegInfo->samplerate) continue;
108
switch(mpegInfo->level)
112
index=4+mpegInfo->layer;
115
index=mpegInfo->layer;
121
mpegInfo->bitrate=Bitrate[index][brindex];
122
if(!mpegInfo->bitrate) continue;
127
if(templ->samplerate!=mpegInfo->samplerate) continue;
133
}while(!found && start<maxSearch-4);
139
// Sample in the packet
140
if(mpegInfo->level==1)
142
if(1==mpegInfo->layer)
143
mpegInfo->samples=384;
145
mpegInfo->samples=1152;
150
if(1==mpegInfo->layer)
151
mpegInfo->samples=384;
153
mpegInfo->samples=576;
159
//L1:FrameLengthInBytes = (12 * BitRate / SampleRate + Padding) * 4
161
switch(mpegInfo->layer)
164
mpegInfo->size=((12*1000*mpegInfo->bitrate)/mpegInfo->samplerate)
166
mpegInfo->size=mpegInfo->size*4;
169
//FrameLengthInBytes = 144 * BitRate / SampleRate + Padding
170
uint32_t slot_per_frame;
171
if(mpegInfo->layer==3 && mpegInfo->level==2) slot_per_frame=72;
172
else slot_per_frame=144;
173
mpegInfo->size=(slot_per_frame*mpegInfo->bitrate*1000)/mpegInfo->samplerate;
174
mpegInfo->size+=mpegInfo->padding;
178
printf("MP3: Skipped %lu bytes\n",*offset);
182
printf("%02x %02x %02x %02x\n",a[0],a[1],a[2],a[3]);
183
printf("Packet found : at :%d level:%d layer:%d fq:%d bitrate:%d mode:%d\n",
184
start-1,mpegInfo->level,mpegInfo->layer,mpegInfo->samplerate,
185
mpegInfo->bitrate,mpegInfo->mode);
186
printf("Private :%d cop:%d ext:%d ",mpegInfo->privatebit,
187
0,mpegInfo->mode_extension);
188
printf("Padd:%lu, crc on:%lu size:%lu\n",mpegInfo->padding,mpegInfo->protect,