Changeset 561 for trunk/src/3rdparty/phonon/ds9/iodevicereader.cpp
- Timestamp:
- Feb 11, 2010, 11:19:06 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/vendor/nokia/qt/4.6.1 merged eligible /branches/vendor/nokia/qt/current merged eligible /branches/vendor/trolltech/qt/current 3-149
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
trunk/src/3rdparty/phonon/ds9/iodevicereader.cpp
r2 r561 37 37 static QVector<AM_MEDIA_TYPE> getMediaTypes() 38 38 { 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}; 48 43 49 44 QVector<AM_MEDIA_TYPE> ret; 50 //normal auto-detect stream51 mt.subtype = MEDIASUBTYPE_NULL;52 ret << mt;53 45 //AVI stream 54 mt.subtype = MEDIASUBTYPE_Avi;55 46 ret << mt; 56 47 //WAVE stream 57 48 mt.subtype = MEDIASUBTYPE_WAVE; 49 ret << mt; 50 //normal auto-detect stream (must be at the end!) 51 mt.subtype = MEDIASUBTYPE_NULL; 58 52 ret << mt; 59 53 return ret; … … 73 67 void writeData(const QByteArray &data) 74 68 { 75 QWriteLocker locker(&m_lock);76 69 m_pos += data.size(); 77 70 m_buffer += data; … … 84 77 void setStreamSize(qint64 newSize) 85 78 { 86 Q WriteLocker locker(&m_lock);79 QMutexLocker locker(&m_mutex); 87 80 m_size = newSize; 88 }89 90 qint64 streamSize() const91 {92 QReadLocker locker(&m_lock);93 return m_size;94 81 } 95 82 96 83 void setStreamSeekable(bool s) 97 84 { 98 Q WriteLocker locker(&m_lock);85 QMutexLocker locker(&m_mutex); 99 86 m_seekable = s; 100 }101 102 bool streamSeekable() const103 {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() const117 {118 QReadLocker locker(&m_lock);119 return m_pos;120 }121 122 int currentBufferSize() const123 {124 QReadLocker locker(&m_lock);125 return m_buffer.size();126 87 } 127 88 … … 131 92 STDMETHODIMP Length(LONGLONG *total, LONGLONG *available) 132 93 { 133 Q ReadLocker locker(&m_lock);94 QMutexLocker locker(&m_mutex); 134 95 if (total) { 135 96 *total = m_size; … … 146 107 HRESULT read(LONGLONG pos, LONG length, BYTE *buffer, LONG *actual) 147 108 { 148 QMutexLocker locker(&m_mutexRead); 149 109 Q_ASSERT(!m_mutex.tryLock()); 150 110 if (m_mediaGraph->isStopping()) { 151 111 return VFW_E_WRONG_STATE; 152 112 } 153 113 154 if( streamSize() != 1 && pos + length > streamSize()) {114 if(m_size != 1 && pos + length > m_size) { 155 115 //it tries to read outside of the boundaries 156 116 return E_FAIL; 157 117 } 158 118 159 if ( currentPos() - currentBufferSize() != pos) {160 if (! streamSeekable()) {119 if (m_pos - m_buffer.size() != pos) { 120 if (!m_seekable) { 161 121 return S_FALSE; 162 122 } 163 setCurrentPos(pos); 123 m_pos = pos; 124 seekStream(pos); 125 m_buffer.clear(); 164 126 } 165 127 166 int oldSize = currentBufferSize();167 while ( currentBufferSize() < int(length)) {128 int oldSize = m_buffer.size(); 129 while (m_buffer.size() < int(length)) { 168 130 needData(); 169 131 if (m_mediaGraph->isStopping()) { … … 171 133 } 172 134 173 if (oldSize == currentBufferSize()) {135 if (oldSize == m_buffer.size()) { 174 136 break; //we didn't get any data 175 137 } 176 oldSize = currentBufferSize();138 oldSize = m_buffer.size(); 177 139 } 178 140 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); 186 145 187 146 if (actual) { … … 199 158 qint64 m_size; 200 159 201 QMutex m_mutexRead;202 160 const MediaGraph *m_mediaGraph; 203 161 }; … … 213 171 { 214 172 } 215 216 STDMETHODIMP IODeviceReader::Stop()217 {218 HRESULT hr = QBaseFilter::Stop();219 m_streamReader->enoughData(); //this asks to cancel any blocked call to needData220 return hr;221 }222 223 173 } 224 174 }
Note:
See TracChangeset
for help on using the changeset viewer.