MovieWriter::Obj::Obj( const fs::path &path, int32_t width, int32_t height, const Format &format ) : mPath( path ), mWidth( width ), mHeight( height ), mFormat( format ), mFinished( false ) { OSErr err = noErr; Handle dataRef; OSType dataRefType; startQuickTime(); //Create movie file CFStringRef strDestMoviePath = ::CFStringCreateWithCString( kCFAllocatorDefault, path.string().c_str(), kCFStringEncodingUTF8 ); err = ::QTNewDataReferenceFromFullPathCFString( strDestMoviePath, kQTNativeDefaultPathStyle, 0, &dataRef, &dataRefType ); ::CFRelease( strDestMoviePath ); if( err ) throw MovieWriterExcInvalidPath(); // Create a movie for this file (data ref) err = ::CreateMovieStorage( dataRef, dataRefType, 'TVOD', smCurrentScript, createMovieFileDeleteCurFile | createMovieFileDontCreateResFile, &mDataHandler, &mMovie ); ::DisposeHandle( dataRef ); if( err ) throw MovieWriterExc(); mTrack = ::NewMovieTrack( mMovie, width << 16, height << 16, 0 ); err = ::GetMoviesError(); if( err ) throw MovieWriterExc(); //Create track media mMedia = ::NewTrackMedia( mTrack, ::VideoMediaType, mFormat.mTimeBase, 0, 0 ); err = ::GetMoviesError(); if( err ) throw MovieWriterExc(); //Prepare media for editing err = ::BeginMediaEdits( mMedia ); mRequestedMultiPass = false; mDoingMultiPass = false; createCompressionSession(); mCurrentTimeValue = 0; mNumFrames = 0; }
void UBQuickTimeFile::run() { EnterMoviesOnThread(kCSAcceptThreadSafeComponentsOnlyMode); mSouldStopCompression = false; mPendingFrames = 0; createCompressionSession(); mCompressionSessionRunning = true; emit compressionSessionStarted(); while(!mSouldStopCompression) { frameQueueMutex.lock(); //qDebug() << "run .... wait" << QTime::currentTime(); frameBufferNotEmpty.wait(&UBQuickTimeFile::frameQueueMutex); //qDebug() << "awakend ..." << QTime::currentTime(); if (!frameQueue.isEmpty()) { QQueue<VideoFrame> localQueue = frameQueue; frameQueue.clear(); frameQueueMutex.unlock(); while (!localQueue.isEmpty()) { VideoFrame frame = localQueue.dequeue(); appendVideoFrame(frame.buffer, frame.timestamp); } } else { frameQueueMutex.unlock(); } } flushPendingFrames(); }