// // Written by Will Braynen (in 2001) // #ifndef __JAVUPLAYERUTIL_H_ // added by will, not the wizard #define __JAVUPLAYERUTIL_H_ // // Conditional compilation // //#define REMOVE_AUDIO_FILTER_IF_NEEDED // if this is defined, PlayFastThread() isn't used by PlayForward() // all/most of the code associated with removing filters is removed after the following version: "JavuPlayer - BACKUP 4.7 (May 09, 2001)" //#define SEEK_INTO_MIDDLE_OF_FRAME //#define OFFSET_TIMECODE // (NOTE: if dFrameRate is unknown, then the timecode will NOT be offset regardless) start with "00:00:00:00" ("hh:mm:ss:ff") or offset to match a test file; see ConvertTimeToString() //#define PLAY_PAUSE_BUTTON_TOGGLE //#define DEBUG_OUTPUT // // Types // typedef enum { PlayerState_StoppingPlayFastThread, PlayerState_Stopped, PlayerState_Paused, PlayerState_PlayingForward, PlayerState_PlayingReverse, PlayerState_Uninitialized, PlayerState_Loading, PlayerState_Ready, PlayerState_LoadFailed } player_state_t; // // Constants // #define AUDIO_RENDERING_FILTER_NAME L"Sound Renderer" #define GUI_PADDING 5 #define FRAME_DURATION (m_rtAveTimePerFrame > 0 ? m_rtAveTimePerFrame : 1) //m_rtTotalDurationTime / m_llTotalDurationFrame) /*(10000000.0/30)*/ // in 100ns #define INITIAL_SKIP_FRAMES_GUESS 1 // used by PlayFastThread(); initially skip one frame and if you can't keep up drop (more and more) frames until your playback is fast enough (same as requested) #define SLIDER_TIMERDELAY 100 // also determines how often current position display is updated #define VOLUME_FULL 0L #define VOLUME_SILENCE -10000L #define TICKLEN 500 // length of the seek slider in ticks #define ONE_SECOND 10000000 // in 100-nanosecond units (for seeking) #define VIDEO_PLAYBACK_RATE_MAX 16.0 #define AUDIO_PLAYBACK_RATE_MAX 2.0 #define TEMP_XML_FILENAME _T("JavuPlayer_temp_XMLfile.xtl") // the extension of this file MUST be .xtl (unless the logic in CJavuPlayerCtrl::LoadFile changed - right now it uses the file extension to figure out whether it's loading an XTL timeline or just one media file) // // Application-defined messages // #define WM_GRAPHNOTIFY WM_APP + 1 #define WM_PLAYBACKENDED WM_APP + 2 #define WM_POSITIONCHANGED WM_APP + 3 // // Routines // // Miscellaneous #define SAFE_RELEASE(i) {if (i) i->Release(); i = NULL;} #define JIF(x) if (FAILED(hr=(x))) {goto CLEANUP;} #define ABS(n) (n >= 0 ? n : -n) #define SET_PRECISION(x,n) (((int)(x * pow(10,n))) / pow(10,n)) #define ROUND_UP(n) ( (LONGLONG)n >= n ? (LONGLONG)n : (LONGLONG)n + 1 ) #define SAFE_DIVISOR(x) (x ? x : 1) long GetDlgItemLong( HWND hDlg, int nID, LPTSTR lpString, int nMaxCount ); #define GetDlgItemCString(nID, strText, MAX_LEN) \ { \ TCHAR lpString [MAX_LEN]; \ ::GetWindowText(::GetDlgItem (m_hWnd, nID), (LPTSTR) lpString, MAX_LEN); \ strText = lpString; \ } #define AddIconToButton(nIDDlgItem, nResourceID) \ { \ HICON hIcon = AfxGetApp()->LoadIcon (nResourceID); \ SendMessage (::GetDlgItem (m_hWnd, nIDDlgItem), BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); \ ::SendMessage (::GetDlgItem (m_hWnd, nIDDlgItem), WM_PAINT, NULL, NULL); \ } RECT * GetCoords( HWND hParentWindow, int nIDDlgItem, RECT *pRect ); char * Wide2Ascii( LPCWSTR lpszWideString, char *pAsciiString ); LPWSTR Ascii2Wide( const char *pAsciiString, LPWSTR lpszWideString ); double GetXMLFrameRate( LPCWSTR lpszFilename ); HRESULT IsValidFile( LPCWSTR lpszFilename ); // Jump routines - positioning #define JumpToFrame(n) Jump(n,&TIME_FORMAT_FRAME,true) // do an absolute jump in frames #define JumpToTime(n) Jump(n,&TIME_FORMAT_MEDIA_TIME,true) // do an absolute jump in 100-nanosecond units #define NextFrame(n) (n <= 0 ? E_INVALIDARG : Jump(n,&TIME_FORMAT_FRAME,false)) // do a relative jump forward in frames #define PreviousFrame(n) (n <= 0 ? E_INVALIDARG : Jump(-n,&TIME_FORMAT_FRAME,false)) // do a relative jump backward in frames #define TimeStep(n) (n <= 0 ? E_INVALIDARG : Jump(n,&TIME_FORMAT_MEDIA_TIME,false)) // do a relative jump forward in 100-nanosecond units #define TimeBack(n) (n <= 0 ? E_INVALIDARG : Jump(-n,&TIME_FORMAT_MEDIA_TIME,false)) // do a relative jump backward in 100-nanosecond units // Position conversion routines: "hh:mm:ss:ff" (string), hhmmssff (long int), f (frame) HRESULT Time2Timecode( REFERENCE_TIME rtDurationTime, CString *strDurationTimecode, double dFrameRate = 0, bool bDropFrameFormat = false ); // 100ns -> "hh:mm:ss:ff" HRESULT Timecode2Time( long lPositionTimecode, REFERENCE_TIME *prtPositionTime, const double dFrameRate, bool bDropFrameFormat = false ); HRESULT TimecodeInt2String( long lDuration, CString *strDuration ); // hhmmssff -> "hh:mm:ss:ff" HRESULT TimecodeString2Int( CString strDuration, long *plDuration ); // "hh:mm:ss:ff" -> hhmmssff // Exposing the graph to an external process (e.g. GraphEdit) HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister); void RemoveFromRot(DWORD pdwRegister); #endif //__JAVUPLAYERUTIL_H_