Ticket #9205: qt_scaler_v2.diff

File qt_scaler_v2.diff, 5.4 KB (added by SF/kreegee, 9 years ago)

qt_decoder.h and qt_decoder.cpp, this time with Common::Rational

  • video/qt_decoder.cpp

     
    6767        _numStreams = 0;
    6868        _fd = 0;
    6969        _scaledSurface = 0;
     70        _scaleFactorX = 1;
     71        _scaleFactorY = 1;
    7072        _dirtyPalette = false;
    7173        _resFork = new Common::MacResManager();
    7274
     
    8284        if (_videoStreamIndex < 0)
    8385                return 0;
    8486
    85         return _streams[_videoStreamIndex]->width / getScaleMode();
     87        return Common::Rational(_streams[_videoStreamIndex]->width,getScaleFactorX()).toInt();
    8688}
    8789
    8890uint16 QuickTimeDecoder::getHeight() const {
    8991        if (_videoStreamIndex < 0)
    9092                return 0;
    91 
    92         return _streams[_videoStreamIndex]->height / getScaleMode();
     93               
     94        return Common::Rational(_streams[_videoStreamIndex]->height,getScaleFactorY()).toInt();
    9395}
    9496
    9597uint32 QuickTimeDecoder::getFrameCount() const {
     
    113115        return _streams[_videoStreamIndex]->codec_tag;
    114116}
    115117
    116 ScaleMode QuickTimeDecoder::getScaleMode() const {
     118Common::Rational QuickTimeDecoder::getScaleFactorX() const {
    117119        if (_videoStreamIndex < 0)
    118                 return kScaleNormal;
     120                return 1;
    119121
    120         return (ScaleMode)(_scaleMode * _streams[_videoStreamIndex]->scaleMode);
     122        return (_scaleFactorX * _streams[_videoStreamIndex]->scaleFactorX);
    121123}
    122124
     125Common::Rational QuickTimeDecoder::getScaleFactorY() const {
     126        if (_videoStreamIndex < 0)
     127                return 1;
     128
     129        return (_scaleFactorY * _streams[_videoStreamIndex]->scaleFactorY);
     130}
     131
    123132uint32 QuickTimeDecoder::getFrameDuration() {
    124133        if (_videoStreamIndex < 0)
    125134                return 0;
     
    231240}
    232241
    233242Surface *QuickTimeDecoder::scaleSurface(Surface *frame) {
    234         if (getScaleMode() == kScaleNormal)
     243        if (getScaleFactorX() == 1 && getScaleFactorY() == 1)
    235244                return frame;
    236245
    237246        assert(_scaledSurface);
    238247
    239         for (uint32 j = 0; j < _scaledSurface->h; j++)
    240                 for (uint32 k = 0; k < _scaledSurface->w; k++)
    241                         memcpy(_scaledSurface->getBasePtr(k, j), frame->getBasePtr(k * getScaleMode(), j * getScaleMode()), frame->bytesPerPixel);
     248        for (int32 j = 0; j < _scaledSurface->h; j++)
     249                for (int32 k = 0; k < _scaledSurface->w; k++)
     250                        memcpy(_scaledSurface->getBasePtr(k, j), frame->getBasePtr(int(getScaleFactorX() * k ) , int(getScaleFactorY() * j)), frame->bytesPerPixel);
    242251
    243252        return _scaledSurface;
    244253}
     
    376385        if (_videoStreamIndex >= 0) {
    377386                _videoCodec = createCodec(getCodecTag(), getBitsPerPixel());
    378387
    379                 if (getScaleMode() != kScaleNormal) {
     388                if (getScaleFactorX() != 1 || getScaleFactorY() != 1) {
    380389                        // We have to initialize the scaled surface
    381390                        _scaledSurface = new Surface();
    382391                        _scaledSurface->create(getWidth(), getHeight(), getPixelFormat().bytesPerPixel);
     
    592601        _fd->skip(12);
    593602        uint32 yMod = _fd->readUint32BE();
    594603        _fd->skip(16);
     604       
     605        _scaleFactorX = Common::Rational(65536, xMod);
     606        _scaleFactorY = Common::Rational(65536, yMod);
    595607
    596         if (xMod != yMod)
    597                 error("X and Y resolution modifiers differ");
     608        debug(1, "readMVHD(): scaleFactorX = %f", double(_scaleFactorX));
     609        debug(1, "readMVHD(): scaleFactorY = %f", double(_scaleFactorY));
    598610
    599         if (xMod == 0x8000)
    600                 _scaleMode = kScaleHalf;
    601         else if (xMod == 0x4000)
    602                 _scaleMode = kScaleQuarter;
    603         else
    604                 _scaleMode = kScaleNormal;
    605 
    606         debug(1, "readMVHD(): scaleMode = %d", (int)_scaleMode);
    607 
    608611        _fd->readUint32BE(); // preview time
    609612        _fd->readUint32BE(); // preview duration
    610613        _fd->readUint32BE(); // poster time
     
    687690        _fd->skip(12);
    688691        uint32 yMod = _fd->readUint32BE();
    689692        _fd->skip(16);
     693       
     694        st->scaleFactorX = Common::Rational(65536, xMod);
     695        st->scaleFactorY = Common::Rational(65536, yMod);
     696       
     697        debug(1, "readTKHD(): scaleFactorX = %f", double(st->scaleFactorX));
     698        debug(1, "readTKHD(): scaleFactorY = %f", double(st->scaleFactorY));
    690699
    691         if (xMod != yMod)
    692                 error("X and Y resolution modifiers differ");
    693 
    694         if (xMod == 0x8000)
    695                 st->scaleMode = kScaleHalf;
    696         else if (xMod == 0x4000)
    697                 st->scaleMode = kScaleQuarter;
    698         else
    699                 st->scaleMode = kScaleNormal;
    700 
    701         debug(1, "readTKHD(): scaleMode = %d", (int)_scaleMode);
    702 
    703700        // these are fixed-point, 16:16
    704701        // uint32 tkWidth = _fd->readUint32BE() >> 16; // track width
    705702        // uint32 tkHeight = _fd->readUint32BE() >> 16; // track height
  • video/qt_decoder.h

     
    3636
    3737#include "common/scummsys.h"
    3838#include "common/queue.h"
     39#include "common/rational.h"
    3940
    4041#include "graphics/video/video_decoder.h"
    4142#include "graphics/video/codecs/codec.h"
     
    5051
    5152namespace Graphics {
    5253
    53 enum ScaleMode {
    54         kScaleNormal = 1,
    55         kScaleHalf = 2,
    56         kScaleQuarter = 4
    57 };
    5854
    5955class QuickTimeDecoder : public RewindableVideoDecoder {
    6056public:
     
    217213                uint32 nb_frames;
    218214                uint32 duration;
    219215                uint32 start_time;
    220                 ScaleMode scaleMode;
     216                Common::Rational scaleFactorX;
     217                Common::Rational scaleFactorY;
    221218        };
    222219
    223220        const ParseTable *_parseTable;
     
    230227        MOVStreamContext *_partial;
    231228        uint32 _numStreams;
    232229        int _ni;
    233         ScaleMode _scaleMode;
     230        Common::Rational _scaleFactorX;
     231        Common::Rational _scaleFactorY;
    234232        MOVStreamContext *_streams[20];
    235233        byte _palette[256 * 3];
    236234        bool _dirtyPalette;
     
    260258
    261259        Surface *_scaledSurface;
    262260        Surface *scaleSurface(Surface *frame);
    263         ScaleMode getScaleMode() const;
     261        Common::Rational getScaleFactorX() const;
     262        Common::Rational getScaleFactorY() const;
    264263
    265264        void pauseVideoIntern(bool pause);
    266265