Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/qt7/audionode.h

    r2 r846  
    7373
    7474            // Only the following methods needs to
    75             // be overidden by only_one-audio-unit nodes:
     75            // be overridden by only_one-audio-unit nodes:
    7676            virtual ComponentDescription getAudioNodeDescription() const;
    7777            virtual void initializeAudioUnit();
  • trunk/src/3rdparty/phonon/qt7/audionode.mm

    r2 r846  
    7878    // deal with at the moment, so we'll take the "deprecated" warning instead.
    7979    err = AUGraphNewNode(m_audioGraph->audioGraphRef(), &description, 0, 0, &m_auNode);
     80       
    8081    BACKEND_ASSERT2(err != kAUGraphErr_OutputNodeErr, "A MediaObject can only be connected to one audio output device.", FATAL_ERROR)
    8182    BACKEND_ASSERT2(err == noErr, "Could not create new AUNode.", FATAL_ERROR)
  • trunk/src/3rdparty/phonon/qt7/backendinfo.mm

    r2 r846  
    1616*/
    1717
    18 #include "backendinfo.h"
    19 #include "backendheader.h"
    20 
    21 #include <AudioToolbox/AudioToolbox.h>
    22 #include <AudioUnit/AudioUnit.h>
    23 #include <CoreServices/CoreServices.h>
    24 
    25 #include <QtGui/qmacdefines_mac.h>
    2618#import <QTKit/QTMovie.h>
    27 
    2819#ifdef QUICKTIME_C_API_AVAILABLE
    2920    #include <QuickTime/QuickTime.h>
    3021    #undef check // avoid name clash;
    3122#endif
     23
     24#include "backendinfo.h"
     25#include "backendheader.h"
     26
     27#include <AudioToolbox/AudioToolbox.h>
     28#include <AudioUnit/AudioUnit.h>
     29#include <CoreServices/CoreServices.h>
     30
    3231
    3332QT_BEGIN_NAMESPACE
  • trunk/src/3rdparty/phonon/qt7/mediaobject.h

    r561 r846  
    2626#include "medianode.h"
    2727
    28 #if QT_ALLOW_QUICKTIME
    29     #include <QuickTime/QuickTime.h>
    30 #endif
    31 
    3228QT_BEGIN_NAMESPACE
    3329
     
    4339
    4440    class MediaObject : public MediaNode,
    45         public Phonon::MediaObjectInterface
    46 #ifndef QT_NO_PHONON_MEDIACONTROLLER
    47         , public Phonon::AddonInterface
    48 #endif
     41        public Phonon::MediaObjectInterface, public Phonon::AddonInterface
    4942    {
    5043        Q_OBJECT
     
    10093                int videoOutputCount();
    10194
    102 #if QT_ALLOW_QUICKTIME
    103         void displayLinkEvent();
    104 #endif
    105 
    10695    signals:
    10796        void stateChanged(Phonon::State,Phonon::State);
     
    116105        void metaDataChanged(QMultiMap<QString,QString>);
    117106        void currentSourceChanged(const MediaSource &newSource);
    118 
    119         // Add-on interface:
    120         void availableSubtitlesChanged();
    121         void availableAudioChannelsChanged();
    122         void titleChanged(int);
    123         void availableTitlesChanged(int);
    124         void chapterChanged(int);
    125         void availableChaptersChanged(int);
    126         void angleChanged(int);
    127         void availableAnglesChanged(int);
    128107
    129108    protected:
     
    140119        QuickTimeAudioPlayer *m_nextAudioPlayer;
    141120        MediaObjectAudioNode *m_mediaObjectAudioNode;
    142 
    143 #if QT_ALLOW_QUICKTIME
    144         CVDisplayLinkRef m_displayLink;
    145         QMutex m_displayLinkMutex;
    146         bool m_pendingDisplayLinkEvent;
    147         void startDisplayLink();
    148         void stopDisplayLink();
    149 #endif
     121        QuickTimeMetaData *m_metaData;
    150122
    151123        qint32 m_tickInterval;
     
    156128
    157129        int m_tickTimer;
    158         int m_videoTimer;
    159         int m_audioTimer;
     130        int m_bufferTimer;
    160131        int m_rapidTimer;
    161132
     
    163134        int m_swapTimeLeft;
    164135        QTime m_swapTime;
    165         bool m_autoplayTitles;
    166136
    167137        void synchAudioVideo();
     
    172142        void play_internal();
    173143        void setupAudioSystem();
    174         void restartAudioVideoTimers();
     144        void updateTimer(int &timer, int interval);
     145        void bufferAudioVideo();
    175146        void updateRapidly();
    176147        void updateCrossFade();
     
    184155        void inspectGraph();
    185156        bool isCrossFading();
    186         void setCurrentTrack(int track);
    187157
    188158        QString m_errorString;
  • trunk/src/3rdparty/phonon/qt7/mediaobject.mm

    r561 r846  
    4747    setAudioNode(m_mediaObjectAudioNode);
    4848
     49    m_metaData = new QuickTimeMetaData();
    4950    m_audioGraph = new AudioGraph(this);
    5051
     
    5556    m_percentageLoaded = 0;
    5657    m_waitNextSwap = false;
    57     m_autoplayTitles = true;
    5858    m_audioEffectCount = 0;
    5959    m_audioOutputCount = 0;
     
    6464
    6565    m_tickTimer = 0;
    66     m_videoTimer = 0;
    67     m_audioTimer = 0;
     66    m_bufferTimer = 0;
    6867    m_rapidTimer = 0;
    6968
    70 #if QT_ALLOW_QUICKTIME
    71     m_displayLink = 0;
    72     m_pendingDisplayLinkEvent = false;
    73 #endif
    74 
    7569    checkForError();
    7670}
    7771
    7872MediaObject::~MediaObject()
    79 {
    80     // m_mediaObjectAudioNode is owned by super class.
    81 #if QT_ALLOW_QUICKTIME
    82     stopDisplayLink();
    83 #endif
     73{   
     74    // m_mediaObjectAudioNode is owned by super class.   
    8475    m_audioPlayer->unsetVideoPlayer();
    8576    m_nextAudioPlayer->unsetVideoPlayer();
    8677    delete m_videoPlayer;
    8778    delete m_nextVideoPlayer;
     79    delete m_metaData;
    8880    checkForError();
    8981}
     
    9789        if (m_state != state){
    9890            // End-application did something
    99             // upon  receiving the signal.
     91            // upon  receiving the signal. 
    10092            return false;
    10193        }
     
    131123    // effects or outputs connected. This will have
    132124    // influence on the audio system and video system that ends up beeing used:
    133     int prevVideoOutputCount = m_videoOutputCount;
     125    int prevVideoOutputCount = m_videoOutputCount;     
    134126    m_audioEffectCount = 0;
    135127    m_audioOutputCount = 0;
     
    143135            MediaNodeEvent e1(MediaNodeEvent::VideoOutputCountChanged, &m_videoOutputCount);
    144136            notify(&e1);
    145     }
     137        }       
    146138}
    147139
     
    176168    if (newAudioSystem == m_audioSystem)
    177169        return;
    178 
     170 
    179171    // Enable selected audio system:
    180     m_audioSystem = newAudioSystem;
     172    m_audioSystem = newAudioSystem; 
    181173    switch (newAudioSystem){
    182174        case AS_Silent:
    183175            m_audioGraph->stop();
    184176            m_videoPlayer->enableAudio(false);
    185             m_nextVideoPlayer->enableAudio(false);
     177            m_nextVideoPlayer->enableAudio(false);   
    186178            m_audioPlayer->enableAudio(false);
    187179            m_nextAudioPlayer->enableAudio(false);
     
    223215        PhononAutoReleasePool pool;
    224216    setState(Phonon::LoadingState);
    225 
     217   
    226218    // Save current state for event/signal handling below:
    227219    bool prevHasVideo = m_videoPlayer->hasVideo();
    228220    qint64 prevTotalTime = totalTime();
    229     int prevTrackCount = m_videoPlayer->trackCount();
    230221    m_waitNextSwap = false;
    231 
     222       
    232223    // Cancel cross-fade if any:
    233224    m_nextVideoPlayer->pause();
    234225    m_nextAudioPlayer->pause();
    235226    m_mediaObjectAudioNode->cancelCrossFade();
    236 
     227   
    237228    // Set new source:
    238229    m_audioPlayer->unsetVideoPlayer();
    239230    m_videoPlayer->setMediaSource(source);
    240231    m_audioPlayer->setVideoPlayer(m_videoPlayer);
    241 
    242     m_audioGraph->updateStreamSpecifications();
     232    m_metaData->setVideo(m_videoPlayer);       
     233
     234    m_audioGraph->updateStreamSpecifications();       
    243235    m_nextAudioPlayer->unsetVideoPlayer();
    244     m_nextVideoPlayer->unsetCurrentMediaSource();
     236    m_nextVideoPlayer->unsetVideo();
    245237    m_currentTime = 0;
    246 
     238       
    247239    // Emit/notify information about the new source:
    248240    QRect videoRect = m_videoPlayer->videoRect();
     
    255247
    256248    emit currentSourceChanged(source);
    257     emit metaDataChanged(m_videoPlayer->metaData());
     249    emit metaDataChanged(m_metaData->metaData());
    258250
    259251    if (prevHasVideo != m_videoPlayer->hasVideo())
    260         emit hasVideoChanged(m_videoPlayer->hasVideo());
     252        emit hasVideoChanged(m_videoPlayer->hasVideo());       
    261253    if (prevTotalTime != totalTime())
    262         emit totalTimeChanged(totalTime());
    263     if (prevTrackCount != m_videoPlayer->trackCount())
    264         emit availableTitlesChanged(m_videoPlayer->trackCount());
     254        emit totalTimeChanged(totalTime());       
    265255    if (checkForError())
    266256        return;
     
    271261    if (!m_videoPlayer->canPlayMedia())
    272262        SET_ERROR("Cannot play media.", FATAL_ERROR)
    273 
     263       
    274264    // The state might have changed from LoadingState
    275265    // as a response to an error state change. So we
     
    298288    bool prevHasVideo = m_videoPlayer->hasVideo();
    299289    qint64 prevTotalTime = totalTime();
    300     int prevTrackCount = m_videoPlayer->trackCount();
    301290
    302291    qSwap(m_audioPlayer, m_nextAudioPlayer);
     
    304293    m_mediaObjectAudioNode->startCrossFade(transitionTime);
    305294    m_audioGraph->updateStreamSpecifications();
     295    m_metaData->setVideo(m_videoPlayer);
    306296
    307297    m_waitNextSwap = false;
    308298    m_currentTime = 0;
    309 
     299       
    310300    // Emit/notify information about the new source:
    311301    QRect videoRect = m_videoPlayer->videoRect();
     
    314304
    315305    emit currentSourceChanged(m_videoPlayer->mediaSource());
    316     emit metaDataChanged(m_videoPlayer->metaData());
     306    emit metaDataChanged(m_metaData->metaData());
    317307
    318308    if (prevHasVideo != m_videoPlayer->hasVideo())
    319         emit hasVideoChanged(m_videoPlayer->hasVideo());
     309        emit hasVideoChanged(m_videoPlayer->hasVideo());       
    320310    if (prevTotalTime != totalTime())
    321311        emit totalTimeChanged(totalTime());
    322     if (prevTrackCount != m_videoPlayer->trackCount())
    323         emit availableTitlesChanged(m_videoPlayer->trackCount());
    324312    if (checkForError())
    325313        return;
     
    340328}
    341329
    342 #if QT_ALLOW_QUICKTIME
    343 static CVReturn displayLinkCallback(CVDisplayLinkRef /*displayLink*/,
    344                                                                  const CVTimeStamp */*inNow*/,
    345                                                                  const CVTimeStamp */*inOutputTime*/,
    346                                                                  CVOptionFlags /*flagsIn*/,
    347                                                                  CVOptionFlags */*flagsOut*/,
    348                                  void *userData)
    349 {
    350     MediaObject *mediaObject = static_cast<MediaObject *>(userData);
    351     mediaObject->displayLinkEvent();
    352     return kCVReturnSuccess;
    353 }
    354 
    355 void MediaObject::displayLinkEvent()
    356 {
    357     // This function is called from a
    358     // thread != gui thread. So we post the event.
    359     // But we need to make sure that we don't post faster
    360     // than the event loop can eat:
    361     m_displayLinkMutex.lock();
    362     bool pending = m_pendingDisplayLinkEvent;
    363     m_pendingDisplayLinkEvent = true;
    364     m_displayLinkMutex.unlock();
    365 
    366     if (!pending)
    367         qApp->postEvent(this, new QEvent(QEvent::User), Qt::HighEventPriority);
    368 }
    369 
    370 void MediaObject::startDisplayLink()
    371 {
    372     if (m_displayLink)
    373         return;
    374     OSStatus err = CVDisplayLinkCreateWithCGDisplay(kCGDirectMainDisplay, &m_displayLink);
    375     if (err != noErr)
    376         goto fail;
    377     err = CVDisplayLinkSetCurrentCGDisplay(m_displayLink, kCGDirectMainDisplay);
    378     if (err != noErr)
    379         goto fail;
    380     err = CVDisplayLinkSetOutputCallback(m_displayLink, displayLinkCallback, this);
    381     if (err != noErr)
    382         goto fail;
    383     err = CVDisplayLinkStart(m_displayLink);
    384     if (err != noErr)
    385         goto fail;
    386     return;
    387 fail:
    388     stopDisplayLink();
    389 }
    390 
    391 void MediaObject::stopDisplayLink()
    392 {
    393     if (!m_displayLink)
    394         return;
    395     CVDisplayLinkStop(m_displayLink);
    396     CFRelease(m_displayLink);
    397     m_displayLink = 0;
    398 }
    399 #endif
    400 
    401 void MediaObject::restartAudioVideoTimers()
    402 {
    403     if (m_videoTimer)
    404         killTimer(m_videoTimer);
    405     if (m_audioTimer)
    406         killTimer(m_audioTimer);
    407 
    408 #if QT_ALLOW_QUICKTIME
    409     // We prefer to use a display link as timer if available, since
    410     // it is more steady, and results in better and smoother frame drawing:
    411     startDisplayLink();
    412     if (!m_displayLink){
    413         float fps = m_videoPlayer->staticFps();
    414         long videoUpdateFrequency = fps ? long(1000.0f / fps) : 0.001;
    415         m_videoTimer = startTimer(videoUpdateFrequency);
    416     }
    417 #else
    418     float fps = m_videoPlayer->staticFps();
    419     long videoUpdateFrequency = fps ? long(1000.0f / fps) : 0.001;
    420     m_videoTimer = startTimer(videoUpdateFrequency);
    421 #endif
    422 
    423     long audioUpdateFrequency = m_audioPlayer->regularTaskFrequency();
    424     m_audioTimer = startTimer(audioUpdateFrequency);
    425     updateVideoFrames();
    426     updateAudioBuffers();
     330void MediaObject::updateTimer(int &timer, int interval)
     331{
     332    if (timer)
     333        killTimer(timer);
     334    timer = 0;
     335    if (interval >= 0)   
     336        timer = startTimer(interval);
    427337}
    428338
     
    431341    // Play main audio/video:
    432342    m_videoPlayer->play();
    433     m_audioPlayer->play();
     343    m_audioPlayer->play();     
    434344    updateLipSynch(0);
    435345    // Play old audio/video to finish cross-fade:
     
    438348        m_nextAudioPlayer->play();
    439349    }
    440     restartAudioVideoTimers();
    441     if (!m_rapidTimer)
    442         m_rapidTimer = startTimer(100);
     350    bufferAudioVideo();
     351    updateTimer(m_rapidTimer, 100);
    443352}
    444353
     
    450359    m_videoPlayer->pause();
    451360    m_nextVideoPlayer->pause();
    452     killTimer(m_rapidTimer);
    453     killTimer(m_videoTimer);
    454     killTimer(m_audioTimer);
    455     m_rapidTimer = 0;
    456     m_videoTimer = 0;
    457     m_audioTimer = 0;
    458 #if QT_ALLOW_QUICKTIME
    459     stopDisplayLink();
    460 #endif
     361    updateTimer(m_rapidTimer, -1);
     362    updateTimer(m_bufferTimer, -1);
     363
    461364    if (m_waitNextSwap)
    462365        m_swapTimeLeft = m_swapTime.msecsTo(QTime::currentTime());
     
    480383        return;
    481384    if (!setState(Phonon::PlayingState))
    482         return;
     385        return;       
    483386    if (m_audioSystem == AS_Graph){
    484387        m_audioGraph->start();
     
    521424        return;
    522425    m_waitNextSwap = false;
    523     m_nextVideoPlayer->unsetCurrentMediaSource();
     426    m_nextVideoPlayer->unsetVideo();
    524427    m_nextAudioPlayer->unsetVideoPlayer();
    525428    pause_internal();
     
    533436    if (m_state == Phonon::ErrorState)
    534437        return;
    535 
     438       
    536439    // Stop cross-fade if any:
    537     m_nextVideoPlayer->unsetCurrentMediaSource();
     440    m_nextVideoPlayer->unsetVideo();
    538441    m_nextAudioPlayer->unsetVideoPlayer();
    539442    m_mediaObjectAudioNode->cancelCrossFade();
     
    544447    m_audioPlayer->seek(m_videoPlayer->currentTime());
    545448    m_mediaObjectAudioNode->setMute(false);
    546 
     449   
    547450    // Update time and cancel pending swap:
    548451    if (m_currentTime < m_videoPlayer->duration())
     
    655558{
    656559    IMPLEMENTED_SILENT;
    657     const_cast<MediaObject *>(this)->updateCurrentTime();
     560    const_cast<MediaObject *>(this)->updateCurrentTime(); 
    658561    return m_currentTime;
    659562}
     
    665568    quint64 total = m_videoPlayer->duration();
    666569
    667     if (m_videoPlayer->currentTrack() < m_videoPlayer->trackCount() - 1){
    668         // There are still more tracks to play after the current track.
    669         if (m_autoplayTitles) {
    670             if (lastUpdateTime < m_currentTime && m_currentTime == total)
    671                 setCurrentTrack(m_videoPlayer->currentTrack() + 1);
    672         }
    673     } else if (m_nextVideoPlayer->state() == QuickTimeVideoPlayer::NoMedia){
    674         // There is no more sources or tracks to play after the current source.
    675         // Check if it's time to emit aboutToFinish:
    676         quint32 mark = qMax(quint64(0), qMin(total, total + m_transitionTime - 2000));
    677         if (lastUpdateTime < mark && mark <= m_currentTime)
    678             emit aboutToFinish();
    679 
    680         // Check if it's time to emit prefinishMarkReached:
    681         mark = qMax(quint64(0), total - m_prefinishMark);
    682         if (lastUpdateTime < mark && mark <= m_currentTime)
    683             emit prefinishMarkReached(total - m_currentTime);
    684 
     570    // Check if it's time to emit aboutToFinish:
     571    quint32 mark = qMax(quint64(0), qMin(total, total + m_transitionTime - 2000));
     572    if (lastUpdateTime < mark && mark <= m_currentTime)
     573        emit aboutToFinish();
     574
     575    // Check if it's time to emit prefinishMarkReached:
     576    mark = qMax(quint64(0), total - m_prefinishMark);
     577    if (lastUpdateTime < mark && mark <= m_currentTime)
     578        emit prefinishMarkReached(total - m_currentTime);
     579
     580    if (m_nextVideoPlayer->state() == QuickTimeVideoPlayer::NoMedia){
     581        // There is no next source in que.
     582        // Check if it's time to emit finished:
    685583        if (lastUpdateTime < m_currentTime && m_currentTime == total){
    686584            emit finished();
     
    692590        // We have a next source.
    693591        // Check if it's time to swap to next source:
    694         quint32 mark = qMax(quint64(0), total + m_transitionTime);
     592        mark = qMax(quint64(0), total + m_transitionTime);
    695593        if (m_waitNextSwap && m_state == Phonon::PlayingState &&
    696594            m_transitionTime < m_swapTime.msecsTo(QTime::currentTime())){
     
    795693void MediaObject::updateCrossFade()
    796694{
    797     m_mediaObjectAudioNode->updateCrossFade(m_currentTime);
     695    m_mediaObjectAudioNode->updateCrossFade(m_currentTime);   
    798696    // Clean-up previous movie if done fading:
    799697    if (m_mediaObjectAudioNode->m_fadeDuration == 0){
    800698        if (m_nextVideoPlayer->isPlaying() || m_nextAudioPlayer->isPlaying()){
    801             m_nextVideoPlayer->unsetCurrentMediaSource();
     699            m_nextVideoPlayer->unsetVideo();
    802700            m_nextAudioPlayer->unsetVideoPlayer();
    803701        }
    804     }
     702    }       
    805703}
    806704
     
    831729    if (m_videoPlayer->videoFrameChanged()){
    832730        updateLipSynch(50);
    833         VideoFrame frame(m_videoPlayer);
     731        VideoFrame frame(m_videoPlayer);           
    834732        if (m_nextVideoPlayer->isPlaying()
    835733            && m_nextVideoPlayer->hasVideo()
     
    839737            frame.setBaseOpacity(m_mediaObjectAudioNode->m_volume1);
    840738        }
    841 
     739       
    842740        // Send the frame through the graph:
    843         updateVideo(frame);
     741        updateVideo(frame);   
    844742        checkForError();
    845743    }
     
    852750    if (m_videoSinkList.isEmpty() || m_audioSinkList.isEmpty())
    853751        return;
    854 
     752       
    855753    if (m_videoPlayer->hasVideo()){
    856754        qint64 diff = m_audioPlayer->currentTime() - m_videoPlayer->currentTime();
     
    864762            m_nextAudioPlayer->seek(m_nextVideoPlayer->currentTime());
    865763    }
     764}
     765
     766void MediaObject::bufferAudioVideo()
     767{
     768    long nextVideoUpdate = m_videoPlayer->hasVideo() ? 30 : INT_MAX;
     769    long nextAudioUpdate = m_audioPlayer->regularTaskFrequency();
     770    updateAudioBuffers();
     771    updateVideoFrames();
     772    if (m_state == Phonon::PlayingState)
     773        updateTimer(m_bufferTimer, qMin(nextVideoUpdate, nextAudioUpdate));
    866774}
    867775
     
    890798            checkForError();
    891799            m_mediaObjectAudioNode->setMute(false);
    892             if (m_state == Phonon::PlayingState)
    893                 restartAudioVideoTimers();
     800             if (m_state == Phonon::PlayingState)
     801                bufferAudioVideo();
    894802            break;
    895803        case MediaNodeEvent::AudioGraphCannotPlay:
     
    902810                m_mediaObjectAudioNode->setMute(false);
    903811            }
     812            break;
     813        default:
     814            break;
     815    }
     816}
     817
     818bool MediaObject::event(QEvent *event)
     819{
     820    switch (event->type()){
     821        case QEvent::Timer: {
     822            QTimerEvent *timerEvent = static_cast<QTimerEvent *>(event);
     823            if (timerEvent->timerId() == m_rapidTimer)
     824                updateRapidly();
     825            else if (timerEvent->timerId() == m_tickTimer)
     826                emit tick(currentTime());
     827            else if (timerEvent->timerId() == m_bufferTimer)
     828                bufferAudioVideo();
     829            }
    904830            break;
    905831        default:
    906832            break;
    907833    }
    908 }
    909 
    910 bool MediaObject::event(QEvent *event)
    911 {
    912     switch (event->type()){
    913 #if QT_ALLOW_QUICKTIME
    914         case QEvent::User:{
    915             m_displayLinkMutex.lock();
    916             m_pendingDisplayLinkEvent = false;
    917             m_displayLinkMutex.unlock();
    918             updateVideoFrames();
    919             break; }
    920 #endif
    921         case QEvent::Timer:{
    922             int timerId = static_cast<QTimerEvent *>(event)->timerId();
    923             if (timerId == m_rapidTimer)
    924                 updateRapidly();
    925             else if (timerId == m_tickTimer)
    926                 emit tick(currentTime());
    927             else if (timerId == m_videoTimer)
    928                 updateVideoFrames();
    929             else if (timerId == m_audioTimer)
    930                 updateAudioBuffers();
    931             break; }
    932         default:
    933             break;
    934     }
    935834    return QObject::event(event);
    936835}
    937836
    938 void MediaObject::setCurrentTrack(int track)
    939 {
    940     if (track == m_videoPlayer->currentTrack() || track < 0 || track >= m_videoPlayer->trackCount())
    941         return;
    942 
    943     m_videoPlayer->setCurrentTrack(track);
    944     emit titleChanged(track);
    945     emit metaDataChanged(m_videoPlayer->metaData());
    946 }
    947 
    948 bool MediaObject::hasInterface(Interface iface) const
    949 {
    950     return iface == AddonInterface::TitleInterface;
    951 }
    952 
    953 QVariant MediaObject::interfaceCall(Interface iface, int command, const QList<QVariant> &params)
    954 {
    955     switch (iface) {
    956         case TitleInterface:
    957             switch (command) {
    958                 case availableTitles:
    959                     return m_videoPlayer->trackCount();
    960                 case title:
    961                     return m_videoPlayer->currentTrack();
    962                 case setTitle:
    963                     setCurrentTrack(params.first().toInt());
    964                     break;
    965                 case autoplayTitles:
    966                     return m_autoplayTitles;
    967                 case setAutoplayTitles:
    968                     m_autoplayTitles = params.first().toBool();
    969                     break;
    970             }
    971         default:
    972             break;
    973     }
     837bool MediaObject::hasInterface(Interface /*interface*/) const
     838{
     839    return false;
     840}
     841
     842QVariant MediaObject::interfaceCall(Interface /*interface*/, int /*command*/, const QList<QVariant> &/*arguments*/)
     843{
    974844    return QVariant();
    975845}
  • trunk/src/3rdparty/phonon/qt7/mediaobjectaudionode.mm

    r2 r846  
    1515    along with this library.  If not, see <http://www.gnu.org/licenses/>.
    1616*/
     17
     18#import <QTKit/QTMovie.h>
    1719
    1820#include "mediaobjectaudionode.h"
  • trunk/src/3rdparty/phonon/qt7/quicktimeaudioplayer.mm

    r2 r846  
    1515    along with this library.  If not, see <http://www.gnu.org/licenses/>.
    1616*/
     17
     18#import <QTKit/QTMovie.h>
    1719
    1820#include "quicktimeaudioplayer.h"
  • trunk/src/3rdparty/phonon/qt7/quicktimemetadata.h

    r561 r846  
    3939    {
    4040        public:
    41             QuickTimeMetaData(QuickTimeVideoPlayer *videoPlayer);
    42             void update();
     41            QuickTimeMetaData();
     42            virtual ~QuickTimeMetaData();
     43
     44            void setVideo(QuickTimeVideoPlayer *videoPlayer);
    4345            QMultiMap<QString, QString> metaData();
    4446
     
    4850            QuickTimeVideoPlayer *m_videoPlayer;
    4951            void readMetaData();
    50             void guessMetaDataForCD();
    51             void readMetaDataFromMovie();
    5252
    5353#ifdef QUICKTIME_C_API_AVAILABLE
  • trunk/src/3rdparty/phonon/qt7/quicktimemetadata.mm

    r561 r846  
    1616*/
    1717
    18 #include <QtCore/QFileInfo>
     18#import <QTKit/QTMovie.h>
     19
    1920#include "quicktimemetadata.h"
    2021#include "quicktimevideoplayer.h"
     
    2728{
    2829
    29 QuickTimeMetaData::QuickTimeMetaData(QuickTimeVideoPlayer *videoPlayer)
     30QuickTimeMetaData::QuickTimeMetaData()
    3031{
    31     m_videoPlayer = videoPlayer;
     32    m_videoPlayer = 0;
    3233    m_movieChanged = false;
    3334}
    3435
    35 void QuickTimeMetaData::update()
     36QuickTimeMetaData::~QuickTimeMetaData()
    3637{
     38}
     39
     40void QuickTimeMetaData::setVideo(QuickTimeVideoPlayer *videoPlayer)
     41{
     42    m_videoPlayer = videoPlayer;
    3743    m_movieChanged = true;
    3844    m_metaData.clear();
     
    142148#endif // QUICKTIME_C_API_AVAILABLE
    143149
    144 void QuickTimeMetaData::guessMetaDataForCD()
     150void QuickTimeMetaData::readMetaData()
    145151{
    146     QString album = QFileInfo(m_videoPlayer->movieCompactDiscPath()).fileName();
    147     QString title = QFileInfo(m_videoPlayer->currentTrackPath()).fileName();
    148     title = title.left(title.lastIndexOf('.'));
    149     m_metaData.insert(QLatin1String("ALBUM"), album);
    150     m_metaData.insert(QLatin1String("TITLE"), title);
    151     m_metaData.insert(QLatin1String("TRACKNUMBER"), QString::number(m_videoPlayer->currentTrack()));
    152 }
    153 
    154 void QuickTimeMetaData::readMetaDataFromMovie()
    155 {
     152        if (!m_videoPlayer)
     153        return;
    156154    QMultiMap<QString, QString> metaMap;
    157 
     155   
    158156#ifdef QUICKTIME_C_API_AVAILABLE
    159     QTMetaDataRef metaDataRef;
     157        QTMetaDataRef metaDataRef;       
    160158        OSStatus err = QTCopyMovieMetaData([m_videoPlayer->qtMovie() quickTimeMovie], &metaDataRef);
    161159    BACKEND_ASSERT2(err == noErr, "Could not read QuickTime meta data", NORMAL_ERROR)
     
    178176}
    179177
    180 void QuickTimeMetaData::readMetaData()
    181 {
    182         if (!m_videoPlayer)
    183         return;
    184 
    185     if (m_videoPlayer->mediaSource().type() == Phonon::MediaSource::Disc)
    186         guessMetaDataForCD();
    187     else
    188         readMetaDataFromMovie();
    189 }
    190 
    191178QMultiMap<QString, QString> QuickTimeMetaData::metaData()
    192179{
  • trunk/src/3rdparty/phonon/qt7/quicktimevideoplayer.h

    r561 r846  
    2121#include "backendheader.h"
    2222
    23 #include <QtGui/qmacdefines_mac.h>
    2423#import <QTKit/QTDataReference.h>
    2524#import <QTKit/QTMovie.h>
     
    4039{
    4140    class QuickTimeStreamReader;
    42     class QuickTimeMetaData;
    4341        class VideoRenderWidgetQTMovieView;
    4442
     
    5856            void setMediaSource(const MediaSource &source);
    5957            MediaSource mediaSource() const;
    60             void unsetCurrentMediaSource();
     58            void unsetVideo();
    6159
    6260            void play();
     
    6967                        void *currentFrameAsCIImage();
    7068            QImage currentFrameAsQImage();
    71             void releaseImageCache();
    7269            QRect videoRect() const;
    7370
     
    7572            quint64 currentTime() const;
    7673            long timeScale() const;
    77             float staticFps();
    7874            QString currentTimeString();
    7975
     
    8884            void setPlaybackRate(float rate);
    8985            QTMovie *qtMovie() const;
    90             QMultiMap<QString, QString> metaData();
    9186
    9287            float playbackRate() const;
     
    108103            quint64 timeLoaded();
    109104
    110             int trackCount() const;
    111             int currentTrack() const;
    112             void setCurrentTrack(int track);
    113             QString movieCompactDiscPath() const;
    114             QString currentTrackPath() const;
    115 
    116105            static QString timeToString(quint64 ms);
    117106
     
    127116            State m_state;
    128117            QGLPixelBuffer *m_QImagePixelBuffer;
    129             QuickTimeMetaData *m_metaData;
    130 
    131             CVOpenGLTextureRef m_cachedCVTextureRef;
    132             QImage m_cachedQImage;
    133118
    134119            bool m_playbackRateSat;
     
    141126            float m_relativeVolume;
    142127            float m_playbackRate;
    143             float m_staticFps;
    144128            quint64 m_currentTime;
    145129            MediaSource m_mediaSource;
    146 
    147130                        void *m_primaryRenderingCIImage;
    148131                        qreal m_brightness;
     
    150133                        qreal m_hue;
    151134                        qreal m_saturation;
    152             NSArray *m_folderTracks;
    153             int m_currentTrack;
    154             QString m_movieCompactDiscPath;
    155135
    156136#ifdef QUICKTIME_C_API_AVAILABLE
     
    160140            QuickTimeStreamReader *m_streamReader;
    161141
    162             void prepareCurrentMovieForPlayback();
    163142            void createVisualContext();
    164143            void openMovieFromCurrentMediaSource();
     
    167146            void openMovieFromUrl();
    168147            void openMovieFromStream();
    169             void openMovieFromCompactDisc();
    170148            void openMovieFromData(QByteArray *data, char *fileType);
    171149            void openMovieFromDataGuessType(QByteArray *data);
    172150                        QString mediaSourcePath();
    173151                        bool codecExistsAccordingToSuffix(const QString &fileName);
    174             NSString* pathToCompactDisc();
    175             bool isCompactDisc(NSString *path);
    176             NSArray* scanFolder(NSString *path);
    177152
    178153            void setError(NSError *error);
    179154            bool errorOccured();
    180155            void readProtection();
    181             void calculateStaticFps();
    182156            void checkIfVideoAwailable();
    183157            bool movieNotLoaded();
  • trunk/src/3rdparty/phonon/qt7/quicktimevideoplayer.mm

    r561 r846  
    2121#include "audiodevice.h"
    2222#include "quicktimestreamreader.h"
    23 #include "quicktimemetadata.h"
    2423
    2524#include <QtCore/QCoreApplication>
     
    5453    m_state = NoMedia;
    5554    m_mediaSource = MediaSource();
    56     m_metaData = new QuickTimeMetaData(this);
    5755    m_QTMovie = 0;
    5856    m_streamReader = 0;
     
    6462    m_audioEnabled = false;
    6563    m_hasVideo = false;
    66     m_staticFps = 0;
    6764    m_playbackRateSat = false;
    6865    m_isDrmProtected = false;
     
    7168        m_primaryRenderingCIImage = 0;
    7269    m_QImagePixelBuffer = 0;
    73     m_cachedCVTextureRef = 0;
    74     m_folderTracks = 0;
    75     m_currentTrack = 0;
    7670
    7771#ifdef QUICKTIME_C_API_AVAILABLE
     
    8478QuickTimeVideoPlayer::~QuickTimeVideoPlayer()
    8579{
    86         PhononAutoReleasePool pool;
    87     unsetCurrentMediaSource();
    88     delete m_metaData;
     80    unsetVideo();
    8981    [(NSObject*)m_primaryRenderingTarget release];
    9082    m_primaryRenderingTarget = 0;
     
    9385        CFRelease(m_visualContext);
    9486#endif
    95 }
    96 
    97 void QuickTimeVideoPlayer::releaseImageCache()
    98 {
    99     if (m_cachedCVTextureRef){
    100         CVOpenGLTextureRelease(m_cachedCVTextureRef);
    101         m_cachedCVTextureRef = 0;
    102     }
    103     m_cachedQImage = QImage();
    10487}
    10588
     
    143126
    144127    QTVisualContextTask(m_visualContext);
    145     bool changed = QTVisualContextIsNewImageAvailable(m_visualContext, 0);
    146     if (changed)
    147         releaseImageCache();
    148     return changed;
     128    return QTVisualContextIsNewImageAvailable(m_visualContext, 0);
    149129
    150130#elif defined(QT_MAC_USE_COCOA)
     
    161141    if (!m_visualContext)
    162142        return 0;
    163     if (!m_cachedCVTextureRef){
    164         OSStatus err = QTVisualContextCopyImageForTime(m_visualContext, 0, 0, &m_cachedCVTextureRef);
    165         BACKEND_ASSERT3(err == noErr, "Could not copy image for time in QuickTime player", FATAL_ERROR, 0)
    166     }
    167     return m_cachedCVTextureRef;
     143    CVOpenGLTextureRef texture = 0;
     144    OSStatus err = QTVisualContextCopyImageForTime(m_visualContext, 0, 0, &texture);
     145    BACKEND_ASSERT3(err == noErr, "Could not copy image for time in QuickTime player", FATAL_ERROR, 0)
     146    return texture;
    168147
    169148#else
     
    174153QImage QuickTimeVideoPlayer::currentFrameAsQImage()
    175154{
    176     if (!m_cachedQImage.isNull())
    177         return m_cachedQImage;
    178 
    179155#ifdef QUICKTIME_C_API_AVAILABLE
    180156    QGLContext *prevContext = const_cast<QGLContext *>(QGLContext::currentContext());
     
    206182    glEnd();
    207183
    208     m_cachedQImage = m_QImagePixelBuffer->toImage();
     184    QImage image = m_QImagePixelBuffer->toImage();
     185    CVOpenGLTextureRelease(texture);
    209186    // Because of QuickTime, m_QImagePixelBuffer->doneCurrent() will fail.
    210187    // So we store, and restore, the context our selves:
    211188    prevContext->makeCurrent();
    212     return m_cachedQImage;
     189    return image;
    213190#else
    214191        CIImage *img = (CIImage *)currentFrameAsCIImage();
     
    219196        CGRect bounds = [img extent];
    220197        QImage qImg([bitmap bitmapData], bounds.size.width, bounds.size.height, QImage::Format_ARGB32);
    221         m_cachedQImage = qImg.rgbSwapped();
     198        QImage swapped = qImg.rgbSwapped();
    222199        [bitmap release];
    223200        [img release];
    224         return m_cachedQImage;
     201        return swapped;
    225202#endif
    226203}
     
    274251        CVOpenGLTextureRef cvImg = currentFrameAsCVTexture();
    275252        CIImage *img = [[CIImage alloc] initWithCVImageBuffer:cvImg];
    276         return img;
     253        CVOpenGLTextureRelease(cvImg);
     254        return img;     
    277255#else
    278256        return 0;
     
    296274    int samplesPerPixel = [bitmap samplesPerPixel];
    297275    if (![bitmap isPlanar] && (samplesPerPixel == 3 || samplesPerPixel == 4)){
    298         glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0,
     276        glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 
    299277            samplesPerPixel == 4 ? GL_RGBA8 : GL_RGB8,
    300278            [bitmap pixelsWide], [bitmap pixelsHigh],
     
    325303    m_relativeVolume = relativeVolume;
    326304    if (!m_QTMovie || !m_audioEnabled || m_mute)
    327         return;
     305        return;               
    328306    [m_QTMovie setVolume:(m_masterVolume * m_relativeVolume)];
    329307}
     
    336314
    337315    // Work-around bug that happends if you set/unset mute
    338     // before movie is playing, and audio is not played
     316    // before movie is playing, and audio is not played 
    339317    // through graph. Then audio is delayed.
    340318    [m_QTMovie setMuted:mute];
     
    349327
    350328    // Work-around bug that happends if you set/unset mute
    351     // before movie is playing, and audio is not played
     329    // before movie is playing, and audio is not played 
    352330    // through graph. Then audio is delayed.
    353331    [m_QTMovie setMuted:(!enable || m_mute)];
     
    368346    // The following code will not work for some media codecs that
    369347    // typically mingle audio/video frames (e.g mpeg).
    370     CFStringRef idString = PhononCFString::toCFStringRef(AudioDevice::deviceUID(id));
     348    CFStringRef idString = PhononCFString::toCFStringRef(AudioDevice::deviceUID(id));       
    371349    QTAudioContextRef context;
    372350    QTAudioContextCreateForAudioDevice(kCFAllocatorDefault, idString, 0, &context);
     
    392370    saturation += 1;
    393371
    394     if (m_brightness == brightness
    395         && m_contrast == contrast
    396         && m_hue == hue
    397         && m_saturation == saturation)
    398         return;
    399 
    400372        m_brightness = brightness;
    401373        m_contrast = contrast;
    402374        m_hue = hue;
    403375        m_saturation = saturation;
     376       
    404377#ifdef QUICKTIME_C_API_AVAILABLE
    405378    Float32 value;
     
    413386    SetMovieVisualSaturation([m_QTMovie quickTimeMovie], value, 0);
    414387#endif
    415     releaseImageCache();
    416388}
    417389
     
    426398}
    427399
    428 void QuickTimeVideoPlayer::unsetCurrentMediaSource()
     400void QuickTimeVideoPlayer::unsetVideo()
    429401{
    430402    if (!m_QTMovie)
     
    439411    m_isDrmProtected = false;
    440412    m_isDrmAuthorized = true;
    441     m_hasVideo = false;
    442     m_staticFps = 0;
    443413    m_mediaSource = MediaSource();
    444     m_movieCompactDiscPath.clear();
    445414        [(CIImage *)m_primaryRenderingCIImage release];
    446415        m_primaryRenderingCIImage = 0;
    447416    delete m_QImagePixelBuffer;
    448417    m_QImagePixelBuffer = 0;
    449     releaseImageCache();
    450     [m_folderTracks release];
    451     m_folderTracks = 0;
    452418}
    453419
     
    559525{
    560526    PhononAutoReleasePool pool;
    561     unsetCurrentMediaSource();
    562 
     527    unsetVideo();
    563528    m_mediaSource = mediaSource;
    564529    if (mediaSource.type() == MediaSource::Empty || mediaSource.type() == MediaSource::Invalid){
     
    566531        return;
    567532    }
    568 
    569533    openMovieFromCurrentMediaSource();
    570534    if (errorOccured()){
    571         unsetCurrentMediaSource();
    572         return;
    573     }
    574 
    575     prepareCurrentMovieForPlayback();
    576 }
    577 
    578 void QuickTimeVideoPlayer::prepareCurrentMovieForPlayback()
    579 {
     535        unsetVideo();
     536        return;
     537    }
     538
    580539#ifdef QUICKTIME_C_API_AVAILABLE
    581540    if (m_visualContext)
     
    585544    waitStatePlayable();
    586545    if (errorOccured()){
    587         unsetCurrentMediaSource();
     546        unsetVideo();
    588547        return;
    589548    }
     
    592551    preRollMovie();
    593552    if (errorOccured()){
    594         unsetCurrentMediaSource();
     553        unsetVideo();
    595554        return;
    596555    }
     
    599558        m_playbackRate = prefferedPlaybackRate();
    600559    checkIfVideoAwailable();
    601     calculateStaticFps();
    602560    enableAudio(m_audioEnabled);
    603561    setMute(m_mute);
    604562    setVolume(m_masterVolume, m_relativeVolume);
    605     m_metaData->update();
    606563    pause();
    607564}
     
    617574        break;
    618575    case MediaSource::Disc:
    619         openMovieFromCompactDisc();
     576        CASE_UNSUPPORTED("Could not open media source.", FATAL_ERROR)
    620577        break;
    621578    case MediaSource::Stream:
     
    679636    // codecs *think* they can decode the stream, and crash...
    680637#define TryOpenMovieWithCodec(type) gClearError(); \
    681     openMovieFromData(data, (char *)"."type); \
     638    openMovieFromData(data, "."type); \
    682639    if (m_QTMovie) return;
    683640
     
    719676}
    720677
    721 typedef void (*qt_sighandler_t)(int);
    722 static void sigtest(int) {
    723     qApp->exit(0);
    724 }
    725 
    726 void QuickTimeVideoPlayer::openMovieFromCompactDisc()
    727 {
    728     // Interrupting the application while the device is open
    729     // causes the application to hang. So we need to handle
    730     // this in a more graceful way:
    731     qt_sighandler_t hndl = signal(SIGINT, sigtest);
    732     if (hndl)
    733         signal(SIGINT, hndl);
    734 
    735     PhononAutoReleasePool pool;
    736     NSString *cd = 0;
    737     QString devName = m_mediaSource.deviceName();
    738     if (devName.isEmpty()) {
    739         cd = pathToCompactDisc();
    740         if (!cd) {
    741             SET_ERROR("Could not open media source.", NORMAL_ERROR)
    742             return;
    743         }
    744         m_movieCompactDiscPath = PhononCFString::toQString(reinterpret_cast<CFStringRef>(cd));
    745     } else {
    746        if (!QFileInfo(devName).isAbsolute())
    747            devName = QLatin1String("/Volumes/") + devName;
    748        cd = [reinterpret_cast<const NSString *>(PhononCFString::toCFStringRef(devName)) autorelease];
    749        if (!isCompactDisc(cd)) {
    750            SET_ERROR("Could not open media source.", NORMAL_ERROR)
    751            return;
    752        }
    753        m_movieCompactDiscPath = devName;
    754     }
    755 
    756     m_folderTracks = [scanFolder(cd) retain];
    757     setCurrentTrack(0);
    758 }
    759 
    760 QString QuickTimeVideoPlayer::movieCompactDiscPath() const
    761 {
    762     return m_movieCompactDiscPath;
    763 }
    764 
    765678MediaSource QuickTimeVideoPlayer::mediaSource() const
    766679{
     
    806719        PhononAutoReleasePool pool;
    807720    return [[m_QTMovie attributeForKey:@"QTMovieTimeScaleAttribute"] longValue];
    808 }
    809 
    810 float QuickTimeVideoPlayer::staticFps()
    811 {
    812     return m_staticFps;
    813 }
    814 
    815 void QuickTimeVideoPlayer::calculateStaticFps()
    816 {
    817     if (!m_hasVideo){
    818         m_staticFps = 0;
    819         return;
    820     }
    821 
    822 #ifdef QT_ALLOW_QUICKTIME
    823     Boolean isMpeg = false;
    824     Track videoTrack = GetMovieIndTrackType([m_QTMovie quickTimeMovie], 1,
    825             FOUR_CHAR_CODE('vfrr'), // 'vfrr' means: has frame rate
    826             movieTrackCharacteristic | movieTrackEnabledOnly);
    827     Media media = GetTrackMedia(videoTrack);
    828     MediaHandler mediaH = GetMediaHandler(media);
    829     MediaHasCharacteristic(mediaH, FOUR_CHAR_CODE('mpeg'), &isMpeg);
    830 
    831     if (isMpeg){
    832         MHInfoEncodedFrameRateRecord frameRate;
    833         Size frameRateSize = sizeof(frameRate);
    834         MediaGetPublicInfo(mediaH, kMHInfoEncodedFrameRate, &frameRate, &frameRateSize);
    835         m_staticFps = float(Fix2X(frameRate.encodedFrameRate));
    836     } else {
    837         Media media = GetTrackMedia(videoTrack);
    838         long sampleCount = GetMediaSampleCount(media);
    839         TimeValue64 duration = GetMediaDisplayDuration(media);
    840         TimeValue64 timeScale = GetMediaTimeScale(media);
    841         m_staticFps = float((double)sampleCount * (double)timeScale / (double)duration);
    842     }
    843 #else
    844     m_staticFps = 30.0f;
    845 #endif
    846721}
    847722
     
    1076951}
    1077952
    1078 QMultiMap<QString, QString> QuickTimeVideoPlayer::metaData()
    1079 {
    1080     return m_metaData->metaData();
    1081 }
    1082 
    1083 int QuickTimeVideoPlayer::trackCount() const
    1084 {
    1085     if (!m_folderTracks)
    1086         return 0;
    1087     return [m_folderTracks count];
    1088 }
    1089 
    1090 int QuickTimeVideoPlayer::currentTrack() const
    1091 {
    1092     return m_currentTrack;
    1093 }
    1094 
    1095 QString QuickTimeVideoPlayer::currentTrackPath() const
    1096 {
    1097     if (!m_folderTracks)
    1098         return QString();
    1099 
    1100     PhononAutoReleasePool pool;
    1101     NSString *trackPath = [m_folderTracks objectAtIndex:m_currentTrack];
    1102     return PhononCFString::toQString(reinterpret_cast<CFStringRef>(trackPath));
    1103 }
    1104 
    1105 NSString* QuickTimeVideoPlayer::pathToCompactDisc()
    1106 {
    1107     PhononAutoReleasePool pool;
    1108     NSArray *devices = [[NSWorkspace sharedWorkspace] mountedRemovableMedia];
    1109     for (unsigned int i=0; i<[devices count]; ++i) {
    1110         NSString *dev = [devices objectAtIndex:i];
    1111         if (isCompactDisc(dev))
    1112             return [dev retain];
    1113     }
    1114     return 0;
    1115 }
    1116 
    1117 bool QuickTimeVideoPlayer::isCompactDisc(NSString *path)
    1118 {
    1119     PhononAutoReleasePool pool;
    1120     NSString *type = [NSString string];
    1121     [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath:path
    1122         isRemovable:0
    1123         isWritable:0
    1124         isUnmountable:0
    1125         description:0
    1126         type:&type];
    1127     return [type hasPrefix:@"cdd"];
    1128 }
    1129 
    1130 NSArray* QuickTimeVideoPlayer::scanFolder(NSString *path)
    1131 {
    1132     NSMutableArray *tracks = [NSMutableArray arrayWithCapacity:20];
    1133     if (!path)
    1134         return tracks;
    1135 
    1136     NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path];
    1137     while (NSString *track = [enumerator nextObject]) {
    1138         if (![track hasPrefix:@"."])
    1139             [tracks addObject:[path stringByAppendingPathComponent:track]];
    1140     }
    1141     return tracks;
    1142 }
    1143 
    1144 void QuickTimeVideoPlayer::setCurrentTrack(int track)
    1145 {
    1146     PhononAutoReleasePool pool;
    1147     [m_QTMovie release];
    1148         m_QTMovie = 0;
    1149     m_currentTime = 0;
    1150     m_currentTrack = track;
    1151 
    1152     if (!m_folderTracks)
    1153         return;
    1154     if (track < 0 || track >= (int)[m_folderTracks count])
    1155         return;
    1156 
    1157     NSString *trackPath = [m_folderTracks objectAtIndex:track];
    1158     QTDataReference *dataRef = [QTDataReference dataReferenceWithReferenceToFile:trackPath];
    1159     State currentState = m_state;
    1160     openMovieFromDataRef(dataRef);
    1161     prepareCurrentMovieForPlayback();
    1162     if (currentState == Playing)
    1163         play();
    1164 }
    1165 
    1166953}}
    1167954
  • trunk/src/3rdparty/phonon/qt7/videoframe.mm

    r561 r846  
    2020#import <QuartzCore/CIFilter.h>
    2121#import <QuartzCore/CIContext.h>
    22 
    23 //#define CACHE_CV_TEXTURE
    2422
    2523QT_BEGIN_NAMESPACE
     
    7371    void VideoFrame::copyMembers(const VideoFrame& frame)
    7472    {
    75 #ifdef CACHE_CV_TEXTURE
    7673        m_cachedCVTextureRef = frame.m_cachedCVTextureRef;
    77 #endif
    7874                m_cachedCIImage = frame.m_cachedCIImage;
    7975                m_cachedQImage = frame.m_cachedQImage;
     
    110106    CVOpenGLTextureRef VideoFrame::cachedCVTexture() const
    111107    {
    112 #ifdef CACHE_CV_TEXTURE
    113108        if (!m_cachedCVTextureRef && m_videoPlayer){
    114109            m_videoPlayer->setColors(m_brightness, m_contrast, m_hue, m_saturation);
    115110            (const_cast<VideoFrame *>(this))->m_cachedCVTextureRef = m_videoPlayer->currentFrameAsCVTexture();
    116             CVOpenGLTextureRetain((const_cast<VideoFrame *>(this))->m_cachedCVTextureRef);
    117111        }
    118112        return m_cachedCVTextureRef;
    119 #else
    120         if (m_videoPlayer){
    121             m_videoPlayer->setColors(m_brightness, m_contrast, m_hue, m_saturation);
    122             return m_videoPlayer->currentFrameAsCVTexture();
    123         }
    124         return 0;
    125 #endif
    126113    }
    127114
     
    343330    void VideoFrame::invalidateImage() const
    344331    {
    345 #ifdef CACHE_CV_TEXTURE
    346332        if (m_cachedCVTextureRef){
    347333            CVOpenGLTextureRelease(m_cachedCVTextureRef);
    348334            (const_cast<VideoFrame *>(this))->m_cachedCVTextureRef = 0;
    349335        }
    350 #endif
    351336        if (m_cachedCIImage){
    352337                        [(CIImage *) m_cachedCIImage release];
     
    362347    void VideoFrame::retain() const
    363348    {
    364 #ifdef CACHE_CV_TEXTURE
    365349        if (m_cachedCVTextureRef)
    366350            CVOpenGLTextureRetain(m_cachedCVTextureRef);
    367 #endif
    368351                if (m_cachedCIImage)
    369352                        [(CIImage *) m_cachedCIImage retain];
     
    376359    void VideoFrame::release() const
    377360    {
    378 #ifdef CACHE_CV_TEXTURE
    379         if (m_cachedCVTextureRef){
     361        if (m_cachedCVTextureRef)
    380362            CVOpenGLTextureRelease(m_cachedCVTextureRef);
    381             (const_cast<VideoFrame *>(this))->m_cachedCVTextureRef = 0;
    382         }
    383 #endif
    384363                if (m_cachedCIImage)
    385364                        [(CIImage *) m_cachedCIImage release];
     
    390369
    391370        (const_cast<VideoFrame *>(this))->m_backgroundFrame = 0;
     371        (const_cast<VideoFrame *>(this))->m_cachedCVTextureRef = 0;
    392372        (const_cast<VideoFrame *>(this))->m_cachedCIImage = 0;
    393373        (const_cast<VideoFrame *>(this))->m_cachedNSBitmap = 0;
Note: See TracChangeset for help on using the changeset viewer.