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 |