This code does not work in PB4.40. I have updated all the simple things but clearly missed one or more items that are not obvious to me. It opens the Lib OK, adds the selected BMP files successfully to a linked list and the compiler does not complain about a thing, but the "AVIFileOpen" function fails:
Code: Select all
;/ Nico le 02/06/05
;/ Création d'un avi avec de l'audio
#streamtypeAUDIO = $73647561
#streamtypeVIDEO = $73646976
#ICMF_CHOOSE_KEYFRAME = 1
#ICMF_CHOOSE_DATARATE = 2
#AVIERR_OK = 0
#AVIIF_KEYFRAME = $10
#Lib = 10
#BmpFile = 20
#AviFile = 30
Global sgAvi32Lib.s = "C:\WINDOWS\system32\avifil32.dll"
Global sgPat.s = ""
Global igIndex.i = 0
Global bgVal.b = 0
Global sgAviFile.s = ""
Structure bitmap24
bmiHeader.BITMAPINFOHEADER
EndStructure
Structure msvc
a.b
b.b
c.b
d.b
EndStructure
Structure AVISTREAMINFO
fccType.l
fccHandler.msvc
dwFlags.l
dwCaps.l
wPriority.w
wLanguage.w
dwScale.l
dwRate.l
dwStart.l
dwLength.l
dwInitialFrames.l
dwSuggestedBufferSize.l
dwQuality.l
dwSampleSize.l
rcFrame.RECT
dwEditCount.l
dwFormatChangeCount.l
szName.b[64]
EndStructure
Structure AVICOMPRESSOPTIONS
fccType.l
fccHandler.l
dwKeyFrameEvery.l
dwQuality.l
dwBytesPerSecond.l
dwFlags.l
*lpFormat.l
cbFormat.l
*lpParms.l
cbParms.l
dwInterleaveEvery.l
EndStructure
Structure WAVE_FORMAT
wFormatTag.w
nChannels.w
nSamplesPerSec.l
nAvgBytesPerSec.l
nBlockAlign.w
wBitsPerSample.w
cbSize.w
EndStructure
NewList bitmap.s()
NewList memoire.l()
;/ Procédure traduite en Pure Basic
;/ d'un code écrit en c++ par son auteur Chiew Heng Wah.
Procedure AddWAV(strFileWAV.s, pfile.l)
;--------------------------------------
pfileWav.IAVIFILE
siWav.AVISTREAMINFO
psWav.IAVISTREAM
psAvi.l
fmtWav.WAVE_FORMAT
If CallFunction(#Lib, "AVIFileOpen",@pfileWav, @strFileWAV, #OF_READ, #Null) = 0
If CallFunction(#Lib, "AVIFileGetStream",pfileWav, @psWav, #streamtypeAUDIO, 0) = 0
If CallFunction(#Lib, "AVIStreamInfo",psWav, @siWav, SizeOf(AVISTREAMINFO)) = 0
If CallFunction(#Lib, "AVIStreamReadFormat",psWav, 0, #Null, @lFmtSize) = 0
If lFmtSize
If CallFunction(#Lib, "AVIStreamReadFormat",psWav, 0, @fmtWav, @lFmtSize) = 0
lStreamLength = CallFunction(#Lib, "AVIStreamLength",psWav)
If lStreamLength
lpbData = AllocateMemory(lStreamLength)
If CallFunction(#Lib, "AVIStreamRead",psWav, 0, lStreamLength, lpbData, lStreamLength, #Null, #Null) = 0
If CallFunction(#Lib, "AVIFileCreateStream",pfile, @psAvi, @siWav) = 0
If CallFunction(#Lib, "AVIStreamSetFormat",psAvi, 0, @fmtWav, lFmtSize) = 0
If CallFunction(#Lib, "AVIStreamWrite",psAvi, 0, lStreamLength, lpbData, lStreamLength, #AVIIF_KEYFRAME, #Null, #Null) = 0
bgVal = 1
EndIf
EndIf
CallFunction(#Lib, "AVIStreamRelease",psAvi)
EndIf
EndIf
FreeMemory(lpbData)
EndIf
EndIf
EndIf
EndIf
EndIf
CallFunction(#Lib, "AVIStreamRelease",psWav)
EndIf
CallFunction(#Lib, "AVIFileRelease",pfileWav)
EndIf
ProcedureReturn bgVal
EndProcedure
sgPat = "Image Files (*.BMP *.bmp)|*.BMP;*.bmp"
Images.s = OpenFileRequester("Select multiple Bitmap Images", "", sgPat, 0, #PB_Requester_MultiSelection)
If Images
AddElement(bitmap())
bitmap() = Images
Repeat
Images = NextSelectedFileName()
If Images
AddElement(bitmap())
bitmap() = Images
EndIf
Until Images = ""
EndIf
ForEach bitmap()
If ReadFile(#BmpFile, bitmap())
FileSeek(#BmpFile, SizeOf(BITMAPFILEHEADER))
bmi.bitmap24
ReadData(#BmpFile, @bmi, SizeOf(bitmap24))
If bmi\bmiHeader\biWidth
If bmi\bmiHeader\biHeight
If bmi\bmiHeader\biBitCount
If bmi\bmiHeader\bisizeimage = 0
bmi\bmiHeader\bisizeimage = (Lof(#BmpFile) - 54)
EndIf
FileSeek(#BmpFile,1078)
AddElement(memoire())
memoire() = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT, bmi\bmiHeader\bisizeimage)
ReadData(#BmpFile,memoire(), bmi\bmiHeader\bisizeimage)
EndIf
EndIf
EndIf
CloseFile(#BmpFile)
EndIf
Next
If OpenLibrary(#Lib, sgAvi32Lib)
CallFunction(#Lib, "AVIFileInit") ;## Initialise the AVI Lib (cannot test success, does not return a val)
sgPat = "AVI Movie File (*.AVI *.avi)|*.AVI;*.avi"
sgAviFile = SaveFileRequester("Enter AVI File Name", "", sgPat, 0)
If (GetExtensionPart(sgAviFile) = "")
sgAviFile = sgAviFile + ".avi"
EndIf
If CallFunction(#Lib, "AVIFileOpen", @pAVIFile.IAVIFILE, @sgAviFile, (#OF_WRITE | #OF_CREATE), 0) = 0
strhdr.AVISTREAMINFO
strhdr\fccType = #streamtypeVIDEO
strhdr\fccHandler\a = $6D
strhdr\fccHandler\b = $73
strhdr\fccHandler\c = $76
strhdr\fccHandler\d = $63
strhdr\dwScale = 1
strhdr\dwRate = 5 ;##Frames per second(1 to 30)
strhdr\dwSuggestedBufferSize = bmi\bmiHeader\biSize
If SetRect_(@strhdr\rcFrame, 0, 0, bmi\bmiHeader\biWidth, bmi\bmiHeader\biHeight) <> 0
If CallFunction(#Lib, "AVIFileCreateStream", pAVIFile, @pAVIStream, @strhdr) = 0
opts.AVICOMPRESSOPTIONS
Dim aopts(1)
aopts(0) = @opts
If CallFunction(#Lib, "AVISaveOptions", 0, #ICMF_CHOOSE_KEYFRAME | #ICMF_CHOOSE_DATARATE, 1, @pAVIStream, @aopts(0)) = 1
If CallFunction(#Lib, "AVIMakeCompressedStream", @pAVICompressed, pAVIStream, aopts(0), 0) = #AVIERR_OK
If CallFunction(#Lib, "AVIStreamSetFormat", pAVICompressed, 0, @bmi, SizeOf(bitmap24)) = 0
ForEach memoire()
If memoire()
If CallFunction(#Lib, "AVIStreamWrite", pAVICompressed, igIndex, 1, memoire(), bmi\bmiHeader\bisizeimage, #AVIIF_KEYFRAME, 0, 0) = 0
igIndex = igIndex + 1
Else
MessageRequester("Attention","AVI Stream Write call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf
EndIf ;## memoire()
Next
Else
MessageRequester("Attention","AVI Stream Set Format call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##CallFunction(#Lib, "AVIStreamSetFormat"
CallFunction(#Lib, "AVIStreamRelease", pAVICompressed)
Else
MessageRequester("Attention","AVI Make Compressed Stream call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##CallFunction(#Lib, "AVIMakeCompressedStream"
Else
MessageRequester("Attention","AVI Save Options call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##CallFunction(#Lib, "AVISaveOptions"
CallFunction(#Lib, "AVIStreamRelease", pAVIStream)
Else
MessageRequester("Attention","AVI create File Stream call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##CallFunction(#Lib, "AVIFileCreateStream"
;### Include Sound Option ###
sgPat = "Audio Files (*.WAV *.wav)|*.WAV;*.wav"
strFileWAV2.s = OpenFileRequester("Select an Audio file", "", sgPat, 0)
If (Len(strFileWAV2) > 4)
If AddWAV(strFileWAV2, pAVIFile)
a$="Audio added to AVI file"
Else
a$="Could not add Audio to AVI file"
EndIf
EndIf
;### End Include Sound Option ###
Else
MessageRequester("Attention","Set header frame width and height values call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##SetRect_
CallFunction(#Lib, "AVIFileRelease", pAVIFile)
Else
MessageRequester("Attention","AVI File Open call failed", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##CallFunction(#Lib, "AVIFileOpen"
CallFunction(#Lib, "AVIFileExit") ;## Release the AVI Lib
CloseLibrary(#Lib)
ForEach memoire()
GlobalFree_(memoire())
Next
MessageRequester("Info","Total number of Frames created: " + Str(igIndex) + Chr(13) + a$)
Else
MessageRequester("Attention","Could not Open AVI Lib", #PB_MessageRequester_Ok | #MB_ICONERROR)
EndIf ;##OpenLibrary(#Lib, sgAvi32Lib)
End
It doesn't get as far as calling the AddWAV procedure and Audio is not important for my current project but I notice that the procedure returns a value, yet that val is not used anywhere.