From b4cb15d14cf04979acd5bfd563175f28f9d8b3f4 Mon Sep 17 00:00:00 2001 From: Tammo 'kb' Hinrichs Date: Fri, 21 Dec 2012 14:18:14 +0100 Subject: [PATCH] screens4: movie related fixes - fixed GetFrame() being called outside the rendering thread and subsequent crashes - fixed horizontal stride for non-multiple-of-16-width h.264 videos (Media Foundation, you lying cow!) --- altona_wz4/wz4/screens4/movieplayer_win7.cpp | 5 +++ altona_wz4/wz4/screens4/playlists.cpp | 37 +++++++++++--------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/altona_wz4/wz4/screens4/movieplayer_win7.cpp b/altona_wz4/wz4/screens4/movieplayer_win7.cpp index e7ae3aa..9917339 100644 --- a/altona_wz4/wz4/screens4/movieplayer_win7.cpp +++ b/altona_wz4/wz4/screens4/movieplayer_win7.cpp @@ -589,6 +589,11 @@ class sMoviePlayerMF : public sMoviePlayer // was probably padded to 16 lines (h.264 limitation) sInt stride = RawStride?RawStride:Info.XSize; sInt extralines = ((size*2/3)/stride)-Info.YSize; + if (extralines>0) + { + stride = sAlign(stride,16); // actually, the stride we get from MF is a lie. + extralines = ((size*2/3)/stride)-Info.YSize; + } // copy to y,v,u texture sTexture2D *ytex=Mtrl->Texture[0]->CastTex2D(); diff --git a/altona_wz4/wz4/screens4/playlists.cpp b/altona_wz4/wz4/screens4/playlists.cpp index 2f67691..1f69a3d 100644 --- a/altona_wz4/wz4/screens4/playlists.cpp +++ b/altona_wz4/wz4/screens4/playlists.cpp @@ -261,9 +261,28 @@ NewSlideData* PlaylistMgr::OnFrame(sF32 delta, const sChar *doneId, sBool doneHa Time += delta; NewSlideData *nsd = PreparedSlide; - PreparedSlide = 0; + + if (nsd && nsd->Type == VIDEO) + { + // wait for first frame to be fully decoded. must be in rendering thread, thus here. + if (nsd->Movie->GetInfo().XSize<0) + { + nsd->Error = sTRUE; + sRelease(nsd->Movie); + } + else + { + sFRect uvr; + nsd->Movie->GetFrame(uvr); + if (nsd->Movie->GetInfo().XSize==0 || uvr.SizeX()==0) + nsd = 0; + } + } + if (nsd) { + PreparedSlide = 0; + // prepare auto advance if (CurrentDuration>0) CurrentSwitchTime = Time; @@ -794,21 +813,7 @@ void PlaylistMgr::PrepareThreadFunc(sThread *t) nsd->Movie = sCreateMoviePlayer(filename,sMOF_DONTSTART|(item->Mute?sMOF_NOSOUND:0)); if (nsd->Movie) { - // wait for first frame to be fully decoded - sFRect uvr; - if (nsd->Movie->GetInfo().XSize<0) - { - nsd->Error = sTRUE; - sRelease(nsd->Movie); - } - else - { - while (nsd->Movie->GetInfo().XSize==0 || uvr.SizeX()==0) - { - sSleep(5); - nsd->Movie->GetFrame(uvr); - } - } + } else {