Mercurial > hg > svcore
comparison data/fileio/QuickTimeFileReader.cpp @ 297:c022976d18e8
* Merge from sv-match-alignment branch (excluding alignment-specific document).
  - add aggregate wave model (not yet complete enough to be added as a true
    model in a layer, but there's potential)
  - add play solo mode
  - add alignment model -- unused in plain SV
  - fix two plugin leaks
  - add m3u playlist support (opens all files at once, potentially hazardous)
  - fix retrieval of pre-encoded URLs
  - add ability to resample audio files on import, so as to match rates with
    other files previously loaded; add preference for same
  - add preliminary support in transform code for range and rate of transform
    input
  - reorganise preferences dialog, move dark-background option to preferences,
    add option for temporary directory location
| author | Chris Cannam | 
|---|---|
| date | Fri, 28 Sep 2007 13:56:38 +0000 | 
| parents | 42e6c8360df1 | 
| children | bbf87199e6e1 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 296:2b6c99b607f1 | 297:c022976d18e8 | 
|---|---|
| 48 }; | 48 }; | 
| 49 | 49 | 
| 50 | 50 | 
| 51 QuickTimeFileReader::QuickTimeFileReader(QString path, | 51 QuickTimeFileReader::QuickTimeFileReader(QString path, | 
| 52 DecodeMode decodeMode, | 52 DecodeMode decodeMode, | 
| 53 CacheMode mode) : | 53 CacheMode mode, | 
| 54 CodedAudioFileReader(mode), | 54 size_t targetRate) : | 
| 55 CodedAudioFileReader(mode, targetRate), | |
| 55 m_path(path), | 56 m_path(path), | 
| 56 m_d(new D), | 57 m_d(new D), | 
| 57 m_progress(0), | 58 m_progress(0), | 
| 58 m_cancelled(false), | 59 m_cancelled(false), | 
| 59 m_completion(0), | 60 m_completion(0), | 
| 60 m_decodeThread(0) | 61 m_decodeThread(0) | 
| 61 { | 62 { | 
| 62 m_frameCount = 0; | |
| 63 m_channelCount = 0; | 63 m_channelCount = 0; | 
| 64 m_sampleRate = 0; | 64 m_fileRate = 0; | 
| 65 | 65 | 
| 66 Profiler profiler("QuickTimeFileReader::QuickTimeFileReader", true); | 66 Profiler profiler("QuickTimeFileReader::QuickTimeFileReader", true); | 
| 67 | 67 | 
| 68 std::cerr << "QuickTimeFileReader: path is \"" << path.toStdString() << "\"" << std::endl; | 68 std::cerr << "QuickTimeFileReader: path is \"" << path.toStdString() << "\"" << std::endl; | 
| 69 | 69 | 
| 179 m_error = QString("Error in QuickTime decoder property get: code %1").arg(m_d->err); | 179 m_error = QString("Error in QuickTime decoder property get: code %1").arg(m_d->err); | 
| 180 return; | 180 return; | 
| 181 } | 181 } | 
| 182 | 182 | 
| 183 m_channelCount = m_d->asbd.mChannelsPerFrame; | 183 m_channelCount = m_d->asbd.mChannelsPerFrame; | 
| 184 m_sampleRate = m_d->asbd.mSampleRate; | 184 m_fileRate = m_d->asbd.mSampleRate; | 
| 185 | 185 | 
| 186 std::cerr << "QuickTime: " << m_channelCount << " channels, " << m_sampleRate << " kHz" << std::endl; | 186 std::cerr << "QuickTime: " << m_channelCount << " channels, " << m_fileRate << " kHz" << std::endl; | 
| 187 | 187 | 
| 188 m_d->asbd.mFormatFlags = | 188 m_d->asbd.mFormatFlags = | 
| 189 kAudioFormatFlagIsFloat | | 189 kAudioFormatFlagIsFloat | | 
| 190 kAudioFormatFlagIsPacked | | 190 kAudioFormatFlagIsPacked | | 
| 191 kAudioFormatFlagsNativeEndian; | 191 kAudioFormatFlagsNativeEndian; | 
| 234 break; | 234 break; | 
| 235 } | 235 } | 
| 236 | 236 | 
| 237 // std::cerr << "Read " << framesRead << " frames (block size " << m_d->blockSize << ")" << std::endl; | 237 // std::cerr << "Read " << framesRead << " frames (block size " << m_d->blockSize << ")" << std::endl; | 
| 238 | 238 | 
| 239 m_frameCount += framesRead; | |
| 240 | |
| 241 // QuickTime buffers are interleaved unless specified otherwise | 239 // QuickTime buffers are interleaved unless specified otherwise | 
| 242 for (UInt32 i = 0; i < framesRead * m_channelCount; ++i) { | 240 addSamplesToDecodeCache(m_d->data, framesRead); | 
| 243 addSampleToDecodeCache(m_d->data[i]); | |
| 244 } | |
| 245 | 241 | 
| 246 if (framesRead < m_d->blockSize) break; | 242 if (framesRead < m_d->blockSize) break; | 
| 247 } | 243 } | 
| 248 | 244 | 
| 249 finishDecodeCache(); | 245 finishDecodeCache(); | 
| 286 } | 282 } | 
| 287 | 283 | 
| 288 void | 284 void | 
| 289 QuickTimeFileReader::DecodeThread::run() | 285 QuickTimeFileReader::DecodeThread::run() | 
| 290 { | 286 { | 
| 287 if (m_reader->m_cacheMode == CacheInTemporaryFile) { | |
| 288 m_reader->m_completion = 1; | |
| 289 m_reader->startSerialised("QuickTimeFileReader::Decode"); | |
| 290 } | |
| 291 | |
| 291 while (1) { | 292 while (1) { | 
| 292 | 293 | 
| 293 UInt32 framesRead = m_reader->m_d->blockSize; | 294 UInt32 framesRead = m_reader->m_d->blockSize; | 
| 294 UInt32 extractionFlags = 0; | 295 UInt32 extractionFlags = 0; | 
| 295 m_reader->m_d->err = MovieAudioExtractionFillBuffer | 296 m_reader->m_d->err = MovieAudioExtractionFillBuffer | 
| 299 m_reader->m_error = QString("Error in QuickTime decoding: code %1") | 300 m_reader->m_error = QString("Error in QuickTime decoding: code %1") | 
| 300 .arg(m_reader->m_d->err); | 301 .arg(m_reader->m_d->err); | 
| 301 break; | 302 break; | 
| 302 } | 303 } | 
| 303 | 304 | 
| 304 m_reader->m_frameCount += framesRead; | |
| 305 | |
| 306 // QuickTime buffers are interleaved unless specified otherwise | 305 // QuickTime buffers are interleaved unless specified otherwise | 
| 307 for (UInt32 i = 0; i < framesRead * m_reader->m_channelCount; ++i) { | 306 addSamplesToDecodeCache(m_d->data, framesRead); | 
| 308 m_reader->addSampleToDecodeCache(m_reader->m_d->data[i]); | |
| 309 } | |
| 310 | 307 | 
| 311 if (framesRead < m_reader->m_d->blockSize) break; | 308 if (framesRead < m_reader->m_d->blockSize) break; | 
| 312 } | 309 } | 
| 313 | 310 | 
| 314 m_reader->finishDecodeCache(); | 311 m_reader->finishDecodeCache(); | 
| 317 if (m_reader->m_d->err) { | 314 if (m_reader->m_d->err) { | 
| 318 m_reader->m_error = QString("Error ending QuickTime extraction session: code %1").arg(m_reader->m_d->err); | 315 m_reader->m_error = QString("Error ending QuickTime extraction session: code %1").arg(m_reader->m_d->err); | 
| 319 } | 316 } | 
| 320 | 317 | 
| 321 m_reader->m_completion = 100; | 318 m_reader->m_completion = 100; | 
| 319 m_reader->endSerialised(); | |
| 322 } | 320 } | 
| 323 | 321 | 
| 324 void | 322 void | 
| 325 QuickTimeFileReader::getSupportedExtensions(std::set<QString> &extensions) | 323 QuickTimeFileReader::getSupportedExtensions(std::set<QString> &extensions) | 
| 326 { | 324 { | 
| 337 extensions.insert("mp4"); | 335 extensions.insert("mp4"); | 
| 338 extensions.insert("wav"); | 336 extensions.insert("wav"); | 
| 339 } | 337 } | 
| 340 | 338 | 
| 341 #endif | 339 #endif | 
| 340 | 
