/* * Class: sage_DShowDVDPlayer * Method: setupGraph0 * Signature: (JLjava/lang/String;Ljava/lang/String;ZZ)V */ JNIEXPORT void JNICALL Java_sage_DShowDVDPlayer_setupGraph0 (JNIEnv *env, jobject jo, jlong dataPtr, jstring jFilename, jstring jhostname, jboolean renderVideo, jboolean renderAudio) { NPE_RET(dataPtr); try { CDVDPlayerData* playerData = dynamic_cast<CDVDPlayerData*>((CPlayerData*) dataPtr); const jchar* wszFilename = jFilename ? env->GetStringChars(jFilename, NULL) : NULL; HRESULT hr = playerData->SetDVDLocation((const WCHAR*) wszFilename); if (wszFilename) env->ReleaseStringChars(jFilename, wszFilename); PLAYEXCEPT_RET(sage_PlaybackException_FILESYSTEM); if (renderAudio) { hr = playerData->RenderAudio(); PLAYEXCEPT_RET(sage_PlaybackException_AUDIO_RENDER); } if (renderVideo) { hr = playerData->RenderVideo(); PLAYEXCEPT_RET(sage_PlaybackException_VIDEO_RENDER); hr = playerData->RenderSubPicture(); HTESTPRINT(hr); // if there's no subpicture we're OK and shouldn't fail hr = playerData->RenderCC(); HTESTPRINT(hr); // if there's no CC we're OK and shouldn't fail } LogFilterGraphInfo(playerData->GetGraph()); } catch (...) { throwPlaybackException(env, sage_PlaybackException_DIRECTX_INSTALL, 0); } }
/* * Class: sage_DShowMediaPlayer * Method: setupGraph0 * Signature: (JLjava/lang/String;Ljava/lang/String;ZZ)V */ JNIEXPORT void JNICALL Java_sage_DShowMediaPlayer_setupGraph0 (JNIEnv *env, jobject jo, jlong dataPtr, jstring jFilename, jstring jhostname, jboolean renderVideo, jboolean renderAudio) { NPE_RET(dataPtr); try { CPlayerData* playData = (CPlayerData*) dataPtr; const jchar* wszFilename = env->GetStringChars(jFilename, NULL); const char* cHostname = jhostname ? env->GetStringUTFChars(jhostname, NULL) : NULL; HRESULT hr = playData->SetSourceFilename((const WCHAR**) &wszFilename, 1, cHostname); env->ReleaseStringChars(jFilename, wszFilename); if (cHostname) env->ReleaseStringUTFChars(jhostname, cHostname); if (hr == E_NOINTERFACE) { // This happens if they're using the wrong SageTV filter components from an older version PLAYEXCEPT_RET(sage_PlaybackException_SAGETV_INSTALL); } PLAYEXCEPT_RET(sage_PlaybackException_FILESYSTEM); BOOL hasDemux = playData->HasDemux(); if (hasDemux) { if (renderAudio) hr = playData->RenderAudio(); PLAYEXCEPT_RET(sage_PlaybackException_AUDIO_RENDER); if (renderVideo) hr = playData->RenderVideo(); PLAYEXCEPT_RET(sage_PlaybackException_VIDEO_RENDER); if (renderVideo) hr = playData->RenderCC(); // We accept failures rendering this //HTESTPRINT(hr); } else if (renderAudio || renderVideo) { hr = playData->RenderSource(); PLAYEXCEPT_RET(renderVideo ? sage_PlaybackException_VIDEO_RENDER : sage_PlaybackException_AUDIO_RENDER); } LogFilterGraphInfo(playData->GetGraph()); } catch (...) { throwPlaybackException(env, sage_PlaybackException_VIDEO_RENDER, 0); } }
/* * Class: sage_DShowDVDPlayer * Method: processEvents0 * Signature: (J)I */ JNIEXPORT jint JNICALL Java_sage_DShowDVDPlayer_processEvents0 (JNIEnv *env, jobject jo, jlong dataPtr) { if (!dataPtr) return JNI_TRUE; CDVDPlayerData* playerData = dynamic_cast<CDVDPlayerData*>((CPlayerData*) dataPtr); IDvdInfo2* pInfo = playerData->GetDVDInfo(); IDvdControl2* pCtrl = playerData->GetDVDCtrl(); if (!pCtrl || !pInfo) return JNI_TRUE; HRESULT hr = S_OK; // Clear out any events in the DVD event queue, this method is called with null params // when that's all we need to do CComPtr<IMediaEvent> pIME = NULL; hr = playerData->GetGraph()->QueryInterface(IID_IMediaEvent, (void**)&pIME); long lEvent, lParam1, lParam2; long lTimeOut = 0; long evErr = 0; static jclass stringClass = (jclass) env->NewGlobalRef(env->FindClass("java/lang/String")); LCID language; TCHAR langString[256]; BOOL subPicDisabled; DVD_SubpictureAttributes dvdSubpic; ULONG ulTotal=0, ulCurr=0; jboolean rv = 0; ULONG numVols, currVol, numTitles=0; while (SUCCEEDED(pIME->GetEvent(&lEvent, (LONG_PTR *) &lParam1, (LONG_PTR *) &lParam2, lTimeOut))) { slog((env, "Event: %#x l1=0x%x l2=0x%x\r\n", lEvent, lParam1, lParam2)); switch(lEvent) { case EC_DVD_PLAYBACK_STOPPED: slog((env, "EC_DVD_PLAYBACK_STOPPED event received reason=%d\n", (int)lParam1)); rv = 1; break; case EC_COMPLETE: slog((env, "EC_COMPLETE event received\n")); rv = 1; break; case EC_DVD_NO_FP_PGC: pCtrl->PlayTitle(1, DVD_CMD_FLAG_None, NULL); break; case EC_DVD_ANGLE_CHANGE: playerData->m_currAngle = lParam2; playerData->m_totalAngles = lParam1; break; case EC_DVD_CHAPTER_START: playerData->m_currChapter = lParam1; break; case EC_DVD_DOMAIN_CHANGE: playerData->m_currDomain = (DVD_DOMAIN)lParam1; DVD_DISC_SIDE currSide; pInfo->GetDVDVolumeInfo(&numVols, &currVol, &currSide, &numTitles); playerData->m_totalTitles = numTitles; // Audio & subpic selections can change on domain changes in DShow //break; case EC_DVD_TITLE_CHANGE: if (lEvent == EC_DVD_TITLE_CHANGE) { playerData->m_currTitle = lParam1; hr = pInfo->GetNumberOfChapters(lParam1, (ULONG*)&(playerData->m_totalChapters)); } // Subtitles/audio selections change on title boundaries so reconfigure those values hr = pInfo->GetCurrentSubpicture(&ulTotal, &ulCurr, &subPicDisabled); if (SUCCEEDED(hr)) { for( UINT j = 0; j < ulTotal; j++ ) { hr = pInfo->GetSubpictureLanguage(j, &language); if (SUCCEEDED(hr)) { sprintf(langString, "%d ", j + 1); GetLocaleInfo(language, LOCALE_SENGLANGUAGE, langString + strlen(langString), 256 - strlen(langString)); pInfo->GetSubpictureAttributes(j, &dvdSubpic); if (SUCCEEDED(hr)) { switch (dvdSubpic.LanguageExtension) { case DVD_SP_EXT_Caption_Normal: strcat(langString, " Normal"); break; case DVD_SP_EXT_Caption_Big: strcat(langString, " Large"); break; case DVD_SP_EXT_Caption_Children: strcat(langString, " Children"); break; case DVD_SP_EXT_CC_Normal: strcat(langString, " Normal CC"); break; case DVD_SP_EXT_CC_Big: strcat(langString, " Large CC"); break; case DVD_SP_EXT_CC_Children: strcat(langString, " Children CC"); break; case DVD_SP_EXT_Forced: strcat(langString, " Forced"); break; case DVD_SP_EXT_DirectorComments_Normal: strcat(langString, " Director Comments"); break; case DVD_SP_EXT_DirectorComments_Big: strcat(langString, " Large Director Comments"); break; case DVD_SP_EXT_DirectorComments_Children: strcat(langString, " Director Comments for Children"); break; } } strcpy(playerData->m_availSubs[j], langString); } else playerData->m_availSubs[j][0] = '\0'; } playerData->m_numAvailSubs = ulTotal; playerData->m_currSub = subPicDisabled ? -1 : ulCurr; } hr = pInfo->GetCurrentAudio(&ulTotal, &ulCurr); DVD_AudioAttributes dvdAudio; if (SUCCEEDED(hr)) { for( UINT j = 0; j < ulTotal; j++ ) { hr = pInfo->GetAudioLanguage(j, &language); if (SUCCEEDED(hr)) { sprintf(langString, "%d ", j + 1); GetLocaleInfo(language, LOCALE_SENGLANGUAGE, langString + strlen(langString), 256 - strlen(langString)); pInfo->GetAudioAttributes(j, &dvdAudio); if (SUCCEEDED(hr)) { switch (dvdAudio.AudioFormat) { case DVD_AudioFormat_AC3: strcat(langString, " AC3"); break; case DVD_AudioFormat_DTS: strcat(langString, " DTS"); break; case DVD_AudioFormat_SDDS: strcat(langString, " SDDS"); break; } switch (dvdAudio.LanguageExtension) { case DVD_AUD_EXT_DirectorComments1: strcat(langString, " w/Comments"); break; case DVD_AUD_EXT_DirectorComments2: strcat(langString, " w/Comments 2"); break; } if (dvdAudio.bNumberOfChannels == 6) { strcat(langString, " 5.1"); } } strcpy(playerData->m_availLangs[j], langString); } else playerData->m_availLangs[j][0] = '\0'; } playerData->m_numAvailLangs = ulTotal; playerData->m_currLang = ulCurr; } break; case EC_DVD_BUTTON_CHANGE: playerData->m_numButtons = lParam1; break; case EC_DVD_AUDIO_STREAM_CHANGE: playerData->m_currLang = (lParam1 == 0xFFFFFFFF) ? -1 : lParam1; break; case EC_DVD_SUBPICTURE_STREAM_CHANGE: playerData->m_currSub = (lParam1 == 0xFFFFFFFF) ? -1 : lParam1; if (lParam2 == 0) playerData->m_currSub = -1; // disabled subpicture break; case EC_DVD_ERROR: slog((env, "DVD Event: Error event received (code %ld)\r\n", lParam1)); hr = lParam1; pIME->FreeEventParams(lEvent, lParam1, lParam2); switch (hr) { case DVD_ERROR_Unexpected: throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"An unexpected error (possibly incorrectly authored content)\nwas encountered.\nCan't playback this DVD-Video disc."*/ return rv; case DVD_ERROR_CopyProtectFail: throwPlaybackException(env, sage_PlaybackException_DVD_COPYPROTECT, hr);/*"Key exchange for DVD copy protection failed.\nCan't playback this DVD-Video disc."*/ return rv; case DVD_ERROR_InvalidDVD1_0Disc: throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"This DVD-Video disc is incorrectly authored for v1.0 of the spec.\nCan't playback this disc."*/ return rv; case DVD_ERROR_InvalidDiscRegion: throwPlaybackException(env, sage_PlaybackException_DVD_REGION, hr);/*"This DVD-Video disc cannot be played, because it is not\nauthored to play in the current system region.\nThe region mismatch may be fixed by changing the\nsystem region (with DVDRgn.exe)."*/ return rv; case DVD_ERROR_LowParentalLevel: throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"Player parental level is set lower than the lowest parental\nlevel available in this DVD-Video content.\nCannot playback this DVD-Video disc."*/ return rv; case DVD_ERROR_MacrovisionFail: throwPlaybackException(env, sage_PlaybackException_DVD_COPYPROTECT, hr);/*"This DVD-Video content is protected by Macrovision.\nThe system does not satisfy Macrovision requirement.\nCan't continue playing this disc."*/ return rv; case DVD_ERROR_IncompatibleSystemAndDecoderRegions: throwPlaybackException(env, sage_PlaybackException_DVD_REGION, hr);/*"No DVD-Video disc can be played on this system, because \nthe system region does not match the decoder region.\nPlease contact the manufacturer of this system."*/ return rv; case DVD_ERROR_IncompatibleDiscAndDecoderRegions: throwPlaybackException(env, sage_PlaybackException_DVD_REGION, hr);/*"This DVD-Video disc cannot be played on this system, because it is\nnot authored to be played in the installed decoder's region."*/ return rv; } throwPlaybackException(env, sage_PlaybackException_DVD_GENERAL, hr);/*"An unknown error occurred while trying to playback the DVD"*/ return rv; } // end of switch(lEvent) pIME->FreeEventParams(lEvent, lParam1, lParam2) ; } // end of while(GetEvent()) return rv; }