📄 sopen.m
字号:
if any(HDR.FILE.TYPE==[2:5]),
HDR.Cal = 2^(1-HDR.bits);
else
HDR.Cal = 1;
end;
HDR.Off = 0;
HDR.Calib = sparse(2:HDR.NS+1,1:HDR.NS,HDR.Cal);
%%%%% READ
if HDR.FILE.OPEN == 1;
% check file length
fseek(HDR.FILE.FID,0,1);
len = ftell(HDR.FILE.FID);
if len ~= (datlen+HDR.HeadLen),
fprintf(HDR.FILE.stderr,'Warning SOPEN SND-format: header information does not fit file length \n');
datlen = len - HDR.HeadLen;
end;
fseek(HDR.FILE.FID,HDR.HeadLen,-1);
HDR.SPR = datlen/HDR.AS.bpb;
HDR.AS.endpos = datlen/HDR.AS.bpb;
HDR.Dur = HDR.SPR/HDR.SampleRate;
%%%%% WRITE
elseif HDR.FILE.OPEN > 1;
datlen = HDR.SPR * HDR.AS.bpb;
fwrite(HDR.FILE.FID,[hex2dec('2e736e64'),HDR.HeadLen,datlen,HDR.FILE.TYPE,HDR.SampleRate,HDR.NS],'uint32');
fwrite(HDR.FILE.FID,HDR.INFO,'char');
end;
HDR.FILE.POS = 0;
HDR.NRec = 1;
elseif strcmp(HDR.TYPE,'MFER'),
HDR = mwfopen(HDR,PERMISSION);
if (HDR.FRAME.N ~= 1),
fprintf(2,'Error SOPEN (MFER): files with more than one frame not implemented, yet.\n');
fclose(HDR.FILE.FID);
HDR.FILE.FID =-1;
HDR.FILE.OPEN = 0;
end
elseif strcmp(HDR.TYPE,'MPEG'),
% http://www.dv.co.yu/mpgscript/mpeghdr.htm
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-le');
if ~isempty(findstr(PERMISSION,'r')), %%%%% READ
HDR.FILE.OPEN = 1;
% read header
try,
tmp = fread(HDR.FILE.FID,1,'ubit11');
catch
fprintf(HDR.FILE.stderr,'Error 1003 SOPEN: datatype UBIT11 not implented. Header cannot be read.\n');
return;
end;
HDR.MPEG.syncword = tmp;
HDR.MPEG.ID = fread(HDR.FILE.FID,1,'ubit2');
HDR.MPEG.layer = fread(HDR.FILE.FID,1,'ubit2');
HDR.MPEG.protection_bit = fread(HDR.FILE.FID,1,'ubit1');
HDR.MPEG.bitrate_index = fread(HDR.FILE.FID,1,'ubit4');
HDR.MPEG.sampling_frequency_index = fread(HDR.FILE.FID,1,'ubit2');
HDR.MPEG.padding_bit = fread(HDR.FILE.FID,1,'ubit1');
HDR.MPEG.privat_bit = fread(HDR.FILE.FID,1,'ubit1');
HDR.MPEG.mode = fread(HDR.FILE.FID,1,'ubit2');
HDR.MPEG.mode_extension = fread(HDR.FILE.FID,1,'ubit2');
HDR.MPEG.copyright = fread(HDR.FILE.FID,1,'ubit1');
HDR.MPEG.original_home = fread(HDR.FILE.FID,1,'ubit1');
HDR.MPEG.emphasis = fread(HDR.FILE.FID,1,'ubit2');
switch HDR.MPEG.ID, %Layer
case 0,
HDR.VERSION = 2.5;
case 1,
HDR.VERSION = -1;% reserved
case 2,
HDR.VERSION = 2;
case 3,
HDR.VERSION = 1;
end;
tmp = [32,32,32,32,8; 64,48,40,48,16; 96,56,48,56,24; 128,64,56,64,32; 160,80,64,80,40; 192,96,80,96,48; 224,112,96,112,56; 256,128,112,128,64; 288,160,128,144,80; 320,192 160,160,96; 352,224,192,176,112; 384,256,224, 192,128; 416,320,256,224,144; 448,384,320,256,160];
tmp = [tmp,tmp(:,5)];
if HDR.MPEG.bitrate_index==0,
HDR.bitrate = NaN;
elseif HDR.MPEG.bitrate_index==15,
fclose(HDR.FILE.FID);
fprintf(2,'SOPEN: corrupted MPEG file %s ',HDR.FileName);
return;
else
HDR.bitrate = tmp(HDR.MPEG.bitrate_index,floor(HDR.VERSION)*3+HDR.MPEG.layer-3);
end;
switch HDR.MPEG.sampling_frequency_index,
case 0,
HDR.SampleRate = 44.100;
case 1,
HDR.SampleRate = 48.000;
case 2,
HDR.SampleRate = 32.000;
otherwise,
HDR.SampleRate = NaN;
end;
HDR.SampleRate_units = 'kHz';
HDR.SampleRate = HDR.SampleRate*(2^(1-ceil(HDR.VERSION)));
switch 4-HDR.MPEG.layer, %Layer
case 1,
HDR.SPR = 384;
slot = 32*HDR.MPEG.padding_bit; % bits, 4 bytes
HDR.FrameLengthInBytes = (12*HDR.bitrate/HDR.SampleRate+slot)*4;
case {2,3},
HDR.SampleRate = 1152;
slot = 8*HDR.MPEG.padding_bit; % bits, 1 byte
HDR.FrameLengthInBytes = 144*HDR.bitrate/HDR.SampleRate+slot;
end;
if ~HDR.MPEG.protection_bit,
HDR.MPEG.error_check = fread(HDR.FILE.FID,1,'uint16');
end;
HDR.MPEG.allocation = fread(HDR.FILE.FID,[1,32],'ubit4');
HDR.MPEG.NoFB = sum(HDR.MPEG.allocation>0);
HDR.MPEG.idx = find(HDR.MPEG.allocation>0);
HDR.MPEG.scalefactor = fread(HDR.FILE.FID,[1,HDR.MPEG.NoFB],'ubit6');
for k = HDR.MPEG.idx,
HDR.MPEG.temp(1:12,k) = fread(HDR.FILE.FID,[12,1],['ubit',int2str(HDR.MPEG.allocation(k))]);
end;
fprintf(2,'Warning SOPEN: MPEG not ready for use\n');
end;
HDR.FILE.OPEN = 0;
fclose(HDR.FILE.FID);
HDR.FILE.FID = -1;
return;
elseif strcmp(HDR.TYPE,'QTFF'),
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,'ieee-be');
if ~isempty(findstr(PERMISSION,'r')), %%%%% READ
HDR.FILE.OPEN = 1;
offset = 0;
while ~feof(HDR.FILE.FID),
tagsize = fread(HDR.FILE.FID,1,'uint32'); % which size
if ~isempty(tagsize),
offset = offset + tagsize;
tag = setstr(fread(HDR.FILE.FID,[1,4],'char'));
if tagsize==0,
tagsize=inf; %tagsize-8;
elseif tagsize==1,
tagsize=fread(HDR.FILE.FID,1,'uint64');
end;
if tagsize <= 8,
elseif strcmp(tag,'free'),
val = fread(HDR.FILE.FID,[1,tagsize-8],'char');
HDR.MOV.free = val;
elseif strcmp(tag,'skip'),
val = fread(HDR.FILE.FID,[1,tagsize-8],'char');
HDR.MOV.skip = val;
elseif strcmp(tag,'wide'),
%val = fread(HDR.FILE.FID,[1,tagsize-8],'char');
%HDR.MOV.wide = val;
elseif strcmp(tag,'pnot'),
val = fread(HDR.FILE.FID,[1,tagsize-8],'char');
HDR.MOV.pnot = val;
elseif strcmp(tag,'moov'),
offset2 = 8;
while offset2 < tagsize,
tagsize2 = fread(HDR.FILE.FID,1,'uint32'); % which size
if tagsize2==0,
tagsize2 = inf;
elseif tagsize2==1,
tagsize2=fread(HDR.FILE.FID,1,'uint64');
end;
offset2 = offset2 + tagsize2;
tag2 = setstr(fread(HDR.FILE.FID,[1,4],'char'));
if tagsize2 <= 8,
elseif strcmp(tag2,'mvhd'),
HDR.MOOV.Version = fread(HDR.FILE.FID,1,'char');
HDR.MOOV.Flags = fread(HDR.FILE.FID,3,'char');
HDR.MOOV.Times = fread(HDR.FILE.FID,5,'uint32');
HDR.T0 = datevec(HDR.MOOV.Times(1)/(3600*24))+[1904,0,0,0,0,0];
HDR.MOOV.prefVol = fread(HDR.FILE.FID,1,'uint16');
HDR.MOOV.reserved = fread(HDR.FILE.FID,10,'char');
HDR.MOOV.Matrix = fread(HDR.FILE.FID,[3,3],'int32')';
HDR.MOOV.Matrix(:,1:2) = HDR.MOOV.Matrix(:,1:2)/2^16;
HDR.MOOV.Preview = fread(HDR.FILE.FID,5,'uint32');
elseif strcmp(tag2,'trak'),
HDR.MOOV.trak = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'cmov'),
HDR.MOOV.cmov = fread(HDR.FILE.FID,[1,tagsize2-8],'uchar');
elseif strcmp(tag2,'free'),
HDR.MOOV.free = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'clip'),
HDR.MOOV.clip = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'udta'),
HDR.MOOV.udta = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'ctab'),
HDR.MOOV.ctab = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
else
end;
end;
%HDR.MOV.moov = fread(HDR.FILE.FID,[1,tagsize-8],'char');
elseif strcmp(tag,'mdat'),
HDR.HeadLen = ftell(HDR.FILE.FID);
offset2 = 8;
while offset2 < tagsize,
tagsize2 = fread(HDR.FILE.FID,1,'uint32'); % which size
tag2 = char(fread(HDR.FILE.FID,[1,4],'char'));
if tagsize2==0,
tagsize2 = inf;
elseif tagsize2==1,
tagsize2 = fread(HDR.FILE.FID,1,'uint64');
end;
offset2 = offset2 + tagsize2;
if tagsize2 <= 8,
elseif strcmp(tag2,'mdat'),
HDR.MDAT.mdat = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'wide'),
HDR.MDAT.wide = fread(HDR.FILE.FID,[1,tagsize2],'char');
elseif strcmp(tag2,'clip'),
HDR.MDAT.clip = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'udta'),
HDR.MDAT.udta = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
elseif strcmp(tag2,'ctab'),
HDR.MDAT.ctab = fread(HDR.FILE.FID,[1,tagsize2-8],'char');
else
end;
end;
%HDR.MOV.mdat = fread(HDR.FILE.FID,[1,tagsize-8],'char');
else
val = fread(HDR.FILE.FID,[1,tagsize-8],'char');
fprintf(HDR.FILE.stderr,'Warning SOPEN Type=MOV: unknown Tag %s.\n',tag);
end;
fseek(HDR.FILE.FID,offset,'bof');
end;
end;
end;
%fclose(HDR.FILE.FID);
elseif strcmp(HDR.TYPE,'ASF') ,
if exist('asfopen','file'),
HDR = asfopen(HDR,PERMISSION);
else
fprintf(1,'SOPEN ASF-File: Microsoft claims that its illegal to implement the ASF format.\n');
fprintf(1,' Anyway Microsoft provides the specification at http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx \n');
fprintf(1,' So, you can implement it and use it for your own purpose.\n');
end;
elseif strcmp(HDR.TYPE,'AIF') | strcmp(HDR.TYPE,'IIF') | strcmp(HDR.TYPE,'WAV') | strcmp(HDR.TYPE,'AVI') ,
HDR.FILE.FID = fopen(HDR.FileName,PERMISSION,HDR.Endianity);
if ~isempty(findstr(PERMISSION,'r')), %%%%% READ
HDR.FILE.OPEN = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -