summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/media/data_source_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/media/data_source_impl.cc')
-rw-r--r--chrome/renderer/media/data_source_impl.cc342
1 files changed, 0 insertions, 342 deletions
diff --git a/chrome/renderer/media/data_source_impl.cc b/chrome/renderer/media/data_source_impl.cc
deleted file mode 100644
index 68539e8..0000000
--- a/chrome/renderer/media/data_source_impl.cc
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
-// source code is governed by a BSD-style license that can be found in the
-// LICENSE file.
-
-#include "base/compiler_specific.h"
-#include "base/message_loop.h"
-#include "base/process_util.h"
-#include "chrome/renderer/media/data_source_impl.h"
-#include "chrome/renderer/render_view.h"
-#include "chrome/renderer/webmediaplayer_delegate_impl.h"
-#include "chrome/renderer/render_thread.h"
-#include "media/base/filter_host.h"
-#include "net/base/load_flags.h"
-#include "net/base/net_errors.h"
-#include "webkit/glue/webappcachecontext.h"
-
-DataSourceImpl::DataSourceImpl(WebMediaPlayerDelegateImpl* delegate)
- : delegate_(delegate),
- render_loop_(RenderThread::current()->message_loop()),
- stopped_(false),
- download_event_(false, false),
- downloaded_bytes_(0),
- total_bytes_(0),
- total_bytes_known_(false),
- download_completed_(false),
- resource_loader_bridge_(NULL),
- read_event_(false, false),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- read_callback_(this, &DataSourceImpl::OnDidFileStreamRead)),
- stream_(NULL),
- last_read_size_(0),
- position_(0),
- io_loop_(delegate->view()->GetMessageLoopForIO()),
- seek_event_(false, false) {
-}
-
-DataSourceImpl::~DataSourceImpl() {
-}
-
-void DataSourceImpl::Stop() {
- AutoLock auto_lock(lock_);
- if (stopped_)
- return;
- stopped_ = true;
-
- // Wakes up demuxer waiting on |read_event_| in Read().
- read_event_.Signal();
- // Wakes up demuxer waiting on |seek_event_| in SetPosition().
- seek_event_.Signal();
- // Wakes up demuxer waiting on |download_event_| in Read() or SetPosition().
- download_event_.Signal();
-
- render_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &DataSourceImpl::OnDestroy));
-}
-
-bool DataSourceImpl::Initialize(const std::string& url) {
- media_format_.SetAsString(media::MediaFormat::kMimeType,
- media::mime_type::kApplicationOctetStream);
- media_format_.SetAsString(media::MediaFormat::kURL, url);
- render_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &DataSourceImpl::OnInitialize, url));
- return true;
-}
-
-size_t DataSourceImpl::Read(uint8* data, size_t size) {
- DCHECK(stream_.get());
- // Wait until we have downloaded the requested bytes.
- while (true) {
- {
- AutoLock auto_lock(lock_);
- if (stopped_ || download_completed_ ||
- position_ + size <= downloaded_bytes_)
- break;
- }
- download_event_.Wait();
- }
-
- last_read_size_ = media::DataSource::kReadError;
- if (logging::DEBUG_MODE) {
- AutoLock auto_lock(lock_);
- DCHECK(stopped_ || download_completed_ ||
- position_ + size <= downloaded_bytes_);
- }
-
- // Post a task to IO message loop to perform the actual reading.
- bool task_posted = false;
- {
- AutoLock auto_lock(lock_);
- if (!stopped_) {
- io_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &DataSourceImpl::OnReadFileStream,
- data, size));
- task_posted = true;
- }
- }
-
- if (task_posted)
- read_event_.Wait();
-
- {
- AutoLock auto_lock(lock_);
- if (!stopped_)
- return last_read_size_;
- return media::DataSource::kReadError;
- }
-}
-
-bool DataSourceImpl::GetPosition(int64* position_out) {
- AutoLock auto_lock(lock_);
- *position_out = position_;
- return true;
-}
-
-bool DataSourceImpl::SetPosition(int64 position) {
- DCHECK(stream_.get());
- while (true) {
- {
- AutoLock auto_lock(lock_);
- if (stopped_ || download_completed_ || position < downloaded_bytes_)
- break;
- }
- download_event_.Wait();
- }
-
- if (logging::DEBUG_MODE) {
- AutoLock auto_lock(lock_);
- DCHECK(stopped_ || download_completed_ || position < downloaded_bytes_);
- }
-
- // Perform the seek operation on IO message loop.
- bool task_posted = false;
- {
- AutoLock auto_lock(lock_);
- if (!stopped_) {
- io_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &DataSourceImpl::OnSeekFileStream, net::FROM_BEGIN, position));
- task_posted = true;
- }
- }
- if (task_posted)
- seek_event_.Wait();
-
- if (logging::DEBUG_MODE) {
- AutoLock auto_lock_(lock_);
- DCHECK(stopped_ || position == position_);
- }
- return true;
-}
-
-bool DataSourceImpl::GetSize(int64* size_out) {
- AutoLock auto_lock(lock_);
- if (total_bytes_known_) {
- *size_out = total_bytes_;
- return true;
- }
- *size_out = 0;
- return false;
-}
-
-bool DataSourceImpl::IsSeekable() {
- // If URI is file then it is seekable.
- // TODO(hclam): make other protocols seekable.
- return uri_.find("file:///") == 0;
-}
-
-void DataSourceImpl::OnCreateFileStream(base::PlatformFile file) {
- AutoLock auto_lock(lock_);
- if (stopped_)
- return;
- stream_.reset(
- new net::FileStream(
- file, base::PLATFORM_FILE_READ | base::PLATFORM_FILE_ASYNC));
- // TODO(hclam): maybe we should check the validity of the file handle.
- host_->InitializationComplete();
-}
-
-void DataSourceImpl::OnReadFileStream(uint8* data, size_t size) {
- int error = net::ERR_IO_PENDING;
- {
- AutoLock auto_lock(lock_);
- if (!stopped_) {
- // net::FileStream::Read wants a char*, not uint8*.
- char* c_data = reinterpret_cast<char*>(data);
- COMPILE_ASSERT(sizeof(*c_data) == sizeof(*data), data_not_sizeof_char);
- error = stream_->Read(c_data, size, &read_callback_);
- }
- }
-
- // Since the file handle is asynchronous, return value other than
- // ERROR_IO_PENDING is an error.
- if (error != net::ERR_IO_PENDING) {
- HandleError(media::PIPELINE_ERROR_READ);
- }
-}
-
-void DataSourceImpl::OnSeekFileStream(net::Whence whence, int64 position) {
- {
- AutoLock auto_lock(lock_);
- if (!stopped_)
- position_ = stream_->Seek(whence, position);
- }
- seek_event_.Signal();
-}
-
-void DataSourceImpl::OnDidFileStreamRead(int size) {
- if (size < 0) {
- HandleError(media::PIPELINE_ERROR_READ);
- } else {
- AutoLock auto_lock(lock_);
- position_ += size;
- }
- last_read_size_ = size;
- read_event_.Signal();
-}
-
-void DataSourceImpl::OnInitialize(std::string uri) {
- uri_ = uri;
- // Create the resource loader bridge.
- resource_loader_bridge_.reset(
- RenderThread::current()->resource_dispatcher()->CreateBridge(
- "GET",
- GURL(uri),
- GURL(uri),
- GURL(), // TODO(hclam): provide referer here.
- "null", // TODO(abarth): provide frame_origin
- "null", // TODO(abarth): provide main_frame_origin
- std::string(), // Provide no header.
- // Prefer to load from cache, also enable downloading the file, the
- // resource will be saved to a single response data file if it's possible.
- net::LOAD_PREFERRING_CACHE | net::LOAD_ENABLE_DOWNLOAD_FILE,
- base::GetCurrentProcId(),
- ResourceType::MEDIA,
- 0,
- // TODO(michaeln): delegate->mediaplayer->frame->
- // app_cache_context()->context_id()
- // For now don't service media resource requests from the appcache.
- WebAppCacheContext::kNoAppCacheContextId,
- delegate_->view()->routing_id()));
- // Start the resource loading.
- resource_loader_bridge_->Start(this);
-}
-
-void DataSourceImpl::OnDestroy() {
- DCHECK(MessageLoop::current() == render_loop_);
- resource_loader_bridge_->Cancel();
- resource_loader_bridge_.reset();
-}
-
-void DataSourceImpl::OnDownloadProgress(uint64 position, uint64 size) {
- {
- AutoLock auto_lock(lock_);
- downloaded_bytes_ = position;
- if (!total_bytes_known_) {
- if (size == kuint64max) {
- // If we receive an invalid value for size, we keep on updating the
- // total number of bytes.
- total_bytes_ = position;
- } else {
- total_bytes_ = size;
- total_bytes_known_ = true;
- }
- }
- }
- host_->SetBufferedBytes(downloaded_bytes_);
- download_event_.Signal();
-}
-
-void DataSourceImpl::OnUploadProgress(uint64 position, uint64 size) {
- // We don't care about upload progress.
-}
-
-void DataSourceImpl::OnReceivedRedirect(const GURL& new_url) {
- // TODO(hclam): what to do here? fire another resource request or show an
- // error?
-}
-
-void DataSourceImpl::OnReceivedResponse(
- const webkit_glue::ResourceLoaderBridge::ResponseInfo& info,
- bool content_filtered) {
-#if defined(OS_POSIX)
- base::PlatformFile response_data_file = info.response_data_file.fd;
-#elif defined(OS_WIN)
- base::PlatformFile response_data_file = info.response_data_file;
-#endif
-
- if (response_data_file != base::kInvalidPlatformFileValue) {
- DCHECK(!position_ && !downloaded_bytes_);
- if (info.content_length != -1) {
- total_bytes_known_ = true;
- total_bytes_ = info.content_length;
- host_->SetTotalBytes(total_bytes_);
- }
-
- {
- // Post a task to the IO message loop to create the file stream.
- // We don't want to post any more tasks once we are stopped.
- AutoLock auto_lock(lock_);
- if (!stopped_) {
- io_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &DataSourceImpl::OnCreateFileStream,
- response_data_file));
- }
- }
- } else {
- // TODO(hclam): handle the fallback case of using memory buffer here.
- HandleError(media::PIPELINE_ERROR_NETWORK);
- }
-}
-
-void DataSourceImpl::OnReceivedData(const char* data, int len) {
- // TODO(hclam): we will get this method call when browser process fails
- // to provide us with a file handle, come up with some fallback mechanism.
-}
-
-void DataSourceImpl::OnCompletedRequest(const URLRequestStatus& status,
- const std::string& security_info) {
- {
- AutoLock auto_lock(lock_);
- total_bytes_known_ = true;
- download_completed_ = true;
- }
- if (status.status() != URLRequestStatus::SUCCESS) {
- HandleError(media::PIPELINE_ERROR_NETWORK);
- }
-}
-
-void DataSourceImpl::HandleError(media::PipelineError error) {
- AutoLock auto_lock(lock_);
- if (!stopped_) {
- host_->Error(error);
- }
-}
-
-std::string DataSourceImpl::GetURLForDebugging() {
- return uri_;
-}
-
-const media::MediaFormat& DataSourceImpl::media_format() {
- return media_format_;
-}