/******************************Module*Header*******************************\ * Module Name: property.cpp * * Support for the mpeg video and audio decoder property pages. * * * Created: 24-01-96 * Author: Stephen Estrop [StephenE] * * Copyright (c) 1996 - 1998 Microsoft Corporation. All Rights Reserved. \**************************************************************************/ #include #include #include #include "project.h" #include "mpgcodec.h" #include #include extern HINSTANCE hInst; extern HWND hwndApp; extern CMpegMovie *pMpegMovie; extern "C" { INT_PTR CALLBACK VideoStatsDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); INT_PTR CALLBACK VideoDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); INT_PTR CALLBACK AudioDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); } void UpdateStats( HWND hwnd ); TCHAR * StringFromId( int idResource ); void SetDecoderOption( HWND m_hwnd, DWORD dwOptions ); DWORD GetDecoderOption( HWND m_hwnd ); void GetButtonValues( HWND m_hwnd, LPDWORD iChannels, LPDWORD iSkip, LPDWORD iQuality, LPDWORD iInteger, LPDWORD iOutputWordSize ); void SetButtonValues( HWND m_hwnd, DWORD iChannels, DWORD iSkip, DWORD iQuality, DWORD iInteger, DWORD iOutputWordSize ); void PutDecoderInteger( const TCHAR *pKey, int iValue ); /* ------------------------------------------------------------------------- ** Decoder strings ** ------------------------------------------------------------------------- */ const TCHAR chVideoFramesDecoded[] = TEXT("VideoFramesDecoded"); const TCHAR chVideoQuality[] = TEXT("VideoQuality"); const TCHAR chGreyScale[] = TEXT("GreyScale"); const TCHAR chIgnoreQMessages[] = TEXT("IgnoreQMessages"); const TCHAR chAudioChannels[] = TEXT("AudioChannels"); const TCHAR chAudioFreqDivider[] = TEXT("AudioFreqDivider"); const TCHAR chAudioQuality[] = TEXT("AudioQuality"); const TCHAR chAudioQuarterInt[] = TEXT("AudioQuarterInt"); const TCHAR chAudioBits[] = TEXT("AudioBits"); const TCHAR chRegistryKey[] = TEXT("Software\\Microsoft\\Multimedia\\ActiveMovie Filters\\MPEG Decoder"); /******************************Public*Routine******************************\ * DoMpegVideoPropertyPage * * * * History: * 24-01-96 - StephenE - Created * \**************************************************************************/ void DoMpegVideoPropertyPage() { DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VIDEOPROP), hwndApp, VideoDialogProc, (LPARAM)NULL); } /******************************Public*Routine******************************\ * DoMpegAudioPropertyPage * * * * History: * 24-01-96 - StephenE - Created * \**************************************************************************/ void DoMpegAudioPropertyPage() { DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_AUDIOPROP), hwndApp, AudioDialogProc, (LPARAM)NULL); } /******************************Public*Routine******************************\ * VideoDialogProc * * Handles the messages for our property window * * History: * 27-09-95 - StephenE - Created * \**************************************************************************/ INT_PTR CALLBACK VideoDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { DWORD m_dwDecoderOptions; BOOL m_fQualityOption; BOOL m_fGreyScaleOption; switch (uMsg) { case WM_INITDIALOG: pMpegMovie->pMpegDecoder->get_DefaultDecoderOption(&m_dwDecoderOptions); pMpegMovie->pMpegDecoder->get_QualityMsgProcessing(&m_fQualityOption); pMpegMovie->pMpegDecoder->get_GreyScaleOutput(&m_fGreyScaleOption); SetDecoderOption(hwnd, m_dwDecoderOptions); Button_SetCheck(GetDlgItem(hwnd, B_GREY), m_fGreyScaleOption); Button_SetCheck(GetDlgItem(hwnd, IGNORE_QUALITY), m_fQualityOption); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hwnd, wParam); break; case IDOK: m_dwDecoderOptions = GetDecoderOption(hwnd); m_fQualityOption = Button_GetCheck(GetDlgItem(hwnd, IGNORE_QUALITY)); m_fGreyScaleOption = Button_GetCheck(GetDlgItem(hwnd, B_GREY)); pMpegMovie->pMpegDecoder->set_DefaultDecoderOption(m_dwDecoderOptions); pMpegMovie->pMpegDecoder->set_QualityMsgProcessing(m_fQualityOption); pMpegMovie->pMpegDecoder->set_GreyScaleOutput(m_fGreyScaleOption); EndDialog(hwnd, wParam); break; case STATS_BUTTON: DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_VIDEOSTATS), hwnd, VideoStatsDialogProc, (LPARAM)NULL); break; case ID_DEFAULT: m_dwDecoderOptions = GetDecoderOption(hwnd); PutDecoderInteger(chVideoFramesDecoded, m_dwDecoderOptions & 0x3F); PutDecoderInteger(chVideoQuality, m_dwDecoderOptions & 0x30000000); PutDecoderInteger(chGreyScale, Button_GetCheck(GetDlgItem(hwnd, B_GREY))); PutDecoderInteger(chIgnoreQMessages, Button_GetCheck(GetDlgItem(hwnd, IGNORE_QUALITY))); break; } return TRUE; default: return FALSE; } } /*****************************Private*Routine******************************\ * SetDecoderOption * * This function puts the buttons on the property page into the state that * corresponds to the passed in dwOptions parameter. * * History: * 27-09-95 - StephenE - Created * \**************************************************************************/ void SetDecoderOption( HWND m_hwnd, DWORD dwOptions ) { switch (dwOptions & 0x0FFFFFFF) { case DECODE_I: Button_SetCheck(GetDlgItem(m_hwnd, I_ONLY), TRUE ); break; case DECODE_IP: Button_SetCheck(GetDlgItem(m_hwnd, IP_ONLY), TRUE ); break; case DECODE_IPB: Button_SetCheck(GetDlgItem(m_hwnd, IP_ALL_B), TRUE ); break; case DECODE_IPB1: Button_SetCheck(GetDlgItem(m_hwnd, IP_1_IN_4_B), TRUE ); break; case DECODE_IPB2: Button_SetCheck(GetDlgItem(m_hwnd, IP_2_IN_4_B), TRUE ); break; case DECODE_IPB3: Button_SetCheck(GetDlgItem(m_hwnd, IP_3_IN_4_B), TRUE ); break; } switch (dwOptions & 0xF0000000) { case DECODE_BQUAL_HIGH: Button_SetCheck(GetDlgItem(m_hwnd, B_HIGH), TRUE ); break; case DECODE_BQUAL_MEDIUM: Button_SetCheck(GetDlgItem(m_hwnd, B_MEDIUM), TRUE ); break; case DECODE_BQUAL_LOW: Button_SetCheck(GetDlgItem(m_hwnd, B_LOW), TRUE ); break; } } /*****************************Private*Routine******************************\ * GetDecoderOption * * Returns the decoder options from the property page dialog. * * History: * 27-09-95 - StephenE - Created * \**************************************************************************/ DWORD GetDecoderOption( HWND m_hwnd ) { DWORD dwOption = 0L; if (Button_GetCheck(GetDlgItem(m_hwnd, I_ONLY))) { dwOption = DECODE_I; } else if (Button_GetCheck(GetDlgItem(m_hwnd, I_ONLY))) { dwOption = DECODE_I; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IP_ONLY))) { dwOption = DECODE_IP; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IP_ALL_B))) { dwOption = DECODE_IPB; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IP_1_IN_4_B))) { dwOption = DECODE_IPB1; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IP_2_IN_4_B))) { dwOption = DECODE_IPB2; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IP_3_IN_4_B))) { dwOption = DECODE_IPB3; } if (Button_GetCheck(GetDlgItem(m_hwnd, B_HIGH))) { dwOption |= DECODE_BQUAL_HIGH; } else if (Button_GetCheck(GetDlgItem(m_hwnd, B_MEDIUM))) { dwOption |= DECODE_BQUAL_MEDIUM; } else if (Button_GetCheck(GetDlgItem(m_hwnd, B_LOW))) { dwOption |= DECODE_BQUAL_LOW; } return dwOption; } /******************************Public*Routine******************************\ * VideoStatsDialogProc * * Handles the messages for our property window * * History: * 27-09-95 - StephenE - Created * \**************************************************************************/ INT_PTR CALLBACK VideoStatsDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: SetWindowFont(GetDlgItem(hwnd,ID_STATSBOX), GetStockObject(ANSI_FIXED_FONT), FALSE); UpdateStats(hwnd); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: case IDOK: EndDialog(hwnd, wParam); break; case ID_REFRESH: UpdateStats(hwnd); break; } return TRUE; default: return FALSE; } } /*****************************Private*Routine******************************\ * UpdateStats * * Gets the video decoder statics and then formats and displays then in the * read only edit field. * * History: * 27-09-95 - StephenE - Created * \**************************************************************************/ void UpdateStats( HWND hwnd ) { DWORD dwIFramesDecoded; DWORD dwPFramesDecoded; DWORD dwBFramesDecoded; DWORD dwIFramesSkipped; DWORD dwPFramesSkipped; DWORD dwBFramesSkipped; DWORD dwTotalFrames; DWORD dwTotalIFrames; DWORD dwTotalPFrames; DWORD dwTotalBFrames; DWORD dwTotalDecoded; TCHAR Text[1024]; SEQHDR_INFO SeqHdr; pMpegMovie->pMpegDecoder->get_SequenceHeader(&SeqHdr); pMpegMovie->pMpegDecoder->get_FrameStatistics( &dwIFramesDecoded, &dwPFramesDecoded, &dwBFramesDecoded, &dwIFramesSkipped, &dwPFramesSkipped, &dwBFramesSkipped); dwTotalIFrames = dwIFramesDecoded + dwIFramesSkipped; dwTotalPFrames = dwPFramesDecoded + dwPFramesSkipped; dwTotalBFrames = dwBFramesDecoded + dwBFramesSkipped; dwTotalFrames = dwTotalIFrames + dwTotalPFrames + dwTotalBFrames; dwTotalDecoded = dwIFramesDecoded + dwPFramesDecoded + dwBFramesDecoded; wsprintf(Text, StringFromId(IDS_IMAGE_SIZE), SeqHdr.lWidth, SeqHdr.lHeight); wsprintf(Text + lstrlen(Text), StringFromId(IDS_BUFFER_VBV), SeqHdr.lvbv); wsprintf(Text + lstrlen(Text), StringFromId(IDS_BITRATE), SeqHdr.dwBitRate); if (dwTotalFrames != 0) { lstrcat(Text, StringFromId(IDS_NEWLINE)); wsprintf(Text + lstrlen(Text), StringFromId(IDS_FRAMES_DEC), dwTotalDecoded, dwTotalFrames); wsprintf(Text + lstrlen(Text), StringFromId(IDS_PROPORTION), (100 * dwTotalDecoded) / dwTotalFrames); lstrcat(Text, StringFromId(IDS_NEWLINE)); wsprintf(Text + lstrlen(Text), StringFromId(IDS_SKIP_I), dwIFramesDecoded, dwIFramesSkipped); wsprintf(Text + lstrlen(Text), StringFromId(IDS_SKIP_P), dwPFramesDecoded, dwPFramesSkipped); wsprintf(Text + lstrlen(Text), StringFromId(IDS_SKIP_B), dwBFramesDecoded, dwBFramesSkipped); } SetWindowText(GetDlgItem(hwnd, ID_STATSBOX), Text); } /******************************Public*Routine******************************\ * AudioDialogProc * * Handles the messages for our property window * * History: * dd-mm-95 - StephenE - Created * \**************************************************************************/ INT_PTR CALLBACK AudioDialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { DWORD m_iChannels; DWORD m_iSkip; DWORD m_iQuality; DWORD m_iInteger; DWORD m_iWordSize; switch (uMsg) { case WM_INITDIALOG: pMpegMovie->pMpegAudioDecoder->get_Stereo(&m_iChannels); pMpegMovie->pMpegAudioDecoder->get_IntegerDecode(&m_iInteger ); pMpegMovie->pMpegAudioDecoder->get_FrequencyDivider(&m_iSkip); pMpegMovie->pMpegAudioDecoder->get_DecoderAccuracy(&m_iQuality); pMpegMovie->pMpegAudioDecoder->get_DecoderWordSize(&m_iWordSize); SetButtonValues(hwnd, m_iChannels, m_iSkip, m_iQuality, m_iInteger, m_iWordSize); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hwnd, wParam); break; case IDOK: GetButtonValues(hwnd, &m_iChannels, &m_iSkip, &m_iQuality, &m_iInteger, &m_iWordSize); pMpegMovie->pMpegAudioDecoder->put_Stereo(m_iChannels); pMpegMovie->pMpegAudioDecoder->put_IntegerDecode(m_iInteger ); pMpegMovie->pMpegAudioDecoder->put_FrequencyDivider(m_iSkip); pMpegMovie->pMpegAudioDecoder->put_DecoderAccuracy(m_iQuality); pMpegMovie->pMpegAudioDecoder->put_DecoderWordSize(m_iWordSize); EndDialog(hwnd, wParam); break; case IDC_AINFO: // DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_VIDEOSTATS), // hwnd, VideoStatsDialogProc, (LPARAM)pThis); break; case IDC_ADEFAULT: GetButtonValues(hwnd, &m_iChannels, &m_iSkip, &m_iQuality, &m_iInteger, &m_iWordSize); PutDecoderInteger(chAudioChannels, m_iChannels); PutDecoderInteger(chAudioFreqDivider, m_iSkip); PutDecoderInteger(chAudioQuality, m_iQuality); PutDecoderInteger(chAudioQuarterInt, m_iInteger); PutDecoderInteger(chAudioBits, m_iWordSize); break; } return TRUE; default: return FALSE; } } /*****************************Private*Routine******************************\ * * SetButtonValues * * Sets the buttons in the dialog * * History: * dd-mm-96 - StephenE - Created * \**************************************************************************/ void SetButtonValues( HWND m_hwnd, DWORD iChannels, DWORD iSkip, DWORD iQuality, DWORD iInteger, DWORD iWordSize ) { Button_SetCheck(GetDlgItem(m_hwnd, STEREO_OUTPUT), iChannels == 2); int iButton; if (iInteger) { iButton = IDC_INTEGER; } else { switch (iSkip) { case 1: iButton = FULL_FREQ; break; case 2: iButton = HALF_FREQ; break; case 4: iButton = QUARTER_FREQ; break; default: DbgBreak("Illegal case"); } } Button_SetCheck(GetDlgItem(m_hwnd, iButton), TRUE); switch (iQuality) { case DECODE_HALF_FULLQ: iButton = D_MEDIUM; break; case DECODE_HALF_HIQ: iButton = D_LOW; break; default: iButton = D_HIGH; break; } Button_SetCheck(GetDlgItem(m_hwnd, iButton), TRUE); switch(iWordSize) { case 16: iButton = IDC_16_BIT; break; default: iButton = IDC_8_BIT; break; } Button_SetCheck(GetDlgItem(m_hwnd, iButton), TRUE); } /*****************************Private*Routine******************************\ * GetButtonValues * * Gets the values of the button settings * * History: * dd-mm-96 - StephenE - Created * \**************************************************************************/ void GetButtonValues( HWND m_hwnd, LPDWORD iChannels, LPDWORD iSkip, LPDWORD iQuality, LPDWORD iInteger, LPDWORD iOutputWordSize ) { *iChannels = Button_GetCheck(GetDlgItem(m_hwnd, STEREO_OUTPUT)) ? 2 : 1; *iInteger = 0; if (Button_GetCheck(GetDlgItem(m_hwnd, FULL_FREQ))) { *iSkip = 1; } else if (Button_GetCheck(GetDlgItem(m_hwnd, HALF_FREQ))) { *iSkip = 2; } else if (Button_GetCheck(GetDlgItem(m_hwnd, QUARTER_FREQ))) { *iSkip = 4; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IDC_INTEGER))) { *iSkip = 4; *iInteger = 1; } else { DbgBreak("One button should be set"); } if (Button_GetCheck(GetDlgItem(m_hwnd, D_MEDIUM))) { *iQuality = DECODE_HALF_FULLQ; } else if (Button_GetCheck(GetDlgItem(m_hwnd, D_LOW))) { *iQuality = DECODE_HALF_HIQ; } else if (Button_GetCheck(GetDlgItem(m_hwnd, D_HIGH))) { *iQuality = 0L; } else { DbgBreak("One button should be set"); } if (Button_GetCheck(GetDlgItem(m_hwnd, IDC_8_BIT))) { *iOutputWordSize = 8; } else if (Button_GetCheck(GetDlgItem(m_hwnd, IDC_16_BIT))) { *iOutputWordSize = 16; } else { DbgBreak("One button should be set"); } } /******************************Public*Routine******************************\ * StringFromId * * * * History: * dd-mm-96 - StephenE - Created * \**************************************************************************/ TCHAR * StringFromId( int idResource ) { static TCHAR chBuffer[ STR_MAX_STRING_LEN ]; static TCHAR chEmpty[] = TEXT(""); if (LoadString(hInst, idResource, chBuffer, STR_MAX_STRING_LEN) == 0) { return chEmpty; } return chBuffer; } /******************************Public*Routine******************************\ * PutDecoderDword * * * * History: * dd-mm-96 - StephenE - Created * \**************************************************************************/ void PutDecoderInteger( const TCHAR *pKey, int iValue ) { HKEY hKey; if (ERROR_SUCCESS == RegCreateKey(HKEY_CURRENT_USER, chRegistryKey, &hKey)) { DWORD dwTmp = (DWORD)iValue; RegSetValueEx(hKey, pKey, 0L, REG_DWORD, (LPBYTE)&dwTmp, sizeof(dwTmp)); RegCloseKey(hKey); } }