Ignore:
Timestamp:
Feb 11, 2010, 11:19:06 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.1 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/ds9/iodevicereader.cpp

    r2 r561  
    3737        static QVector<AM_MEDIA_TYPE> getMediaTypes()
    3838        {
    39             AM_MEDIA_TYPE mt;
    40             mt.majortype = MEDIATYPE_Stream;
    41             mt.bFixedSizeSamples = TRUE;
    42             mt.bTemporalCompression = FALSE;
    43             mt.lSampleSize = 1;
    44             mt.formattype = GUID_NULL;
    45             mt.pUnk = 0;
    46             mt.cbFormat = 0;
    47             mt.pbFormat = 0;
     39            //the order here is important because otherwise,
     40            //directshow might not be able to detect the stream type correctly
     41
     42            AM_MEDIA_TYPE mt = { MEDIATYPE_Stream, MEDIASUBTYPE_Avi, TRUE, FALSE, 1, GUID_NULL, 0, 0, 0};
    4843
    4944            QVector<AM_MEDIA_TYPE> ret;
    50             //normal auto-detect stream
    51             mt.subtype = MEDIASUBTYPE_NULL;
    52             ret << mt;
    5345            //AVI stream
    54             mt.subtype = MEDIASUBTYPE_Avi;
    5546            ret << mt;
    5647            //WAVE stream
    5748            mt.subtype = MEDIASUBTYPE_WAVE;
     49            ret << mt;
     50            //normal auto-detect stream (must be at the end!)
     51            mt.subtype = MEDIASUBTYPE_NULL;
    5852            ret << mt;
    5953            return ret;
     
    7367              void writeData(const QByteArray &data)
    7468              {
    75                   QWriteLocker locker(&m_lock);
    7669                  m_pos += data.size();
    7770                  m_buffer += data;
     
    8477              void setStreamSize(qint64 newSize)
    8578              {
    86                   QWriteLocker locker(&m_lock);
     79                  QMutexLocker locker(&m_mutex);
    8780                  m_size = newSize;
    88               }
    89 
    90               qint64 streamSize() const
    91               {
    92                   QReadLocker locker(&m_lock);
    93                   return m_size;
    9481              }
    9582
    9683              void setStreamSeekable(bool s)
    9784              {
    98                   QWriteLocker locker(&m_lock);
     85                  QMutexLocker locker(&m_mutex);
    9986                  m_seekable = s;
    100               }
    101 
    102               bool streamSeekable() const
    103               {
    104                   QReadLocker locker(&m_lock);
    105                   return m_seekable;
    106               }
    107 
    108               void setCurrentPos(qint64 pos)
    109               {
    110                   QWriteLocker locker(&m_lock);
    111                   m_pos = pos;
    112                   seekStream(pos);
    113                   m_buffer.clear();
    114               }
    115 
    116               qint64 currentPos() const
    117               {
    118                   QReadLocker locker(&m_lock);
    119                   return m_pos;
    120               }
    121 
    122               int currentBufferSize() const
    123               {
    124                   QReadLocker locker(&m_lock);
    125                   return m_buffer.size();
    12687              }
    12788
     
    13192              STDMETHODIMP Length(LONGLONG *total, LONGLONG *available)
    13293              {
    133                   QReadLocker locker(&m_lock);
     94                  QMutexLocker locker(&m_mutex);
    13495                  if (total) {
    13596                      *total = m_size;
     
    146107              HRESULT read(LONGLONG pos, LONG length, BYTE *buffer, LONG *actual)
    147108              {
    148                   QMutexLocker locker(&m_mutexRead);
    149 
     109                  Q_ASSERT(!m_mutex.tryLock());
    150110                  if (m_mediaGraph->isStopping()) {
    151111                      return VFW_E_WRONG_STATE;
    152112                  }
    153113
    154                   if(streamSize() != 1 && pos + length > streamSize()) {
     114                  if(m_size != 1 && pos + length > m_size) {
    155115                      //it tries to read outside of the boundaries
    156116                      return E_FAIL;
    157117                  }
    158118
    159                   if (currentPos() - currentBufferSize() != pos) {
    160                       if (!streamSeekable()) {
     119                  if (m_pos - m_buffer.size() != pos) {
     120                      if (!m_seekable) {
    161121                          return S_FALSE;
    162122                      }
    163                       setCurrentPos(pos);
     123                      m_pos = pos;
     124                      seekStream(pos);
     125                      m_buffer.clear();
    164126                  }
    165127
    166                   int oldSize = currentBufferSize();
    167                   while (currentBufferSize() < int(length)) {
     128                  int oldSize = m_buffer.size();
     129                  while (m_buffer.size() < int(length)) {
    168130                      needData();
    169131                      if (m_mediaGraph->isStopping()) {
     
    171133                      }
    172134
    173                       if (oldSize == currentBufferSize()) {
     135                      if (oldSize == m_buffer.size()) {
    174136                          break; //we didn't get any data
    175137                      }
    176                       oldSize = currentBufferSize();
     138                      oldSize = m_buffer.size();
    177139                  }
    178140
    179                   DWORD bytesRead = qMin(currentBufferSize(), int(length));
    180                   {
    181                       QWriteLocker locker(&m_lock);
    182                       qMemCopy(buffer, m_buffer.data(), bytesRead);
    183                       //truncate the buffer
    184                       m_buffer = m_buffer.mid(bytesRead);
    185                   }
     141                  int bytesRead = qMin(m_buffer.size(), int(length));
     142                  qMemCopy(buffer, m_buffer.data(), bytesRead);
     143                  //truncate the buffer
     144                  m_buffer = m_buffer.mid(bytesRead);
    186145
    187146                  if (actual) {
     
    199158            qint64 m_size;
    200159
    201             QMutex m_mutexRead;
    202160            const MediaGraph *m_mediaGraph;
    203161        };
     
    213171        {
    214172        }
    215 
    216         STDMETHODIMP IODeviceReader::Stop()
    217         {
    218             HRESULT hr = QBaseFilter::Stop();
    219             m_streamReader->enoughData(); //this asks to cancel any blocked call to needData
    220             return hr;
    221         }
    222 
    223173    }
    224174}
Note: See TracChangeset for help on using the changeset viewer.