⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systems.cpp

📁 mpeg2编码解码源程序代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/* 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 + -