Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7183)

Unified Diff: chromecast/media/cma/ipc_streamer/video_decoder_config_marshaller.cc

Issue 557333003: Audio/video data streaming over shared memory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromecast/media/cma/ipc_streamer/video_decoder_config_marshaller.cc
diff --git a/chromecast/media/cma/ipc_streamer/video_decoder_config_marshaller.cc b/chromecast/media/cma/ipc_streamer/video_decoder_config_marshaller.cc
new file mode 100644
index 0000000000000000000000000000000000000000..645056ce22d97a042acf1215c3f36e6e5cb8f6ca
--- /dev/null
+++ b/chromecast/media/cma/ipc_streamer/video_decoder_config_marshaller.cc
@@ -0,0 +1,113 @@
+// Copyright 2014 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 "chromecast/media/cma/ipc_streamer/video_decoder_config_marshaller.h"
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+#include "chromecast/media/cma/ipc/media_message.h"
+#include "media/base/video_decoder_config.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/size.h"
+
+namespace chromecast {
+namespace media {
+
+namespace {
+const size_t kMaxExtraDataSize = 16 * 1024;
+
+class SizeMarshaller {
+ public:
+ static void Write(const gfx::Size& size, MediaMessage* msg) {
+ CHECK(msg->WritePod(size.width()));
+ CHECK(msg->WritePod(size.height()));
+ }
+
+ static gfx::Size Read(MediaMessage* msg) {
+ int w, h;
+ CHECK(msg->ReadPod(&w));
+ CHECK(msg->ReadPod(&h));
+ return gfx::Size(w, h);
+ }
+};
+
+class RectMarshaller {
+ public:
+ static void Write(const gfx::Rect& rect, MediaMessage* msg) {
+ CHECK(msg->WritePod(rect.x()));
+ CHECK(msg->WritePod(rect.y()));
+ CHECK(msg->WritePod(rect.width()));
+ CHECK(msg->WritePod(rect.height()));
+ }
+
+ static gfx::Rect Read(MediaMessage* msg) {
+ int x, y, w, h;
+ CHECK(msg->ReadPod(&x));
+ CHECK(msg->ReadPod(&y));
+ CHECK(msg->ReadPod(&w));
+ CHECK(msg->ReadPod(&h));
+ return gfx::Rect(x, y, w, h);
+ }
+};
+
+} // namespace
+
+// static
+void VideoDecoderConfigMarshaller::Write(
+ const ::media::VideoDecoderConfig& config, MediaMessage* msg) {
+ CHECK(msg->WritePod(config.codec()));
+ CHECK(msg->WritePod(config.profile()));
+ CHECK(msg->WritePod(config.format()));
+ SizeMarshaller::Write(config.coded_size(), msg);
+ RectMarshaller::Write(config.visible_rect(), msg);
+ SizeMarshaller::Write(config.natural_size(), msg);
+ CHECK(msg->WritePod(config.is_encrypted()));
+ CHECK(msg->WritePod(config.extra_data_size()));
+ if (config.extra_data_size() > 0)
+ CHECK(msg->WriteBuffer(config.extra_data(), config.extra_data_size()));
+}
+
+// static
+::media::VideoDecoderConfig VideoDecoderConfigMarshaller::Read(
+ MediaMessage* msg) {
+ ::media::VideoCodec codec;
+ ::media::VideoCodecProfile profile;
+ ::media::VideoFrame::Format format;
+ gfx::Size coded_size;
+ gfx::Rect visible_rect;
+ gfx::Size natural_size;
+ bool is_encrypted;
+ size_t extra_data_size;
+ scoped_ptr<uint8[]> extra_data;
+
+ CHECK(msg->ReadPod(&codec));
+ CHECK(msg->ReadPod(&profile));
+ CHECK(msg->ReadPod(&format));
+ coded_size = SizeMarshaller::Read(msg);
+ visible_rect = RectMarshaller::Read(msg);
+ natural_size = SizeMarshaller::Read(msg);
+ CHECK(msg->ReadPod(&is_encrypted));
+ CHECK(msg->ReadPod(&extra_data_size));
+
+ CHECK_GE(codec, ::media::kUnknownVideoCodec);
+ CHECK_LE(codec, ::media::kVideoCodecMax);
+ CHECK_GE(profile, ::media::VIDEO_CODEC_PROFILE_UNKNOWN);
+ CHECK_LE(profile, ::media::VIDEO_CODEC_PROFILE_MAX);
+ CHECK_GE(format, ::media::VideoFrame::UNKNOWN);
+ CHECK_LE(format, ::media::VideoFrame::FORMAT_MAX);
+ CHECK_LT(extra_data_size, kMaxExtraDataSize);
+ if (extra_data_size > 0) {
+ extra_data.reset(new uint8[extra_data_size]);
+ CHECK(msg->ReadBuffer(extra_data.get(), extra_data_size));
+ }
+
+ return ::media::VideoDecoderConfig(
+ codec, profile, format,
+ coded_size, visible_rect, natural_size,
+ extra_data.get(), extra_data_size,
+ is_encrypted);
+}
+
+} // namespace media
+} // namespace chromecast

Powered by Google App Engine
This is Rietveld 408576698