mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-20 15:02:27 +02:00
2021-10-06 Fred Gleason <fredg@paravelsystems.com>
* Fixed an arithmetic overflow bug in 'RDWaveFile' that could cause the play length of MPEG-encoded to be incorrectly calculated. Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
parent
6d34ca7ee8
commit
9fcd7aaab1
@ -22507,3 +22507,6 @@
|
||||
2021-10-06 Fred Gleason <fredg@paravelsystems.com>
|
||||
* Increased the import process timeout for the WebGet service
|
||||
to 1200 seconds.
|
||||
2021-10-06 Fred Gleason <fredg@paravelsystems.com>
|
||||
* Fixed an arithmetic overflow bug in 'RDWaveFile' that could
|
||||
cause the play length of MPEG-encoded to be incorrectly calculated.
|
||||
|
@ -3864,9 +3864,9 @@ bool RDWaveFile::GetMpegHeader(int fd,int offset)
|
||||
time_length=
|
||||
total_frame_quan*__samples_per_frame[version_index][layer_index]/
|
||||
__samplerates[version_index][samprate_index];
|
||||
ext_time_length=1000*total_frame_quan*
|
||||
__samples_per_frame[version_index][layer_index]/
|
||||
__samplerates[version_index][samprate_index];
|
||||
ext_time_length=1000*(int64_t)total_frame_quan*
|
||||
(int64_t)__samples_per_frame[version_index][layer_index]/
|
||||
(int64_t)__samplerates[version_index][samprate_index];
|
||||
}
|
||||
}
|
||||
if(total_frame_quan<0) {
|
||||
@ -3886,559 +3886,6 @@ bool RDWaveFile::GetMpegHeader(int fd,int offset)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
bool RDWaveFile::GetMpegHeader(int fd,int offset)
|
||||
{
|
||||
unsigned char buffer[4];
|
||||
int n;
|
||||
|
||||
lseek(fd,offset,SEEK_SET);
|
||||
if((n=read(fd,buffer,4))!=4) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Sync
|
||||
//
|
||||
if((buffer[0]!=0xFF)||((buffer[1]&0xE0)!=0xE0)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// MPEG Id
|
||||
//
|
||||
if((buffer[1]&0x08)==0) {
|
||||
mpeg_id=RDWaveFile::Mpeg2;
|
||||
}
|
||||
else {
|
||||
mpeg_id=RDWaveFile::Mpeg1;
|
||||
}
|
||||
|
||||
//
|
||||
// Layer
|
||||
//
|
||||
switch((buffer[1]&0x06)>>1) {
|
||||
case 1:
|
||||
head_layer=3;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_layer=2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_layer=1;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Bitrate
|
||||
//
|
||||
switch(mpeg_id) {
|
||||
case RDWaveFile::Mpeg1:
|
||||
switch(head_layer) {
|
||||
case 1:
|
||||
switch(buffer[2]>>4) {
|
||||
case 1:
|
||||
head_bit_rate=32000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_bit_rate=64000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_bit_rate=96000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
head_bit_rate=128000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
head_bit_rate=160000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
head_bit_rate=192000;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
head_bit_rate=224000;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
head_bit_rate=256000;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
head_bit_rate=288000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
head_bit_rate=320000;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
head_bit_rate=352000;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
head_bit_rate=384000;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
head_bit_rate=416000;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
head_bit_rate=448000;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
switch(buffer[2]>>4) {
|
||||
case 1:
|
||||
head_bit_rate=32000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_bit_rate=48000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_bit_rate=56000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
head_bit_rate=64000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
head_bit_rate=80000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
head_bit_rate=96000;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
head_bit_rate=112000;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
head_bit_rate=128000;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
head_bit_rate=160000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
head_bit_rate=192000;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
head_bit_rate=224000;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
head_bit_rate=256000;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
head_bit_rate=320000;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
head_bit_rate=384000;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
switch(buffer[2]>>4) {
|
||||
case 1:
|
||||
head_bit_rate=32000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_bit_rate=40000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_bit_rate=48000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
head_bit_rate=56000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
head_bit_rate=64000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
head_bit_rate=80000;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
head_bit_rate=96000;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
head_bit_rate=112000;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
head_bit_rate=128000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
head_bit_rate=160000;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
head_bit_rate=192000;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
head_bit_rate=224000;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
head_bit_rate=256000;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
head_bit_rate=320000;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case RDWaveFile::Mpeg2:
|
||||
switch(head_layer) {
|
||||
case 1:
|
||||
switch(buffer[2]>>4) {
|
||||
case 1:
|
||||
head_bit_rate=32000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_bit_rate=48000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_bit_rate=56000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
head_bit_rate=64000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
head_bit_rate=80000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
head_bit_rate=96000;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
head_bit_rate=112000;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
head_bit_rate=128000;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
head_bit_rate=144000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
head_bit_rate=160000;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
head_bit_rate=176000;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
head_bit_rate=192000;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
head_bit_rate=224000;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
head_bit_rate=256000;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
switch(buffer[2]>>4) {
|
||||
case 1:
|
||||
head_bit_rate=8000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_bit_rate=16000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_bit_rate=24000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
head_bit_rate=32000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
head_bit_rate=40000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
head_bit_rate=48000;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
head_bit_rate=56000;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
head_bit_rate=64000;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
head_bit_rate=80000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
head_bit_rate=96000;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
head_bit_rate=112000;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
head_bit_rate=128000;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
head_bit_rate=144000;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
head_bit_rate=160000;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
switch(buffer[2]>>4) {
|
||||
case 1:
|
||||
head_bit_rate=8000;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_bit_rate=16000;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_bit_rate=24000;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
head_bit_rate=32000;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
head_bit_rate=40000;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
head_bit_rate=48000;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
head_bit_rate=56000;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
head_bit_rate=64000;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
head_bit_rate=80000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
head_bit_rate=96000;
|
||||
break;
|
||||
|
||||
case 11:
|
||||
head_bit_rate=112000;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
head_bit_rate=128000;
|
||||
break;
|
||||
|
||||
case 13:
|
||||
head_bit_rate=144000;
|
||||
break;
|
||||
|
||||
case 14:
|
||||
head_bit_rate=160000;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// Sample Rate
|
||||
//
|
||||
switch((buffer[2]>>2)&0x03) {
|
||||
case 0:
|
||||
switch(mpeg_id) {
|
||||
case RDWaveFile::Mpeg1:
|
||||
samples_per_sec=44100;
|
||||
break;
|
||||
|
||||
case RDWaveFile::Mpeg2:
|
||||
samples_per_sec=22050;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
switch(mpeg_id) {
|
||||
case RDWaveFile::Mpeg1:
|
||||
samples_per_sec=48000;
|
||||
break;
|
||||
|
||||
case RDWaveFile::Mpeg2:
|
||||
samples_per_sec=24000;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
switch(mpeg_id) {
|
||||
case RDWaveFile::Mpeg1:
|
||||
samples_per_sec=32000;
|
||||
break;
|
||||
|
||||
case RDWaveFile::Mpeg2:
|
||||
samples_per_sec=16000;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Mode
|
||||
//
|
||||
switch(buffer[3]>>6) {
|
||||
case 0:
|
||||
head_mode=ACM_MPEG_STEREO;
|
||||
channels=2;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
head_mode=ACM_MPEG_JOINTSTEREO;
|
||||
channels=2;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
head_mode=ACM_MPEG_DUALCHANNEL;
|
||||
channels=2;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
head_mode=ACM_MPEG_SINGLECHANNEL;
|
||||
channels=1;
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Flags
|
||||
//
|
||||
if((buffer[2]&0x01)!=0) {
|
||||
head_flags|=ACM_MPEG_PRIVATEBIT;
|
||||
}
|
||||
if((buffer[3]&0x08)!=0) {
|
||||
head_flags|=ACM_MPEG_COPYRIGHT;
|
||||
}
|
||||
if((buffer[3]&0x04)!=0) {
|
||||
head_flags|=ACM_MPEG_ORIGINALHOME;
|
||||
}
|
||||
if((buffer[1]&0x01)!=0) {
|
||||
head_flags|=ACM_MPEG_PROTECTIONBIT;
|
||||
}
|
||||
if(mpeg_id==RDWaveFile::Mpeg1) {
|
||||
head_flags|=ACM_MPEG_ID_MPEG1;
|
||||
}
|
||||
|
||||
//
|
||||
// Frame Size (without padding)
|
||||
//
|
||||
mpeg_frame_size=144*head_bit_rate/samples_per_sec;
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
int RDWaveFile::GetAtxOffset(int fd)
|
||||
{
|
||||
unsigned char buffer[MAX_ATX_HEADER_SIZE];
|
||||
|
Loading…
x
Reference in New Issue
Block a user