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

Unified Diff: remoting/host/encoder_vp8.cc

Issue 2690003: Copy the (early prototype of) remoting in Chrome into the public tree.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 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
« no previous file with comments | « remoting/host/encoder_vp8.h ('k') | remoting/host/encoder_vp8_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/encoder_vp8.cc
===================================================================
--- remoting/host/encoder_vp8.cc (revision 0)
+++ remoting/host/encoder_vp8.cc (revision 0)
@@ -0,0 +1,133 @@
+// 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.
+
+#include "base/logging.h"
+#include "media/base/callback.h"
+#include "media/base/data_buffer.h"
+#include "remoting/host/encoder_vp8.h"
+
+extern "C" {
+// TODO(garykac): Rix with correct path to vp8 header.
+#include "remoting/third_party/on2/include/vp8cx.h"
+}
+
+namespace remoting {
+
+EncoderVp8::EncoderVp8()
+ : initialized_(false),
+ last_timestamp_(0) {
+}
+
+EncoderVp8::~EncoderVp8() {
+}
+
+bool EncoderVp8::Init() {
+ // TODO(hclam): Now always assume we receive YV12. May need to extend this
+ // so we can do color space conversion manually.
+ image_.fmt = IMG_FMT_YV12;
+ image_.w = width_;
+ image_.h = height_;
+
+ on2_codec_enc_cfg_t config;
+ on2_codec_err_t result = on2_codec_enc_config_default(&on2_codec_vp8_cx_algo,
+ &config, 0);
+
+ // TODO(hclam): Adjust the parameters.
+ config.g_w = width_;
+ config.g_h = height_;
+ config.g_pass = ON2_RC_ONE_PASS;
+ config.g_profile = 1;
+ config.g_threads = 2;
+ config.rc_target_bitrate = 1000000;
+ config.rc_min_quantizer = 0;
+ config.rc_max_quantizer = 15;
+ config.g_timebase.num = 1;
+ config.g_timebase.den = 30;
+
+ if (on2_codec_enc_init(&codec_, &on2_codec_vp8_cx_algo, &config, 0))
+ return false;
+
+ on2_codec_control_(&codec_, VP8E_SET_CPUUSED, -15);
+ return true;
+}
+
+void EncoderVp8::Encode(const DirtyRects& dirty_rects,
+ const uint8** input_data,
+ const int* strides,
+ bool key_frame,
+ chromotocol_pb::UpdateStreamPacketHeader* header,
+ scoped_refptr<media::DataBuffer>* output_data,
+ bool* encode_done,
+ Task* data_available_task) {
+ // This will allow the task be called when this method exits.
+ media::AutoTaskRunner task(data_available_task);
+ *encode_done = false;
+
+ // TODO(hclam): We only initialize the encoder once. We may have to
+ // allow encoder be initialized with difference sizes.
+ if (!initialized_) {
+ if (!Init()) {
+ LOG(ERROR) << "Can't initialize VP8 encoder";
+ return;
+ }
+ initialized_ = true;
+ }
+
+ // Assume the capturer has done the color space conversion.
+ if (!input_data || !strides)
+ return;
+
+ image_.planes[0] = (unsigned char*)input_data[0];
+ image_.planes[1] = (unsigned char*)input_data[1];
+ image_.planes[2] = (unsigned char*)input_data[2];
+ image_.stride[0] = strides[0];
+ image_.stride[1] = strides[1];
+ image_.stride[2] = strides[2];
+
+ // Do the actual encoding.
+ if (on2_codec_encode(&codec_, &image_,
+ last_timestamp_, 1, 0, ON2_DL_REALTIME)) {
+ return;
+ }
+
+ // TODO(hclam): fix this.
+ last_timestamp_ += 100;
+
+ // Read the encoded data.
+ on2_codec_iter_t iter = NULL;
+ bool got_data = false;
+
+ // TODO(hclam: We assume one frame of input will get exactly one frame of
+ // output. This assumption may not be valid.
+ while (!got_data) {
+ on2_codec_cx_pkt_t* packet = on2_codec_get_cx_data(&codec_, &iter);
+ if (!packet)
+ continue;
+
+ switch (packet->kind) {
+ case ON2_CODEC_CX_FRAME_PKT:
+ got_data = true;
+ *encode_done = true;
+ *output_data = new media::DataBuffer(packet->data.frame.sz);
+ memcpy((*output_data)->GetWritableData(),
+ packet->data.frame.buf,
+ packet->data.frame.sz);
+ break;
+ default:
+ break;
+ }
+ }
+ return;
+}
+
+void EncoderVp8::SetSize(int width, int height) {
+ width_ = width;
+ height_ = height;
+}
+
+void EncoderVp8::SetPixelFormat(PixelFormat pixel_format) {
+ pixel_format_ = pixel_format;
+}
+
+} // namespace remoting
Property changes on: remoting/host/encoder_vp8.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « remoting/host/encoder_vp8.h ('k') | remoting/host/encoder_vp8_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698