📄 systems.cpp
字号:
/* systems.c, systems-specific routines *//* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. *//* * Disclaimer of Warranty * * These software programs are available to the user without any license fee or * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims * any and all warranties, whether express, implied, or statuary, including any * implied warranties or merchantability or of fitness for a particular * purpose. In no event shall the copyright-holder be liable for any * incidental, punitive, or consequential damages of any kind whatsoever * arising from the use of these programs. * * This disclaimer of warranty extends to the user of these programs and user's * customers, employees, agents, transferees, successors, and assigns. * * The MPEG Software Simulation Group does not represent or warrant that the * programs furnished hereunder are free of infringement of any third-party * patents. * * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware, * are subject to royalty fees to patent holders. Many of these patents are * general enough such that they are unavoidable regardless of implementation * design. * */#include <stdio.h>#include <stdlib.h>#include "config.h"#include "global.h"
#include "AC3Dec\ac3.h"
#include "io.h"
static char *FTType[5] = {
"48KHz", "44.1KHz", "44.1KHz", "44.1KHz", "44.1KHz"
};
static char *AC3ModeDash[8] = {
"1+1", "1_0", "2_0", "3_0", "2_1", "3_1", "2_2", "3_2"
};
static unsigned char PCM_Buffer[BUFFER_SIZE];
static short *ptrPCM_Buffer = (short*)PCM_Buffer;
static short *ptrAC3Dec_Buffer = (short*)AC3Dec_Buffer;
/* initialize buffer, call once before first getbits or showbits *//* parse system layer, ignore everything we don't need */
static unsigned int Get_Short()
{
unsigned int i = Get_Byte();
return (i<<8) | Get_Byte();
}void Next_Packet(){
static short volume;
static int i, j, Packet_Length, Packet_Header_Length, size;
static unsigned int code, AUDIO_ID, VOBCELL_Count, AC3_Track, MPA_Track;
if(AUDIO)
{
D2V_Flag = true;
process.locate = LOCATE_RIP;
Rip_Flag = 1;
}
int l;
int offset=0;
for(;;) {
if(SEQEND)
{
return;
} code = Get_Long();
/* remove system layer byte stuffing */ while ((code & 0xffffff00) != 0x100) {
code = (code<<8) | Get_Byte();
if(SEQEND)
{
break;
}
}
switch(code) { case PACK_START_CODE: /* pack header */ /* skip pack header (system_clock_reference and mux_rate) */ ld->Rdptr += 8; break;
///////////////////////////////////////
case PRIVATE_STREAM_1:
if(!AUDIO)
break;
Packet_Length = Get_Short();
ld->Rdptr ++;
code = Get_Byte();
Packet_Header_Length = Get_Byte();
if (code>=0x80)
{
code = Get_Byte();
AudioPTS = (code & 0x0e) << 29;
AudioPTS |= (Get_Short() & 0xfffe) << 14;
AudioPTS |= (Get_Short()>>1) & 0x7fff;
AudioPTS /= 90;
ld->Rdptr += Packet_Header_Length-5;
}
else
ld->Rdptr += Packet_Header_Length;
Packet_Length -= Packet_Header_Length;
AUDIO_ID = Get_Byte();
if (AUDIO_ID>=SUB_AC3 && AUDIO_ID<SUB_AC3+CHANNEL)
{
ld->Rdptr += 3; Packet_Length -= 7; AC3_Track = AUDIO_ID-SUB_AC3;
if (!ac3[AC3_Track].rip && Rip_Flag && !CH[AC3_Track])
{
CH[AC3_Track] = FORMAT_AC3;
code = Get_Byte();
code = (code & 0xff)<<8 | Get_Byte();
i = 0;
while (code!=0xb77)
{
code = (code & 0xff)<<8 | Get_Byte();
i++;
}
Get_Short();
ac3[AC3_Track].rate = (Get_Byte()>>1) & 0x1f;
Get_Byte();
ac3[AC3_Track].mode = (Get_Byte()>>5) & 0x07;
if ((Format_Flag==FORMAT_AC3 || !Format_Flag) && (AVI_Flag || D2V_Flag))
{
if (AC3_Flag==AUDIO_DECODE && AC3_Track==Track_Flag)
{
sprintf(szBuffer, "%s AC3 T%02d %sch %dKbps %s", szOutput, Track_Flag+1,
AC3ModeDash[ac3[AC3_Track].mode], AC3Rate[ac3[AC3_Track].rate], FTType[SRC_Flag]);
sprintf(szBuffer, "%s%s.wav", szBuffer, NormType[Norm_Flag]);
strcpy(ac3[AC3_Track].filename, szBuffer);
ac3[AC3_Track].file = fopen(szBuffer, "wb");
fwrite(WAVHeader, sizeof(WAVHeader), 1, ac3[AC3_Track].file);
ac3[AC3_Track].delay = (AudioPTS-VideoPTS)*192;
if (SRC_Flag)
{
DownWAV(ac3[AC3_Track].file);
InitialSRC();
}
if (ac3[AC3_Track].delay > 0)
{
if (SRC_Flag)
ac3[AC3_Track].delay = ((int)(0.91875*ac3[AC3_Track].delay)>>2)<<2;
for (j=0; j<ac3[AC3_Track].delay; j++)
fputc(*szBlank, ac3[AC3_Track].file);
ac3[AC3_Track].size += ac3[AC3_Track].delay;
ac3[AC3_Track].delay = 0;
}
InitialAC3();
size = ac3_decode_data(ld->Rdptr-7, Packet_Length-i);
if (-ac3[AC3_Track].delay > size)
ac3[AC3_Track].delay += size;
else
{
if (SRC_Flag)
Wavefs44(ac3[AC3_Track].file, size+ac3[AC3_Track].delay, AC3Dec_Buffer-ac3[AC3_Track].delay);
else
fwrite(AC3Dec_Buffer-ac3[AC3_Track].delay, size+ac3[AC3_Track].delay, 1, ac3[AC3_Track].file);
ac3[AC3_Track].size += size+ac3[AC3_Track].delay;
ac3[AC3_Track].delay = 0;
}
ac3[AC3_Track].rip = 1;
}
else if (!AC3_Flag || (AC3_Flag==AUDIO_DEMUXONE && AC3_Track==Track_Flag))
{
sprintf(szBuffer, "%s AC3 T%02d %sch %dKbps DELAY %dms.ac3", szOutput, AC3_Track+1,
AC3ModeDash[ac3[AC3_Track].mode], AC3Rate[ac3[AC3_Track].rate], AudioPTS-VideoPTS);
ac3[AC3_Track].file = fopen(szBuffer, "wb");
fwrite(ld->Rdptr-7, Packet_Length-i, 1, ac3[AC3_Track].file);
ac3[AC3_Track].rip = 1;
}
}
ld->Rdptr -= 4+i;
}
else if (ac3[AC3_Track].rip)
{
if (AC3_Flag==AUDIO_DECODE)
{
size = ac3_decode_data(ld->Rdptr, Packet_Length);
if (-ac3[AC3_Track].delay > size)
ac3[AC3_Track].delay += size;
else
{
if (SRC_Flag)
Wavefs44(ac3[AC3_Track].file, size+ac3[AC3_Track].delay, AC3Dec_Buffer-ac3[AC3_Track].delay);
else
{
fwrite(AC3Dec_Buffer-ac3[AC3_Track].delay, size+ac3[AC3_Track].delay, 1, ac3[AC3_Track].file);
if (Norm_Flag)
for (j=0; j<(size>>1); j++)
{
volume = ptrAC3Dec_Buffer[j];
if (Sound_Max < volume)
Sound_Max = volume;
else if (Sound_Max < -volume)
Sound_Max = -volume;
}
}
ac3[AC3_Track].size += size+ac3[AC3_Track].delay;
ac3[AC3_Track].delay = 0;
}
}
else
fwrite(ld->Rdptr, Packet_Length, 1, ac3[AC3_Track].file);
}
ld->Rdptr += Packet_Length;
}
else if (AUDIO_ID-SUB_PCM == Track_Flag)
{
CH[Track_Flag] = FORMAT_LPCM;
ld->Rdptr += 6; Packet_Length -= 10;
if (!pcm.rip && Rip_Flag)
{
if ((Format_Flag==FORMAT_LPCM || !Format_Flag) && (AVI_Flag || D2V_Flag))
{
pcm.delay = (AudioPTS-VideoPTS)*192;
sprintf(szBuffer, "%s LPCM T%02d %s", szOutput, Track_Flag+1, FTType[SRC_Flag]);
sprintf(szBuffer, "%s%s.wav", szBuffer, NormType[Norm_Flag]);
strcpy(pcm.filename, szBuffer);
pcm.file = fopen(szBuffer, "wb");
fwrite(WAVHeader, sizeof(WAVHeader), 1, pcm.file);
if (SRC_Flag)
{
DownWAV(pcm.file);
InitialSRC();
}
if (pcm.delay > 0)
{
if (SRC_Flag)
pcm.delay = ((int)(0.91875*pcm.delay)>>2)<<2;
for (j=0; j<pcm.delay; j++)
fputc(*szBlank, pcm.file);
pcm.size += pcm.delay;
pcm.delay = 0;
}
if (-pcm.delay > Packet_Length)
pcm.delay += Packet_Length;
else
{
for (j=0; j<Packet_Length; j+=2)
{
PCM_Buffer[j] = *(ld->Rdptr+j+1);
PCM_Buffer[j+1] = *(ld->Rdptr+j);
}
if (SRC_Flag)
Wavefs44(pcm.file, Packet_Length+pcm.delay, PCM_Buffer-pcm.delay);
else
fwrite(PCM_Buffer-pcm.delay, Packet_Length+pcm.delay, 1, pcm.file);
pcm.size += Packet_Length+pcm.delay;
pcm.delay = 0;
}
pcm.rip = 1;
}
}
else if (pcm.rip)
{
if (-pcm.delay > Packet_Length)
pcm.delay += Packet_Length;
else
{
for (j=0; j<Packet_Length; j+=2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -