diff options
-rw-r--r-- | chrome/renderer/media/ipc_video_renderer.cc | 7 | ||||
-rw-r--r-- | media/base/media_format.cc | 22 | ||||
-rw-r--r-- | media/base/media_format.h | 6 | ||||
-rw-r--r-- | media/filters/omx_video_decoder.cc | 15 | ||||
-rw-r--r-- | media/filters/omx_video_decoder.h | 7 | ||||
-rw-r--r-- | media/filters/video_decoder_impl.cc | 6 | ||||
-rw-r--r-- | media/filters/video_decoder_impl.h | 10 | ||||
-rw-r--r-- | media/filters/video_renderer_base.cc | 15 | ||||
-rw-r--r-- | media/filters/video_renderer_base.h | 10 | ||||
-rw-r--r-- | media/tools/player_wtl/wtl_renderer.cc | 7 | ||||
-rw-r--r-- | media/tools/player_x11/gl_video_renderer.cc | 6 | ||||
-rw-r--r-- | media/tools/player_x11/gl_video_renderer.h | 1 | ||||
-rw-r--r-- | media/tools/player_x11/gles_video_renderer.cc | 6 | ||||
-rw-r--r-- | media/tools/player_x11/gles_video_renderer.h | 1 | ||||
-rw-r--r-- | media/tools/player_x11/x11_video_renderer.cc | 6 | ||||
-rw-r--r-- | media/tools/player_x11/x11_video_renderer.h | 1 | ||||
-rw-r--r-- | webkit/glue/media/video_renderer_impl.cc | 7 |
17 files changed, 106 insertions, 27 deletions
diff --git a/chrome/renderer/media/ipc_video_renderer.cc b/chrome/renderer/media/ipc_video_renderer.cc index c5bac86..aab8f60 100644 --- a/chrome/renderer/media/ipc_video_renderer.cc +++ b/chrome/renderer/media/ipc_video_renderer.cc @@ -39,13 +39,16 @@ bool IPCVideoRenderer::IsMediaFormatSupported( const media::MediaFormat& media_format) { int width = 0; int height = 0; - return ParseMediaFormat(media_format, &width, &height); + bool uses_egl_image = false; + return ParseMediaFormat(media_format, &width, &height, &uses_egl_image); } bool IPCVideoRenderer::OnInitialize(media::VideoDecoder* decoder) { int width = 0; int height = 0; - if (!ParseMediaFormat(decoder->media_format(), &width, &height)) + bool uses_egl_image = false; + if (!ParseMediaFormat(decoder->media_format(), &width, &height, + &uses_egl_image)) return false; video_size_.SetSize(width, height); diff --git a/media/base/media_format.cc b/media/base/media_format.cc index 7c10cc8..fca4f89 100644 --- a/media/base/media_format.cc +++ b/media/base/media_format.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 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. @@ -44,6 +44,15 @@ const char kUncompressedAudio[] = "audio/x-uncompressed"; // kHeight Integer Display height of the surface const char kUncompressedVideo[] = "video/x-uncompressed"; +// Represents decoded video data in EGLImage, typically from OpenMAX video +// decoder. +// Other information, such as surface format (i.e., YV12), stride and planes are +// included with the buffer itself and is not part of the MediaFormat. +// Expected keys: +// kWidth Integer Display width of the surface +// kHeight Integer Display height of the surface +const char kUncompressedVideoEglImage[] = "video/x-uncompressed-eglimage"; + // Major types of media types begin with the prefix "audio/" or "video/". const char kMajorTypeVideo[] = "video/"; const char kMajorTypeAudio[] = "audio/"; @@ -80,19 +89,23 @@ void MediaFormat::Clear() { } void MediaFormat::SetAsBoolean(const std::string& key, bool in_value) { + ReleaseValue(key); value_map_[key] = Value::CreateBooleanValue(in_value); } void MediaFormat::SetAsInteger(const std::string& key, int in_value) { + ReleaseValue(key); value_map_[key] = Value::CreateIntegerValue(in_value); } void MediaFormat::SetAsReal(const std::string& key, double in_value) { + ReleaseValue(key); value_map_[key] = Value::CreateRealValue(in_value); } void MediaFormat::SetAsString(const std::string& key, const std::string& in_value) { + ReleaseValue(key); value_map_[key] = Value::CreateStringValue(in_value); } @@ -122,4 +135,11 @@ Value* MediaFormat::GetValue(const std::string& key) const { return (value_iter == value_map_.end()) ? NULL : value_iter->second; } +void MediaFormat::ReleaseValue(const std::string& key) { + ValueMap::iterator vm = value_map_.find(key); + if (vm != value_map_.end()) { + delete vm->second; + } +} + } // namespace media diff --git a/media/base/media_format.h b/media/base/media_format.h index c131d82..3a7cb3d 100644 --- a/media/base/media_format.h +++ b/media/base/media_format.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 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. @@ -21,6 +21,7 @@ extern const char kAACAudio[]; extern const char kH264AnnexB[]; extern const char kUncompressedAudio[]; extern const char kUncompressedVideo[]; +extern const char kUncompressedVideoEglImage[]; extern const char kMajorTypeAudio[]; extern const char kMajorTypeVideo[]; } // namespace mime_type @@ -79,6 +80,9 @@ class MediaFormat { // Helper to return a value. Value* GetValue(const std::string& key) const; + // Helper to release Value of the key + void ReleaseValue(const std::string& key); + typedef std::map<std::string, Value*> ValueMap; ValueMap value_map_; diff --git a/media/filters/omx_video_decoder.cc b/media/filters/omx_video_decoder.cc index d5a5e85..8254f66 100644 --- a/media/filters/omx_video_decoder.cc +++ b/media/filters/omx_video_decoder.cc @@ -39,11 +39,26 @@ bool OmxVideoDecoder::IsMediaFormatSupported(const MediaFormat& format) { OmxVideoDecoder::OmxVideoDecoder(OmxVideoDecodeEngine* engine) : VideoDecoderImpl(engine), omx_engine_(engine) { +#if defined(ENABLE_EGLIMAGE) + supports_egl_image_ = true; +#else + supports_egl_image_ = false; +#endif } OmxVideoDecoder::~OmxVideoDecoder() { } +void OmxVideoDecoder::DoInitialize(DemuxerStream* demuxer_stream, + bool* success, + Task* done_cb) { + if (supports_egl_image_) + media_format_.SetAsString(MediaFormat::kMimeType, + mime_type::kUncompressedVideoEglImage); + + VideoDecoderImpl::DoInitialize(demuxer_stream, success, done_cb); +} + void OmxVideoDecoder::set_message_loop(MessageLoop* message_loop) { // TODO(ajwong): Is there a way around needing to propogate the message loop? VideoDecoderImpl::set_message_loop(message_loop); diff --git a/media/filters/omx_video_decoder.h b/media/filters/omx_video_decoder.h index e01ce5f..ab4c0f2 100644 --- a/media/filters/omx_video_decoder.h +++ b/media/filters/omx_video_decoder.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 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. @@ -26,7 +26,12 @@ class OmxVideoDecoder : public VideoDecoderImpl { virtual void set_message_loop(MessageLoop* message_loop); virtual void Stop(); + protected: + void DoInitialize(DemuxerStream* demuxer_stream, bool* success, + Task* done_cb); + private: + bool supports_egl_image_; OmxVideoDecodeEngine* omx_engine_; DISALLOW_COPY_AND_ASSIGN(OmxVideoDecoder); diff --git a/media/filters/video_decoder_impl.cc b/media/filters/video_decoder_impl.cc index 9932620..38f36dc 100644 --- a/media/filters/video_decoder_impl.cc +++ b/media/filters/video_decoder_impl.cc @@ -51,8 +51,10 @@ void VideoDecoderImpl::DoInitialize(DemuxerStream* demuxer_stream, return; } - media_format_.SetAsString(MediaFormat::kMimeType, - mime_type::kUncompressedVideo); + // Only set kMimeType when derived class has not done so. + if (!media_format_.Contains(MediaFormat::kMimeType)) + media_format_.SetAsString(MediaFormat::kMimeType, + mime_type::kUncompressedVideo); media_format_.SetAsInteger(MediaFormat::kWidth, width_); media_format_.SetAsInteger(MediaFormat::kHeight, height_); diff --git a/media/filters/video_decoder_impl.h b/media/filters/video_decoder_impl.h index 033cd77..e63f961 100644 --- a/media/filters/video_decoder_impl.h +++ b/media/filters/video_decoder_impl.h @@ -31,6 +31,11 @@ class VideoDecoderImpl : public DecoderBase<VideoDecoder, VideoFrame> { // class doesn't probably need to be abstract. virtual ~VideoDecoderImpl() = 0; + virtual void DoInitialize(DemuxerStream* demuxer_stream, bool* success, + Task* done_cb); + virtual void DoSeek(base::TimeDelta time, Task* done_cb); + virtual void DoDecode(Buffer* buffer, Task* done_cb); + private: friend class FilterFactoryImpl1<VideoDecoderImpl, VideoDecodeEngine*>; friend class DecoderPrivateMock; @@ -55,11 +60,6 @@ class VideoDecoderImpl : public DecoderBase<VideoDecoder, VideoFrame> { }; // Implement DecoderBase template methods. - virtual void DoInitialize(DemuxerStream* demuxer_stream, bool* success, - Task* done_cb); - virtual void DoSeek(base::TimeDelta time, Task* done_cb); - virtual void DoDecode(Buffer* buffer, Task* done_cb); - virtual void EnqueueVideoFrame(const scoped_refptr<VideoFrame>& video_frame); // Create an empty video frame and queue it. diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc index 46906c06e..683a170 100644 --- a/media/filters/video_renderer_base.cc +++ b/media/filters/video_renderer_base.cc @@ -38,6 +38,7 @@ static const int kIdleMilliseconds = 10; VideoRendererBase::VideoRendererBase() : width_(0), height_(0), + uses_egl_image_(false), frame_available_(&lock_), state_(kUninitialized), thread_(kNullThreadHandle), @@ -52,12 +53,19 @@ VideoRendererBase::~VideoRendererBase() { // static bool VideoRendererBase::ParseMediaFormat(const MediaFormat& media_format, - int* width_out, int* height_out) { + int* width_out, int* height_out, + bool* uses_egl_image_out) { std::string mime_type; if (!media_format.GetAsString(MediaFormat::kMimeType, &mime_type)) return false; - if (mime_type.compare(mime_type::kUncompressedVideo) != 0) + if (mime_type.compare(mime_type::kUncompressedVideo) != 0 && + mime_type.compare(mime_type::kUncompressedVideoEglImage) != 0) return false; + + if (mime_type.compare(mime_type::kUncompressedVideoEglImage) == 0) + *uses_egl_image_out = true; + else + *uses_egl_image_out = false; if (!media_format.GetAsInteger(MediaFormat::kWidth, width_out)) return false; if (!media_format.GetAsInteger(MediaFormat::kHeight, height_out)) @@ -139,7 +147,8 @@ void VideoRendererBase::Initialize(VideoDecoder* decoder, scoped_ptr<FilterCallback> c(callback); // Notify the pipeline of the video dimensions. - if (!ParseMediaFormat(decoder->media_format(), &width_, &height_)) { + if (!ParseMediaFormat(decoder->media_format(), &width_, &height_, + &uses_egl_image_)) { host()->SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); callback->Run(); return; diff --git a/media/filters/video_renderer_base.h b/media/filters/video_renderer_base.h index e3af186..24e914d 100644 --- a/media/filters/video_renderer_base.h +++ b/media/filters/video_renderer_base.h @@ -32,9 +32,11 @@ class VideoRendererBase : public VideoRenderer, virtual ~VideoRendererBase(); // Helper method for subclasses to parse out video-related information from - // a MediaFormat. Returns true if |width_out| and |height_out| were assigned. + // a MediaFormat. Returns true if |width_out|, |height_out| and + // |uses_egl_image_out| were assigned. static bool ParseMediaFormat(const MediaFormat& media_format, - int* width_out, int* height_out); + int* width_out, int* height_out, + bool* uses_egl_image_out); // MediaFilter implementation. virtual void Play(FilterCallback* callback); @@ -101,9 +103,13 @@ class VideoRendererBase : public VideoRenderer, scoped_refptr<VideoDecoder> decoder_; + // TODO(wjia): can we move this to at least protected? Seems all derived + // classes have width_, height_, uses_egl_image_ and same logic to + // calculate those values. // Video dimensions parsed from the decoder's media format. int width_; int height_; + bool uses_egl_image_; // Queue of incoming frames as well as the current frame since the last time // OnFrameAvailable() was called. diff --git a/media/tools/player_wtl/wtl_renderer.cc b/media/tools/player_wtl/wtl_renderer.cc index 8a850f7..112037c 100644 --- a/media/tools/player_wtl/wtl_renderer.cc +++ b/media/tools/player_wtl/wtl_renderer.cc @@ -18,7 +18,8 @@ bool WtlVideoRenderer::IsMediaFormatSupported( const media::MediaFormat& media_format) { int width = 0; int height = 0; - return ParseMediaFormat(media_format, &width, &height); + bool uses_egl_image = false; + return ParseMediaFormat(media_format, &width, &height, &uses_egl_image); } void WtlVideoRenderer::OnStop() { @@ -27,7 +28,9 @@ void WtlVideoRenderer::OnStop() { bool WtlVideoRenderer::OnInitialize(media::VideoDecoder* decoder) { int width = 0; int height = 0; - if (!ParseMediaFormat(decoder->media_format(), &width, &height)) + bool uses_egl_image = false; + if (!ParseMediaFormat(decoder->media_format(), &width, &height, + &uses_egl_image)) return false; window_->SetSize(width, height); return true; diff --git a/media/tools/player_x11/gl_video_renderer.cc b/media/tools/player_x11/gl_video_renderer.cc index 87ad6ed..035db82 100644 --- a/media/tools/player_x11/gl_video_renderer.cc +++ b/media/tools/player_x11/gl_video_renderer.cc @@ -30,7 +30,8 @@ bool GlVideoRenderer::IsMediaFormatSupported( const media::MediaFormat& media_format) { int width = 0; int height = 0; - return ParseMediaFormat(media_format, &width, &height); + bool uses_egl_image = false; + return ParseMediaFormat(media_format, &width, &height, &uses_egl_image); } void GlVideoRenderer::OnStop() { @@ -149,7 +150,8 @@ static const char kFragmentShader[] = static const unsigned int kErrorSize = 4096; bool GlVideoRenderer::OnInitialize(media::VideoDecoder* decoder) { - if (!ParseMediaFormat(decoder->media_format(), &width_, &height_)) + if (!ParseMediaFormat(decoder->media_format(), &width_, &height_, + &uses_egl_image_)) return false; LOG(INFO) << "Initializing GL Renderer..."; diff --git a/media/tools/player_x11/gl_video_renderer.h b/media/tools/player_x11/gl_video_renderer.h index 6595508..dec35f2 100644 --- a/media/tools/player_x11/gl_video_renderer.h +++ b/media/tools/player_x11/gl_video_renderer.h @@ -45,6 +45,7 @@ class GlVideoRenderer : public media::VideoRendererBase { int width_; int height_; + bool uses_egl_image_; Display* display_; Window window_; diff --git a/media/tools/player_x11/gles_video_renderer.cc b/media/tools/player_x11/gles_video_renderer.cc index 347a3dc..31847820 100644 --- a/media/tools/player_x11/gles_video_renderer.cc +++ b/media/tools/player_x11/gles_video_renderer.cc @@ -34,7 +34,8 @@ bool GlesVideoRenderer::IsMediaFormatSupported( const media::MediaFormat& media_format) { int width = 0; int height = 0; - return ParseMediaFormat(media_format, &width, &height); + bool uses_egl_image_ = false; + return ParseMediaFormat(media_format, &width, &height, &uses_egl_image_); } void GlesVideoRenderer::OnStop() { @@ -105,7 +106,8 @@ static const char kFragmentShader[] = static const unsigned int kErrorSize = 4096; bool GlesVideoRenderer::OnInitialize(media::VideoDecoder* decoder) { - if (!ParseMediaFormat(decoder->media_format(), &width_, &height_)) + if (!ParseMediaFormat(decoder->media_format(), &width_, &height_, + &uses_egl_image_)) return false; LOG(INFO) << "Initializing GLES Renderer..."; diff --git a/media/tools/player_x11/gles_video_renderer.h b/media/tools/player_x11/gles_video_renderer.h index 0c53026..39478ac 100644 --- a/media/tools/player_x11/gles_video_renderer.h +++ b/media/tools/player_x11/gles_video_renderer.h @@ -48,6 +48,7 @@ class GlesVideoRenderer : public media::VideoRendererBase { int width_; int height_; + bool uses_egl_image_; Display* display_; Window window_; diff --git a/media/tools/player_x11/x11_video_renderer.cc b/media/tools/player_x11/x11_video_renderer.cc index 87d1c2f..50f8b5f 100644 --- a/media/tools/player_x11/x11_video_renderer.cc +++ b/media/tools/player_x11/x11_video_renderer.cc @@ -70,7 +70,8 @@ bool X11VideoRenderer::IsMediaFormatSupported( const media::MediaFormat& media_format) { int width = 0; int height = 0; - return ParseMediaFormat(media_format, &width, &height); + bool uses_egl_image = false; + return ParseMediaFormat(media_format, &width, &height, &uses_egl_image); } void X11VideoRenderer::OnStop() { @@ -81,7 +82,8 @@ void X11VideoRenderer::OnStop() { } bool X11VideoRenderer::OnInitialize(media::VideoDecoder* decoder) { - if (!ParseMediaFormat(decoder->media_format(), &width_, &height_)) + if (!ParseMediaFormat(decoder->media_format(), &width_, &height_, + &uses_egl_image_)) return false; LOG(INFO) << "Initializing X11 Renderer..."; diff --git a/media/tools/player_x11/x11_video_renderer.h b/media/tools/player_x11/x11_video_renderer.h index d122675..2ffb17f 100644 --- a/media/tools/player_x11/x11_video_renderer.h +++ b/media/tools/player_x11/x11_video_renderer.h @@ -44,6 +44,7 @@ class X11VideoRenderer : public media::VideoRendererBase { int width_; int height_; + bool uses_egl_image_; Display* display_; Window window_; diff --git a/webkit/glue/media/video_renderer_impl.cc b/webkit/glue/media/video_renderer_impl.cc index 8660920..e0ce558 100644 --- a/webkit/glue/media/video_renderer_impl.cc +++ b/webkit/glue/media/video_renderer_impl.cc @@ -34,13 +34,16 @@ bool VideoRendererImpl::IsMediaFormatSupported( const media::MediaFormat& media_format) { int width = 0; int height = 0; - return ParseMediaFormat(media_format, &width, &height); + bool uses_egl_image = false; + return ParseMediaFormat(media_format, &width, &height, &uses_egl_image); } bool VideoRendererImpl::OnInitialize(media::VideoDecoder* decoder) { int width = 0; int height = 0; - if (!ParseMediaFormat(decoder->media_format(), &width, &height)) + bool uses_egl_image = false; + if (!ParseMediaFormat(decoder->media_format(), &width, &height, + &uses_egl_image)) return false; video_size_.SetSize(width, height); |