/* Renders a video sequence specified by filename to a buffer*/ bool seq_RenderVideoToBuffer(const char* sequenceName, int seqCommand) { static enum { VIDEO_NOT_PLAYING, VIDEO_PLAYING, VIDEO_FINISHED, } videoPlaying = VIDEO_NOT_PLAYING; static enum { VIDEO_LOOP, VIDEO_HOLD_LAST_FRAME, } frameHold = VIDEO_LOOP; if (seqCommand == SEQUENCE_KILL) { //stop the movie seq_Shutdown(); bSeqPlaying = false; frameHold = VIDEO_LOOP; videoPlaying = VIDEO_NOT_PLAYING; return true; } if (!bSeqPlaying && frameHold == VIDEO_LOOP) { //start the ball rolling iV_SetFont(font_regular); iV_SetTextColour(WZCOL_TEXT_BRIGHT); /* We do *NOT* want to use the user-choosen resolution when we * are doing intelligence videos. */ videoPlaying = seq_StartFullScreenVideo(sequenceName, NULL, VIDEO_PRESELECTED_RESOLUTION) ? VIDEO_PLAYING : VIDEO_FINISHED; bSeqPlaying = true; } if (videoPlaying != VIDEO_FINISHED) { videoPlaying = seq_Update() ? VIDEO_PLAYING : VIDEO_FINISHED; } if (videoPlaying == VIDEO_FINISHED) { seq_Shutdown(); bSeqPlaying = false; frameHold = VIDEO_HOLD_LAST_FRAME; videoPlaying = VIDEO_NOT_PLAYING; return false; } return true; }
bool seq_UpdateFullScreenVideo(int *pbClear) { int i; bool bMoreThanOneSequenceLine = false; bool stillPlaying; unsigned int subMin = SUBTITLE_BOX_MAX + D_H2; unsigned int subMax = SUBTITLE_BOX_MIN + D_H2; //get any text lines over bottom of the video double realTime = seq_GetFrameTime(); for (i = 0; i < MAX_TEXT_OVERLAYS; i++) { SEQTEXT seqtext = aSeqList[currentPlaySeq].aText[i]; if (seqtext.pText[0] != '\0') { if (seqtext.bSubtitle) { if (((realTime >= seqtext.startTime) && (realTime <= seqtext.endTime)) || aSeqList[currentPlaySeq].bSeqLoop) //if its a looped video always draw the text { if (subMin > seqtext.y && seqtext.y > SUBTITLE_BOX_MIN) { subMin = seqtext.y; } if (subMax < seqtext.y) { subMax = seqtext.y; } } } if (realTime >= seqtext.endTime && realTime < seqtext.endTime) { if (pbClear != NULL) { *pbClear = CLEAR_BLACK; } } } } subMin -= D_H2;//adjust video window here because text is already ofset for big screens subMax -= D_H2; if (subMin < SUBTITLE_BOX_MIN) { subMin = SUBTITLE_BOX_MIN; } if (subMax > SUBTITLE_BOX_MAX) { subMax = SUBTITLE_BOX_MAX; } if (subMax > subMin) { bMoreThanOneSequenceLine = true; } //call sequence player to download last frame stillPlaying = seq_Update(); //print any text over the video realTime = seq_GetFrameTime(); for (i = 0; i < MAX_TEXT_OVERLAYS; i++) { SEQTEXT currentText = aSeqList[currentPlaySeq].aText[i]; if (currentText.pText[0] != '\0') { if (((realTime >= currentText.startTime) && (realTime <= currentText.endTime)) || (aSeqList[currentPlaySeq].bSeqLoop)) //if its a looped video always draw the text { if (bMoreThanOneSequenceLine) { currentText.x = 20 + D_W2; } iV_SetTextColour(WZCOL_GREY); iV_DrawText(&(currentText.pText[0]), currentText.x - 1, currentText.y - 1); iV_DrawText(&(currentText.pText[0]), currentText.x - 1, currentText.y + 1); iV_DrawText(&(currentText.pText[0]), currentText.x - 1, currentText.y + 1); iV_DrawText(&(currentText.pText[0]), currentText.x + 1, currentText.y + 1); iV_SetTextColour(WZCOL_WHITE); iV_DrawText(&(currentText.pText[0]), currentText.x, currentText.y); } } } if (!stillPlaying || bHoldSeqForAudio) { if (bAudioPlaying) { if (aSeqList[currentPlaySeq].bSeqLoop) { seq_Shutdown(); if (!seq_Play(aVideoName.toUtf8().constData())) { bHoldSeqForAudio = true; } } else { bHoldSeqForAudio = true; } return true;//should hold the video } else { return false;//should terminate the video } } return true; }
BOOL seq_UpdateFullScreenVideo(int *pbClear) { int i; BOOL bMoreThanOneSequenceLine = false; bool stillPlaying; unsigned int subMin = SUBTITLE_BOX_MAX + D_H2; unsigned int subMax = SUBTITLE_BOX_MIN + D_H2; //get any text lines over bottom of the video unsigned int realFrame = seq_GetFrameNumber(); for(i=0;i<MAX_TEXT_OVERLAYS;i++) { if (aSeqList[currentPlaySeq].aText[i].pText[0] != '\0') { if (aSeqList[currentPlaySeq].aText[i].bSubtitle) { if ((realFrame >= aSeqList[currentPlaySeq].aText[i].startFrame) && (realFrame <= aSeqList[currentPlaySeq].aText[i].endFrame)) { if (subMin > aSeqList[currentPlaySeq].aText[i].y) { if (aSeqList[currentPlaySeq].aText[i].y > SUBTITLE_BOX_MIN) { subMin = aSeqList[currentPlaySeq].aText[i].y; } } if (subMax < aSeqList[currentPlaySeq].aText[i].y) { subMax = aSeqList[currentPlaySeq].aText[i].y; } } else if (aSeqList[currentPlaySeq].bSeqLoop)//if its a looped video always draw the text { if (subMin >= aSeqList[currentPlaySeq].aText[i].y) { if (aSeqList[currentPlaySeq].aText[i].y > SUBTITLE_BOX_MIN) { subMin = aSeqList[currentPlaySeq].aText[i].y; } } if (subMax < aSeqList[currentPlaySeq].aText[i].y) { subMax = aSeqList[currentPlaySeq].aText[i].y; } } } if (realFrame >= aSeqList[currentPlaySeq].aText[i].endFrame && realFrame < aSeqList[currentPlaySeq].aText[i].endFrame + frameSkip) { if (pbClear != NULL) { *pbClear = CLEAR_BLACK; } } } } subMin -= D_H2;//adjust video window here because text is already ofset for big screens subMax -= D_H2; if (subMin < SUBTITLE_BOX_MIN) { subMin = SUBTITLE_BOX_MIN; } if (subMax > SUBTITLE_BOX_MAX) { subMax = SUBTITLE_BOX_MAX; } if (subMax > subMin) { bMoreThanOneSequenceLine = true; } //call sequence player to download last frame stillPlaying = seq_Update(); //print any text over the video realFrame = seq_GetFrameNumber();//textFrame + 1; for(i=0;i<MAX_TEXT_OVERLAYS;i++) { if (aSeqList[currentPlaySeq].aText[i].pText[0] != '\0') { if ((realFrame >= aSeqList[currentPlaySeq].aText[i].startFrame) && (realFrame <= aSeqList[currentPlaySeq].aText[i].endFrame)) { if (bMoreThanOneSequenceLine) { aSeqList[currentPlaySeq].aText[i].x = 20 + D_W2; } iV_SetTextColour(WZCOL_GREY); iV_DrawText(&(aSeqList[currentPlaySeq].aText[i].pText[0]), aSeqList[currentPlaySeq].aText[i].x + 1, aSeqList[currentPlaySeq].aText[i].y + 1); iV_SetTextColour(WZCOL_TEXT_BRIGHT); iV_DrawText(&(aSeqList[currentPlaySeq].aText[i].pText[0]), aSeqList[currentPlaySeq].aText[i].x, aSeqList[currentPlaySeq].aText[i].y); } else if (aSeqList[currentPlaySeq].bSeqLoop)//if its a looped video always draw the text { if (bMoreThanOneSequenceLine) { aSeqList[currentPlaySeq].aText[i].x = 20 + D_W2; } iV_SetTextColour(WZCOL_GREY); iV_DrawText(&(aSeqList[currentPlaySeq].aText[i].pText[0]), aSeqList[currentPlaySeq].aText[i].x + 1, aSeqList[currentPlaySeq].aText[i].y + 1); iV_SetTextColour(WZCOL_TEXT_BRIGHT); iV_DrawText(&(aSeqList[currentPlaySeq].aText[i].pText[0]), aSeqList[currentPlaySeq].aText[i].x, aSeqList[currentPlaySeq].aText[i].y); } } } if (!stillPlaying || bHoldSeqForAudio) { if (bAudioPlaying) { if (aSeqList[currentPlaySeq].bSeqLoop) { seq_Shutdown(); if (!seq_Play(aVideoName)) { bHoldSeqForAudio = true; } } else { bHoldSeqForAudio = true; } return true;//should hold the video } else { return false;//should terminate the video } } return true; }