Difference between revisions of "ReNamer:Scripts:AVI video codec"
Jump to navigation
Jump to search
(navigation) |
m (Text replacement - "<source>" to "<syntaxhighlight lang="pascal">") |
||
Line 13: | Line 13: | ||
The simple version of the script, which should work for most of the AVI files: | The simple version of the script, which should work for most of the AVI files: | ||
− | < | + | <syntaxhighlight lang="pascal"> |
var | var | ||
fourcc: string; | fourcc: string; | ||
Line 28: | Line 28: | ||
More complicated version, which is parsing internal AVI structures: | More complicated version, which is parsing internal AVI structures: | ||
− | < | + | <syntaxhighlight lang="pascal"> |
function BigEndian(const bytestring: String): Integer; | function BigEndian(const bytestring: String): Integer; | ||
var | var |
Revision as of 15:03, 8 February 2017
Extract AVI video codec and insert it into the filename, as a suffix.
Tested
- ReNamer 5.50
Code
Author: prologician. Date: 3 Aug 2009.
The simple version of the script, which should work for most of the AVI files:
<syntaxhighlight lang="pascal"> var
fourcc: string;
begin
if WideSameText(WideExtractFileExt(FileName), '.avi') then begin fourcc := FileReadFragment(FilePath, 7*16, 4); FileName := WideExtractBaseName(FileName) + ' ' + fourcc + WideExtractFileExt(FileName); end
end. </source>
More complicated version, which is parsing internal AVI structures:
<syntaxhighlight lang="pascal"> function BigEndian(const bytestring: String): Integer; var
i: Integer;
begin
result := 0; for i := 1 to Length(bytestring) do result := result * $100 + ord(bytestring[i])
end;
function LittleEndian(const bytestring: String): Integer; var
i: Integer;
begin
result := 0; for i := Length(bytestring) downto 1 do result := result * $100 + ord(bytestring[i])
end;
function FileAssertString(var offset: integer; const actual: string): Boolean; begin
result := (WideCompareStr(actual, FileReadFragment(FilePath, offset, length(actual))) = 0) offset := offset + length(actual)
end;
procedure FileSkip(var fileoffset: integer; const amount: integer); begin
fileoffset := fileoffset + amount
end;
function IsStrhVids(offset: integer): Boolean; begin
result := false; if not fileassertstring(offset, 'strl') then exit; if not fileassertstring(offset, 'strh') then exit; FileSkip(offset, 4); //Size of the strh chunk if not fileassertstring(offset, 'vids') then exit; result := true;
end;
var
fourcc: string; fileptr: integer; streams: integer; chunksize: integer; i: integer;
begin
if WideSameText(WideExtractFileExt(FileName), '.avi') then begin fileptr := 0; chunksize := 0; if not widefileexists(filepath) then exit; if not fileassertstring(fileptr, 'RIFF') then exit; FileSkip(fileptr, 4); //Size of the RIFF chunk (most of the file) if not fileassertstring(fileptr, 'AVI ') then exit; if not fileassertstring(fileptr, 'LIST') then exit; FileSkip(fileptr, 4); //Size of the list if not fileassertstring(fileptr, 'hdrl') then exit; if not fileassertstring(fileptr, 'avih') then exit; streams := LittleEndian(FileReadFragment(FilePath, fileptr + 28, 4)); FileSkip(fileptr, LittleEndian(FileReadFragment(FilePath, fileptr, 4)) + 4); //Skip over the 'avih' chunk.
for i := 1 to streams do begin FileSkip(fileptr, chunksize); if not fileassertstring(fileptr, 'LIST') then exit; chunksize := LittleEndian(FileReadFragment(FilePath, fileptr, 4)); FileSkip(fileptr, 4); //Size of the list if IsStrhVids(fileptr) then begin fourcc := FileReadFragment(FilePath, fileptr + 16, 4); FileName := WideExtractBaseName(FileName) + ' ' + fourcc + WideExtractFileExt(FileName); exit end end end
end. </source>