563 lines
18 KiB
C
563 lines
18 KiB
C
|
/****************************************************************************
|
|||
|
*
|
|||
|
* AVIOPTS.C
|
|||
|
*
|
|||
|
* routine for bringing up the compression options dialog
|
|||
|
*
|
|||
|
* AVISaveOptions()
|
|||
|
*
|
|||
|
* Copyright (c) 1992 - 1995 Microsoft Corporation. All Rights Reserved.
|
|||
|
*
|
|||
|
* You have a royalty-free right to use, modify, reproduce and
|
|||
|
* distribute the Sample Files (and/or any modified version) in
|
|||
|
* any way you find useful, provided that you agree that
|
|||
|
* Microsoft has no warranty obligations or liability for any
|
|||
|
* Sample Application Files which are modified.
|
|||
|
*
|
|||
|
***************************************************************************/
|
|||
|
|
|||
|
#include <win32.h>
|
|||
|
#include <mmreg.h>
|
|||
|
#include <msacm.h>
|
|||
|
#include <vfw.h>
|
|||
|
#include "aviopts.h"
|
|||
|
#include "avifile.rc"
|
|||
|
|
|||
|
#if !defined NUMELMS
|
|||
|
#define NUMELMS(aa) (sizeof(aa)/sizeof((aa)[0]))
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
/****************************************************************************
|
|||
|
***************************************************************************/
|
|||
|
|
|||
|
extern HINSTANCE ghMod;
|
|||
|
|
|||
|
INT_PTR FAR PASCAL _export AVICompressOptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|||
|
|
|||
|
/****************************************************************************
|
|||
|
***************************************************************************/
|
|||
|
|
|||
|
|
|||
|
int gnNumStreams = 0; // how many streams in array
|
|||
|
int gnCurStream = 0; // which stream's options we're setting
|
|||
|
PAVISTREAM FAR *gapAVI; // array of stream pointers
|
|||
|
LPAVICOMPRESSOPTIONS FAR *gapOpt; // array of option structures to fill
|
|||
|
UINT guiFlags;
|
|||
|
COMPVARS gCompVars; // for ICCompressorChoose
|
|||
|
|
|||
|
/****************************************************************************
|
|||
|
***************************************************************************/
|
|||
|
/*************************************************************
|
|||
|
* @doc EXTERNAL AVISaveOptions
|
|||
|
*
|
|||
|
* @api BOOL | AVISaveOptions | This function gets the save options for
|
|||
|
* a file and returns them in a buffer.
|
|||
|
*
|
|||
|
* @parm HWND | hwnd | Specifies the parent window handle for the Compression Options
|
|||
|
* dialog box.
|
|||
|
*
|
|||
|
* @parm UINT | uiFlags | Specifies the flags for displaying the
|
|||
|
* Compression Options dialog box. The following flags are defined:
|
|||
|
*
|
|||
|
* @flag ICMF_CHOOSE_KEYFRAME | Displays a "Key frame every" box for
|
|||
|
* the video options. This is the same flag used in <f ICCompressorChoose>.
|
|||
|
*
|
|||
|
* @flag ICMF_CHOOSE_DATARATE | Displays a "Data rate" box for the video
|
|||
|
* options. This is the same flag used in <f ICCompressorChoose>.
|
|||
|
*
|
|||
|
* @flag ICMF_CHOOSE_PREVIEW | Displays a "Preview" button for
|
|||
|
* the video options. This button previews the compression
|
|||
|
* using a frame from the stream. This is the same flag
|
|||
|
* used in <f ICCompressorChoose>.
|
|||
|
*
|
|||
|
* @parm int | nStreams | Specifies the number of streams
|
|||
|
* that will have their options set by the dialog box.
|
|||
|
*
|
|||
|
* @parm PAVISTREAM FAR * | ppavi | Specifies a pointer to an
|
|||
|
* array of stream interface pointers. The <p nStreams>
|
|||
|
* parameter indicates the number of pointers in the array.
|
|||
|
*
|
|||
|
* @parm LPAVICOMPRESSOPTIONS FAR * | plpOptions | Specifies a pointer
|
|||
|
* to an array of <t LPAVICOMPRESSOPTIONS> pointers
|
|||
|
* to hold the compression options set by the dialog box. The
|
|||
|
* <p nStreams> parameter indicates the number of
|
|||
|
* pointers in the array.
|
|||
|
*
|
|||
|
* @rdesc Returns TRUE if the user pressed OK, FALSE for CANCEL or an error.
|
|||
|
*
|
|||
|
* @comm This function presents a standard Compression Options dialog
|
|||
|
* box using <p hwnd> as the parent window handle. When the
|
|||
|
* user is finished selecting the compression options for
|
|||
|
* each stream, the options are returned in the <t AVICOMPRESSOPTIONS>
|
|||
|
* structures in the array referenced by <p lpOptions>. The caller
|
|||
|
* must pass the interface pointers for the streams
|
|||
|
* in the array referenced by <p ppavi>.
|
|||
|
*
|
|||
|
******************************************************************/
|
|||
|
STDAPI_(INT_PTR) AVISaveOptions(HWND hwnd, UINT uiFlags, int nStreams, PAVISTREAM FAR *ppavi, LPAVICOMPRESSOPTIONS FAR *plpOptions)
|
|||
|
{
|
|||
|
INT_PTR f;
|
|||
|
AVICOMPRESSOPTIONS FAR *aOptions;
|
|||
|
int i;
|
|||
|
|
|||
|
/* Save the stream pointer */
|
|||
|
gnNumStreams = nStreams;
|
|||
|
gnCurStream = -1;
|
|||
|
gapAVI = ppavi;
|
|||
|
gapOpt = plpOptions;
|
|||
|
guiFlags = uiFlags;
|
|||
|
|
|||
|
//
|
|||
|
// Remember the old compression options in case we cancel and need to
|
|||
|
// restore them
|
|||
|
//
|
|||
|
aOptions = (AVICOMPRESSOPTIONS FAR *)GlobalAllocPtr(GMEM_MOVEABLE,
|
|||
|
nStreams * sizeof(AVICOMPRESSOPTIONS));
|
|||
|
if (!aOptions)
|
|||
|
return FALSE;
|
|||
|
|
|||
|
#if 0 //def _WIN32
|
|||
|
CopyMemory((PVOID)aOptions, (PVOID)*plpOptions, nStreams * sizeof(AVICOMPRESSOPTIONS));
|
|||
|
#else
|
|||
|
// We really ought to use memcpy on this...
|
|||
|
for (i = 0; i < nStreams; i++)
|
|||
|
aOptions[i] = *plpOptions[i];
|
|||
|
#endif
|
|||
|
|
|||
|
f = DialogBox (ghMod, MAKEINTRESOURCE(IDD_COMPRESSOPTIONS), hwnd,
|
|||
|
AVICompressOptionsDlgProc);
|
|||
|
|
|||
|
//
|
|||
|
// The user cancelled... put the old compression options back.
|
|||
|
//
|
|||
|
if (f == 0) {
|
|||
|
|
|||
|
#if 0 //def _WIN32
|
|||
|
CopyMemory((PVOID)*plpOptions, (PVOID)aOptions, nStreams * sizeof(AVICOMPRESSOPTIONS));
|
|||
|
#else
|
|||
|
// We really ought to use memcpy on this...
|
|||
|
for (i = 0; i < nStreams; i++)
|
|||
|
*plpOptions[i] = aOptions[i];
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
// Couldn't bring up the dialog
|
|||
|
if (f == -1)
|
|||
|
f = 0;
|
|||
|
|
|||
|
GlobalFreePtr(aOptions);
|
|||
|
|
|||
|
// !!! Returning TRUE doesn't guarantee something actually changed...
|
|||
|
return f;
|
|||
|
}
|
|||
|
|
|||
|
/*************************************************************
|
|||
|
* @doc EXTERNAL AVISaveOptionsFree
|
|||
|
*
|
|||
|
* @api LONG | AVISaveOptionsFree | This function frees the resources allocated
|
|||
|
* by <f AVISaveOptions>.
|
|||
|
*
|
|||
|
* @parm int | nStreams | Specifies the number of <t AVICOMPRESSOPTIONS>
|
|||
|
* structures in the array passed in as the next parameter.
|
|||
|
*
|
|||
|
* @parm LPAVICOMPRESSOPTIONS FAR * | plpOptions | Specifies a pointer
|
|||
|
* to an array of <t LPAVICOMPRESSOPTIONS> pointers
|
|||
|
* to hold the compression options set by the dialog box. The
|
|||
|
* resources in each of these structures that were allocated by
|
|||
|
* <f AVISaveOptions> will be freed.
|
|||
|
*
|
|||
|
* @rdesc This function always returns AVIERR_OK (zero)
|
|||
|
*
|
|||
|
* @comm This function frees the resources allocated by <f AVISaveOptions>.
|
|||
|
**************************************************************/
|
|||
|
STDAPI AVISaveOptionsFree(int nStreams, LPAVICOMPRESSOPTIONS FAR *plpOptions)
|
|||
|
{
|
|||
|
for (; nStreams > 0; nStreams--) {
|
|||
|
if (plpOptions[nStreams-1]->lpParms)
|
|||
|
GlobalFreePtr(plpOptions[nStreams-1]->lpParms);
|
|||
|
plpOptions[nStreams-1]->lpParms = NULL;
|
|||
|
if (plpOptions[nStreams-1]->lpFormat)
|
|||
|
GlobalFreePtr(plpOptions[nStreams-1]->lpFormat);
|
|||
|
plpOptions[nStreams-1]->lpFormat = NULL;
|
|||
|
}
|
|||
|
return AVIERR_OK;
|
|||
|
}
|
|||
|
|
|||
|
/****************************************************************************
|
|||
|
Bring up the compression options for the current stream
|
|||
|
***************************************************************************/
|
|||
|
BOOL StreamOptions(HWND hwnd) {
|
|||
|
AVISTREAMINFO avis;
|
|||
|
BOOL f = FALSE;
|
|||
|
LONG lTemp;
|
|||
|
UINT w;
|
|||
|
|
|||
|
// Get the stream type
|
|||
|
if (AVIStreamInfo(gapAVI[gnCurStream], &avis, sizeof(avis)) != 0)
|
|||
|
return FALSE;
|
|||
|
|
|||
|
//
|
|||
|
// Video stream -- bring up the video compression dlg
|
|||
|
//
|
|||
|
if (avis.fccType == streamtypeVIDEO) {
|
|||
|
|
|||
|
// The structure we have now is not filled in ... init it
|
|||
|
if (!(gapOpt[gnCurStream]->dwFlags & AVICOMPRESSF_VALID)) {
|
|||
|
_fmemset(gapOpt[gnCurStream], 0,
|
|||
|
sizeof(AVICOMPRESSOPTIONS));
|
|||
|
gapOpt[gnCurStream]->fccHandler = comptypeDIB;
|
|||
|
gapOpt[gnCurStream]->dwQuality = (DWORD)ICQUALITY_DEFAULT;
|
|||
|
}
|
|||
|
|
|||
|
_fmemset(&gCompVars, 0, sizeof(gCompVars));
|
|||
|
gCompVars.cbSize = sizeof(gCompVars);
|
|||
|
gCompVars.dwFlags = ICMF_COMPVARS_VALID;
|
|||
|
gCompVars.fccHandler = gapOpt[gnCurStream]->fccHandler;
|
|||
|
gCompVars.lQ = gapOpt[gnCurStream]->dwQuality;
|
|||
|
gCompVars.lpState = gapOpt[gnCurStream]->lpParms;
|
|||
|
gCompVars.cbState = gapOpt[gnCurStream]->cbParms;
|
|||
|
gCompVars.lKey =
|
|||
|
(gapOpt[gnCurStream]->dwFlags & AVICOMPRESSF_KEYFRAMES)?
|
|||
|
(gapOpt[gnCurStream]->dwKeyFrameEvery) : 0;
|
|||
|
gCompVars.lDataRate =
|
|||
|
(gapOpt[gnCurStream]->dwFlags & AVICOMPRESSF_DATARATE) ?
|
|||
|
(gapOpt[gnCurStream]->dwBytesPerSecond / 1024) : 0;
|
|||
|
|
|||
|
// !!! Don't pass flags verbatim if others are defined!!!
|
|||
|
f = ICCompressorChoose(hwnd, guiFlags, NULL,
|
|||
|
gapAVI[gnCurStream], &gCompVars, NULL);
|
|||
|
|
|||
|
/* Set the options to our new values */
|
|||
|
gapOpt[gnCurStream]->lpParms = gCompVars.lpState;
|
|||
|
gapOpt[gnCurStream]->cbParms = gCompVars.cbState;
|
|||
|
gCompVars.lpState = NULL; // so it won't be freed
|
|||
|
gapOpt[gnCurStream]->fccHandler = gCompVars.fccHandler;
|
|||
|
gapOpt[gnCurStream]->dwQuality = gCompVars.lQ;
|
|||
|
gapOpt[gnCurStream]->dwKeyFrameEvery = gCompVars.lKey;
|
|||
|
gapOpt[gnCurStream]->dwBytesPerSecond = gCompVars.lDataRate
|
|||
|
* 1024;
|
|||
|
if (gCompVars.lKey)
|
|||
|
gapOpt[gnCurStream]->dwFlags |= AVICOMPRESSF_KEYFRAMES;
|
|||
|
else
|
|||
|
gapOpt[gnCurStream]->dwFlags &=~AVICOMPRESSF_KEYFRAMES;
|
|||
|
if (gCompVars.lDataRate)
|
|||
|
gapOpt[gnCurStream]->dwFlags |= AVICOMPRESSF_DATARATE;
|
|||
|
else
|
|||
|
gapOpt[gnCurStream]->dwFlags &=~AVICOMPRESSF_DATARATE;
|
|||
|
|
|||
|
// If they pressed OK, we have valid stuff in here now.
|
|||
|
if (f)
|
|||
|
gapOpt[gnCurStream]->dwFlags |= AVICOMPRESSF_VALID;
|
|||
|
|
|||
|
// Close the stuff opened by ICCompressorChoose
|
|||
|
ICCompressorFree(&gCompVars);
|
|||
|
|
|||
|
//
|
|||
|
// Bring up the ACM format dialog and stuff it in our
|
|||
|
// compression options structure
|
|||
|
//
|
|||
|
} else if (avis.fccType == streamtypeAUDIO) {
|
|||
|
|
|||
|
ACMFORMATCHOOSE acf;
|
|||
|
LONG lsizeF = 0;
|
|||
|
|
|||
|
if (acmGetVersion() < 0x02000000L) {
|
|||
|
TCHAR achACM[160];
|
|||
|
TCHAR achACMV[40];
|
|||
|
|
|||
|
LoadString(ghMod, IDS_BADACM, achACM, sizeof(achACM)/sizeof(TCHAR));
|
|||
|
LoadString(ghMod, IDS_BADACMV, achACMV, sizeof(achACMV)/sizeof(TCHAR));
|
|||
|
|
|||
|
MessageBox(hwnd, achACM, achACMV, MB_OK | MB_ICONHAND);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
_fmemset(&acf, 0, sizeof(acf)); // or ACM blows up
|
|||
|
acf.cbStruct = sizeof(ACMFORMATCHOOSE);
|
|||
|
// If our options struct has valid data, use it to init
|
|||
|
// the acm dialog with, otherwise pick a default.
|
|||
|
acf.fdwStyle = (gapOpt[gnCurStream]->dwFlags & AVICOMPRESSF_VALID)
|
|||
|
? ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT : 0;
|
|||
|
acf.hwndOwner = hwnd;
|
|||
|
|
|||
|
// Make sure the AVICOMPRESSOPTIONS has a big enough lpFormat
|
|||
|
acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, (LPVOID)&lTemp);
|
|||
|
if ((gapOpt[gnCurStream]->cbFormat == 0 ||
|
|||
|
gapOpt[gnCurStream]->lpFormat == NULL) && lTemp) {
|
|||
|
gapOpt[gnCurStream]->lpFormat =
|
|||
|
GlobalAllocPtr(GMEM_MOVEABLE, lTemp);
|
|||
|
gapOpt[gnCurStream]->cbFormat = lTemp;
|
|||
|
} else if (gapOpt[gnCurStream]->cbFormat < (DWORD)lTemp && lTemp) {
|
|||
|
gapOpt[gnCurStream]->lpFormat =
|
|||
|
GlobalReAllocPtr(gapOpt[gnCurStream]->lpFormat, lTemp,
|
|||
|
GMEM_MOVEABLE);
|
|||
|
gapOpt[gnCurStream]->cbFormat = lTemp;
|
|||
|
}
|
|||
|
|
|||
|
if (!gapOpt[gnCurStream]->lpFormat)
|
|||
|
return FALSE;
|
|||
|
|
|||
|
acf.pwfx = gapOpt[gnCurStream]->lpFormat;
|
|||
|
acf.cbwfx = gapOpt[gnCurStream]->cbFormat;
|
|||
|
|
|||
|
//
|
|||
|
// Only ask for choices that we can actually convert to
|
|||
|
//
|
|||
|
AVIStreamReadFormat(gapAVI[gnCurStream],
|
|||
|
AVIStreamStart(gapAVI[gnCurStream]), NULL, &lsizeF);
|
|||
|
|
|||
|
// !!! Work around ACM bug by making sure our format is big enough
|
|||
|
lsizeF = max(lsizeF, sizeof(WAVEFORMATEX));
|
|||
|
acf.pwfxEnum = (LPWAVEFORMATEX)
|
|||
|
GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT, lsizeF);
|
|||
|
|
|||
|
if (acf.pwfxEnum) {
|
|||
|
AVIStreamReadFormat(gapAVI[gnCurStream],
|
|||
|
AVIStreamStart(gapAVI[gnCurStream]), acf.pwfxEnum, &lsizeF);
|
|||
|
acf.fdwEnum |= ACM_FORMATENUMF_CONVERT;
|
|||
|
}
|
|||
|
|
|||
|
// If they pressed OK, we now have valid stuff in here!
|
|||
|
w = acmFormatChoose(&acf);
|
|||
|
|
|||
|
if (w == MMSYSERR_NOERROR)
|
|||
|
gapOpt[gnCurStream]->dwFlags |= AVICOMPRESSF_VALID;
|
|||
|
else if (w != ACMERR_CANCELED) {
|
|||
|
MessageBeep(0); // !!! Should really be a message box!
|
|||
|
}
|
|||
|
|
|||
|
if (acf.pwfxEnum)
|
|||
|
GlobalFreePtr(acf.pwfxEnum);
|
|||
|
|
|||
|
f = (w == MMSYSERR_NOERROR);
|
|||
|
}
|
|||
|
|
|||
|
return f;
|
|||
|
}
|
|||
|
|
|||
|
#if defined _WIN32 && !defined UNICODE // Chicago only
|
|||
|
|
|||
|
/*
|
|||
|
* convert a UNICODE string to 'normal'
|
|||
|
*/
|
|||
|
LPTSTR WINAPI aviWideToText (LPTSTR lpszOut, LPWSTR lpwIn, UINT cch)
|
|||
|
{
|
|||
|
if (sizeof(TCHAR) != sizeof(WCHAR))
|
|||
|
WideCharToMultiByte(CP_ACP, 0, lpwIn, cch, lpszOut, cch, NULL, NULL);
|
|||
|
else
|
|||
|
lstrcpyn (lpszOut, (LPTSTR)lpwIn, cch);
|
|||
|
return lpszOut;
|
|||
|
}
|
|||
|
#else
|
|||
|
#define aviWideToText(lpszOut,lpwIn,cch) lstrcpyn(lpszOut,lpwIn,cch)
|
|||
|
#endif // _WIN32 on CHICAGO
|
|||
|
|
|||
|
STATICDT SZCODE aszXbyXbyX[] = TEXT("%ldx%ldx%d\n");
|
|||
|
STATICDT SZCODE aszBlahSpaceBlah[] = TEXT("%s %s");
|
|||
|
|
|||
|
//
|
|||
|
// Somebody chose a new stream. Do we need to grey InterleaveOpts?
|
|||
|
// Set the current stream.
|
|||
|
//
|
|||
|
void NEAR PASCAL NewStreamChosen(HWND hwnd)
|
|||
|
{
|
|||
|
AVISTREAMINFO avis;
|
|||
|
HIC hic;
|
|||
|
ICINFO icinfo;
|
|||
|
ACMFORMATDETAILS acmfmt;
|
|||
|
ACMFORMATTAGDETAILS aftd;
|
|||
|
LONG lsizeF;
|
|||
|
LPBITMAPINFOHEADER lp = NULL;
|
|||
|
TCHAR szFFDesc[80];
|
|||
|
TCHAR szDesc[120];
|
|||
|
|
|||
|
gnCurStream = (int)SendDlgItemMessage(hwnd, IDC_intCHOOSESTREAM,
|
|||
|
CB_GETCURSEL, 0, 0L);
|
|||
|
if (gnCurStream < 0)
|
|||
|
return;
|
|||
|
|
|||
|
if (AVIStreamInfo(gapAVI[gnCurStream], &avis, sizeof(avis)) != 0)
|
|||
|
return;
|
|||
|
|
|||
|
//
|
|||
|
// Show a string describing the current format
|
|||
|
//
|
|||
|
szDesc[0] = TEXT('\0');
|
|||
|
|
|||
|
lsizeF = 0;
|
|||
|
AVIStreamReadFormat(gapAVI[gnCurStream],
|
|||
|
AVIStreamStart(gapAVI[gnCurStream]), NULL, &lsizeF);
|
|||
|
if (lsizeF) {
|
|||
|
lp = (LPBITMAPINFOHEADER)GlobalAllocPtr(GHND, lsizeF);
|
|||
|
if (lp) {
|
|||
|
if (AVIStreamReadFormat(gapAVI[gnCurStream],
|
|||
|
AVIStreamStart(gapAVI[gnCurStream]),
|
|||
|
lp, &lsizeF) == AVIERR_OK) {
|
|||
|
if (avis.fccType == streamtypeVIDEO) {
|
|||
|
wsprintf(szDesc, aszXbyXbyX, lp->biWidth,
|
|||
|
lp->biHeight, lp->biBitCount);
|
|||
|
if (lp->biCompression == BI_RGB) {
|
|||
|
LoadString(ghMod, IDS_FFDESC, szFFDesc,
|
|||
|
sizeof(szFFDesc)/sizeof(TCHAR));
|
|||
|
lstrcat(szDesc, szFFDesc);
|
|||
|
} else {
|
|||
|
hic = ICDecompressOpen(ICTYPE_VIDEO,avis.fccHandler,
|
|||
|
lp, NULL);
|
|||
|
if (hic) {
|
|||
|
if (ICGetInfo(hic, &icinfo,sizeof(icinfo)) != 0) {
|
|||
|
UINT cb = lstrlen(szDesc);
|
|||
|
aviWideToText (szDesc + cb,
|
|||
|
icinfo.szDescription,
|
|||
|
NUMELMS(szDesc) - cb);
|
|||
|
}
|
|||
|
ICClose(hic);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (avis.fccType == streamtypeAUDIO) {
|
|||
|
_fmemset(&acmfmt, 0, sizeof(acmfmt));
|
|||
|
acmfmt.pwfx = (LPWAVEFORMATEX) lp;
|
|||
|
acmfmt.cbStruct = sizeof(ACMFORMATDETAILS);
|
|||
|
acmfmt.dwFormatTag = acmfmt.pwfx->wFormatTag;
|
|||
|
acmfmt.cbwfx = lsizeF;
|
|||
|
aftd.cbStruct = sizeof(aftd);
|
|||
|
aftd.dwFormatTag = acmfmt.pwfx->wFormatTag;
|
|||
|
aftd.fdwSupport = 0;
|
|||
|
|
|||
|
if ((acmFormatTagDetails(NULL,
|
|||
|
&aftd,
|
|||
|
ACM_FORMATTAGDETAILSF_FORMATTAG) == 0) &&
|
|||
|
(acmFormatDetails(NULL, &acmfmt,
|
|||
|
ACM_FORMATDETAILSF_FORMAT) == 0)) {
|
|||
|
wsprintf(szDesc, aszBlahSpaceBlah, (LPTSTR) acmfmt.szFormat,
|
|||
|
(LPTSTR) aftd.szFormatTag);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
GlobalFreePtr(lp);
|
|||
|
}
|
|||
|
}
|
|||
|
SetDlgItemText(hwnd, IDC_intFORMAT, szDesc);
|
|||
|
|
|||
|
//
|
|||
|
// AUDIO and VIDEO streams have a compression dialog
|
|||
|
//
|
|||
|
if (avis.fccType == streamtypeAUDIO ||
|
|||
|
avis.fccType == streamtypeVIDEO)
|
|||
|
EnableWindow(GetDlgItem(hwnd, IDC_intOPTIONS), TRUE);
|
|||
|
else
|
|||
|
EnableWindow(GetDlgItem(hwnd, IDC_intOPTIONS), FALSE);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*--------------------------------------------------------------+
|
|||
|
* Dialog Proc for the main compression options dialog *
|
|||
|
+--------------------------------------------------------------*/
|
|||
|
INT_PTR FAR PASCAL _export AVICompressOptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
|
{
|
|||
|
int i, nVal;
|
|||
|
AVISTREAMINFO avis;
|
|||
|
DWORD dw;
|
|||
|
BOOL f;
|
|||
|
|
|||
|
switch(msg){
|
|||
|
case WM_INITDIALOG:
|
|||
|
|
|||
|
//
|
|||
|
// If we've only got one stream to set the options for, it seems
|
|||
|
// strange to bring up a box to let you choose which stream you want.
|
|||
|
// Let's skip straight to the proper options dlg box.
|
|||
|
//
|
|||
|
if (gnNumStreams == 1) {
|
|||
|
gnCurStream = 0;
|
|||
|
EndDialog(hwnd, StreamOptions(hwnd));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
/* Add the list of streams to the drop-down box */
|
|||
|
for (nVal = 0; nVal < gnNumStreams; nVal++) {
|
|||
|
// Get the name of this stream
|
|||
|
AVIStreamInfo(gapAVI[nVal], &avis, sizeof(avis));
|
|||
|
SendDlgItemMessage(hwnd, IDC_intCHOOSESTREAM, CB_ADDSTRING, 0,
|
|||
|
(LONG_PTR) (LPTSTR)avis.szName);
|
|||
|
}
|
|||
|
|
|||
|
// Set our initial selection to the first item
|
|||
|
SendDlgItemMessage(hwnd, IDC_intCHOOSESTREAM, CB_SETCURSEL, 0, 0L);
|
|||
|
// Make sure we see it
|
|||
|
SendMessage(hwnd, WM_COMMAND,
|
|||
|
GET_WM_COMMAND_MPS(IDC_intCHOOSESTREAM, hwnd, CBN_SELCHANGE));
|
|||
|
|
|||
|
// Set the interleave boxes for these streams. Every stream should
|
|||
|
// be interleaved the same way, so just look at the first guy.
|
|||
|
// !!! Admittedly, some app might only set the interleaving for
|
|||
|
// the audio stream, and we won't get his intended default here.
|
|||
|
// Default to interleave every 1 if we're uninitialized
|
|||
|
if (gapOpt[0]->dwFlags & AVICOMPRESSF_VALID) {
|
|||
|
f = (gapOpt[0]->dwFlags & AVICOMPRESSF_INTERLEAVE) != 0;
|
|||
|
dw = gapOpt[0]->dwInterleaveEvery;
|
|||
|
} else {
|
|||
|
dw = 1;
|
|||
|
f = FALSE;
|
|||
|
}
|
|||
|
CheckDlgButton(hwnd, IDC_intINTERLEAVE, f);
|
|||
|
SetDlgItemInt(hwnd, IDC_intINTERLEAVEEDIT, (int)dw, FALSE);
|
|||
|
EnableWindow(GetDlgItem(hwnd, IDC_intINTERLEAVEEDIT), f);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
switch(GET_WM_COMMAND_ID(wParam, lParam)){
|
|||
|
case IDOK:
|
|||
|
// Set the interleaving for every stream to be the same,
|
|||
|
// whatever we have chosen. AVIFile doesn't support
|
|||
|
// interleaving different streams in different ways.
|
|||
|
f = IsDlgButtonChecked(hwnd, IDC_intINTERLEAVE);
|
|||
|
dw = (DWORD)GetDlgItemInt(hwnd, IDC_intINTERLEAVEEDIT,
|
|||
|
NULL, FALSE);
|
|||
|
for (i = 0; i < gnNumStreams; i++) {
|
|||
|
gapOpt[i]->dwInterleaveEvery = dw;
|
|||
|
if (f)
|
|||
|
gapOpt[i]->dwFlags |= AVICOMPRESSF_INTERLEAVE;
|
|||
|
else
|
|||
|
gapOpt[i]->dwFlags &=~AVICOMPRESSF_INTERLEAVE;
|
|||
|
}
|
|||
|
// fall through (AAAAaaaahhhhh.....)
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
EndDialog(hwnd, wParam == IDOK);
|
|||
|
break;
|
|||
|
|
|||
|
case IDC_intOPTIONS:
|
|||
|
StreamOptions(hwnd);
|
|||
|
break;
|
|||
|
|
|||
|
//
|
|||
|
// Somebody chose a new stream.
|
|||
|
//
|
|||
|
case IDC_intCHOOSESTREAM:
|
|||
|
if (GET_WM_COMMAND_CMD(wParam, lParam) != CBN_SELCHANGE)
|
|||
|
break;
|
|||
|
|
|||
|
NewStreamChosen(hwnd);
|
|||
|
break;
|
|||
|
|
|||
|
case IDC_intINTERLEAVE:
|
|||
|
// Enable the "interleave every" edit box iff we've checked it
|
|||
|
f = IsDlgButtonChecked(hwnd, IDC_intINTERLEAVE);
|
|||
|
EnableWindow(GetDlgItem(hwnd, IDC_intINTERLEAVEEDIT), f);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|