📄 buffer_misc.~pas
字号:
// MP4Cam2AVI - .MP4 to .AVI converter
// Copyright (C) 2004-2007 Oleg Mikheev, graywolf2004@mail.ru
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// Any non-GPL usage of this software or parts of this software is strictly
// forbidden.
unit Buffer_Misc;
interface
uses
Windows, Math, SysUtils, StrUtils;
{$UNDEF UNICODE}
type
PBuffer = ^TBuffer;
TBuffer = array of char;
TChunk = record
Data: TBuffer;
Size: integer;
WavSize: integer;
Pref: string[4];
FrameType: char;
Flags: integer;
FB: integer;
end;
TLowPassFilter = class
private
M: integer;
NonOdd: byte;
Gam: real;
G, b, c: array of real;
y: array of array[0..2] of real;
x: array[0..2] of real;
public
constructor Create(CutOff, Pwr, SampleRate: integer; Aps: real);
function Pass(Inp: integer):integer;
end;
TSplineFilter = class
InSamples, InSamplesDone: int64;
OutSamples, OutSamplesDone: int64;
InSR, SR: integer;
private
y: array[0..2] of real;
a: array[1..3] of real;
a1, Ratio: real;
LFilter: TLowPassFilter;
public
constructor Create(InSampleRate, SampleRate: integer);
procedure Input(x: integer);
function Output: integer;
end;
TReSampleBox = class
InSampleRate, SamplesRate: integer;
Channels: integer;
RFilters: array of TSplineFilter;
private
ReSampleRatio: real;
public
constructor Create(Chann, InSampleRate, SampleRate: integer);
function Pass(var InChunk: TChunk): TChunk;
end;
function DwordToStr(d: integer):string;
function StrToDword(s: string):integer;
function HexNum(c: char):byte;
function DwordReverse(var d: integer):integer;
function WordReverse(var d: smallint):smallint;
procedure HexStringToBuffer(var buf: TBuffer; s: string; StartPos: integer);
function BufferToDwordRev(var buf: TBuffer; index: integer):integer;
function BufferToDword(var buf: TBuffer; index: integer):integer;
function BufferToWordRev(var buf: TBuffer; index: integer):smallint;
function BufferToWord(var buf: TBuffer; index: integer):smallint;
function BufferToByte(var buf: TBuffer; index: integer):byte;
function BufferToString(var buf: TBuffer; index: integer; count: integer):string;
procedure BufferShiftRight(var buf: TBuffer; count: integer);
procedure BufferShiftLeft(var buf: TBuffer; count: integer; RealSize: integer);
procedure BufferRemoveBytes(var buf: TBuffer; StartPoint, EndPoint, RealSize: integer);
procedure BufferWriteBuffer(var bufTo, bufFrom: TBuffer; index: integer; count: integer; indTo: integer);
procedure BufferWriteString(var buf: TBuffer; s: string; index: integer);
procedure BufferWriteDword(var buf: TBuffer; d: integer; index: integer);
procedure BufferWriteWord(var buf: TBuffer; d: smallint; index: integer);
procedure BufferWriteWordRev(var buf: TBuffer; d: smallint; index: integer);
procedure BufferWriteDwordRev(var buf: TBuffer; d: integer; index: integer);
procedure BufferWriteByte(var buf: TBuffer; b: byte; index: integer);
procedure BufferWriteEntireBuffer(var bufTo, bufFrom: TBuffer; indTo: integer);
function BufferSearchString(var buf: TBuffer; str: string; offs: integer): integer;
function BufferSearchStringRev(var buf: TBuffer; str: string; offs: integer): integer;
function BufferSearchDword(var buf: TBuffer; d: integer; offs: integer): integer;
procedure BufferWriteZeroBuffer(var buf: TBuffer; index, count: integer);
procedure ReChannelWavChunk(var Chunk: TChunk; InChannels, Channels: integer);
procedure IMA_ADPCMDecode(srcChunk: TChunk; var dstChunk: TChunk; Channels: integer; ADPCMFrameSize: integer);
procedure MS_ADPCMDecode(srcChunk: TChunk; var dstChunk: TChunk; Channels: integer; ADPCMFrameSize: integer);
procedure QT_ADPCMDecode(srcChunk: TChunk; var dstChunk: TChunk; Channels: integer);
function CmdParamExists(s: string): boolean;
function GetCmdParamVal(name: string): string;
// ADPCM DECODE
const
IMA_ADPCMStepTable: array[0..88] of integer =
(7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767);
IMA_ADPCMIndexTable: array[0..7] of integer = (-1, -1, -1, -1, 2, 4, 6, 8);
MS_AdapTable: array[0..15] of integer = (230, 230, 230, 230, 307, 409, 512, 614,
768, 614, 512, 409, 307, 230, 230, 230);
MS_Coeff1: array[0..6] of integer = (256, 512, 0, 192, 240, 460, 392);
MS_Coeff2: array[0..6] of integer = (0, -256, 0, 64, 0, -208, -232);
var
CStepIndex, CPredictor, BlockPredictor, MSDelta, Sample1, Sample2, Coeff1, Coeff2 : integer;
implementation
uses
Main;
constructor TLowPassFilter.Create(CutOff, Pwr, SampleRate: integer; Aps: real);
var dt, fs, ws, wdp, wds, wdc: real;
De: real;
i: integer;
a: array of real;
begin
dt := 1 / SampleRate;
De := Aps * Sqrt(2/Aps - 1) / (1 - Aps);
fs := CutOff;
ws := fs * 2 * PI;
wds := 2 * tan(ws * dt / 2) / dt;
wdp := wds * Power(De / (sqrt(1/sqr(Aps) - 1)), 1/Pwr);
// 欣廖依盘 C 着彝厶
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -