Ticket #9205: qt_scaler.diff

File qt_scaler.diff, 4.9 KB (added by SF/kreegee, 9 years ago)

qt_decoder.h and qt_decoder.cpp

  • video/qt_decoder.cpp

     
    6767        _numStreams = 0;
    6868        _fd = 0;
    6969        _scaledSurface = 0;
     70        _scaleFactorX = 1.0f;
     71        _scaleFactorY = 1.0f;
    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 (uint16) ((float) _streams[_videoStreamIndex]->width / getScaleFactorX());
    8688}
    8789
    8890uint16 QuickTimeDecoder::getHeight() const {
    8991        if (_videoStreamIndex < 0)
    9092                return 0;
    91 
    92         return _streams[_videoStreamIndex]->height / getScaleMode();
     93               
     94        return (uint16) ((float) _streams[_videoStreamIndex]->height / getScaleFactorY());
    9395}
    9496
    9597uint32 QuickTimeDecoder::getFrameCount() const {
     
    113115        return _streams[_videoStreamIndex]->codec_tag;
    114116}
    115117
    116 ScaleMode QuickTimeDecoder::getScaleMode() const {
     118float QuickTimeDecoder::getScaleFactorX() const {
    117119        if (_videoStreamIndex < 0)
    118                 return kScaleNormal;
     120                return 1.0f;
    119121
    120         return (ScaleMode)(_scaleMode * _streams[_videoStreamIndex]->scaleMode);
     122        return (_scaleFactorX * _streams[_videoStreamIndex]->scaleFactorX);
    121123}
    122124
     125float QuickTimeDecoder::getScaleFactorY() const {
     126        if (_videoStreamIndex < 0)
     127                return 1.0f;
     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
    239248        for (uint32 j = 0; j < _scaledSurface->h; j++)
    240249                for (uint32 k = 0; k < _scaledSurface->w; k++)
    241                         memcpy(_scaledSurface->getBasePtr(k, j), frame->getBasePtr(k * getScaleMode(), j * getScaleMode()), frame->bytesPerPixel);
     250                        memcpy(_scaledSurface->getBasePtr(k, j), frame->getBasePtr((int) (k * getScaleFactorX()),(int) (j * getScaleFactorY())), 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 = 65536.0f/(float) xMod;
     606        _scaleFactorY = 65536.0f/(float) yMod;
    595607
    596         if (xMod != yMod)
    597                 error("X and Y resolution modifiers differ");
     608        debug(1, "readMVHD(): scaleFactorX = %f", _scaleFactorX);
     609        debug(1, "readMVHD(): scaleFactorY = %f", _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 = 65536.0f/(float) xMod;
     695        st->scaleFactorY = 65536.0f/(float) yMod;
     696       
     697        debug(1, "readTKHD(): scaleFactorX = %f", st->scaleFactorX);
     698        debug(1, "readTKHD(): scaleFactorY = %f", 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

     
    5050
    5151namespace Graphics {
    5252
    53 enum ScaleMode {
    54         kScaleNormal = 1,
    55         kScaleHalf = 2,
    56         kScaleQuarter = 4
    57 };
    5853
    5954class QuickTimeDecoder : public RewindableVideoDecoder {
    6055public:
     
    217212                uint32 nb_frames;
    218213                uint32 duration;
    219214                uint32 start_time;
    220                 ScaleMode scaleMode;
     215                float scaleFactorX;
     216                float scaleFactorY;
    221217        };
    222218
    223219        const ParseTable *_parseTable;
     
    230226        MOVStreamContext *_partial;
    231227        uint32 _numStreams;
    232228        int _ni;
    233         ScaleMode _scaleMode;
     229        float _scaleFactorX;
     230        float _scaleFactorY;
    234231        MOVStreamContext *_streams[20];
    235232        byte _palette[256 * 3];
    236233        bool _dirtyPalette;
     
    260257
    261258        Surface *_scaledSurface;
    262259        Surface *scaleSurface(Surface *frame);
    263         ScaleMode getScaleMode() const;
     260        float getScaleFactorX() const;
     261        float getScaleFactorY() const;
    264262
    265263        void pauseVideoIntern(bool pause);
    266264