summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
Diffstat (limited to 'media')
-rw-r--r--media/base/media_format.cc22
-rw-r--r--media/base/media_format.h6
-rw-r--r--media/filters/omx_video_decoder.cc15
-rw-r--r--media/filters/omx_video_decoder.h7
-rw-r--r--media/filters/video_decoder_impl.cc6
-rw-r--r--media/filters/video_decoder_impl.h10
-rw-r--r--media/filters/video_renderer_base.cc15
-rw-r--r--media/filters/video_renderer_base.h10
-rw-r--r--media/tools/player_wtl/wtl_renderer.cc7
-rw-r--r--media/tools/player_x11/gl_video_renderer.cc6
-rw-r--r--media/tools/player_x11/gl_video_renderer.h1
-rw-r--r--media/tools/player_x11/gles_video_renderer.cc6
-rw-r--r--media/tools/player_x11/gles_video_renderer.h1
-rw-r--r--media/tools/player_x11/x11_video_renderer.cc6
-rw-r--r--media/tools/player_x11/x11_video_renderer.h1
15 files changed, 96 insertions, 23 deletions
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_;