diff options
author | Max Horn | 2004-03-23 00:10:18 +0000 |
---|---|---|
committer | Max Horn | 2004-03-23 00:10:18 +0000 |
commit | 3fddbc18d6e0a3a783883b9a9bb0c24f50397e6a (patch) | |
tree | 72951868185eaf58e4c77e41da714a04065cfbae /graphics | |
parent | 7b158941e75914b915b5d9fdbcb0676e0aa71873 (diff) | |
download | scummvm-rg350-3fddbc18d6e0a3a783883b9a9bb0c24f50397e6a.tar.gz scummvm-rg350-3fddbc18d6e0a3a783883b9a9bb0c24f50397e6a.tar.bz2 scummvm-rg350-3fddbc18d6e0a3a783883b9a9bb0c24f50397e6a.zip |
Unify MPEG2 code even more
svn-id: r13365
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/animation.cpp | 76 | ||||
-rw-r--r-- | graphics/animation.h | 4 |
2 files changed, 80 insertions, 0 deletions
diff --git a/graphics/animation.cpp b/graphics/animation.cpp index 4808402a46..63bf92f42d 100644 --- a/graphics/animation.cpp +++ b/graphics/animation.cpp @@ -151,6 +151,82 @@ bool BaseAnimationState::init(const char *name) { #endif } +bool BaseAnimationState::decodeFrame() { +#ifdef USE_MPEG2 + mpeg2_state_t state; + const mpeg2_sequence_t *sequence_i; + size_t size = (size_t) -1; + + do { + state = mpeg2_parse(decoder); + sequence_i = info->sequence; + + switch (state) { + case STATE_BUFFER: + size = mpgfile->read(buffer, BUFFER_SIZE); + mpeg2_buffer(decoder, buffer, buffer + size); + break; + + case STATE_SLICE: + case STATE_END: + if (info->display_fbuf) { + /* simple audio video sync code: + * we calculate the actual frame by taking the elapsed audio time and try + * to stay inside +- 1 frame of this calculated frame number by dropping + * frames if we run behind and delaying if we are too fast + */ + + /* Avoid deadlock is sound was too far ahead */ + if (bgSoundStream && !bgSound.isActive()) + return false; + + if (checkPaletteSwitch() || (bgSoundStream == NULL) || + ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum + 1) || + frameskipped > 10) { + if (frameskipped > 10) { + warning("force frame %i redraw", framenum); + frameskipped = 0; + } + drawYUV(sequence_i->width, sequence_i->height, info->display_fbuf->buf); + + if (bgSoundStream) { + while ((_snd->getChannelElapsedTime(bgSound) * 12) / 1000 < framenum) + _sys->delay_msecs(10); + } else { + ticks += 83; + while (_sys->get_msecs() < ticks) + _sys->delay_msecs(10); + // FIXME: This used to be used for the Sword2 version of this + // method. I do not see any compelling reason why it should be + // used, but maybe I am wrong; so if you know more, either + // remove this comment, or change the implementation of the + // method to use "sleepUntil" for BS2. + //_vm->sleepUntil(ticks); + } + + } else { + warning("dropped frame %i", framenum); + frameskipped++; + } + +#ifdef BACKEND_8BIT + buildLookup(palnum + 1, lutcalcnum); +#endif + + framenum++; + return true; + + } + break; + + default: + break; + } + } while (size); +#endif + return false; +} + bool BaseAnimationState::checkPaletteSwitch() { #ifdef BACKEND_8BIT // if we have reached the last image with this palette, switch to new one diff --git a/graphics/animation.h b/graphics/animation.h index e532036929..e4a92a66fa 100644 --- a/graphics/animation.h +++ b/graphics/animation.h @@ -123,8 +123,12 @@ public: virtual ~BaseAnimationState(); bool init(const char *name); + bool decodeFrame(); + protected: bool checkPaletteSwitch(); + virtual void drawYUV(int width, int height, byte *const *dat) = 0; + #ifdef BACKEND_8BIT void buildLookup(int p, int lines); virtual void setPalette(byte *pal) = 0; |