void AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer, uint32_t aLength, WebAudioDecodeJob& aDecodeJob) { // Do not attempt to decode the media if we were not successful at sniffing // the content type. if (!*aContentType || strcmp(aContentType, APPLICATION_OCTET_STREAM) == 0) { nsCOMPtr<nsIRunnable> event = new ReportResultTask(aDecodeJob, &WebAudioDecodeJob::OnFailure, WebAudioDecodeJob::UnknownContent); JS_free(nullptr, aBuffer); NS_DispatchToMainThread(event); return; } RefPtr<MediaDecodeTask> task = new MediaDecodeTask(aContentType, aBuffer, aLength, aDecodeJob); if (!task->CreateReader()) { nsCOMPtr<nsIRunnable> event = new ReportResultTask(aDecodeJob, &WebAudioDecodeJob::OnFailure, WebAudioDecodeJob::UnknownError); NS_DispatchToMainThread(event); } else { // If we did this without a temporary: // task->Reader()->OwnerThread()->Dispatch(task.forget()) // we might evaluate the task.forget() before calling Reader(). Enforce // a non-crashy order-of-operations. TaskQueue* taskQueue = task->Reader()->OwnerThread(); taskQueue->Dispatch(task.forget()); } }
void AsyncDecodeWebAudio(const char* aContentType, uint8_t* aBuffer, uint32_t aLength, WebAudioDecodeJob& aDecodeJob) { Maybe<MediaContainerType> containerType = MakeMediaContainerType(aContentType); // Do not attempt to decode the media if we were not successful at sniffing // the container type. if (!*aContentType || strcmp(aContentType, APPLICATION_OCTET_STREAM) == 0 || !containerType) { nsCOMPtr<nsIRunnable> event = new ReportResultTask(aDecodeJob, &WebAudioDecodeJob::OnFailure, WebAudioDecodeJob::UnknownContent); JS_free(nullptr, aBuffer); aDecodeJob.mContext->Dispatch(event.forget()); return; } RefPtr<MediaDecodeTask> task = new MediaDecodeTask(*containerType, aBuffer, aLength, aDecodeJob); if (!task->CreateReader()) { nsCOMPtr<nsIRunnable> event = new ReportResultTask(aDecodeJob, &WebAudioDecodeJob::OnFailure, WebAudioDecodeJob::UnknownError); aDecodeJob.mContext->Dispatch(event.forget()); } else { // If we did this without a temporary: // task->Reader()->OwnerThread()->Dispatch(task.forget()) // we might evaluate the task.forget() before calling Reader(). Enforce // a non-crashy order-of-operations. TaskQueue* taskQueue = task->Reader()->OwnerThread(); nsresult rv = taskQueue->Dispatch(task.forget()); MOZ_DIAGNOSTIC_ASSERT(NS_SUCCEEDED(rv)); Unused << rv; } }