ReNamer:Scripts:AVI video codec
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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:
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.
More complicated version, which is parsing internal AVI structures:
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.