Rename I420VideoFrame to VideoFrame.
This is a mechanical change since it affects so many files. I420VideoFrame -> VideoFrame and reformatted. Rationale: in the next CL I420VideoFrame will get an indication of Pixel Format (I420 for starters) and of storage type: usually UNOWNED, could be SHMEM, and in the near future will be possibly TEXTURE. See https://codereview.chromium.org/1154153003 for the change that happened in Cr. BUG=4730, chromium:440843 R=jiayl@webrtc.org, niklas.enbom@webrtc.org, pthatcher@webrtc.org Review URL: https://webrtc-codereview.appspot.com/52629004 Cr-Commit-Position: refs/heads/master@{#9339}
This commit is contained in:
		@@ -51,7 +51,7 @@ using rtc::scoped_ptr;
 | 
			
		||||
using webrtc::CodecSpecificInfo;
 | 
			
		||||
using webrtc::DecodedImageCallback;
 | 
			
		||||
using webrtc::EncodedImage;
 | 
			
		||||
using webrtc::I420VideoFrame;
 | 
			
		||||
using webrtc::VideoFrame;
 | 
			
		||||
using webrtc::RTPFragmentationHeader;
 | 
			
		||||
using webrtc::TickTime;
 | 
			
		||||
using webrtc::VideoCodec;
 | 
			
		||||
@@ -108,7 +108,7 @@ class MediaCodecVideoDecoder : public webrtc::VideoDecoder,
 | 
			
		||||
  bool use_surface_;
 | 
			
		||||
  int error_count_;
 | 
			
		||||
  VideoCodec codec_;
 | 
			
		||||
  I420VideoFrame decoded_image_;
 | 
			
		||||
  VideoFrame decoded_image_;
 | 
			
		||||
  NativeHandleImpl native_handle_;
 | 
			
		||||
  DecodedImageCallback* callback_;
 | 
			
		||||
  int frames_received_;  // Number of frames received by decoder.
 | 
			
		||||
@@ -654,9 +654,9 @@ bool MediaCodecVideoDecoder::DeliverPendingOutputs(
 | 
			
		||||
  int32_t callback_status = WEBRTC_VIDEO_CODEC_OK;
 | 
			
		||||
  if (use_surface_) {
 | 
			
		||||
    native_handle_.SetTextureObject(surface_texture_, texture_id);
 | 
			
		||||
    I420VideoFrame texture_image(&native_handle_, width, height,
 | 
			
		||||
                                 output_timestamp_, 0, webrtc::kVideoRotation_0,
 | 
			
		||||
                                 rtc::Callback0<void>());
 | 
			
		||||
    VideoFrame texture_image(&native_handle_, width, height, output_timestamp_,
 | 
			
		||||
                             0, webrtc::kVideoRotation_0,
 | 
			
		||||
                             rtc::Callback0<void>());
 | 
			
		||||
    texture_image.set_ntp_time_ms(output_ntp_time_ms_);
 | 
			
		||||
    callback_status = callback_->Decoded(texture_image);
 | 
			
		||||
  } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ using rtc::scoped_ptr;
 | 
			
		||||
 | 
			
		||||
using webrtc::CodecSpecificInfo;
 | 
			
		||||
using webrtc::EncodedImage;
 | 
			
		||||
using webrtc::I420VideoFrame;
 | 
			
		||||
using webrtc::VideoFrame;
 | 
			
		||||
using webrtc::RTPFragmentationHeader;
 | 
			
		||||
using webrtc::VideoCodec;
 | 
			
		||||
using webrtc::VideoCodecType;
 | 
			
		||||
@@ -85,7 +85,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
 | 
			
		||||
                     int32_t /* number_of_cores */,
 | 
			
		||||
                     size_t /* max_payload_size */) override;
 | 
			
		||||
  int32_t Encode(
 | 
			
		||||
      const webrtc::I420VideoFrame& input_image,
 | 
			
		||||
      const webrtc::VideoFrame& input_image,
 | 
			
		||||
      const webrtc::CodecSpecificInfo* /* codec_specific_info */,
 | 
			
		||||
      const std::vector<webrtc::VideoFrameType>* frame_types) override;
 | 
			
		||||
  int32_t RegisterEncodeCompleteCallback(
 | 
			
		||||
@@ -116,7 +116,7 @@ class MediaCodecVideoEncoder : public webrtc::VideoEncoder,
 | 
			
		||||
  // (makes it easier to reason about thread-safety).
 | 
			
		||||
  int32_t InitEncodeOnCodecThread(int width, int height, int kbps, int fps);
 | 
			
		||||
  int32_t EncodeOnCodecThread(
 | 
			
		||||
      const webrtc::I420VideoFrame& input_image,
 | 
			
		||||
      const webrtc::VideoFrame& input_image,
 | 
			
		||||
      const std::vector<webrtc::VideoFrameType>* frame_types);
 | 
			
		||||
  int32_t RegisterEncodeCompleteCallbackOnCodecThread(
 | 
			
		||||
      webrtc::EncodedImageCallback* callback);
 | 
			
		||||
@@ -309,7 +309,7 @@ int32_t MediaCodecVideoEncoder::InitEncode(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t MediaCodecVideoEncoder::Encode(
 | 
			
		||||
    const webrtc::I420VideoFrame& frame,
 | 
			
		||||
    const webrtc::VideoFrame& frame,
 | 
			
		||||
    const webrtc::CodecSpecificInfo* /* codec_specific_info */,
 | 
			
		||||
    const std::vector<webrtc::VideoFrameType>* frame_types) {
 | 
			
		||||
  return codec_thread_->Invoke<int32_t>(Bind(
 | 
			
		||||
@@ -471,7 +471,7 @@ int32_t MediaCodecVideoEncoder::InitEncodeOnCodecThread(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t MediaCodecVideoEncoder::EncodeOnCodecThread(
 | 
			
		||||
    const webrtc::I420VideoFrame& frame,
 | 
			
		||||
    const webrtc::VideoFrame& frame,
 | 
			
		||||
    const std::vector<webrtc::VideoFrameType>* frame_types) {
 | 
			
		||||
  CheckOnCodecThread();
 | 
			
		||||
  JNIEnv* jni = AttachCurrentThreadIfNeeded();
 | 
			
		||||
@@ -493,9 +493,9 @@ int32_t MediaCodecVideoEncoder::EncodeOnCodecThread(
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  CHECK(frame_types->size() == 1) << "Unexpected stream count";
 | 
			
		||||
  const I420VideoFrame& input_frame =
 | 
			
		||||
      (scale_ && codecType_ == kVideoCodecVP8) ?
 | 
			
		||||
      quality_scaler_->GetScaledFrame(frame) : frame;
 | 
			
		||||
  const VideoFrame& input_frame = (scale_ && codecType_ == kVideoCodecVP8)
 | 
			
		||||
                                      ? quality_scaler_->GetScaledFrame(frame)
 | 
			
		||||
                                      : frame;
 | 
			
		||||
 | 
			
		||||
  if (input_frame.width() != width_ || input_frame.height() != height_) {
 | 
			
		||||
    ALOGD("Frame resolution change from %d x %d to %d x %d",
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,7 @@ int FakeVideoSendStream::GetLastHeight() const {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FakeVideoSendStream::IncomingCapturedFrame(
 | 
			
		||||
    const webrtc::I420VideoFrame& frame) {
 | 
			
		||||
    const webrtc::VideoFrame& frame) {
 | 
			
		||||
  ++num_swapped_frames_;
 | 
			
		||||
  last_frame_.ShallowCopy(frame);
 | 
			
		||||
}
 | 
			
		||||
@@ -166,7 +166,7 @@ bool FakeVideoReceiveStream::IsReceiving() const {
 | 
			
		||||
  return receiving_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FakeVideoReceiveStream::InjectFrame(const webrtc::I420VideoFrame& frame,
 | 
			
		||||
void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame,
 | 
			
		||||
                                         int time_to_render_ms) {
 | 
			
		||||
  config_.renderer->RenderFrame(frame, time_to_render_ms);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ class FakeVideoSendStream : public webrtc::VideoSendStream,
 | 
			
		||||
  void SetStats(const webrtc::VideoSendStream::Stats& stats);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  void IncomingCapturedFrame(const webrtc::I420VideoFrame& frame) override;
 | 
			
		||||
  void IncomingCapturedFrame(const webrtc::VideoFrame& frame) override;
 | 
			
		||||
  webrtc::VideoSendStream::Stats GetStats() override;
 | 
			
		||||
 | 
			
		||||
  bool ReconfigureVideoEncoder(
 | 
			
		||||
@@ -91,7 +91,7 @@ class FakeVideoSendStream : public webrtc::VideoSendStream,
 | 
			
		||||
    webrtc::VideoCodecVP9 vp9;
 | 
			
		||||
  } vpx_settings_;
 | 
			
		||||
  int num_swapped_frames_;
 | 
			
		||||
  webrtc::I420VideoFrame last_frame_;
 | 
			
		||||
  webrtc::VideoFrame last_frame_;
 | 
			
		||||
  webrtc::VideoSendStream::Stats stats_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -104,7 +104,7 @@ class FakeVideoReceiveStream : public webrtc::VideoReceiveStream {
 | 
			
		||||
 | 
			
		||||
  bool IsReceiving() const;
 | 
			
		||||
 | 
			
		||||
  void InjectFrame(const webrtc::I420VideoFrame& frame, int time_to_render_ms);
 | 
			
		||||
  void InjectFrame(const webrtc::VideoFrame& frame, int time_to_render_ms);
 | 
			
		||||
 | 
			
		||||
  void SetStats(const webrtc::VideoReceiveStream::Stats& stats);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,7 @@ class FakeWebRtcVideoCaptureModule : public webrtc::VideoCaptureModule {
 | 
			
		||||
 | 
			
		||||
  bool SendFrame(int w, int h) {
 | 
			
		||||
    if (!running_) return false;
 | 
			
		||||
    webrtc::I420VideoFrame sample;
 | 
			
		||||
    webrtc::VideoFrame sample;
 | 
			
		||||
    // Setting stride based on width.
 | 
			
		||||
    if (sample.CreateEmptyFrame(w, h, w, (w + 1) / 2, (w + 1) / 2) < 0) {
 | 
			
		||||
      return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -159,10 +159,9 @@ class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder {
 | 
			
		||||
    return codec_settings_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual int32 Encode(
 | 
			
		||||
      const webrtc::I420VideoFrame& inputImage,
 | 
			
		||||
            const webrtc::CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
            const std::vector<webrtc::VideoFrameType>* frame_types) {
 | 
			
		||||
  virtual int32 Encode(const webrtc::VideoFrame& inputImage,
 | 
			
		||||
                       const webrtc::CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                       const std::vector<webrtc::VideoFrameType>* frame_types) {
 | 
			
		||||
    rtc::CritScope lock(&crit_);
 | 
			
		||||
    ++num_frames_encoded_;
 | 
			
		||||
    return WEBRTC_VIDEO_CODEC_OK;
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ class PassthroughStream: public webrtc::VideoRenderCallback {
 | 
			
		||||
  virtual ~PassthroughStream() {
 | 
			
		||||
  }
 | 
			
		||||
  virtual int32_t RenderFrame(const uint32_t stream_id,
 | 
			
		||||
                              const webrtc::I420VideoFrame& videoFrame) {
 | 
			
		||||
                              const webrtc::VideoFrame& videoFrame) {
 | 
			
		||||
    rtc::CritScope cs(&stream_critical_);
 | 
			
		||||
    // Send frame for rendering directly
 | 
			
		||||
    if (running_ && renderer_) {
 | 
			
		||||
 
 | 
			
		||||
@@ -161,12 +161,12 @@ class WebRtcPassthroughRender : public webrtc::VideoRender {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int32_t SetStartImage(const uint32_t stream_id,
 | 
			
		||||
                        const webrtc::I420VideoFrame& videoFrame) override {
 | 
			
		||||
                        const webrtc::VideoFrame& videoFrame) override {
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int32_t SetTimeoutImage(const uint32_t stream_id,
 | 
			
		||||
                          const webrtc::I420VideoFrame& videoFrame,
 | 
			
		||||
                          const webrtc::VideoFrame& videoFrame,
 | 
			
		||||
                          const uint32_t timeout) override {
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class WebRtcPassthroughRenderTest : public testing::Test {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual int32_t RenderFrame(const uint32_t stream_id,
 | 
			
		||||
                                const webrtc::I420VideoFrame& videoFrame) {
 | 
			
		||||
                                const webrtc::VideoFrame& videoFrame) {
 | 
			
		||||
      ++frame_num_;
 | 
			
		||||
      LOG(INFO) << "RenderFrame stream_id: " << stream_id
 | 
			
		||||
                << " frame_num: " << frame_num_;
 | 
			
		||||
@@ -121,7 +121,7 @@ TEST_F(WebRtcPassthroughRenderTest, Streams) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(WebRtcPassthroughRenderTest, Renderer) {
 | 
			
		||||
  webrtc::I420VideoFrame frame;
 | 
			
		||||
  webrtc::VideoFrame frame;
 | 
			
		||||
  const int stream_id1 = 1234;
 | 
			
		||||
  const int stream_id2 = 5678;
 | 
			
		||||
  const int stream_id3 = 9012;  // A stream that doesn't exist.
 | 
			
		||||
 
 | 
			
		||||
@@ -370,7 +370,7 @@ bool WebRtcVideoCapturer::GetPreferredFourccs(
 | 
			
		||||
 | 
			
		||||
void WebRtcVideoCapturer::OnIncomingCapturedFrame(
 | 
			
		||||
    const int32_t id,
 | 
			
		||||
    const webrtc::I420VideoFrame& sample) {
 | 
			
		||||
    const webrtc::VideoFrame& sample) {
 | 
			
		||||
  // This can only happen between Start() and Stop().
 | 
			
		||||
  DCHECK(start_thread_);
 | 
			
		||||
  DCHECK(async_invoker_);
 | 
			
		||||
@@ -396,7 +396,7 @@ void WebRtcVideoCapturer::OnCaptureDelayChanged(const int32_t id,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebRtcVideoCapturer::SignalFrameCapturedOnStartThread(
 | 
			
		||||
    const webrtc::I420VideoFrame frame) {
 | 
			
		||||
    const webrtc::VideoFrame frame) {
 | 
			
		||||
  // This can only happen between Start() and Stop().
 | 
			
		||||
  DCHECK(start_thread_);
 | 
			
		||||
  DCHECK(start_thread_->IsCurrent());
 | 
			
		||||
@@ -424,7 +424,7 @@ void WebRtcVideoCapturer::SignalFrameCapturedOnStartThread(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WebRtcCapturedFrame
 | 
			
		||||
WebRtcCapturedFrame::WebRtcCapturedFrame(const webrtc::I420VideoFrame& sample,
 | 
			
		||||
WebRtcCapturedFrame::WebRtcCapturedFrame(const webrtc::VideoFrame& sample,
 | 
			
		||||
                                         void* buffer,
 | 
			
		||||
                                         size_t length) {
 | 
			
		||||
  width = sample.width();
 | 
			
		||||
 
 | 
			
		||||
@@ -82,7 +82,7 @@ class WebRtcVideoCapturer : public VideoCapturer,
 | 
			
		||||
 private:
 | 
			
		||||
  // Callback when a frame is captured by camera.
 | 
			
		||||
  virtual void OnIncomingCapturedFrame(const int32_t id,
 | 
			
		||||
                                       const webrtc::I420VideoFrame& frame);
 | 
			
		||||
                                       const webrtc::VideoFrame& frame);
 | 
			
		||||
  virtual void OnCaptureDelayChanged(const int32_t id,
 | 
			
		||||
                                     const int32_t delay);
 | 
			
		||||
 | 
			
		||||
@@ -92,7 +92,7 @@ class WebRtcVideoCapturer : public VideoCapturer,
 | 
			
		||||
  // directly from OnIncomingCapturedFrame.
 | 
			
		||||
  // TODO(tommi): Remove this workaround when we've updated the WebRTC capturers
 | 
			
		||||
  // to follow the same contract.
 | 
			
		||||
  void SignalFrameCapturedOnStartThread(const webrtc::I420VideoFrame frame);
 | 
			
		||||
  void SignalFrameCapturedOnStartThread(const webrtc::VideoFrame frame);
 | 
			
		||||
 | 
			
		||||
  rtc::scoped_ptr<WebRtcVcmFactoryInterface> factory_;
 | 
			
		||||
  webrtc::VideoCaptureModule* module_;
 | 
			
		||||
@@ -105,8 +105,9 @@ class WebRtcVideoCapturer : public VideoCapturer,
 | 
			
		||||
 | 
			
		||||
struct WebRtcCapturedFrame : public CapturedFrame {
 | 
			
		||||
 public:
 | 
			
		||||
  WebRtcCapturedFrame(const webrtc::I420VideoFrame& frame,
 | 
			
		||||
                      void* buffer, size_t length);
 | 
			
		||||
  WebRtcCapturedFrame(const webrtc::VideoFrame& frame,
 | 
			
		||||
                      void* buffer,
 | 
			
		||||
                      size_t length);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace cricket
 | 
			
		||||
 
 | 
			
		||||
@@ -1679,7 +1679,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
 | 
			
		||||
  DestroyVideoEncoder(&allocated_encoder_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void CreateBlackFrame(webrtc::I420VideoFrame* video_frame,
 | 
			
		||||
static void CreateBlackFrame(webrtc::VideoFrame* video_frame,
 | 
			
		||||
                             int width,
 | 
			
		||||
                             int height) {
 | 
			
		||||
  video_frame->CreateEmptyFrame(width, height, width, (width + 1) / 2,
 | 
			
		||||
@@ -1696,8 +1696,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::InputFrame(
 | 
			
		||||
    VideoCapturer* capturer,
 | 
			
		||||
    const VideoFrame* frame) {
 | 
			
		||||
  TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::InputFrame");
 | 
			
		||||
  webrtc::I420VideoFrame video_frame(frame->GetVideoFrameBuffer(), 0, 0,
 | 
			
		||||
                                     frame->GetVideoRotation());
 | 
			
		||||
  webrtc::VideoFrame video_frame(frame->GetVideoFrameBuffer(), 0, 0,
 | 
			
		||||
                                 frame->GetVideoRotation());
 | 
			
		||||
  rtc::CritScope cs(&lock_);
 | 
			
		||||
  if (stream_ == NULL) {
 | 
			
		||||
    // Frame input before send codecs are configured, dropping frame.
 | 
			
		||||
@@ -1744,7 +1744,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer(
 | 
			
		||||
    if (capturer == NULL) {
 | 
			
		||||
      if (stream_ != NULL) {
 | 
			
		||||
        LOG(LS_VERBOSE) << "Disabling capturer, sending black frame.";
 | 
			
		||||
        webrtc::I420VideoFrame black_frame;
 | 
			
		||||
        webrtc::VideoFrame black_frame;
 | 
			
		||||
 | 
			
		||||
        CreateBlackFrame(&black_frame, last_dimensions_.width,
 | 
			
		||||
                         last_dimensions_.height);
 | 
			
		||||
@@ -2368,7 +2368,7 @@ void WebRtcVideoChannel2::WebRtcVideoReceiveStream::ClearDecoders(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RenderFrame(
 | 
			
		||||
    const webrtc::I420VideoFrame& frame,
 | 
			
		||||
    const webrtc::VideoFrame& frame,
 | 
			
		||||
    int time_to_render_ms) {
 | 
			
		||||
  rtc::CritScope crit(&renderer_lock_);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -416,7 +416,7 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler,
 | 
			
		||||
    void SetRecvCodecs(const std::vector<VideoCodecSettings>& recv_codecs);
 | 
			
		||||
    void SetRtpExtensions(const std::vector<webrtc::RtpExtension>& extensions);
 | 
			
		||||
 | 
			
		||||
    void RenderFrame(const webrtc::I420VideoFrame& frame,
 | 
			
		||||
    void RenderFrame(const webrtc::VideoFrame& frame,
 | 
			
		||||
                     int time_to_render_ms) override;
 | 
			
		||||
    bool IsTextureSupported() const override;
 | 
			
		||||
    bool IsDefaultStream() const;
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
 | 
			
		||||
      cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void CreateBlackFrame(webrtc::I420VideoFrame* video_frame,
 | 
			
		||||
static void CreateBlackFrame(webrtc::VideoFrame* video_frame,
 | 
			
		||||
                             int width,
 | 
			
		||||
                             int height) {
 | 
			
		||||
  video_frame->CreateEmptyFrame(
 | 
			
		||||
@@ -1727,7 +1727,7 @@ TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeAndElapsedTimeCorrectly) {
 | 
			
		||||
  EXPECT_TRUE(channel_->SetRenderer(last_ssrc_, &renderer));
 | 
			
		||||
  EXPECT_TRUE(channel_->SetRender(true));
 | 
			
		||||
 | 
			
		||||
  webrtc::I420VideoFrame video_frame;
 | 
			
		||||
  webrtc::VideoFrame video_frame;
 | 
			
		||||
  CreateBlackFrame(&video_frame, 4, 4);
 | 
			
		||||
  video_frame.set_timestamp(kInitialTimestamp);
 | 
			
		||||
  // Initial NTP time is not available on the first frame, but should still be
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ config("common_video_config") {
 | 
			
		||||
source_set("common_video") {
 | 
			
		||||
  sources = [
 | 
			
		||||
    "i420_buffer_pool.cc",
 | 
			
		||||
    "i420_video_frame.cc",
 | 
			
		||||
    "incoming_video_stream.cc",
 | 
			
		||||
    "interface/i420_buffer_pool.h",
 | 
			
		||||
    "interface/incoming_video_stream.h",
 | 
			
		||||
@@ -27,6 +26,7 @@ source_set("common_video") {
 | 
			
		||||
    "libyuv/include/webrtc_libyuv.h",
 | 
			
		||||
    "libyuv/scaler.cc",
 | 
			
		||||
    "libyuv/webrtc_libyuv.cc",
 | 
			
		||||
    "video_frame.cc",
 | 
			
		||||
    "video_frame_buffer.cc",
 | 
			
		||||
    "video_render_frames.cc",
 | 
			
		||||
    "video_render_frames.h",
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@
 | 
			
		||||
      ],
 | 
			
		||||
      'sources': [
 | 
			
		||||
        'i420_buffer_pool.cc',
 | 
			
		||||
        'i420_video_frame.cc',
 | 
			
		||||
        'video_frame.cc',
 | 
			
		||||
        'incoming_video_stream.cc',
 | 
			
		||||
        'interface/i420_buffer_pool.h',
 | 
			
		||||
        'interface/incoming_video_stream.h',
 | 
			
		||||
 
 | 
			
		||||
@@ -35,25 +35,24 @@ bool EqualPlane(const uint8_t* data1,
 | 
			
		||||
                int stride,
 | 
			
		||||
                int width,
 | 
			
		||||
                int height);
 | 
			
		||||
bool EqualFrames(const I420VideoFrame& frame1, const I420VideoFrame& frame2);
 | 
			
		||||
bool EqualTextureFrames(const I420VideoFrame& frame1,
 | 
			
		||||
                        const I420VideoFrame& frame2);
 | 
			
		||||
bool EqualFrames(const VideoFrame& frame1, const VideoFrame& frame2);
 | 
			
		||||
bool EqualTextureFrames(const VideoFrame& frame1, const VideoFrame& frame2);
 | 
			
		||||
int ExpectedSize(int plane_stride, int image_height, PlaneType type);
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, InitialValues) {
 | 
			
		||||
  I420VideoFrame frame;
 | 
			
		||||
TEST(TestVideoFrame, InitialValues) {
 | 
			
		||||
  VideoFrame frame;
 | 
			
		||||
  EXPECT_TRUE(frame.IsZeroSize());
 | 
			
		||||
  EXPECT_EQ(kVideoRotation_0, frame.rotation());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, CopiesInitialFrameWithoutCrashing) {
 | 
			
		||||
  I420VideoFrame frame;
 | 
			
		||||
  I420VideoFrame frame2;
 | 
			
		||||
TEST(TestVideoFrame, CopiesInitialFrameWithoutCrashing) {
 | 
			
		||||
  VideoFrame frame;
 | 
			
		||||
  VideoFrame frame2;
 | 
			
		||||
  frame2.CopyFrame(frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, WidthHeightValues) {
 | 
			
		||||
  I420VideoFrame frame;
 | 
			
		||||
TEST(TestVideoFrame, WidthHeightValues) {
 | 
			
		||||
  VideoFrame frame;
 | 
			
		||||
  const int valid_value = 10;
 | 
			
		||||
  EXPECT_EQ(0, frame.CreateEmptyFrame(10, 10, 10, 14, 90));
 | 
			
		||||
  EXPECT_EQ(valid_value, frame.width());
 | 
			
		||||
@@ -66,8 +65,8 @@ TEST(TestI420VideoFrame, WidthHeightValues) {
 | 
			
		||||
  EXPECT_EQ(789, frame.render_time_ms());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, SizeAllocation) {
 | 
			
		||||
  I420VideoFrame frame;
 | 
			
		||||
TEST(TestVideoFrame, SizeAllocation) {
 | 
			
		||||
  VideoFrame frame;
 | 
			
		||||
  EXPECT_EQ(0, frame. CreateEmptyFrame(10, 10, 12, 14, 220));
 | 
			
		||||
  int height = frame.height();
 | 
			
		||||
  int stride_y = frame.stride(kYPlane);
 | 
			
		||||
@@ -82,7 +81,7 @@ TEST(TestI420VideoFrame, SizeAllocation) {
 | 
			
		||||
            frame.allocated_size(kVPlane));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, CopyFrame) {
 | 
			
		||||
TEST(TestVideoFrame, CopyFrame) {
 | 
			
		||||
  uint32_t timestamp = 1;
 | 
			
		||||
  int64_t ntp_time_ms = 2;
 | 
			
		||||
  int64_t render_time_ms = 3;
 | 
			
		||||
@@ -92,7 +91,7 @@ TEST(TestI420VideoFrame, CopyFrame) {
 | 
			
		||||
  int width = 15;
 | 
			
		||||
  int height = 15;
 | 
			
		||||
  // Copy frame.
 | 
			
		||||
  I420VideoFrame small_frame;
 | 
			
		||||
  VideoFrame small_frame;
 | 
			
		||||
  EXPECT_EQ(0, small_frame.CreateEmptyFrame(width, height,
 | 
			
		||||
                                            stride_y, stride_u, stride_v));
 | 
			
		||||
  small_frame.set_timestamp(timestamp);
 | 
			
		||||
@@ -108,7 +107,7 @@ TEST(TestI420VideoFrame, CopyFrame) {
 | 
			
		||||
  memset(buffer_y, 16, kSizeY);
 | 
			
		||||
  memset(buffer_u, 8, kSizeU);
 | 
			
		||||
  memset(buffer_v, 4, kSizeV);
 | 
			
		||||
  I420VideoFrame big_frame;
 | 
			
		||||
  VideoFrame big_frame;
 | 
			
		||||
  EXPECT_EQ(0,
 | 
			
		||||
            big_frame.CreateFrame(buffer_y, buffer_u, buffer_v,
 | 
			
		||||
                                  width + 5, height + 5, stride_y + 5,
 | 
			
		||||
@@ -128,7 +127,7 @@ TEST(TestI420VideoFrame, CopyFrame) {
 | 
			
		||||
  EXPECT_TRUE(EqualFrames(small_frame, big_frame));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, ShallowCopy) {
 | 
			
		||||
TEST(TestVideoFrame, ShallowCopy) {
 | 
			
		||||
  uint32_t timestamp = 1;
 | 
			
		||||
  int64_t ntp_time_ms = 2;
 | 
			
		||||
  int64_t render_time_ms = 3;
 | 
			
		||||
@@ -148,18 +147,18 @@ TEST(TestI420VideoFrame, ShallowCopy) {
 | 
			
		||||
  memset(buffer_y, 16, kSizeY);
 | 
			
		||||
  memset(buffer_u, 8, kSizeU);
 | 
			
		||||
  memset(buffer_v, 4, kSizeV);
 | 
			
		||||
  I420VideoFrame frame1;
 | 
			
		||||
  VideoFrame frame1;
 | 
			
		||||
  EXPECT_EQ(0, frame1.CreateFrame(buffer_y, buffer_u, buffer_v, width, height,
 | 
			
		||||
                                  stride_y, stride_u, stride_v, kRotation));
 | 
			
		||||
  frame1.set_timestamp(timestamp);
 | 
			
		||||
  frame1.set_ntp_time_ms(ntp_time_ms);
 | 
			
		||||
  frame1.set_render_time_ms(render_time_ms);
 | 
			
		||||
  I420VideoFrame frame2;
 | 
			
		||||
  VideoFrame frame2;
 | 
			
		||||
  frame2.ShallowCopy(frame1);
 | 
			
		||||
 | 
			
		||||
  // To be able to access the buffers, we need const pointers to the frames.
 | 
			
		||||
  const I420VideoFrame* const_frame1_ptr = &frame1;
 | 
			
		||||
  const I420VideoFrame* const_frame2_ptr = &frame2;
 | 
			
		||||
  const VideoFrame* const_frame1_ptr = &frame1;
 | 
			
		||||
  const VideoFrame* const_frame2_ptr = &frame2;
 | 
			
		||||
 | 
			
		||||
  EXPECT_TRUE(const_frame1_ptr->buffer(kYPlane) ==
 | 
			
		||||
              const_frame2_ptr->buffer(kYPlane));
 | 
			
		||||
@@ -184,8 +183,8 @@ TEST(TestI420VideoFrame, ShallowCopy) {
 | 
			
		||||
  EXPECT_NE(frame2.rotation(), frame1.rotation());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, Reset) {
 | 
			
		||||
  I420VideoFrame frame;
 | 
			
		||||
TEST(TestVideoFrame, Reset) {
 | 
			
		||||
  VideoFrame frame;
 | 
			
		||||
  ASSERT_TRUE(frame.CreateEmptyFrame(5, 5, 5, 5, 5) == 0);
 | 
			
		||||
  frame.set_ntp_time_ms(1);
 | 
			
		||||
  frame.set_timestamp(2);
 | 
			
		||||
@@ -199,8 +198,8 @@ TEST(TestI420VideoFrame, Reset) {
 | 
			
		||||
  EXPECT_TRUE(frame.video_frame_buffer() == NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, CopyBuffer) {
 | 
			
		||||
  I420VideoFrame frame1, frame2;
 | 
			
		||||
TEST(TestVideoFrame, CopyBuffer) {
 | 
			
		||||
  VideoFrame frame1, frame2;
 | 
			
		||||
  int width = 15;
 | 
			
		||||
  int height = 15;
 | 
			
		||||
  int stride_y = 15;
 | 
			
		||||
@@ -228,8 +227,8 @@ TEST(TestI420VideoFrame, CopyBuffer) {
 | 
			
		||||
  EXPECT_LE(kSizeUv, frame2.allocated_size(kVPlane));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, ReuseAllocation) {
 | 
			
		||||
  I420VideoFrame frame;
 | 
			
		||||
TEST(TestVideoFrame, ReuseAllocation) {
 | 
			
		||||
  VideoFrame frame;
 | 
			
		||||
  frame.CreateEmptyFrame(640, 320, 640, 320, 320);
 | 
			
		||||
  const uint8_t* y = frame.buffer(kYPlane);
 | 
			
		||||
  const uint8_t* u = frame.buffer(kUPlane);
 | 
			
		||||
@@ -240,24 +239,24 @@ TEST(TestI420VideoFrame, ReuseAllocation) {
 | 
			
		||||
  EXPECT_EQ(v, frame.buffer(kVPlane));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, FailToReuseAllocation) {
 | 
			
		||||
  I420VideoFrame frame1;
 | 
			
		||||
TEST(TestVideoFrame, FailToReuseAllocation) {
 | 
			
		||||
  VideoFrame frame1;
 | 
			
		||||
  frame1.CreateEmptyFrame(640, 320, 640, 320, 320);
 | 
			
		||||
  const uint8_t* y = frame1.buffer(kYPlane);
 | 
			
		||||
  const uint8_t* u = frame1.buffer(kUPlane);
 | 
			
		||||
  const uint8_t* v = frame1.buffer(kVPlane);
 | 
			
		||||
  // Make a shallow copy of |frame1|.
 | 
			
		||||
  I420VideoFrame frame2(frame1.video_frame_buffer(), 0, 0, kVideoRotation_0);
 | 
			
		||||
  VideoFrame frame2(frame1.video_frame_buffer(), 0, 0, kVideoRotation_0);
 | 
			
		||||
  frame1.CreateEmptyFrame(640, 320, 640, 320, 320);
 | 
			
		||||
  EXPECT_NE(y, frame1.buffer(kYPlane));
 | 
			
		||||
  EXPECT_NE(u, frame1.buffer(kUPlane));
 | 
			
		||||
  EXPECT_NE(v, frame1.buffer(kVPlane));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, TextureInitialValues) {
 | 
			
		||||
TEST(TestVideoFrame, TextureInitialValues) {
 | 
			
		||||
  NativeHandleImpl handle;
 | 
			
		||||
  I420VideoFrame frame(&handle, 640, 480, 100, 10, webrtc::kVideoRotation_0,
 | 
			
		||||
                       rtc::Callback0<void>());
 | 
			
		||||
  VideoFrame frame(&handle, 640, 480, 100, 10, webrtc::kVideoRotation_0,
 | 
			
		||||
                   rtc::Callback0<void>());
 | 
			
		||||
  EXPECT_EQ(640, frame.width());
 | 
			
		||||
  EXPECT_EQ(480, frame.height());
 | 
			
		||||
  EXPECT_EQ(100u, frame.timestamp());
 | 
			
		||||
@@ -270,12 +269,12 @@ TEST(TestI420VideoFrame, TextureInitialValues) {
 | 
			
		||||
  EXPECT_EQ(20, frame.render_time_ms());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(TestI420VideoFrame, NoLongerNeeded) {
 | 
			
		||||
TEST(TestVideoFrame, NoLongerNeeded) {
 | 
			
		||||
  NativeHandleImpl handle;
 | 
			
		||||
  ASSERT_FALSE(handle.no_longer_needed());
 | 
			
		||||
  I420VideoFrame* frame = new I420VideoFrame(
 | 
			
		||||
      &handle, 640, 480, 100, 200, webrtc::kVideoRotation_0,
 | 
			
		||||
      rtc::Bind(&NativeHandleImpl::SetNoLongerNeeded, &handle));
 | 
			
		||||
  VideoFrame* frame =
 | 
			
		||||
      new VideoFrame(&handle, 640, 480, 100, 200, webrtc::kVideoRotation_0,
 | 
			
		||||
                     rtc::Bind(&NativeHandleImpl::SetNoLongerNeeded, &handle));
 | 
			
		||||
  EXPECT_FALSE(handle.no_longer_needed());
 | 
			
		||||
  delete frame;
 | 
			
		||||
  EXPECT_TRUE(handle.no_longer_needed());
 | 
			
		||||
@@ -295,7 +294,7 @@ bool EqualPlane(const uint8_t* data1,
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool EqualFrames(const I420VideoFrame& frame1, const I420VideoFrame& frame2) {
 | 
			
		||||
bool EqualFrames(const VideoFrame& frame1, const VideoFrame& frame2) {
 | 
			
		||||
  if ((frame1.width() != frame2.width()) ||
 | 
			
		||||
      (frame1.height() != frame2.height()) ||
 | 
			
		||||
      (frame1.stride(kYPlane) != frame2.stride(kYPlane)) ||
 | 
			
		||||
@@ -316,8 +315,7 @@ bool EqualFrames(const I420VideoFrame& frame1, const I420VideoFrame& frame2) {
 | 
			
		||||
                    frame1.stride(kVPlane), half_width, half_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool EqualTextureFrames(const I420VideoFrame& frame1,
 | 
			
		||||
                        const I420VideoFrame& frame2) {
 | 
			
		||||
bool EqualTextureFrames(const VideoFrame& frame1, const VideoFrame& frame2) {
 | 
			
		||||
  return ((frame1.native_handle() == frame2.native_handle()) &&
 | 
			
		||||
          (frame1.width() == frame2.width()) &&
 | 
			
		||||
          (frame1.height() == frame2.height()) &&
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ VideoRenderCallback* IncomingVideoStream::ModuleCallback() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t IncomingVideoStream::RenderFrame(const uint32_t stream_id,
 | 
			
		||||
                                         const I420VideoFrame& video_frame) {
 | 
			
		||||
                                         const VideoFrame& video_frame) {
 | 
			
		||||
  CriticalSectionScoped csS(stream_critsect_.get());
 | 
			
		||||
 | 
			
		||||
  if (!running_) {
 | 
			
		||||
@@ -88,14 +88,13 @@ int32_t IncomingVideoStream::RenderFrame(const uint32_t stream_id,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t IncomingVideoStream::SetStartImage(
 | 
			
		||||
    const I420VideoFrame& video_frame) {
 | 
			
		||||
int32_t IncomingVideoStream::SetStartImage(const VideoFrame& video_frame) {
 | 
			
		||||
  CriticalSectionScoped csS(thread_critsect_.get());
 | 
			
		||||
  return start_image_.CopyFrame(video_frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t IncomingVideoStream::SetTimeoutImage(
 | 
			
		||||
    const I420VideoFrame& video_frame, const uint32_t timeout) {
 | 
			
		||||
int32_t IncomingVideoStream::SetTimeoutImage(const VideoFrame& video_frame,
 | 
			
		||||
                                             const uint32_t timeout) {
 | 
			
		||||
  CriticalSectionScoped csS(thread_critsect_.get());
 | 
			
		||||
  timeout_time_ = timeout;
 | 
			
		||||
  return timeout_image_.CopyFrame(video_frame);
 | 
			
		||||
@@ -207,7 +206,7 @@ bool IncomingVideoStream::IncomingVideoStreamProcess() {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    // Get a new frame to render and the time for the frame after this one.
 | 
			
		||||
    I420VideoFrame frame_to_render;
 | 
			
		||||
    VideoFrame frame_to_render;
 | 
			
		||||
    uint32_t wait_time;
 | 
			
		||||
    {
 | 
			
		||||
      CriticalSectionScoped cs(buffer_critsect_.get());
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,8 @@ class ThreadWrapper;
 | 
			
		||||
class VideoRenderCallback {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual int32_t RenderFrame(const uint32_t streamId,
 | 
			
		||||
                              const I420VideoFrame& videoFrame) = 0;
 | 
			
		||||
                              const VideoFrame& videoFrame) = 0;
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual ~VideoRenderCallback() {}
 | 
			
		||||
};
 | 
			
		||||
@@ -36,7 +37,7 @@ class IncomingVideoStream : public VideoRenderCallback {
 | 
			
		||||
  // Get callback to deliver frames to the module.
 | 
			
		||||
  VideoRenderCallback* ModuleCallback();
 | 
			
		||||
  virtual int32_t RenderFrame(const uint32_t stream_id,
 | 
			
		||||
                              const I420VideoFrame& video_frame);
 | 
			
		||||
                              const VideoFrame& video_frame);
 | 
			
		||||
 | 
			
		||||
  // Set callback to the platform dependent code.
 | 
			
		||||
  void SetRenderCallback(VideoRenderCallback* render_callback);
 | 
			
		||||
@@ -55,9 +56,9 @@ class IncomingVideoStream : public VideoRenderCallback {
 | 
			
		||||
  uint32_t StreamId() const;
 | 
			
		||||
  uint32_t IncomingRate() const;
 | 
			
		||||
 | 
			
		||||
  int32_t SetStartImage(const I420VideoFrame& video_frame);
 | 
			
		||||
  int32_t SetStartImage(const VideoFrame& video_frame);
 | 
			
		||||
 | 
			
		||||
  int32_t SetTimeoutImage(const I420VideoFrame& video_frame,
 | 
			
		||||
  int32_t SetTimeoutImage(const VideoFrame& video_frame,
 | 
			
		||||
                          const uint32_t timeout);
 | 
			
		||||
 | 
			
		||||
  int32_t SetExpectedRenderDelay(int32_t delay_ms);
 | 
			
		||||
@@ -90,9 +91,9 @@ class IncomingVideoStream : public VideoRenderCallback {
 | 
			
		||||
  int64_t last_rate_calculation_time_ms_ GUARDED_BY(stream_critsect_);
 | 
			
		||||
  uint16_t num_frames_since_last_calculation_ GUARDED_BY(stream_critsect_);
 | 
			
		||||
  int64_t last_render_time_ms_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  I420VideoFrame temp_frame_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  I420VideoFrame start_image_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  I420VideoFrame timeout_image_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  VideoFrame temp_frame_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  VideoFrame start_image_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  VideoFrame timeout_image_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
  uint32_t timeout_time_ GUARDED_BY(thread_critsect_);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -48,8 +48,7 @@ class Scaler {
 | 
			
		||||
  // Return value: 0 - OK,
 | 
			
		||||
  //               -1 - parameter error
 | 
			
		||||
  //               -2 - scaler not set
 | 
			
		||||
  int Scale(const I420VideoFrame& src_frame,
 | 
			
		||||
            I420VideoFrame* dst_frame);
 | 
			
		||||
  int Scale(const VideoFrame& src_frame, VideoFrame* dst_frame);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // Determine if the VideoTypes are currently supported.
 | 
			
		||||
 
 | 
			
		||||
@@ -77,23 +77,22 @@ void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv);
 | 
			
		||||
size_t CalcBufferSize(VideoType type, int width, int height);
 | 
			
		||||
 | 
			
		||||
// TODO(mikhal): Add unit test for these two functions and determine location.
 | 
			
		||||
// Print I420VideoFrame to file
 | 
			
		||||
// Print VideoFrame to file
 | 
			
		||||
// Input:
 | 
			
		||||
//    - frame       : Reference to video frame.
 | 
			
		||||
//    - file        : pointer to file object. It is assumed that the file is
 | 
			
		||||
//                    already open for writing.
 | 
			
		||||
// Return value: 0 if OK, < 0 otherwise.
 | 
			
		||||
int PrintI420VideoFrame(const I420VideoFrame& frame, FILE* file);
 | 
			
		||||
int PrintVideoFrame(const VideoFrame& frame, FILE* file);
 | 
			
		||||
 | 
			
		||||
// Extract buffer from I420VideoFrame (consecutive planes, no stride)
 | 
			
		||||
// Extract buffer from VideoFrame (consecutive planes, no stride)
 | 
			
		||||
// Input:
 | 
			
		||||
//   - frame       : Reference to video frame.
 | 
			
		||||
//   - size        : pointer to the size of the allocated buffer. If size is
 | 
			
		||||
//                   insufficient, an error will be returned.
 | 
			
		||||
//   - buffer      : Pointer to buffer
 | 
			
		||||
// Return value: length of buffer if OK, < 0 otherwise.
 | 
			
		||||
int ExtractBuffer(const I420VideoFrame& input_frame,
 | 
			
		||||
                  size_t size, uint8_t* buffer);
 | 
			
		||||
int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer);
 | 
			
		||||
// Convert To I420
 | 
			
		||||
// Input:
 | 
			
		||||
//   - src_video_type   : Type of input video.
 | 
			
		||||
@@ -115,7 +114,7 @@ int ConvertToI420(VideoType src_video_type,
 | 
			
		||||
                  int src_height,
 | 
			
		||||
                  size_t sample_size,
 | 
			
		||||
                  VideoRotation rotation,
 | 
			
		||||
                  I420VideoFrame* dst_frame);
 | 
			
		||||
                  VideoFrame* dst_frame);
 | 
			
		||||
 | 
			
		||||
// Convert From I420
 | 
			
		||||
// Input:
 | 
			
		||||
@@ -125,13 +124,15 @@ int ConvertToI420(VideoType src_video_type,
 | 
			
		||||
//   - dst_frame        : Pointer to a destination frame.
 | 
			
		||||
// Return value: 0 if OK, < 0 otherwise.
 | 
			
		||||
// It is assumed that source and destination have equal height.
 | 
			
		||||
int ConvertFromI420(const I420VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type, int dst_sample_size,
 | 
			
		||||
int ConvertFromI420(const VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type,
 | 
			
		||||
                    int dst_sample_size,
 | 
			
		||||
                    uint8_t* dst_frame);
 | 
			
		||||
// ConvertFrom YV12.
 | 
			
		||||
// Interface - same as above.
 | 
			
		||||
int ConvertFromYV12(const I420VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type, int dst_sample_size,
 | 
			
		||||
int ConvertFromYV12(const VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type,
 | 
			
		||||
                    int dst_sample_size,
 | 
			
		||||
                    uint8_t* dst_frame);
 | 
			
		||||
 | 
			
		||||
// The following list describes designated conversion functions which
 | 
			
		||||
@@ -148,11 +149,9 @@ int ConvertNV12ToRGB565(const uint8_t* src_frame,
 | 
			
		||||
 | 
			
		||||
// Compute PSNR for an I420 frame (all planes).
 | 
			
		||||
// Returns the PSNR in decibel, to a maximum of kInfinitePSNR.
 | 
			
		||||
double I420PSNR(const I420VideoFrame* ref_frame,
 | 
			
		||||
                const I420VideoFrame* test_frame);
 | 
			
		||||
double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame);
 | 
			
		||||
// Compute SSIM for an I420 frame (all planes).
 | 
			
		||||
double I420SSIM(const I420VideoFrame* ref_frame,
 | 
			
		||||
                const I420VideoFrame* test_frame);
 | 
			
		||||
double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_WEBRTC_LIBYUV_H_
 | 
			
		||||
 
 | 
			
		||||
@@ -37,8 +37,7 @@ int PrintBuffer(const uint8_t* buffer, int width, int height, int stride) {
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int PrintFrame(const I420VideoFrame* frame, const char* str) {
 | 
			
		||||
int PrintFrame(const VideoFrame* frame, const char* str) {
 | 
			
		||||
  if (frame == NULL)
 | 
			
		||||
     return -1;
 | 
			
		||||
  printf("%s %dx%d \n", str, frame->width(), frame->height());
 | 
			
		||||
@@ -57,7 +56,7 @@ int PrintFrame(const I420VideoFrame* frame, const char* str) {
 | 
			
		||||
 | 
			
		||||
// Create an image from on a YUV frame. Every plane value starts with a start
 | 
			
		||||
// value, and will be set to increasing values.
 | 
			
		||||
void CreateImage(I420VideoFrame* frame, int plane_offset[kNumOfPlanes]) {
 | 
			
		||||
void CreateImage(VideoFrame* frame, int plane_offset[kNumOfPlanes]) {
 | 
			
		||||
  if (frame == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  for (int plane_num = 0; plane_num < kNumOfPlanes; ++plane_num) {
 | 
			
		||||
@@ -83,7 +82,7 @@ class TestLibYuv : public ::testing::Test {
 | 
			
		||||
  virtual void TearDown();
 | 
			
		||||
 | 
			
		||||
  FILE* source_file_;
 | 
			
		||||
  I420VideoFrame orig_frame_;
 | 
			
		||||
  VideoFrame orig_frame_;
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> orig_buffer_;
 | 
			
		||||
  const int width_;
 | 
			
		||||
  const int height_;
 | 
			
		||||
@@ -142,7 +141,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
 | 
			
		||||
  double psnr = 0.0;
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame res_i420_frame;
 | 
			
		||||
  VideoFrame res_i420_frame;
 | 
			
		||||
  EXPECT_EQ(0,res_i420_frame.CreateEmptyFrame(width_, height_, width_,
 | 
			
		||||
                                              (width_ + 1) / 2,
 | 
			
		||||
                                              (width_ + 1) / 2));
 | 
			
		||||
@@ -153,7 +152,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, width_,
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  psnr = I420PSNR(&orig_frame_, &res_i420_frame);
 | 
			
		||||
@@ -173,7 +172,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kRGB24, res_rgb_buffer2.get(), 0, 0, width_,
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  psnr = I420PSNR(&orig_frame_, &res_i420_frame);
 | 
			
		||||
@@ -189,7 +188,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
  psnr = I420PSNR(&orig_frame_, &res_i420_frame);
 | 
			
		||||
  EXPECT_EQ(48.0, psnr);
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  j++;
 | 
			
		||||
@@ -197,7 +196,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
  printf("\nConvert #%d I420 <-> YV12\n", j);
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> outYV120Buffer(new uint8_t[frame_length_]);
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> res_i420_buffer(new uint8_t[frame_length_]);
 | 
			
		||||
  I420VideoFrame yv12_frame;
 | 
			
		||||
  VideoFrame yv12_frame;
 | 
			
		||||
  EXPECT_EQ(0, ConvertFromI420(orig_frame_, kYV12, 0, outYV120Buffer.get()));
 | 
			
		||||
  yv12_frame.CreateFrame(outYV120Buffer.get(),
 | 
			
		||||
                         outYV120Buffer.get() + size_y_,
 | 
			
		||||
@@ -223,7 +222,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kYUY2, out_yuy2_buffer.get(), 0, 0, width_,
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -238,7 +237,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kRGB565, out_rgb565_buffer.get(), 0, 0, width_,
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  j++;
 | 
			
		||||
@@ -258,7 +257,7 @@ TEST_F(TestLibYuv, ConvertTest) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kARGB, out_argb8888_buffer.get(), 0, 0, width_,
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -278,7 +277,7 @@ TEST_F(TestLibYuv, ConvertAlignedFrame) {
 | 
			
		||||
 | 
			
		||||
  double psnr = 0.0;
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame res_i420_frame;
 | 
			
		||||
  VideoFrame res_i420_frame;
 | 
			
		||||
  int stride_y = 0;
 | 
			
		||||
  int stride_uv = 0;
 | 
			
		||||
  Calc16ByteAlignedStride(width_, &stride_y, &stride_uv);
 | 
			
		||||
@@ -290,7 +289,7 @@ TEST_F(TestLibYuv, ConvertAlignedFrame) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kI420, out_i420_buffer.get(), 0, 0, width_,
 | 
			
		||||
                             height_, 0, kVideoRotation_0, &res_i420_frame));
 | 
			
		||||
 | 
			
		||||
  if (PrintI420VideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(res_i420_frame, output_file) < 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  psnr = I420PSNR(&orig_frame_, &res_i420_frame);
 | 
			
		||||
@@ -301,7 +300,7 @@ TEST_F(TestLibYuv, ConvertAlignedFrame) {
 | 
			
		||||
TEST_F(TestLibYuv, RotateTest) {
 | 
			
		||||
  // Use ConvertToI420 for multiple roatations - see that nothing breaks, all
 | 
			
		||||
  // memory is properly allocated and end result is equal to the starting point.
 | 
			
		||||
  I420VideoFrame rotated_res_i420_frame;
 | 
			
		||||
  VideoFrame rotated_res_i420_frame;
 | 
			
		||||
  int rotated_width = height_;
 | 
			
		||||
  int rotated_height = width_;
 | 
			
		||||
  int stride_y ;
 | 
			
		||||
 
 | 
			
		||||
@@ -47,8 +47,7 @@ int Scaler::Set(int src_width, int src_height,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Scaler::Scale(const I420VideoFrame& src_frame,
 | 
			
		||||
                  I420VideoFrame* dst_frame) {
 | 
			
		||||
int Scaler::Scale(const VideoFrame& src_frame, VideoFrame* dst_frame) {
 | 
			
		||||
  assert(dst_frame);
 | 
			
		||||
  if (src_frame.IsZeroSize())
 | 
			
		||||
    return -1;
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ class TestScaler : public ::testing::Test {
 | 
			
		||||
 | 
			
		||||
  Scaler test_scaler_;
 | 
			
		||||
  FILE* source_file_;
 | 
			
		||||
  I420VideoFrame test_frame_;
 | 
			
		||||
  VideoFrame test_frame_;
 | 
			
		||||
  const int width_;
 | 
			
		||||
  const int half_width_;
 | 
			
		||||
  const int height_;
 | 
			
		||||
@@ -88,7 +88,7 @@ TEST_F(TestScaler, ScaleBadInitialValues) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(TestScaler, ScaleSendingNullSourcePointer) {
 | 
			
		||||
  I420VideoFrame null_src_frame;
 | 
			
		||||
  VideoFrame null_src_frame;
 | 
			
		||||
  EXPECT_EQ(-1, test_scaler_.Scale(null_src_frame, &test_frame_));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -98,7 +98,7 @@ TEST_F(TestScaler, ScaleSendingBufferTooSmall) {
 | 
			
		||||
                                half_width_, half_height_,
 | 
			
		||||
                                kI420, kI420,
 | 
			
		||||
                                kScalePoint));
 | 
			
		||||
  I420VideoFrame test_frame2;
 | 
			
		||||
  VideoFrame test_frame2;
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> orig_buffer(new uint8_t[frame_length_]);
 | 
			
		||||
  EXPECT_GT(fread(orig_buffer.get(), 1, frame_length_, source_file_), 0U);
 | 
			
		||||
  test_frame_.CreateFrame(orig_buffer.get(),
 | 
			
		||||
@@ -296,7 +296,7 @@ double TestScaler::ComputeAvgSequencePSNR(FILE* input_file,
 | 
			
		||||
 | 
			
		||||
  int frame_count = 0;
 | 
			
		||||
  double avg_psnr = 0;
 | 
			
		||||
  I420VideoFrame in_frame, out_frame;
 | 
			
		||||
  VideoFrame in_frame, out_frame;
 | 
			
		||||
  const int half_width = (width + 1) / 2;
 | 
			
		||||
  in_frame.CreateEmptyFrame(width, height, width, half_width, half_width);
 | 
			
		||||
  out_frame.CreateEmptyFrame(width, height, width, half_width, half_width);
 | 
			
		||||
@@ -337,8 +337,8 @@ void TestScaler::ScaleSequence(ScaleMethod method,
 | 
			
		||||
 | 
			
		||||
  rewind(source_file);
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame input_frame;
 | 
			
		||||
  I420VideoFrame output_frame;
 | 
			
		||||
  VideoFrame input_frame;
 | 
			
		||||
  VideoFrame output_frame;
 | 
			
		||||
  int64_t start_clock, total_clock;
 | 
			
		||||
  total_clock = 0;
 | 
			
		||||
  int frame_count = 0;
 | 
			
		||||
@@ -363,7 +363,7 @@ void TestScaler::ScaleSequence(ScaleMethod method,
 | 
			
		||||
    start_clock = TickTime::MillisecondTimestamp();
 | 
			
		||||
    EXPECT_EQ(0, test_scaler_.Scale(input_frame, &output_frame));
 | 
			
		||||
    total_clock += TickTime::MillisecondTimestamp() - start_clock;
 | 
			
		||||
    if (PrintI420VideoFrame(output_frame, output_file) < 0) {
 | 
			
		||||
    if (PrintVideoFrame(output_frame, output_file) < 0) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    frame_count++;
 | 
			
		||||
 
 | 
			
		||||
@@ -102,7 +102,7 @@ size_t CalcBufferSize(VideoType type, int width, int height) {
 | 
			
		||||
  return buffer_size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int PrintI420VideoFrame(const I420VideoFrame& frame, FILE* file) {
 | 
			
		||||
int PrintVideoFrame(const VideoFrame& frame, FILE* file) {
 | 
			
		||||
  if (file == NULL)
 | 
			
		||||
    return -1;
 | 
			
		||||
  if (frame.IsZeroSize())
 | 
			
		||||
@@ -123,8 +123,7 @@ int PrintI420VideoFrame(const I420VideoFrame& frame, FILE* file) {
 | 
			
		||||
 return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ExtractBuffer(const I420VideoFrame& input_frame,
 | 
			
		||||
                  size_t size, uint8_t* buffer) {
 | 
			
		||||
int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer) {
 | 
			
		||||
  assert(buffer);
 | 
			
		||||
  if (input_frame.IsZeroSize())
 | 
			
		||||
    return -1;
 | 
			
		||||
@@ -237,7 +236,7 @@ int ConvertToI420(VideoType src_video_type,
 | 
			
		||||
                  int src_height,
 | 
			
		||||
                  size_t sample_size,
 | 
			
		||||
                  VideoRotation rotation,
 | 
			
		||||
                  I420VideoFrame* dst_frame) {
 | 
			
		||||
                  VideoFrame* dst_frame) {
 | 
			
		||||
  int dst_width = dst_frame->width();
 | 
			
		||||
  int dst_height = dst_frame->height();
 | 
			
		||||
  // LibYuv expects pre-rotation values for dst.
 | 
			
		||||
@@ -260,8 +259,9 @@ int ConvertToI420(VideoType src_video_type,
 | 
			
		||||
                               ConvertVideoType(src_video_type));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ConvertFromI420(const I420VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type, int dst_sample_size,
 | 
			
		||||
int ConvertFromI420(const VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type,
 | 
			
		||||
                    int dst_sample_size,
 | 
			
		||||
                    uint8_t* dst_frame) {
 | 
			
		||||
  return libyuv::ConvertFromI420(src_frame.buffer(kYPlane),
 | 
			
		||||
                                 src_frame.stride(kYPlane),
 | 
			
		||||
@@ -275,8 +275,9 @@ int ConvertFromI420(const I420VideoFrame& src_frame,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO(mikhal): Create a designated VideoFrame for non I420.
 | 
			
		||||
int ConvertFromYV12(const I420VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type, int dst_sample_size,
 | 
			
		||||
int ConvertFromYV12(const VideoFrame& src_frame,
 | 
			
		||||
                    VideoType dst_video_type,
 | 
			
		||||
                    int dst_sample_size,
 | 
			
		||||
                    uint8_t* dst_frame) {
 | 
			
		||||
  // YV12 = Y, V, U
 | 
			
		||||
  return libyuv::ConvertFromI420(src_frame.buffer(kYPlane),
 | 
			
		||||
@@ -291,8 +292,7 @@ int ConvertFromYV12(const I420VideoFrame& src_frame,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Compute PSNR for an I420 frame (all planes)
 | 
			
		||||
double I420PSNR(const I420VideoFrame* ref_frame,
 | 
			
		||||
                const I420VideoFrame* test_frame) {
 | 
			
		||||
double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
 | 
			
		||||
  if (!ref_frame || !test_frame)
 | 
			
		||||
    return -1;
 | 
			
		||||
  else if ((ref_frame->width() !=  test_frame->width()) ||
 | 
			
		||||
@@ -320,8 +320,7 @@ double I420PSNR(const I420VideoFrame* ref_frame,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Compute SSIM for an I420 frame (all planes)
 | 
			
		||||
double I420SSIM(const I420VideoFrame* ref_frame,
 | 
			
		||||
                const I420VideoFrame* test_frame) {
 | 
			
		||||
double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
 | 
			
		||||
  if (!ref_frame || !test_frame)
 | 
			
		||||
    return -1;
 | 
			
		||||
  else if ((ref_frame->width() !=  test_frame->width()) ||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
 | 
			
		||||
namespace webrtc {
 | 
			
		||||
 | 
			
		||||
// Helper class for I420VideoFrame: Store plane data and perform basic plane
 | 
			
		||||
// Helper class for VideoFrame: Store plane data and perform basic plane
 | 
			
		||||
// operations.
 | 
			
		||||
class Plane {
 | 
			
		||||
 public:
 | 
			
		||||
 
 | 
			
		||||
@@ -19,17 +19,16 @@
 | 
			
		||||
 | 
			
		||||
namespace webrtc {
 | 
			
		||||
 | 
			
		||||
I420VideoFrame::I420VideoFrame() {
 | 
			
		||||
VideoFrame::VideoFrame() {
 | 
			
		||||
  // Intentionally using Reset instead of initializer list so that any missed
 | 
			
		||||
  // fields in Reset will be caught by memory checkers.
 | 
			
		||||
  Reset();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
I420VideoFrame::I420VideoFrame(
 | 
			
		||||
    const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
 | 
			
		||||
    uint32_t timestamp,
 | 
			
		||||
    int64_t render_time_ms,
 | 
			
		||||
    VideoRotation rotation)
 | 
			
		||||
VideoFrame::VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
 | 
			
		||||
                       uint32_t timestamp,
 | 
			
		||||
                       int64_t render_time_ms,
 | 
			
		||||
                       VideoRotation rotation)
 | 
			
		||||
    : video_frame_buffer_(buffer),
 | 
			
		||||
      timestamp_(timestamp),
 | 
			
		||||
      ntp_time_ms_(0),
 | 
			
		||||
@@ -37,24 +36,27 @@ I420VideoFrame::I420VideoFrame(
 | 
			
		||||
      rotation_(rotation) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
I420VideoFrame::I420VideoFrame(void* native_handle,
 | 
			
		||||
                               int width,
 | 
			
		||||
                               int height,
 | 
			
		||||
                               uint32_t timestamp,
 | 
			
		||||
                               int64_t render_time_ms,
 | 
			
		||||
                               VideoRotation rotation,
 | 
			
		||||
                               const rtc::Callback0<void>& no_longer_used)
 | 
			
		||||
    : I420VideoFrame(new rtc::RefCountedObject<TextureBuffer>(native_handle,
 | 
			
		||||
                                                              width,
 | 
			
		||||
                                                              height,
 | 
			
		||||
                                                              no_longer_used),
 | 
			
		||||
                     timestamp,
 | 
			
		||||
                     render_time_ms,
 | 
			
		||||
                     rotation) {
 | 
			
		||||
VideoFrame::VideoFrame(void* native_handle,
 | 
			
		||||
                       int width,
 | 
			
		||||
                       int height,
 | 
			
		||||
                       uint32_t timestamp,
 | 
			
		||||
                       int64_t render_time_ms,
 | 
			
		||||
                       VideoRotation rotation,
 | 
			
		||||
                       const rtc::Callback0<void>& no_longer_used)
 | 
			
		||||
    : VideoFrame(new rtc::RefCountedObject<TextureBuffer>(native_handle,
 | 
			
		||||
                                                          width,
 | 
			
		||||
                                                          height,
 | 
			
		||||
                                                          no_longer_used),
 | 
			
		||||
                 timestamp,
 | 
			
		||||
                 render_time_ms,
 | 
			
		||||
                 rotation) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::CreateEmptyFrame(int width, int height,
 | 
			
		||||
                                     int stride_y, int stride_u, int stride_v) {
 | 
			
		||||
int VideoFrame::CreateEmptyFrame(int width,
 | 
			
		||||
                                 int height,
 | 
			
		||||
                                 int stride_y,
 | 
			
		||||
                                 int stride_u,
 | 
			
		||||
                                 int stride_v) {
 | 
			
		||||
  const int half_width = (width + 1) / 2;
 | 
			
		||||
  DCHECK_GT(width, 0);
 | 
			
		||||
  DCHECK_GT(height, 0);
 | 
			
		||||
@@ -69,14 +71,11 @@ int I420VideoFrame::CreateEmptyFrame(int width, int height,
 | 
			
		||||
  rotation_ = kVideoRotation_0;
 | 
			
		||||
 | 
			
		||||
  // Check if it's safe to reuse allocation.
 | 
			
		||||
  if (video_frame_buffer_ &&
 | 
			
		||||
      video_frame_buffer_->HasOneRef() &&
 | 
			
		||||
  if (video_frame_buffer_ && video_frame_buffer_->HasOneRef() &&
 | 
			
		||||
      !video_frame_buffer_->native_handle() &&
 | 
			
		||||
      width == video_frame_buffer_->width() &&
 | 
			
		||||
      height == video_frame_buffer_->height() &&
 | 
			
		||||
      stride_y == stride(kYPlane) &&
 | 
			
		||||
      stride_u == stride(kUPlane) &&
 | 
			
		||||
      stride_v == stride(kVPlane)) {
 | 
			
		||||
      height == video_frame_buffer_->height() && stride_y == stride(kYPlane) &&
 | 
			
		||||
      stride_u == stride(kUPlane) && stride_v == stride(kVPlane)) {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -86,27 +85,27 @@ int I420VideoFrame::CreateEmptyFrame(int width, int height,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::CreateFrame(const uint8_t* buffer_y,
 | 
			
		||||
                                const uint8_t* buffer_u,
 | 
			
		||||
                                const uint8_t* buffer_v,
 | 
			
		||||
                                int width, int height,
 | 
			
		||||
                                int stride_y,
 | 
			
		||||
                                int stride_u,
 | 
			
		||||
                                int stride_v) {
 | 
			
		||||
  return CreateFrame(buffer_y, buffer_u, buffer_v,
 | 
			
		||||
                     width, height, stride_y, stride_u, stride_v,
 | 
			
		||||
                     kVideoRotation_0);
 | 
			
		||||
int VideoFrame::CreateFrame(const uint8_t* buffer_y,
 | 
			
		||||
                            const uint8_t* buffer_u,
 | 
			
		||||
                            const uint8_t* buffer_v,
 | 
			
		||||
                            int width,
 | 
			
		||||
                            int height,
 | 
			
		||||
                            int stride_y,
 | 
			
		||||
                            int stride_u,
 | 
			
		||||
                            int stride_v) {
 | 
			
		||||
  return CreateFrame(buffer_y, buffer_u, buffer_v, width, height, stride_y,
 | 
			
		||||
                     stride_u, stride_v, kVideoRotation_0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::CreateFrame(const uint8_t* buffer_y,
 | 
			
		||||
                                const uint8_t* buffer_u,
 | 
			
		||||
                                const uint8_t* buffer_v,
 | 
			
		||||
                                int width,
 | 
			
		||||
                                int height,
 | 
			
		||||
                                int stride_y,
 | 
			
		||||
                                int stride_u,
 | 
			
		||||
                                int stride_v,
 | 
			
		||||
                                VideoRotation rotation) {
 | 
			
		||||
int VideoFrame::CreateFrame(const uint8_t* buffer_y,
 | 
			
		||||
                            const uint8_t* buffer_u,
 | 
			
		||||
                            const uint8_t* buffer_v,
 | 
			
		||||
                            int width,
 | 
			
		||||
                            int height,
 | 
			
		||||
                            int stride_y,
 | 
			
		||||
                            int stride_u,
 | 
			
		||||
                            int stride_v,
 | 
			
		||||
                            VideoRotation rotation) {
 | 
			
		||||
  const int half_height = (height + 1) / 2;
 | 
			
		||||
  const int expected_size_y = height * stride_y;
 | 
			
		||||
  const int expected_size_u = half_height * stride_u;
 | 
			
		||||
@@ -119,10 +118,10 @@ int I420VideoFrame::CreateFrame(const uint8_t* buffer_y,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::CreateFrame(const uint8_t* buffer,
 | 
			
		||||
                                int width,
 | 
			
		||||
                                int height,
 | 
			
		||||
                                VideoRotation rotation) {
 | 
			
		||||
int VideoFrame::CreateFrame(const uint8_t* buffer,
 | 
			
		||||
                            int width,
 | 
			
		||||
                            int height,
 | 
			
		||||
                            VideoRotation rotation) {
 | 
			
		||||
  const int stride_y = width;
 | 
			
		||||
  const int stride_uv = (width + 1) / 2;
 | 
			
		||||
 | 
			
		||||
@@ -133,7 +132,7 @@ int I420VideoFrame::CreateFrame(const uint8_t* buffer,
 | 
			
		||||
                     stride_uv, stride_uv, rotation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::CopyFrame(const I420VideoFrame& videoFrame) {
 | 
			
		||||
int VideoFrame::CopyFrame(const VideoFrame& videoFrame) {
 | 
			
		||||
  if (videoFrame.IsZeroSize()) {
 | 
			
		||||
    video_frame_buffer_ = nullptr;
 | 
			
		||||
  } else if (videoFrame.native_handle()) {
 | 
			
		||||
@@ -152,7 +151,7 @@ int I420VideoFrame::CopyFrame(const I420VideoFrame& videoFrame) {
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void I420VideoFrame::ShallowCopy(const I420VideoFrame& videoFrame) {
 | 
			
		||||
void VideoFrame::ShallowCopy(const VideoFrame& videoFrame) {
 | 
			
		||||
  video_frame_buffer_ = videoFrame.video_frame_buffer();
 | 
			
		||||
  timestamp_ = videoFrame.timestamp_;
 | 
			
		||||
  ntp_time_ms_ = videoFrame.ntp_time_ms_;
 | 
			
		||||
@@ -160,7 +159,7 @@ void I420VideoFrame::ShallowCopy(const I420VideoFrame& videoFrame) {
 | 
			
		||||
  rotation_ = videoFrame.rotation_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void I420VideoFrame::Reset() {
 | 
			
		||||
void VideoFrame::Reset() {
 | 
			
		||||
  video_frame_buffer_ = nullptr;
 | 
			
		||||
  timestamp_ = 0;
 | 
			
		||||
  ntp_time_ms_ = 0;
 | 
			
		||||
@@ -168,47 +167,46 @@ void I420VideoFrame::Reset() {
 | 
			
		||||
  rotation_ = kVideoRotation_0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t* I420VideoFrame::buffer(PlaneType type) {
 | 
			
		||||
uint8_t* VideoFrame::buffer(PlaneType type) {
 | 
			
		||||
  return video_frame_buffer_ ? video_frame_buffer_->data(type) : nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const uint8_t* I420VideoFrame::buffer(PlaneType type) const {
 | 
			
		||||
const uint8_t* VideoFrame::buffer(PlaneType type) const {
 | 
			
		||||
  // Const cast to call the correct const-version of data.
 | 
			
		||||
  const VideoFrameBuffer* const_buffer = video_frame_buffer_.get();
 | 
			
		||||
  return const_buffer ? const_buffer->data(type) : nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::allocated_size(PlaneType type) const {
 | 
			
		||||
int VideoFrame::allocated_size(PlaneType type) const {
 | 
			
		||||
  const int plane_height = (type == kYPlane) ? height() : (height() + 1) / 2;
 | 
			
		||||
  return plane_height * stride(type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::stride(PlaneType type) const {
 | 
			
		||||
int VideoFrame::stride(PlaneType type) const {
 | 
			
		||||
  return video_frame_buffer_ ? video_frame_buffer_->stride(type) : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::width() const {
 | 
			
		||||
int VideoFrame::width() const {
 | 
			
		||||
  return video_frame_buffer_ ? video_frame_buffer_->width() : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int I420VideoFrame::height() const {
 | 
			
		||||
int VideoFrame::height() const {
 | 
			
		||||
  return video_frame_buffer_ ? video_frame_buffer_->height() : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool I420VideoFrame::IsZeroSize() const {
 | 
			
		||||
bool VideoFrame::IsZeroSize() const {
 | 
			
		||||
  return !video_frame_buffer_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* I420VideoFrame::native_handle() const {
 | 
			
		||||
void* VideoFrame::native_handle() const {
 | 
			
		||||
  return video_frame_buffer_ ? video_frame_buffer_->native_handle() : nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rtc::scoped_refptr<VideoFrameBuffer> I420VideoFrame::video_frame_buffer()
 | 
			
		||||
    const {
 | 
			
		||||
rtc::scoped_refptr<VideoFrameBuffer> VideoFrame::video_frame_buffer() const {
 | 
			
		||||
  return video_frame_buffer_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void I420VideoFrame::set_video_frame_buffer(
 | 
			
		||||
void VideoFrame::set_video_frame_buffer(
 | 
			
		||||
    const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer) {
 | 
			
		||||
  video_frame_buffer_ = buffer;
 | 
			
		||||
}
 | 
			
		||||
@@ -26,7 +26,7 @@ VideoRenderFrames::VideoRenderFrames()
 | 
			
		||||
    : render_delay_ms_(10) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoRenderFrames::AddFrame(const I420VideoFrame& new_frame) {
 | 
			
		||||
int32_t VideoRenderFrames::AddFrame(const VideoFrame& new_frame) {
 | 
			
		||||
  const int64_t time_now = TickTime::MillisecondTimestamp();
 | 
			
		||||
 | 
			
		||||
  // Drop old frames only when there are other frames in the queue, otherwise, a
 | 
			
		||||
@@ -53,8 +53,8 @@ int32_t VideoRenderFrames::AddFrame(const I420VideoFrame& new_frame) {
 | 
			
		||||
  return static_cast<int32_t>(incoming_frames_.size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
I420VideoFrame VideoRenderFrames::FrameToRender() {
 | 
			
		||||
  I420VideoFrame render_frame;
 | 
			
		||||
VideoFrame VideoRenderFrames::FrameToRender() {
 | 
			
		||||
  VideoFrame render_frame;
 | 
			
		||||
  // Get the newest frame that can be released for rendering.
 | 
			
		||||
  while (!incoming_frames_.empty() && TimeToNextFrameRelease() <= 0) {
 | 
			
		||||
    render_frame = incoming_frames_.front();
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,10 @@ class VideoRenderFrames {
 | 
			
		||||
  VideoRenderFrames();
 | 
			
		||||
 | 
			
		||||
  // Add a frame to the render queue
 | 
			
		||||
  int32_t AddFrame(const I420VideoFrame& new_frame);
 | 
			
		||||
  int32_t AddFrame(const VideoFrame& new_frame);
 | 
			
		||||
 | 
			
		||||
  // Get a frame for rendering, or a zero-size frame if it's not time to render.
 | 
			
		||||
  I420VideoFrame FrameToRender();
 | 
			
		||||
  VideoFrame FrameToRender();
 | 
			
		||||
 | 
			
		||||
  // Releases all frames
 | 
			
		||||
  int32_t ReleaseAllFrames();
 | 
			
		||||
@@ -48,7 +48,7 @@ class VideoRenderFrames {
 | 
			
		||||
  enum { KFutureRenderTimestampMS = 10000 };
 | 
			
		||||
 | 
			
		||||
  // Sorted list with framed to be rendered, oldest first.
 | 
			
		||||
  std::list<I420VideoFrame> incoming_frames_;
 | 
			
		||||
  std::list<VideoFrame> incoming_frames_;
 | 
			
		||||
 | 
			
		||||
  // Estimated delay from a frame is released until it's rendered.
 | 
			
		||||
  uint32_t render_delay_ms_;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
 | 
			
		||||
namespace webrtc {
 | 
			
		||||
 | 
			
		||||
class I420VideoFrame;
 | 
			
		||||
class VideoFrame;
 | 
			
		||||
 | 
			
		||||
struct EncodedFrame {
 | 
			
		||||
 public:
 | 
			
		||||
@@ -34,7 +34,7 @@ class I420FrameCallback {
 | 
			
		||||
 public:
 | 
			
		||||
  // This function is called with a I420 frame allowing the user to modify the
 | 
			
		||||
  // frame content.
 | 
			
		||||
  virtual void FrameCallback(I420VideoFrame* video_frame) = 0;
 | 
			
		||||
  virtual void FrameCallback(VideoFrame* video_frame) = 0;
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  virtual ~I420FrameCallback() {}
 | 
			
		||||
 
 | 
			
		||||
@@ -93,15 +93,16 @@ public:
 | 
			
		||||
    virtual int32_t video_codec_info(VideoCodec& /*videoCodec*/) const
 | 
			
		||||
    {return -1;}
 | 
			
		||||
 | 
			
		||||
    virtual int32_t GetVideoFromFile(I420VideoFrame& /*videoFrame*/)
 | 
			
		||||
    { return -1;}
 | 
			
		||||
    virtual int32_t GetVideoFromFile(VideoFrame& /*videoFrame*/) { return -1; }
 | 
			
		||||
 | 
			
		||||
    // Same as GetVideoFromFile(). videoFrame will have the resolution specified
 | 
			
		||||
    // by the width outWidth and height outHeight in pixels.
 | 
			
		||||
    virtual int32_t GetVideoFromFile(I420VideoFrame& /*videoFrame*/,
 | 
			
		||||
    virtual int32_t GetVideoFromFile(VideoFrame& /*videoFrame*/,
 | 
			
		||||
                                     const uint32_t /*outWidth*/,
 | 
			
		||||
                                     const uint32_t /*outHeight*/)
 | 
			
		||||
    {return -1;}
 | 
			
		||||
                                     const uint32_t /*outHeight*/) {
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    virtual ~FilePlayer() {}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -78,8 +78,7 @@ public:
 | 
			
		||||
        bool videoOnly = false) = 0;
 | 
			
		||||
 | 
			
		||||
    // Record the video frame in videoFrame to AVI file.
 | 
			
		||||
    virtual int32_t RecordVideoToFile(
 | 
			
		||||
        const I420VideoFrame& videoFrame) = 0;
 | 
			
		||||
    virtual int32_t RecordVideoToFile(const VideoFrame& videoFrame) = 0;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    virtual ~FileRecorder() {}
 | 
			
		||||
 
 | 
			
		||||
@@ -72,8 +72,7 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    virtual int32_t RecordVideoToFile(const I420VideoFrame& videoFrame)
 | 
			
		||||
    {
 | 
			
		||||
    virtual int32_t RecordVideoToFile(const VideoFrame& videoFrame) {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -94,8 +94,8 @@ protected:
 | 
			
		||||
class VideoCaptureDataCallback
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    virtual void OnIncomingCapturedFrame(const int32_t id,
 | 
			
		||||
                                         const I420VideoFrame& videoFrame) = 0;
 | 
			
		||||
 virtual void OnIncomingCapturedFrame(const int32_t id,
 | 
			
		||||
                                      const VideoFrame& videoFrame) = 0;
 | 
			
		||||
    virtual void OnCaptureDelayChanged(const int32_t id,
 | 
			
		||||
                                       const int32_t delay) = 0;
 | 
			
		||||
protected:
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@ static const int kTestWidth = 352;
 | 
			
		||||
static const int kTestFramerate = 30;
 | 
			
		||||
 | 
			
		||||
// Compares the content of two video frames.
 | 
			
		||||
static bool CompareFrames(const webrtc::I420VideoFrame& frame1,
 | 
			
		||||
                          const webrtc::I420VideoFrame& frame2) {
 | 
			
		||||
static bool CompareFrames(const webrtc::VideoFrame& frame1,
 | 
			
		||||
                          const webrtc::VideoFrame& frame2) {
 | 
			
		||||
  bool result =
 | 
			
		||||
      (frame1.stride(webrtc::kYPlane) == frame2.stride(webrtc::kYPlane)) &&
 | 
			
		||||
      (frame1.stride(webrtc::kUPlane) == frame2.stride(webrtc::kUPlane)) &&
 | 
			
		||||
@@ -104,9 +104,8 @@ class TestVideoCaptureCallback : public VideoCaptureDataCallback {
 | 
			
		||||
      printf("No of timing warnings %d\n", timing_warnings_);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual void OnIncomingCapturedFrame(
 | 
			
		||||
      const int32_t id,
 | 
			
		||||
      const webrtc::I420VideoFrame& videoFrame) {
 | 
			
		||||
  virtual void OnIncomingCapturedFrame(const int32_t id,
 | 
			
		||||
                                       const webrtc::VideoFrame& videoFrame) {
 | 
			
		||||
    CriticalSectionScoped cs(capture_cs_.get());
 | 
			
		||||
    int height = videoFrame.height();
 | 
			
		||||
    int width = videoFrame.width();
 | 
			
		||||
@@ -175,7 +174,7 @@ class TestVideoCaptureCallback : public VideoCaptureDataCallback {
 | 
			
		||||
    return capability_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool CompareLastFrame(const webrtc::I420VideoFrame& frame) {
 | 
			
		||||
  bool CompareLastFrame(const webrtc::VideoFrame& frame) {
 | 
			
		||||
    CriticalSectionScoped cs(capture_cs_.get());
 | 
			
		||||
    return CompareFrames(last_frame_, frame);
 | 
			
		||||
  }
 | 
			
		||||
@@ -192,7 +191,7 @@ class TestVideoCaptureCallback : public VideoCaptureDataCallback {
 | 
			
		||||
  int64_t last_render_time_ms_;
 | 
			
		||||
  int incoming_frames_;
 | 
			
		||||
  int timing_warnings_;
 | 
			
		||||
  webrtc::I420VideoFrame last_frame_;
 | 
			
		||||
  webrtc::VideoFrame last_frame_;
 | 
			
		||||
  webrtc::VideoRotation rotate_frame_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -463,7 +462,7 @@ class VideoCaptureExternalTest : public testing::Test {
 | 
			
		||||
  webrtc::VideoCaptureExternal* capture_input_interface_;
 | 
			
		||||
  webrtc::scoped_refptr<VideoCaptureModule> capture_module_;
 | 
			
		||||
  rtc::scoped_ptr<webrtc::ProcessThread> process_module_;
 | 
			
		||||
  webrtc::I420VideoFrame test_frame_;
 | 
			
		||||
  webrtc::VideoFrame test_frame_;
 | 
			
		||||
  TestVideoCaptureCallback capture_callback_;
 | 
			
		||||
  TestVideoCaptureFeedBack capture_feedback_;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -211,7 +211,7 @@ int32_t VideoCaptureImpl::CaptureDelay()
 | 
			
		||||
    return _setCaptureDelay;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoCaptureImpl::DeliverCapturedFrame(I420VideoFrame& captureFrame) {
 | 
			
		||||
int32_t VideoCaptureImpl::DeliverCapturedFrame(VideoFrame& captureFrame) {
 | 
			
		||||
  UpdateFrameCount();  // frame count used for local frame rate callback.
 | 
			
		||||
 | 
			
		||||
  const bool callOnCaptureDelayChanged = _setCaptureDelay != _captureDelay;
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ public:
 | 
			
		||||
protected:
 | 
			
		||||
    VideoCaptureImpl(const int32_t id);
 | 
			
		||||
    virtual ~VideoCaptureImpl();
 | 
			
		||||
    int32_t DeliverCapturedFrame(I420VideoFrame& captureFrame);
 | 
			
		||||
    int32_t DeliverCapturedFrame(VideoFrame& captureFrame);
 | 
			
		||||
 | 
			
		||||
    int32_t _id; // Module ID
 | 
			
		||||
    char* _deviceUniqueId; // current Device unique name;
 | 
			
		||||
@@ -132,7 +132,7 @@ private:
 | 
			
		||||
    VideoRotation _rotateFrame;  // Set if the frame should be rotated by the
 | 
			
		||||
                                 // capture module.
 | 
			
		||||
 | 
			
		||||
    I420VideoFrame _captureFrame;
 | 
			
		||||
    VideoFrame _captureFrame;
 | 
			
		||||
 | 
			
		||||
    // Indicate whether rotation should be applied before delivered externally.
 | 
			
		||||
    bool apply_rotation_;
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ class I420Encoder : public VideoEncoder {
 | 
			
		||||
//
 | 
			
		||||
// Return value                 : WEBRTC_VIDEO_CODEC_OK if OK.
 | 
			
		||||
//                                <0 - Error
 | 
			
		||||
  int Encode(const I420VideoFrame& inputImage,
 | 
			
		||||
  int Encode(const VideoFrame& inputImage,
 | 
			
		||||
             const CodecSpecificInfo* /*codecSpecificInfo*/,
 | 
			
		||||
             const std::vector<VideoFrameType>* /*frame_types*/) override;
 | 
			
		||||
 | 
			
		||||
@@ -145,7 +145,7 @@ class I420Decoder : public VideoDecoder {
 | 
			
		||||
                                      uint16_t* width,
 | 
			
		||||
                                      uint16_t* height);
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame              _decodedImage;
 | 
			
		||||
  VideoFrame _decodedImage;
 | 
			
		||||
  int                         _width;
 | 
			
		||||
  int                         _height;
 | 
			
		||||
  bool                        _inited;
 | 
			
		||||
 
 | 
			
		||||
@@ -72,9 +72,7 @@ int I420Encoder::InitEncode(const VideoCodec* codecSettings,
 | 
			
		||||
  return WEBRTC_VIDEO_CODEC_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int I420Encoder::Encode(const I420VideoFrame& inputImage,
 | 
			
		||||
int I420Encoder::Encode(const VideoFrame& inputImage,
 | 
			
		||||
                        const CodecSpecificInfo* /*codecSpecificInfo*/,
 | 
			
		||||
                        const std::vector<VideoFrameType>* /*frame_types*/) {
 | 
			
		||||
  if (!_inited) {
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,10 @@ class MockVideoEncoder : public VideoEncoder {
 | 
			
		||||
  MOCK_METHOD3(InitEncode, int32_t(const VideoCodec* codecSettings,
 | 
			
		||||
                                   int32_t numberOfCores,
 | 
			
		||||
                                   size_t maxPayloadSize));
 | 
			
		||||
  MOCK_METHOD3(Encode, int32_t(const I420VideoFrame& inputImage,
 | 
			
		||||
                               const CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                               const std::vector<VideoFrameType>* frame_types));
 | 
			
		||||
  MOCK_METHOD3(Encode,
 | 
			
		||||
               int32_t(const VideoFrame& inputImage,
 | 
			
		||||
                       const CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                       const std::vector<VideoFrameType>* frame_types));
 | 
			
		||||
  MOCK_METHOD1(RegisterEncodeCompleteCallback,
 | 
			
		||||
               int32_t(EncodedImageCallback* callback));
 | 
			
		||||
  MOCK_METHOD0(Release, int32_t());
 | 
			
		||||
@@ -48,8 +49,7 @@ class MockVideoEncoder : public VideoEncoder {
 | 
			
		||||
 | 
			
		||||
class MockDecodedImageCallback : public DecodedImageCallback {
 | 
			
		||||
 public:
 | 
			
		||||
  MOCK_METHOD1(Decoded,
 | 
			
		||||
               int32_t(I420VideoFrame& decodedImage));
 | 
			
		||||
  MOCK_METHOD1(Decoded, int32_t(VideoFrame& decodedImage));
 | 
			
		||||
  MOCK_METHOD1(ReceivedDecodedReferenceFrame,
 | 
			
		||||
               int32_t(const uint64_t pictureId));
 | 
			
		||||
  MOCK_METHOD1(ReceivedDecodedFrame,
 | 
			
		||||
 
 | 
			
		||||
@@ -292,7 +292,7 @@ void VideoProcessorImpl::FrameEncoded(const EncodedImage& encoded_image) {
 | 
			
		||||
  last_frame_missing_ = copied_image._length == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VideoProcessorImpl::FrameDecoded(const I420VideoFrame& image) {
 | 
			
		||||
void VideoProcessorImpl::FrameDecoded(const VideoFrame& image) {
 | 
			
		||||
  TickTime decode_stop = TickTime::Now();
 | 
			
		||||
  int frame_number = image.timestamp();
 | 
			
		||||
  // Report stats
 | 
			
		||||
@@ -312,7 +312,7 @@ void VideoProcessorImpl::FrameDecoded(const I420VideoFrame& image) {
 | 
			
		||||
  // upsample back to original size: needed for PSNR and SSIM computations.
 | 
			
		||||
  if (image.width() !=  config_.codec_settings->width ||
 | 
			
		||||
      image.height() != config_.codec_settings->height) {
 | 
			
		||||
    I420VideoFrame up_image;
 | 
			
		||||
    VideoFrame up_image;
 | 
			
		||||
    int ret_val = scaler_.Set(image.width(), image.height(),
 | 
			
		||||
                              config_.codec_settings->width,
 | 
			
		||||
                              config_.codec_settings->height,
 | 
			
		||||
@@ -404,9 +404,8 @@ VideoProcessorImpl::VideoProcessorEncodeCompleteCallback::Encoded(
 | 
			
		||||
  video_processor_->FrameEncoded(encoded_image);  // Forward to parent class.
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
int32_t
 | 
			
		||||
VideoProcessorImpl::VideoProcessorDecodeCompleteCallback::Decoded(
 | 
			
		||||
    I420VideoFrame& image) {
 | 
			
		||||
int32_t VideoProcessorImpl::VideoProcessorDecodeCompleteCallback::Decoded(
 | 
			
		||||
    VideoFrame& image) {
 | 
			
		||||
  video_processor_->FrameDecoded(image);  // forward to parent class
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -170,7 +170,7 @@ class VideoProcessorImpl : public VideoProcessor {
 | 
			
		||||
  // Invoked by the callback when a frame has completed encoding.
 | 
			
		||||
  void FrameEncoded(const webrtc::EncodedImage& encodedImage);
 | 
			
		||||
  // Invoked by the callback when a frame has completed decoding.
 | 
			
		||||
  void FrameDecoded(const webrtc::I420VideoFrame& image);
 | 
			
		||||
  void FrameDecoded(const webrtc::VideoFrame& image);
 | 
			
		||||
  // Used for getting a 32-bit integer representing time
 | 
			
		||||
  // (checks the size is within signed 32-bit bounds before casting it)
 | 
			
		||||
  int GetElapsedTimeMicroseconds(const webrtc::TickTime& start,
 | 
			
		||||
@@ -199,7 +199,7 @@ class VideoProcessorImpl : public VideoProcessor {
 | 
			
		||||
  // Keep track of the last successful frame, since we need to write that
 | 
			
		||||
  // when decoding fails:
 | 
			
		||||
  uint8_t* last_successful_frame_buffer_;
 | 
			
		||||
  webrtc::I420VideoFrame source_frame_;
 | 
			
		||||
  webrtc::VideoFrame source_frame_;
 | 
			
		||||
  // To keep track of if we have excluded the first key frame from packet loss:
 | 
			
		||||
  bool first_key_frame_has_been_excluded_;
 | 
			
		||||
  // To tell the decoder previous frame have been dropped due to packet loss:
 | 
			
		||||
@@ -241,7 +241,7 @@ class VideoProcessorImpl : public VideoProcessor {
 | 
			
		||||
      explicit VideoProcessorDecodeCompleteCallback(VideoProcessorImpl* vp)
 | 
			
		||||
      : video_processor_(vp) {
 | 
			
		||||
    }
 | 
			
		||||
      int32_t Decoded(webrtc::I420VideoFrame& image) override;
 | 
			
		||||
      int32_t Decoded(webrtc::VideoFrame& image) override;
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    VideoProcessorImpl* video_processor_;
 | 
			
		||||
 
 | 
			
		||||
@@ -233,7 +233,7 @@ int SimulcastEncoderAdapter::InitEncode(const VideoCodec* inst,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int SimulcastEncoderAdapter::Encode(
 | 
			
		||||
    const I420VideoFrame& input_image,
 | 
			
		||||
    const VideoFrame& input_image,
 | 
			
		||||
    const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
    const std::vector<VideoFrameType>* frame_types) {
 | 
			
		||||
  if (!Initialized()) {
 | 
			
		||||
@@ -286,7 +286,7 @@ int SimulcastEncoderAdapter::Encode(
 | 
			
		||||
                                               codec_specific_info,
 | 
			
		||||
                                               &stream_frame_types);
 | 
			
		||||
    } else {
 | 
			
		||||
      I420VideoFrame dst_frame;
 | 
			
		||||
      VideoFrame dst_frame;
 | 
			
		||||
      // Making sure that destination frame is of sufficient size.
 | 
			
		||||
      // Aligning stride values based on width.
 | 
			
		||||
      dst_frame.CreateEmptyFrame(dst_width, dst_height,
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ class SimulcastEncoderAdapter : public VP8Encoder {
 | 
			
		||||
  int InitEncode(const VideoCodec* inst,
 | 
			
		||||
                 int number_of_cores,
 | 
			
		||||
                 size_t max_payload_size) override;
 | 
			
		||||
  int Encode(const I420VideoFrame& input_image,
 | 
			
		||||
  int Encode(const VideoFrame& input_image,
 | 
			
		||||
             const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
             const std::vector<VideoFrameType>* frame_types) override;
 | 
			
		||||
  int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
 | 
			
		||||
 
 | 
			
		||||
@@ -115,9 +115,11 @@ class MockVideoEncoder : public VideoEncoder {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int32_t Encode(const I420VideoFrame& inputImage,
 | 
			
		||||
  int32_t Encode(const VideoFrame& inputImage,
 | 
			
		||||
                 const CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                 const std::vector<VideoFrameType>* frame_types) { return 0; }
 | 
			
		||||
                 const std::vector<VideoFrameType>* frame_types) {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int32_t RegisterEncodeCompleteCallback(EncodedImageCallback* callback) {
 | 
			
		||||
    callback_ = callback;
 | 
			
		||||
 
 | 
			
		||||
@@ -124,7 +124,7 @@ class Vp8TestDecodedImageCallback : public DecodedImageCallback {
 | 
			
		||||
  Vp8TestDecodedImageCallback()
 | 
			
		||||
      : decoded_frames_(0) {
 | 
			
		||||
  }
 | 
			
		||||
  virtual int32_t Decoded(I420VideoFrame& decoded_image) {
 | 
			
		||||
  virtual int32_t Decoded(VideoFrame& decoded_image) {
 | 
			
		||||
    for (int i = 0; i < decoded_image.width(); ++i) {
 | 
			
		||||
      EXPECT_NEAR(kColorY, decoded_image.buffer(kYPlane)[i], 1);
 | 
			
		||||
    }
 | 
			
		||||
@@ -228,9 +228,8 @@ class TestVp8Simulcast : public ::testing::Test {
 | 
			
		||||
     : encoder_(encoder),
 | 
			
		||||
       decoder_(decoder) {}
 | 
			
		||||
 | 
			
		||||
  // Creates an I420VideoFrame from |plane_colors|.
 | 
			
		||||
  static void CreateImage(I420VideoFrame* frame,
 | 
			
		||||
                          int plane_colors[kNumOfPlanes]) {
 | 
			
		||||
  // Creates an VideoFrame from |plane_colors|.
 | 
			
		||||
  static void CreateImage(VideoFrame* frame, int plane_colors[kNumOfPlanes]) {
 | 
			
		||||
    for (int plane_num = 0; plane_num < kNumOfPlanes; ++plane_num) {
 | 
			
		||||
      int width = (plane_num != kYPlane ? (frame->width() + 1) / 2 :
 | 
			
		||||
        frame->width());
 | 
			
		||||
@@ -995,7 +994,7 @@ class TestVp8Simulcast : public ::testing::Test {
 | 
			
		||||
  rtc::scoped_ptr<VP8Decoder> decoder_;
 | 
			
		||||
  MockDecodedImageCallback decoder_callback_;
 | 
			
		||||
  VideoCodec settings_;
 | 
			
		||||
  I420VideoFrame input_frame_;
 | 
			
		||||
  VideoFrame input_frame_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace testing
 | 
			
		||||
 
 | 
			
		||||
@@ -76,13 +76,13 @@ bool Vp8UnitTestEncodeCompleteCallback::EncodeComplete() {
 | 
			
		||||
 | 
			
		||||
class Vp8UnitTestDecodeCompleteCallback : public webrtc::DecodedImageCallback {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit Vp8UnitTestDecodeCompleteCallback(I420VideoFrame* frame)
 | 
			
		||||
  explicit Vp8UnitTestDecodeCompleteCallback(VideoFrame* frame)
 | 
			
		||||
      : decoded_frame_(frame), decode_complete(false) {}
 | 
			
		||||
  int Decoded(webrtc::I420VideoFrame& frame);
 | 
			
		||||
  int Decoded(webrtc::VideoFrame& frame);
 | 
			
		||||
  bool DecodeComplete();
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  I420VideoFrame* decoded_frame_;
 | 
			
		||||
  VideoFrame* decoded_frame_;
 | 
			
		||||
  bool decode_complete;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -94,7 +94,7 @@ bool Vp8UnitTestDecodeCompleteCallback::DecodeComplete() {
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Vp8UnitTestDecodeCompleteCallback::Decoded(I420VideoFrame& image) {
 | 
			
		||||
int Vp8UnitTestDecodeCompleteCallback::Decoded(VideoFrame& image) {
 | 
			
		||||
  decoded_frame_->CopyFrame(image);
 | 
			
		||||
  decode_complete = true;
 | 
			
		||||
  return 0;
 | 
			
		||||
@@ -181,11 +181,11 @@ class TestVp8Impl : public ::testing::Test {
 | 
			
		||||
  rtc::scoped_ptr<Vp8UnitTestDecodeCompleteCallback> decode_complete_callback_;
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> source_buffer_;
 | 
			
		||||
  FILE* source_file_;
 | 
			
		||||
  I420VideoFrame input_frame_;
 | 
			
		||||
  VideoFrame input_frame_;
 | 
			
		||||
  rtc::scoped_ptr<VideoEncoder> encoder_;
 | 
			
		||||
  rtc::scoped_ptr<VideoDecoder> decoder_;
 | 
			
		||||
  EncodedImage encoded_frame_;
 | 
			
		||||
  I420VideoFrame decoded_frame_;
 | 
			
		||||
  VideoFrame decoded_frame_;
 | 
			
		||||
  size_t length_source_frame_;
 | 
			
		||||
  VideoCodec codec_inst_;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -713,10 +713,9 @@ uint32_t VP8EncoderImpl::MaxIntraTarget(uint32_t optimalBuffersize) {
 | 
			
		||||
  return (targetPct < minIntraTh) ? minIntraTh: targetPct;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int VP8EncoderImpl::Encode(
 | 
			
		||||
    const I420VideoFrame& frame,
 | 
			
		||||
    const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
    const std::vector<VideoFrameType>* frame_types) {
 | 
			
		||||
int VP8EncoderImpl::Encode(const VideoFrame& frame,
 | 
			
		||||
                           const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
                           const std::vector<VideoFrameType>* frame_types) {
 | 
			
		||||
  TRACE_EVENT1("webrtc", "VP8::Encode", "timestamp", frame.timestamp());
 | 
			
		||||
 | 
			
		||||
  if (!inited_) {
 | 
			
		||||
@@ -734,7 +733,7 @@ int VP8EncoderImpl::Encode(
 | 
			
		||||
  const bool use_quality_scaler = encoders_.size() == 1 &&
 | 
			
		||||
                                  configurations_[0].rc_dropframe_thresh > 0 &&
 | 
			
		||||
                                  codec_.codecSpecific.VP8.automaticResizeOn;
 | 
			
		||||
  const I420VideoFrame& input_image =
 | 
			
		||||
  const VideoFrame& input_image =
 | 
			
		||||
      use_quality_scaler ? quality_scaler_.GetScaledFrame(frame) : frame;
 | 
			
		||||
 | 
			
		||||
  if (use_quality_scaler && (input_image.width() != codec_.width ||
 | 
			
		||||
@@ -902,8 +901,7 @@ int VP8EncoderImpl::Encode(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO(pbos): Make sure this works for properly for >1 encoders.
 | 
			
		||||
int VP8EncoderImpl::UpdateCodecFrameSize(
 | 
			
		||||
    const I420VideoFrame& input_image) {
 | 
			
		||||
int VP8EncoderImpl::UpdateCodecFrameSize(const VideoFrame& input_image) {
 | 
			
		||||
  codec_.width = input_image.width();
 | 
			
		||||
  codec_.height = input_image.height();
 | 
			
		||||
  // Update the cpu_speed setting for resolution change.
 | 
			
		||||
@@ -952,9 +950,8 @@ void VP8EncoderImpl::PopulateCodecSpecific(
 | 
			
		||||
  picture_id_[stream_idx] = (picture_id_[stream_idx] + 1) & 0x7FFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int VP8EncoderImpl::GetEncodedPartitions(
 | 
			
		||||
    const I420VideoFrame& input_image,
 | 
			
		||||
    bool only_predicting_from_key_frame) {
 | 
			
		||||
int VP8EncoderImpl::GetEncodedPartitions(const VideoFrame& input_image,
 | 
			
		||||
                                         bool only_predicting_from_key_frame) {
 | 
			
		||||
  int stream_idx = static_cast<int>(encoders_.size()) - 1;
 | 
			
		||||
  for (size_t encoder_idx = 0; encoder_idx < encoders_.size();
 | 
			
		||||
      ++encoder_idx, --stream_idx) {
 | 
			
		||||
@@ -1342,8 +1339,8 @@ int VP8DecoderImpl::ReturnFrame(const vpx_image_t* img,
 | 
			
		||||
  last_frame_width_ = img->d_w;
 | 
			
		||||
  last_frame_height_ = img->d_h;
 | 
			
		||||
  // Allocate memory for decoded image.
 | 
			
		||||
  I420VideoFrame decoded_image(buffer_pool_.CreateBuffer(img->d_w, img->d_h),
 | 
			
		||||
                               timestamp, 0, kVideoRotation_0);
 | 
			
		||||
  VideoFrame decoded_image(buffer_pool_.CreateBuffer(img->d_w, img->d_h),
 | 
			
		||||
                           timestamp, 0, kVideoRotation_0);
 | 
			
		||||
  libyuv::I420Copy(
 | 
			
		||||
      img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y],
 | 
			
		||||
      img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U],
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ class VP8EncoderImpl : public VP8Encoder {
 | 
			
		||||
                         int number_of_cores,
 | 
			
		||||
                         size_t max_payload_size);
 | 
			
		||||
 | 
			
		||||
  virtual int Encode(const I420VideoFrame& input_image,
 | 
			
		||||
  virtual int Encode(const VideoFrame& input_image,
 | 
			
		||||
                     const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
                     const std::vector<VideoFrameType>* frame_types);
 | 
			
		||||
 | 
			
		||||
@@ -72,7 +72,7 @@ class VP8EncoderImpl : public VP8Encoder {
 | 
			
		||||
  int InitAndSetControlSettings();
 | 
			
		||||
 | 
			
		||||
  // Update frame size for codec.
 | 
			
		||||
  int UpdateCodecFrameSize(const I420VideoFrame& input_image);
 | 
			
		||||
  int UpdateCodecFrameSize(const VideoFrame& input_image);
 | 
			
		||||
 | 
			
		||||
  void PopulateCodecSpecific(CodecSpecificInfo* codec_specific,
 | 
			
		||||
                             const vpx_codec_cx_pkt& pkt,
 | 
			
		||||
@@ -80,7 +80,7 @@ class VP8EncoderImpl : public VP8Encoder {
 | 
			
		||||
                             uint32_t timestamp,
 | 
			
		||||
                             bool only_predicting_from_key_frame);
 | 
			
		||||
 | 
			
		||||
  int GetEncodedPartitions(const I420VideoFrame& input_image,
 | 
			
		||||
  int GetEncodedPartitions(const VideoFrame& input_image,
 | 
			
		||||
                           bool only_predicting_from_key_frame);
 | 
			
		||||
 | 
			
		||||
  // Get the stream bitrate, for the stream |stream_idx|, given the bitrate
 | 
			
		||||
 
 | 
			
		||||
@@ -68,15 +68,15 @@ class Vp8SequenceCoderDecodeCallback : public webrtc::DecodedImageCallback {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit Vp8SequenceCoderDecodeCallback(FILE* decoded_file)
 | 
			
		||||
      : decoded_file_(decoded_file) {}
 | 
			
		||||
  int Decoded(webrtc::I420VideoFrame& frame);
 | 
			
		||||
  int Decoded(webrtc::VideoFrame& frame);
 | 
			
		||||
  bool DecodeComplete();
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  FILE* decoded_file_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int Vp8SequenceCoderDecodeCallback::Decoded(webrtc::I420VideoFrame& image) {
 | 
			
		||||
  EXPECT_EQ(0, webrtc::PrintI420VideoFrame(image, decoded_file_));
 | 
			
		||||
int Vp8SequenceCoderDecodeCallback::Decoded(webrtc::VideoFrame& image) {
 | 
			
		||||
  EXPECT_EQ(0, webrtc::PrintVideoFrame(image, decoded_file_));
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -140,7 +140,7 @@ int SequenceCoder(webrtc::test::CommandLineParser& parser) {
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
  EXPECT_EQ(0, decoder->InitDecode(&inst, 1));
 | 
			
		||||
  webrtc::I420VideoFrame input_frame;
 | 
			
		||||
  webrtc::VideoFrame input_frame;
 | 
			
		||||
  size_t length = webrtc::CalcBufferSize(webrtc::kI420, width, height);
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> frame_buffer(new uint8_t[length]);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ namespace webrtc {
 | 
			
		||||
// The benefit of owning the pool that libvpx relies on for decoding is that the
 | 
			
		||||
// decoded frames returned by libvpx (from vpx_codec_get_frame) use parts of our
 | 
			
		||||
// buffers for the decoded image data. By retaining ownership of this buffer
 | 
			
		||||
// using scoped_refptr, the image buffer can be reused by I420VideoFrames and no
 | 
			
		||||
// using scoped_refptr, the image buffer can be reused by VideoFrames and no
 | 
			
		||||
// frame copy has to occur during decoding and frame delivery.
 | 
			
		||||
//
 | 
			
		||||
// Pseudo example usage case:
 | 
			
		||||
 
 | 
			
		||||
@@ -261,7 +261,7 @@ uint32_t VP9EncoderImpl::MaxIntraTarget(uint32_t optimal_buffer_size) {
 | 
			
		||||
  return (target_pct < min_intra_size) ? min_intra_size: target_pct;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int VP9EncoderImpl::Encode(const I420VideoFrame& input_image,
 | 
			
		||||
int VP9EncoderImpl::Encode(const VideoFrame& input_image,
 | 
			
		||||
                           const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
                           const std::vector<VideoFrameType>* frame_types) {
 | 
			
		||||
  if (!inited_) {
 | 
			
		||||
@@ -323,7 +323,7 @@ void VP9EncoderImpl::PopulateCodecSpecific(CodecSpecificInfo* codec_specific,
 | 
			
		||||
  picture_id_ = (picture_id_ + 1) & 0x7FFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int VP9EncoderImpl::GetEncodedPartitions(const I420VideoFrame& input_image) {
 | 
			
		||||
int VP9EncoderImpl::GetEncodedPartitions(const VideoFrame& input_image) {
 | 
			
		||||
  vpx_codec_iter_t iter = NULL;
 | 
			
		||||
  encoded_image_._length = 0;
 | 
			
		||||
  encoded_image_._frameType = kDeltaFrame;
 | 
			
		||||
@@ -513,7 +513,7 @@ int VP9DecoderImpl::ReturnFrame(const vpx_image_t* img, uint32_t timestamp) {
 | 
			
		||||
  Vp9FrameBufferPool::Vp9FrameBuffer* img_buffer =
 | 
			
		||||
      static_cast<Vp9FrameBufferPool::Vp9FrameBuffer*>(img->fb_priv);
 | 
			
		||||
  img_buffer->AddRef();
 | 
			
		||||
  // The buffer can be used directly by the I420VideoFrame (without copy) by
 | 
			
		||||
  // The buffer can be used directly by the VideoFrame (without copy) by
 | 
			
		||||
  // using a WrappedI420Buffer.
 | 
			
		||||
  rtc::scoped_refptr<WrappedI420Buffer> img_wrapped_buffer(
 | 
			
		||||
      new rtc::RefCountedObject<webrtc::WrappedI420Buffer>(
 | 
			
		||||
@@ -527,7 +527,7 @@ int VP9DecoderImpl::ReturnFrame(const vpx_image_t* img, uint32_t timestamp) {
 | 
			
		||||
          // release |img_buffer|.
 | 
			
		||||
          rtc::Bind(&WrappedI420BufferNoLongerUsedCb, img_buffer)));
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame decoded_image;
 | 
			
		||||
  VideoFrame decoded_image;
 | 
			
		||||
  decoded_image.set_video_frame_buffer(img_wrapped_buffer);
 | 
			
		||||
  decoded_image.set_timestamp(timestamp);
 | 
			
		||||
  int ret = decode_complete_callback_->Decoded(decoded_image);
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ class VP9EncoderImpl : public VP9Encoder {
 | 
			
		||||
                 int number_of_cores,
 | 
			
		||||
                 size_t max_payload_size) override;
 | 
			
		||||
 | 
			
		||||
  int Encode(const I420VideoFrame& input_image,
 | 
			
		||||
  int Encode(const VideoFrame& input_image,
 | 
			
		||||
             const CodecSpecificInfo* codec_specific_info,
 | 
			
		||||
             const std::vector<VideoFrameType>* frame_types) override;
 | 
			
		||||
 | 
			
		||||
@@ -55,7 +55,7 @@ class VP9EncoderImpl : public VP9Encoder {
 | 
			
		||||
                             const vpx_codec_cx_pkt& pkt,
 | 
			
		||||
                             uint32_t timestamp);
 | 
			
		||||
 | 
			
		||||
  int GetEncodedPartitions(const I420VideoFrame& input_image);
 | 
			
		||||
  int GetEncodedPartitions(const VideoFrame& input_image);
 | 
			
		||||
 | 
			
		||||
  // Determine maximum target for Intra frames
 | 
			
		||||
  //
 | 
			
		||||
 
 | 
			
		||||
@@ -291,7 +291,7 @@ public:
 | 
			
		||||
    // Return value      : VCM_OK, on success.
 | 
			
		||||
    //                     < 0,         on error.
 | 
			
		||||
    virtual int32_t AddVideoFrame(
 | 
			
		||||
        const I420VideoFrame& videoFrame,
 | 
			
		||||
        const VideoFrame& videoFrame,
 | 
			
		||||
        const VideoContentMetrics* contentMetrics = NULL,
 | 
			
		||||
        const CodecSpecificInfo* codecSpecificInfo = NULL) = 0;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@ class VCMPacketizationCallback {
 | 
			
		||||
// Callback class used for passing decoded frames which are ready to be rendered.
 | 
			
		||||
class VCMReceiveCallback {
 | 
			
		||||
 public:
 | 
			
		||||
  virtual int32_t FrameToRender(I420VideoFrame& videoFrame) = 0;
 | 
			
		||||
  virtual int32_t FrameToRender(VideoFrame& videoFrame) = 0;
 | 
			
		||||
  virtual int32_t ReceivedDecodedReferenceFrame(
 | 
			
		||||
      const uint64_t pictureId) {
 | 
			
		||||
    return -1;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,8 +46,7 @@ VCMReceiveCallback* VCMDecodedFrameCallback::UserReceiveCallback()
 | 
			
		||||
    return _receiveCallback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VCMDecodedFrameCallback::Decoded(I420VideoFrame& decodedImage)
 | 
			
		||||
{
 | 
			
		||||
int32_t VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage) {
 | 
			
		||||
    // TODO(holmer): We should improve this so that we can handle multiple
 | 
			
		||||
    // callbacks from one call to Decode().
 | 
			
		||||
    VCMFrameInformation* frameInfo;
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ public:
 | 
			
		||||
    void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback);
 | 
			
		||||
    VCMReceiveCallback* UserReceiveCallback();
 | 
			
		||||
 | 
			
		||||
    virtual int32_t Decoded(I420VideoFrame& decodedImage);
 | 
			
		||||
    virtual int32_t Decoded(VideoFrame& decodedImage);
 | 
			
		||||
    virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId);
 | 
			
		||||
    virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -98,10 +98,9 @@ VCMGenericEncoder::InitEncode(const VideoCodec* settings,
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t
 | 
			
		||||
VCMGenericEncoder::Encode(const I420VideoFrame& inputFrame,
 | 
			
		||||
                          const CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                          const std::vector<FrameType>& frameTypes) {
 | 
			
		||||
int32_t VCMGenericEncoder::Encode(const VideoFrame& inputFrame,
 | 
			
		||||
                                  const CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                                  const std::vector<FrameType>& frameTypes) {
 | 
			
		||||
  std::vector<VideoFrameType> video_frame_types(frameTypes.size(),
 | 
			
		||||
                                                kDeltaFrame);
 | 
			
		||||
  VCMEncodedFrame::ConvertFrameTypes(frameTypes, &video_frame_types);
 | 
			
		||||
@@ -176,7 +175,7 @@ VCMGenericEncoder::SetPeriodicKeyFrames(bool enable)
 | 
			
		||||
 | 
			
		||||
int32_t VCMGenericEncoder::RequestFrame(
 | 
			
		||||
    const std::vector<FrameType>& frame_types) {
 | 
			
		||||
  I420VideoFrame image;
 | 
			
		||||
  VideoFrame image;
 | 
			
		||||
  std::vector<VideoFrameType> video_frame_types(frame_types.size(),
 | 
			
		||||
                                                kDeltaFrame);
 | 
			
		||||
  VCMEncodedFrame::ConvertFrameTypes(frame_types, &video_frame_types);
 | 
			
		||||
 
 | 
			
		||||
@@ -99,7 +99,7 @@ public:
 | 
			
		||||
    * cameraFrameRate   : Request or information from the remote side
 | 
			
		||||
    * frameType         : The requested frame type to encode
 | 
			
		||||
    */
 | 
			
		||||
    int32_t Encode(const I420VideoFrame& inputFrame,
 | 
			
		||||
    int32_t Encode(const VideoFrame& inputFrame,
 | 
			
		||||
                   const CodecSpecificInfo* codecSpecificInfo,
 | 
			
		||||
                   const std::vector<FrameType>& frameTypes);
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -172,7 +172,7 @@ class VideoCodingModuleImpl : public VideoCodingModule {
 | 
			
		||||
    return receiver_->SetVideoProtection(videoProtection, enable);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int32_t AddVideoFrame(const I420VideoFrame& videoFrame,
 | 
			
		||||
  int32_t AddVideoFrame(const VideoFrame& videoFrame,
 | 
			
		||||
                        const VideoContentMetrics* contentMetrics,
 | 
			
		||||
                        const CodecSpecificInfo* codecSpecificInfo) override {
 | 
			
		||||
    return sender_->AddVideoFrame(
 | 
			
		||||
 
 | 
			
		||||
@@ -99,7 +99,7 @@ class VideoSender {
 | 
			
		||||
  int32_t RegisterProtectionCallback(VCMProtectionCallback* protection);
 | 
			
		||||
  void SetVideoProtection(bool enable, VCMVideoProtection videoProtection);
 | 
			
		||||
 | 
			
		||||
  int32_t AddVideoFrame(const I420VideoFrame& videoFrame,
 | 
			
		||||
  int32_t AddVideoFrame(const VideoFrame& videoFrame,
 | 
			
		||||
                        const VideoContentMetrics* _contentMetrics,
 | 
			
		||||
                        const CodecSpecificInfo* codecSpecificInfo);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -297,7 +297,7 @@ void VideoSender::SetVideoProtection(bool enable,
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// Add one raw video frame to the encoder, blocking.
 | 
			
		||||
int32_t VideoSender::AddVideoFrame(const I420VideoFrame& videoFrame,
 | 
			
		||||
int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
 | 
			
		||||
                                   const VideoContentMetrics* contentMetrics,
 | 
			
		||||
                                   const CodecSpecificInfo* codecSpecificInfo) {
 | 
			
		||||
  CriticalSectionScoped cs(_sendCritSect);
 | 
			
		||||
 
 | 
			
		||||
@@ -71,8 +71,8 @@ MATCHER_P(MatchesVp8StreamInfo, expected, "") {
 | 
			
		||||
class EmptyFrameGenerator : public FrameGenerator {
 | 
			
		||||
 public:
 | 
			
		||||
  EmptyFrameGenerator(int width, int height) : width_(width), height_(height) {}
 | 
			
		||||
  I420VideoFrame* NextFrame() override {
 | 
			
		||||
    frame_.reset(new I420VideoFrame());
 | 
			
		||||
  VideoFrame* NextFrame() override {
 | 
			
		||||
    frame_.reset(new VideoFrame());
 | 
			
		||||
    frame_->CreateEmptyFrame(width_, height_, width_, (width_ + 1) / 2,
 | 
			
		||||
                             (width_ + 1) / 2);
 | 
			
		||||
    return frame_.get();
 | 
			
		||||
@@ -81,7 +81,7 @@ class EmptyFrameGenerator : public FrameGenerator {
 | 
			
		||||
 private:
 | 
			
		||||
  const int width_;
 | 
			
		||||
  const int height_;
 | 
			
		||||
  rtc::scoped_ptr<I420VideoFrame> frame_;
 | 
			
		||||
  rtc::scoped_ptr<VideoFrame> frame_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PacketizationCallback : public VCMPacketizationCallback {
 | 
			
		||||
 
 | 
			
		||||
@@ -95,7 +95,7 @@ FileOutputFrameReceiver::~FileOutputFrameReceiver() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t FileOutputFrameReceiver::FrameToRender(
 | 
			
		||||
    webrtc::I420VideoFrame& video_frame) {
 | 
			
		||||
    webrtc::VideoFrame& video_frame) {
 | 
			
		||||
  if (timing_file_ == NULL) {
 | 
			
		||||
    std::string basename;
 | 
			
		||||
    std::string extension;
 | 
			
		||||
@@ -123,7 +123,7 @@ int32_t FileOutputFrameReceiver::FrameToRender(
 | 
			
		||||
  }
 | 
			
		||||
  fprintf(timing_file_, "%u, %u\n", video_frame.timestamp(),
 | 
			
		||||
      webrtc::MaskWord64ToUWord32(video_frame.render_time_ms()));
 | 
			
		||||
  if (PrintI420VideoFrame(video_frame, out_file_) < 0) {
 | 
			
		||||
  if (PrintVideoFrame(video_frame, out_file_) < 0) {
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ class FileOutputFrameReceiver : public webrtc::VCMReceiveCallback {
 | 
			
		||||
  virtual ~FileOutputFrameReceiver();
 | 
			
		||||
 | 
			
		||||
  // VCMReceiveCallback
 | 
			
		||||
  virtual int32_t FrameToRender(webrtc::I420VideoFrame& video_frame);
 | 
			
		||||
  virtual int32_t FrameToRender(webrtc::VideoFrame& video_frame);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  std::string out_filename_;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,15 +30,15 @@ class QualityScaler {
 | 
			
		||||
  void ReportQP(int qp);
 | 
			
		||||
  void ReportDroppedFrame();
 | 
			
		||||
  void Reset(int framerate, int bitrate, int width, int height);
 | 
			
		||||
  Resolution GetScaledResolution(const I420VideoFrame& frame);
 | 
			
		||||
  const I420VideoFrame& GetScaledFrame(const I420VideoFrame& frame);
 | 
			
		||||
  Resolution GetScaledResolution(const VideoFrame& frame);
 | 
			
		||||
  const VideoFrame& GetScaledFrame(const VideoFrame& frame);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  void AdjustScale(bool up);
 | 
			
		||||
  void ClearSamples();
 | 
			
		||||
 | 
			
		||||
  Scaler scaler_;
 | 
			
		||||
  I420VideoFrame scaled_frame_;
 | 
			
		||||
  VideoFrame scaled_frame_;
 | 
			
		||||
 | 
			
		||||
  size_t num_samples_;
 | 
			
		||||
  int low_qp_threshold_;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ void QualityScaler::ReportDroppedFrame() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QualityScaler::Resolution QualityScaler::GetScaledResolution(
 | 
			
		||||
    const I420VideoFrame& frame) {
 | 
			
		||||
    const VideoFrame& frame) {
 | 
			
		||||
  // Should be set through InitEncode -> Should be set by now.
 | 
			
		||||
  assert(low_qp_threshold_ >= 0);
 | 
			
		||||
  assert(num_samples_ > 0);
 | 
			
		||||
@@ -83,8 +83,7 @@ QualityScaler::Resolution QualityScaler::GetScaledResolution(
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const I420VideoFrame& QualityScaler::GetScaledFrame(
 | 
			
		||||
    const I420VideoFrame& frame) {
 | 
			
		||||
const VideoFrame& QualityScaler::GetScaledFrame(const VideoFrame& frame) {
 | 
			
		||||
  Resolution res = GetScaledResolution(frame);
 | 
			
		||||
  if (res.width == frame.width())
 | 
			
		||||
    return frame;
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ class QualityScalerTest : public ::testing::Test {
 | 
			
		||||
 | 
			
		||||
  void ExpectScaleUsingReportedResolution() {
 | 
			
		||||
    QualityScaler::Resolution res = qs_.GetScaledResolution(input_frame_);
 | 
			
		||||
    const I420VideoFrame& scaled_frame = qs_.GetScaledFrame(input_frame_);
 | 
			
		||||
    const VideoFrame& scaled_frame = qs_.GetScaledFrame(input_frame_);
 | 
			
		||||
    EXPECT_EQ(res.width, scaled_frame.width());
 | 
			
		||||
    EXPECT_EQ(res.height, scaled_frame.height());
 | 
			
		||||
  }
 | 
			
		||||
@@ -71,7 +71,7 @@ class QualityScalerTest : public ::testing::Test {
 | 
			
		||||
  void DoesNotDownscaleFrameDimensions(int width, int height);
 | 
			
		||||
 | 
			
		||||
  QualityScaler qs_;
 | 
			
		||||
  I420VideoFrame input_frame_;
 | 
			
		||||
  VideoFrame input_frame_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST_F(QualityScalerTest, UsesOriginalFrameInitially) {
 | 
			
		||||
 
 | 
			
		||||
@@ -114,8 +114,7 @@ class VideoProcessingModule : public Module {
 | 
			
		||||
 | 
			
		||||
     \return 0 on success, -1 on failure.
 | 
			
		||||
  */
 | 
			
		||||
  static int32_t GetFrameStats(FrameStats* stats,
 | 
			
		||||
                               const I420VideoFrame& frame);
 | 
			
		||||
  static int32_t GetFrameStats(FrameStats* stats, const VideoFrame& frame);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
     Checks the validity of a FrameStats struct. Currently, valid implies only
 | 
			
		||||
@@ -148,7 +147,7 @@ class VideoProcessingModule : public Module {
 | 
			
		||||
 | 
			
		||||
     \return 0 on success, -1 on failure.
 | 
			
		||||
  */
 | 
			
		||||
  static int32_t Brighten(I420VideoFrame* frame, int delta);
 | 
			
		||||
  static int32_t Brighten(VideoFrame* frame, int delta);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
     Detects and removes camera flicker from a video stream. Every frame from
 | 
			
		||||
@@ -165,7 +164,7 @@ class VideoProcessingModule : public Module {
 | 
			
		||||
 | 
			
		||||
     \return 0 on success, -1 on failure.
 | 
			
		||||
  */
 | 
			
		||||
  virtual int32_t Deflickering(I420VideoFrame* frame, FrameStats* stats) = 0;
 | 
			
		||||
  virtual int32_t Deflickering(VideoFrame* frame, FrameStats* stats) = 0;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
     Detects if a video frame is excessively bright or dark. Returns a
 | 
			
		||||
@@ -180,7 +179,7 @@ class VideoProcessingModule : public Module {
 | 
			
		||||
 | 
			
		||||
     \return A member of BrightnessWarning on success, -1 on error
 | 
			
		||||
  */
 | 
			
		||||
  virtual int32_t BrightnessDetection(const I420VideoFrame& frame,
 | 
			
		||||
  virtual int32_t BrightnessDetection(const VideoFrame& frame,
 | 
			
		||||
                                      const FrameStats& stats) = 0;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -250,8 +249,8 @@ class VideoProcessingModule : public Module {
 | 
			
		||||
 | 
			
		||||
  \return VPM_OK on success, a negative value on error (see error codes)
 | 
			
		||||
  */
 | 
			
		||||
  virtual int32_t PreprocessFrame(const I420VideoFrame& frame,
 | 
			
		||||
                                  I420VideoFrame** processed_frame) = 0;
 | 
			
		||||
  virtual int32_t PreprocessFrame(const VideoFrame& frame,
 | 
			
		||||
                                  VideoFrame** processed_frame) = 0;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
  Return content metrics for the last processed frame
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
namespace webrtc {
 | 
			
		||||
namespace VideoProcessing {
 | 
			
		||||
 | 
			
		||||
int32_t Brighten(I420VideoFrame* frame, int delta) {
 | 
			
		||||
int32_t Brighten(VideoFrame* frame, int delta) {
 | 
			
		||||
  assert(frame);
 | 
			
		||||
  if (frame->IsZeroSize()) {
 | 
			
		||||
    return VPM_PARAMETER_ERROR;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
namespace webrtc {
 | 
			
		||||
namespace VideoProcessing {
 | 
			
		||||
 | 
			
		||||
int32_t Brighten(I420VideoFrame* frame, int delta);
 | 
			
		||||
int32_t Brighten(VideoFrame* frame, int delta);
 | 
			
		||||
 | 
			
		||||
}  // namespace VideoProcessing
 | 
			
		||||
}  // namespace webrtc
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ void VPMBrightnessDetection::Reset() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VPMBrightnessDetection::ProcessFrame(
 | 
			
		||||
    const I420VideoFrame& frame,
 | 
			
		||||
    const VideoFrame& frame,
 | 
			
		||||
    const VideoProcessingModule::FrameStats& stats) {
 | 
			
		||||
  if (frame.IsZeroSize()) {
 | 
			
		||||
    return VPM_PARAMETER_ERROR;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ class VPMBrightnessDetection {
 | 
			
		||||
  ~VPMBrightnessDetection();
 | 
			
		||||
 | 
			
		||||
  void Reset();
 | 
			
		||||
  int32_t ProcessFrame(const I420VideoFrame& frame,
 | 
			
		||||
  int32_t ProcessFrame(const VideoFrame& frame,
 | 
			
		||||
                       const VideoProcessingModule::FrameStats& stats);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
 
 | 
			
		||||
@@ -49,9 +49,8 @@ VPMContentAnalysis::~VPMContentAnalysis() {
 | 
			
		||||
  Release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VideoContentMetrics* VPMContentAnalysis::ComputeContentMetrics(
 | 
			
		||||
  const I420VideoFrame& inputFrame) {
 | 
			
		||||
    const VideoFrame& inputFrame) {
 | 
			
		||||
  if (inputFrame.IsZeroSize())
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,7 @@ class VPMContentAnalysis {
 | 
			
		||||
  // Input:           new frame
 | 
			
		||||
  // Return value:    pointer to structure containing content Analysis
 | 
			
		||||
  //                  metrics or NULL value upon error
 | 
			
		||||
  VideoContentMetrics* ComputeContentMetrics(const I420VideoFrame&
 | 
			
		||||
                                             inputFrame);
 | 
			
		||||
  VideoContentMetrics* ComputeContentMetrics(const VideoFrame& inputFrame);
 | 
			
		||||
 | 
			
		||||
  // Release all allocated memory
 | 
			
		||||
  // Output: 0 if OK, negative value upon error
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,8 @@ void VPMDeflickering::Reset() {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VPMDeflickering::ProcessFrame(I420VideoFrame* frame,
 | 
			
		||||
int32_t VPMDeflickering::ProcessFrame(
 | 
			
		||||
    VideoFrame* frame,
 | 
			
		||||
    VideoProcessingModule::FrameStats* stats) {
 | 
			
		||||
  assert(frame);
 | 
			
		||||
  uint32_t frame_memory;
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ class VPMDeflickering {
 | 
			
		||||
  ~VPMDeflickering();
 | 
			
		||||
 | 
			
		||||
  void Reset();
 | 
			
		||||
  int32_t ProcessFrame(I420VideoFrame* frame,
 | 
			
		||||
  int32_t ProcessFrame(VideoFrame* frame,
 | 
			
		||||
                       VideoProcessingModule::FrameStats* stats);
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
 
 | 
			
		||||
@@ -86,9 +86,8 @@ uint32_t VPMFramePreprocessor::DecimatedHeight() const {
 | 
			
		||||
  return spatial_resampler_->TargetHeight();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int32_t VPMFramePreprocessor::PreprocessFrame(const I420VideoFrame& frame,
 | 
			
		||||
    I420VideoFrame** processed_frame) {
 | 
			
		||||
int32_t VPMFramePreprocessor::PreprocessFrame(const VideoFrame& frame,
 | 
			
		||||
                                              VideoFrame** processed_frame) {
 | 
			
		||||
  if (frame.IsZeroSize()) {
 | 
			
		||||
    return VPM_PARAMETER_ERROR;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -52,8 +52,8 @@ class VPMFramePreprocessor {
 | 
			
		||||
  uint32_t DecimatedHeight() const;
 | 
			
		||||
 | 
			
		||||
  // Preprocess output:
 | 
			
		||||
  int32_t PreprocessFrame(const I420VideoFrame& frame,
 | 
			
		||||
                          I420VideoFrame** processed_frame);
 | 
			
		||||
  int32_t PreprocessFrame(const VideoFrame& frame,
 | 
			
		||||
                          VideoFrame** processed_frame);
 | 
			
		||||
  VideoContentMetrics* ContentMetrics() const;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
@@ -62,7 +62,7 @@ class VPMFramePreprocessor {
 | 
			
		||||
  enum { kSkipFrameCA = 2 };
 | 
			
		||||
 | 
			
		||||
  VideoContentMetrics* content_metrics_;
 | 
			
		||||
  I420VideoFrame resampled_frame_;
 | 
			
		||||
  VideoFrame resampled_frame_;
 | 
			
		||||
  VPMSpatialResampler* spatial_resampler_;
 | 
			
		||||
  VPMContentAnalysis* ca_;
 | 
			
		||||
  VPMVideoDecimator* vd_;
 | 
			
		||||
 
 | 
			
		||||
@@ -45,8 +45,8 @@ void VPMSimpleSpatialResampler::Reset() {
 | 
			
		||||
  target_height_ = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VPMSimpleSpatialResampler::ResampleFrame(const I420VideoFrame& inFrame,
 | 
			
		||||
                                                 I420VideoFrame* outFrame) {
 | 
			
		||||
int32_t VPMSimpleSpatialResampler::ResampleFrame(const VideoFrame& inFrame,
 | 
			
		||||
                                                 VideoFrame* outFrame) {
 | 
			
		||||
  // Don't copy if frame remains as is.
 | 
			
		||||
  if (resampling_mode_ == kNoRescaling)
 | 
			
		||||
     return VPM_OK;
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ class VPMSpatialResampler {
 | 
			
		||||
  virtual void SetInputFrameResampleMode(VideoFrameResampling
 | 
			
		||||
                                         resampling_mode) = 0;
 | 
			
		||||
  virtual void Reset() = 0;
 | 
			
		||||
  virtual int32_t ResampleFrame(const I420VideoFrame& inFrame,
 | 
			
		||||
                                I420VideoFrame* outFrame) = 0;
 | 
			
		||||
  virtual int32_t ResampleFrame(const VideoFrame& inFrame,
 | 
			
		||||
                                VideoFrame* outFrame) = 0;
 | 
			
		||||
  virtual int32_t TargetWidth() = 0;
 | 
			
		||||
  virtual int32_t TargetHeight() = 0;
 | 
			
		||||
  virtual bool ApplyResample(int32_t width, int32_t height) = 0;
 | 
			
		||||
@@ -42,8 +42,8 @@ class VPMSimpleSpatialResampler : public VPMSpatialResampler {
 | 
			
		||||
  virtual int32_t SetTargetFrameSize(int32_t width, int32_t height);
 | 
			
		||||
  virtual void SetInputFrameResampleMode(VideoFrameResampling resampling_mode);
 | 
			
		||||
  virtual void Reset();
 | 
			
		||||
  virtual int32_t ResampleFrame(const I420VideoFrame& inFrame,
 | 
			
		||||
                                I420VideoFrame* outFrame);
 | 
			
		||||
  virtual int32_t ResampleFrame(const VideoFrame& inFrame,
 | 
			
		||||
                                VideoFrame* outFrame);
 | 
			
		||||
  virtual int32_t TargetWidth();
 | 
			
		||||
  virtual int32_t TargetHeight();
 | 
			
		||||
  virtual bool ApplyResample(int32_t width, int32_t height);
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ void VideoProcessingModuleImpl::Reset() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoProcessingModule::GetFrameStats(FrameStats* stats,
 | 
			
		||||
                                             const I420VideoFrame& frame) {
 | 
			
		||||
                                             const VideoFrame& frame) {
 | 
			
		||||
  if (frame.IsZeroSize()) {
 | 
			
		||||
    LOG(LS_ERROR) << "Zero size frame.";
 | 
			
		||||
    return VPM_PARAMETER_ERROR;
 | 
			
		||||
@@ -111,19 +111,19 @@ void VideoProcessingModule::ClearFrameStats(FrameStats* stats) {
 | 
			
		||||
  memset(stats->hist, 0, sizeof(stats->hist));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoProcessingModule::Brighten(I420VideoFrame* frame, int delta) {
 | 
			
		||||
int32_t VideoProcessingModule::Brighten(VideoFrame* frame, int delta) {
 | 
			
		||||
  return VideoProcessing::Brighten(frame, delta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoProcessingModuleImpl::Deflickering(I420VideoFrame* frame,
 | 
			
		||||
int32_t VideoProcessingModuleImpl::Deflickering(VideoFrame* frame,
 | 
			
		||||
                                                FrameStats* stats) {
 | 
			
		||||
  CriticalSectionScoped mutex(&mutex_);
 | 
			
		||||
  return deflickering_.ProcessFrame(frame, stats);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoProcessingModuleImpl::BrightnessDetection(
 | 
			
		||||
  const I420VideoFrame& frame,
 | 
			
		||||
  const FrameStats& stats) {
 | 
			
		||||
    const VideoFrame& frame,
 | 
			
		||||
    const FrameStats& stats) {
 | 
			
		||||
  CriticalSectionScoped mutex(&mutex_);
 | 
			
		||||
  return brightness_detection_.ProcessFrame(frame, stats);
 | 
			
		||||
}
 | 
			
		||||
@@ -164,8 +164,8 @@ uint32_t VideoProcessingModuleImpl::DecimatedHeight() const {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoProcessingModuleImpl::PreprocessFrame(
 | 
			
		||||
    const I420VideoFrame& frame,
 | 
			
		||||
    I420VideoFrame **processed_frame) {
 | 
			
		||||
    const VideoFrame& frame,
 | 
			
		||||
    VideoFrame** processed_frame) {
 | 
			
		||||
  CriticalSectionScoped mutex(&mutex_);
 | 
			
		||||
  return frame_pre_processor_.PreprocessFrame(frame, processed_frame);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,9 +28,9 @@ class VideoProcessingModuleImpl : public VideoProcessingModule {
 | 
			
		||||
 | 
			
		||||
  void Reset() override;
 | 
			
		||||
 | 
			
		||||
  int32_t Deflickering(I420VideoFrame* frame, FrameStats* stats) override;
 | 
			
		||||
  int32_t Deflickering(VideoFrame* frame, FrameStats* stats) override;
 | 
			
		||||
 | 
			
		||||
  int32_t BrightnessDetection(const I420VideoFrame& frame,
 | 
			
		||||
  int32_t BrightnessDetection(const VideoFrame& frame,
 | 
			
		||||
                              const FrameStats& stats) override;
 | 
			
		||||
 | 
			
		||||
  // Frame pre-processor functions
 | 
			
		||||
@@ -57,8 +57,8 @@ class VideoProcessingModuleImpl : public VideoProcessingModule {
 | 
			
		||||
  // Pre-process incoming frame: Sample when needed and compute content
 | 
			
		||||
  // metrics when enabled.
 | 
			
		||||
  // If no resampling takes place - processed_frame is set to NULL.
 | 
			
		||||
  int32_t PreprocessFrame(const I420VideoFrame& frame,
 | 
			
		||||
                          I420VideoFrame** processed_frame) override;
 | 
			
		||||
  int32_t PreprocessFrame(const VideoFrame& frame,
 | 
			
		||||
                          VideoFrame** processed_frame) override;
 | 
			
		||||
  VideoContentMetrics* ContentMetrics() const override;
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
 
 | 
			
		||||
@@ -70,7 +70,7 @@ TEST_F(VideoProcessingModuleTest, Deflickering)
 | 
			
		||||
 | 
			
		||||
            if (run_idx == 0)
 | 
			
		||||
            {
 | 
			
		||||
              if (PrintI420VideoFrame(video_frame_, deflickerFile) < 0) {
 | 
			
		||||
              if (PrintVideoFrame(video_frame_, deflickerFile) < 0) {
 | 
			
		||||
                return;
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -26,11 +26,11 @@ DEFINE_bool(gen_files, false, "Output files for visual inspection.");
 | 
			
		||||
 | 
			
		||||
}  // namespace
 | 
			
		||||
 | 
			
		||||
static void PreprocessFrameAndVerify(const I420VideoFrame& source,
 | 
			
		||||
static void PreprocessFrameAndVerify(const VideoFrame& source,
 | 
			
		||||
                                     int target_width,
 | 
			
		||||
                                     int target_height,
 | 
			
		||||
                                     VideoProcessingModule* vpm,
 | 
			
		||||
                                     I420VideoFrame** out_frame);
 | 
			
		||||
                                     VideoFrame** out_frame);
 | 
			
		||||
static void CropFrame(const uint8_t* source_data,
 | 
			
		||||
                      int source_width,
 | 
			
		||||
                      int source_height,
 | 
			
		||||
@@ -38,22 +38,21 @@ static void CropFrame(const uint8_t* source_data,
 | 
			
		||||
                      int offset_y,
 | 
			
		||||
                      int cropped_width,
 | 
			
		||||
                      int cropped_height,
 | 
			
		||||
                      I420VideoFrame* cropped_frame);
 | 
			
		||||
                      VideoFrame* cropped_frame);
 | 
			
		||||
// The |source_data| is cropped and scaled to |target_width| x |target_height|,
 | 
			
		||||
// and then scaled back to the expected cropped size. |expected_psnr| is used to
 | 
			
		||||
// verify basic quality, and is set to be ~0.1/0.05dB lower than actual PSNR
 | 
			
		||||
// verified under the same conditions.
 | 
			
		||||
static void TestSize(const I420VideoFrame& source_frame,
 | 
			
		||||
                     const I420VideoFrame& cropped_source_frame,
 | 
			
		||||
static void TestSize(const VideoFrame& source_frame,
 | 
			
		||||
                     const VideoFrame& cropped_source_frame,
 | 
			
		||||
                     int target_width,
 | 
			
		||||
                     int target_height,
 | 
			
		||||
                     double expected_psnr,
 | 
			
		||||
                     VideoProcessingModule* vpm);
 | 
			
		||||
static bool CompareFrames(const webrtc::I420VideoFrame& frame1,
 | 
			
		||||
                          const webrtc::I420VideoFrame& frame2);
 | 
			
		||||
static void WriteProcessedFrameForVisualInspection(
 | 
			
		||||
    const I420VideoFrame& source,
 | 
			
		||||
    const I420VideoFrame& processed);
 | 
			
		||||
static bool CompareFrames(const webrtc::VideoFrame& frame1,
 | 
			
		||||
                          const webrtc::VideoFrame& frame2);
 | 
			
		||||
static void WriteProcessedFrameForVisualInspection(const VideoFrame& source,
 | 
			
		||||
                                                   const VideoFrame& processed);
 | 
			
		||||
 | 
			
		||||
VideoProcessingModuleTest::VideoProcessingModuleTest()
 | 
			
		||||
    : vpm_(NULL),
 | 
			
		||||
@@ -98,7 +97,7 @@ TEST_F(VideoProcessingModuleTest, HandleNullBuffer) {
 | 
			
		||||
  // TODO(mikhal/stefan): Do we need this one?
 | 
			
		||||
  VideoProcessingModule::FrameStats stats;
 | 
			
		||||
  // Video frame with unallocated buffer.
 | 
			
		||||
  I420VideoFrame videoFrame;
 | 
			
		||||
  VideoFrame videoFrame;
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(-3, vpm_->GetFrameStats(&stats, videoFrame));
 | 
			
		||||
 | 
			
		||||
@@ -121,7 +120,7 @@ TEST_F(VideoProcessingModuleTest, HandleBadStats) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST_F(VideoProcessingModuleTest, IdenticalResultsAfterReset) {
 | 
			
		||||
  I420VideoFrame video_frame2;
 | 
			
		||||
  VideoFrame video_frame2;
 | 
			
		||||
  VideoProcessingModule::FrameStats stats;
 | 
			
		||||
  // Only testing non-static functions here.
 | 
			
		||||
  rtc::scoped_ptr<uint8_t[]> video_buffer(new uint8_t[frame_length_]);
 | 
			
		||||
@@ -184,7 +183,7 @@ TEST_F(VideoProcessingModuleTest, PreprocessorLogic) {
 | 
			
		||||
  // Disable spatial sampling.
 | 
			
		||||
  vpm_->SetInputFrameResampleMode(kNoRescaling);
 | 
			
		||||
  EXPECT_EQ(VPM_OK, vpm_->SetTargetResolution(resolution, resolution, 30));
 | 
			
		||||
  I420VideoFrame* out_frame = NULL;
 | 
			
		||||
  VideoFrame* out_frame = NULL;
 | 
			
		||||
  // Set rescaling => output frame != NULL.
 | 
			
		||||
  vpm_->SetInputFrameResampleMode(kFastRescaling);
 | 
			
		||||
  PreprocessFrameAndVerify(video_frame_, resolution, resolution, vpm_,
 | 
			
		||||
@@ -218,7 +217,7 @@ TEST_F(VideoProcessingModuleTest, Resampler) {
 | 
			
		||||
  EXPECT_EQ(0, ConvertToI420(kI420, video_buffer.get(), 0, 0, width_, height_,
 | 
			
		||||
                             0, kVideoRotation_0, &video_frame_));
 | 
			
		||||
  // Cropped source frame that will contain the expected visible region.
 | 
			
		||||
  I420VideoFrame cropped_source_frame;
 | 
			
		||||
  VideoFrame cropped_source_frame;
 | 
			
		||||
  cropped_source_frame.CopyFrame(video_frame_);
 | 
			
		||||
 | 
			
		||||
  for (uint32_t run_idx = 0; run_idx < NumRuns; run_idx++) {
 | 
			
		||||
@@ -283,11 +282,11 @@ TEST_F(VideoProcessingModuleTest, Resampler) {
 | 
			
		||||
         static_cast<int>(min_runtime));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PreprocessFrameAndVerify(const I420VideoFrame& source,
 | 
			
		||||
void PreprocessFrameAndVerify(const VideoFrame& source,
 | 
			
		||||
                              int target_width,
 | 
			
		||||
                              int target_height,
 | 
			
		||||
                              VideoProcessingModule* vpm,
 | 
			
		||||
                              I420VideoFrame** out_frame) {
 | 
			
		||||
                              VideoFrame** out_frame) {
 | 
			
		||||
  ASSERT_EQ(VPM_OK, vpm->SetTargetResolution(target_width, target_height, 30));
 | 
			
		||||
  ASSERT_EQ(VPM_OK, vpm->PreprocessFrame(source, out_frame));
 | 
			
		||||
 | 
			
		||||
@@ -312,7 +311,7 @@ void CropFrame(const uint8_t* source_data,
 | 
			
		||||
               int offset_y,
 | 
			
		||||
               int cropped_width,
 | 
			
		||||
               int cropped_height,
 | 
			
		||||
               I420VideoFrame* cropped_frame) {
 | 
			
		||||
               VideoFrame* cropped_frame) {
 | 
			
		||||
  cropped_frame->CreateEmptyFrame(cropped_width, cropped_height, cropped_width,
 | 
			
		||||
                                  (cropped_width + 1) / 2,
 | 
			
		||||
                                  (cropped_width + 1) / 2);
 | 
			
		||||
@@ -321,14 +320,14 @@ void CropFrame(const uint8_t* source_data,
 | 
			
		||||
                          source_height, 0, kVideoRotation_0, cropped_frame));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TestSize(const I420VideoFrame& source_frame,
 | 
			
		||||
              const I420VideoFrame& cropped_source_frame,
 | 
			
		||||
void TestSize(const VideoFrame& source_frame,
 | 
			
		||||
              const VideoFrame& cropped_source_frame,
 | 
			
		||||
              int target_width,
 | 
			
		||||
              int target_height,
 | 
			
		||||
              double expected_psnr,
 | 
			
		||||
              VideoProcessingModule* vpm) {
 | 
			
		||||
  // Resample source_frame to out_frame.
 | 
			
		||||
  I420VideoFrame* out_frame = NULL;
 | 
			
		||||
  VideoFrame* out_frame = NULL;
 | 
			
		||||
  vpm->SetInputFrameResampleMode(kBox);
 | 
			
		||||
  PreprocessFrameAndVerify(source_frame, target_width, target_height, vpm,
 | 
			
		||||
                           &out_frame);
 | 
			
		||||
@@ -337,7 +336,7 @@ void TestSize(const I420VideoFrame& source_frame,
 | 
			
		||||
  WriteProcessedFrameForVisualInspection(source_frame, *out_frame);
 | 
			
		||||
 | 
			
		||||
  // Scale |resampled_source_frame| back to the source scale.
 | 
			
		||||
  I420VideoFrame resampled_source_frame;
 | 
			
		||||
  VideoFrame resampled_source_frame;
 | 
			
		||||
  resampled_source_frame.CopyFrame(*out_frame);
 | 
			
		||||
  PreprocessFrameAndVerify(resampled_source_frame, cropped_source_frame.width(),
 | 
			
		||||
                           cropped_source_frame.height(), vpm, &out_frame);
 | 
			
		||||
@@ -352,8 +351,8 @@ void TestSize(const I420VideoFrame& source_frame,
 | 
			
		||||
         target_width, target_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CompareFrames(const webrtc::I420VideoFrame& frame1,
 | 
			
		||||
                   const webrtc::I420VideoFrame& frame2) {
 | 
			
		||||
bool CompareFrames(const webrtc::VideoFrame& frame1,
 | 
			
		||||
                   const webrtc::VideoFrame& frame2) {
 | 
			
		||||
  for (int plane = 0; plane < webrtc::kNumOfPlanes; plane ++) {
 | 
			
		||||
    webrtc::PlaneType plane_type = static_cast<webrtc::PlaneType>(plane);
 | 
			
		||||
    int allocated_size1 = frame1.allocated_size(plane_type);
 | 
			
		||||
@@ -368,8 +367,8 @@ bool CompareFrames(const webrtc::I420VideoFrame& frame1,
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WriteProcessedFrameForVisualInspection(const I420VideoFrame& source,
 | 
			
		||||
                                            const I420VideoFrame& processed) {
 | 
			
		||||
void WriteProcessedFrameForVisualInspection(const VideoFrame& source,
 | 
			
		||||
                                            const VideoFrame& processed) {
 | 
			
		||||
  // Skip if writing to files is not enabled.
 | 
			
		||||
  if (!FLAGS_gen_files)
 | 
			
		||||
    return;
 | 
			
		||||
@@ -381,7 +380,7 @@ void WriteProcessedFrameForVisualInspection(const I420VideoFrame& source,
 | 
			
		||||
  std::cout << "Watch " << filename.str() << " and verify that it is okay."
 | 
			
		||||
            << std::endl;
 | 
			
		||||
  FILE* stand_alone_file = fopen(filename.str().c_str(), "wb");
 | 
			
		||||
  if (PrintI420VideoFrame(processed, stand_alone_file) < 0)
 | 
			
		||||
  if (PrintVideoFrame(processed, stand_alone_file) < 0)
 | 
			
		||||
    std::cerr << "Failed to write: " << filename.str() << std::endl;
 | 
			
		||||
  if (stand_alone_file)
 | 
			
		||||
    fclose(stand_alone_file);
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ class VideoProcessingModuleTest : public ::testing::Test {
 | 
			
		||||
  }
 | 
			
		||||
  VideoProcessingModule* vpm_;
 | 
			
		||||
  FILE* source_file_;
 | 
			
		||||
  I420VideoFrame video_frame_;
 | 
			
		||||
  VideoFrame video_frame_;
 | 
			
		||||
  const int width_;
 | 
			
		||||
  const int half_width_;
 | 
			
		||||
  const int height_;
 | 
			
		||||
 
 | 
			
		||||
@@ -381,9 +381,8 @@ int32_t AndroidNativeOpenGl2Channel::Init(int32_t zOrder,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t AndroidNativeOpenGl2Channel::RenderFrame(
 | 
			
		||||
    const uint32_t /*streamId*/,
 | 
			
		||||
    const I420VideoFrame& videoFrame) {
 | 
			
		||||
int32_t AndroidNativeOpenGl2Channel::RenderFrame(const uint32_t /*streamId*/,
 | 
			
		||||
                                                 const VideoFrame& videoFrame) {
 | 
			
		||||
  //   WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer,_id, "%s:" ,__FUNCTION__);
 | 
			
		||||
  _renderCritSect.Enter();
 | 
			
		||||
  _bufferToRender = videoFrame;
 | 
			
		||||
 
 | 
			
		||||
@@ -33,9 +33,8 @@ class AndroidNativeOpenGl2Channel: public AndroidStream {
 | 
			
		||||
               const float right, const float bottom);
 | 
			
		||||
 | 
			
		||||
  //Implement VideoRenderCallback
 | 
			
		||||
  virtual int32_t RenderFrame(
 | 
			
		||||
      const uint32_t streamId,
 | 
			
		||||
      const I420VideoFrame& videoFrame);
 | 
			
		||||
  virtual int32_t RenderFrame(const uint32_t streamId,
 | 
			
		||||
                              const VideoFrame& videoFrame);
 | 
			
		||||
 | 
			
		||||
  //Implements AndroidStream
 | 
			
		||||
  virtual void DeliverFrame(JNIEnv* jniEnv);
 | 
			
		||||
@@ -54,7 +53,7 @@ class AndroidNativeOpenGl2Channel: public AndroidStream {
 | 
			
		||||
  uint32_t _id;
 | 
			
		||||
  CriticalSectionWrapper& _renderCritSect;
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame _bufferToRender;
 | 
			
		||||
  VideoFrame _bufferToRender;
 | 
			
		||||
  VideoRenderAndroid& _renderer;
 | 
			
		||||
  JavaVM*     _jvm;
 | 
			
		||||
  jobject     _javaRenderObj;
 | 
			
		||||
 
 | 
			
		||||
@@ -409,10 +409,8 @@ int32_t AndroidSurfaceViewChannel::Init(
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int32_t AndroidSurfaceViewChannel::RenderFrame(
 | 
			
		||||
    const uint32_t /*streamId*/,
 | 
			
		||||
    const I420VideoFrame& videoFrame) {
 | 
			
		||||
int32_t AndroidSurfaceViewChannel::RenderFrame(const uint32_t /*streamId*/,
 | 
			
		||||
                                               const VideoFrame& videoFrame) {
 | 
			
		||||
  // WEBRTC_TRACE(kTraceInfo, kTraceVideoRenderer,_id, "%s:" ,__FUNCTION__);
 | 
			
		||||
  _renderCritSect.Enter();
 | 
			
		||||
  _bufferToRender = videoFrame;
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ class AndroidSurfaceViewChannel : public AndroidStream {
 | 
			
		||||
 | 
			
		||||
  //Implement VideoRenderCallback
 | 
			
		||||
  virtual int32_t RenderFrame(const uint32_t streamId,
 | 
			
		||||
                              const I420VideoFrame& videoFrame);
 | 
			
		||||
                              const VideoFrame& videoFrame);
 | 
			
		||||
 | 
			
		||||
  //Implements AndroidStream
 | 
			
		||||
  virtual void DeliverFrame(JNIEnv* jniEnv);
 | 
			
		||||
@@ -42,7 +42,7 @@ class AndroidSurfaceViewChannel : public AndroidStream {
 | 
			
		||||
  uint32_t _id;
 | 
			
		||||
  CriticalSectionWrapper& _renderCritSect;
 | 
			
		||||
 | 
			
		||||
  I420VideoFrame _bufferToRender;
 | 
			
		||||
  VideoFrame _bufferToRender;
 | 
			
		||||
  VideoRenderAndroid& _renderer;
 | 
			
		||||
  JavaVM* _jvm;
 | 
			
		||||
  jobject _javaRenderObj;
 | 
			
		||||
 
 | 
			
		||||
@@ -214,8 +214,7 @@ int32_t VideoRenderOpenGles20::SetCoordinates(int32_t zOrder,
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t VideoRenderOpenGles20::Render(const I420VideoFrame& frameToRender) {
 | 
			
		||||
 | 
			
		||||
int32_t VideoRenderOpenGles20::Render(const VideoFrame& frameToRender) {
 | 
			
		||||
  if (frameToRender.IsZeroSize()) {
 | 
			
		||||
    return -1;
 | 
			
		||||
  }
 | 
			
		||||
@@ -335,7 +334,7 @@ static void InitializeTexture(int name, int id, int width, int height) {
 | 
			
		||||
               GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VideoRenderOpenGles20::SetupTextures(const I420VideoFrame& frameToRender) {
 | 
			
		||||
void VideoRenderOpenGles20::SetupTextures(const VideoFrame& frameToRender) {
 | 
			
		||||
  WEBRTC_TRACE(kTraceDebug, kTraceVideoRenderer, _id,
 | 
			
		||||
               "%s: width %d, height %d", __FUNCTION__,
 | 
			
		||||
               frameToRender.width(), frameToRender.height());
 | 
			
		||||
@@ -373,8 +372,7 @@ static void GlTexSubImage2D(GLsizei width, GLsizei height, int stride,
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void VideoRenderOpenGles20::UpdateTextures(const
 | 
			
		||||
                                           I420VideoFrame& frameToRender) {
 | 
			
		||||
void VideoRenderOpenGles20::UpdateTextures(const VideoFrame& frameToRender) {
 | 
			
		||||
  const GLsizei width = frameToRender.width();
 | 
			
		||||
  const GLsizei height = frameToRender.height();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ class VideoRenderOpenGles20 {
 | 
			
		||||
  ~VideoRenderOpenGles20();
 | 
			
		||||
 | 
			
		||||
  int32_t Setup(int32_t widht, int32_t height);
 | 
			
		||||
  int32_t Render(const I420VideoFrame& frameToRender);
 | 
			
		||||
  int32_t Render(const VideoFrame& frameToRender);
 | 
			
		||||
  int32_t SetCoordinates(int32_t zOrder, const float left, const float top,
 | 
			
		||||
                         const float right, const float bottom);
 | 
			
		||||
 | 
			
		||||
@@ -35,8 +35,8 @@ class VideoRenderOpenGles20 {
 | 
			
		||||
  GLuint loadShader(GLenum shaderType, const char* pSource);
 | 
			
		||||
  GLuint createProgram(const char* pVertexSource,
 | 
			
		||||
                       const char* pFragmentSource);
 | 
			
		||||
  void SetupTextures(const I420VideoFrame& frameToRender);
 | 
			
		||||
  void UpdateTextures(const I420VideoFrame& frameToRender);
 | 
			
		||||
  void SetupTextures(const VideoFrame& frameToRender);
 | 
			
		||||
  void UpdateTextures(const VideoFrame& frameToRender);
 | 
			
		||||
 | 
			
		||||
  int32_t _id;
 | 
			
		||||
  GLuint _textureIds[3]; // Texture id of Y,U and V texture.
 | 
			
		||||
 
 | 
			
		||||
@@ -189,8 +189,7 @@ int32_t VideoRenderExternalImpl::SetBitmap(const void* bitMap,
 | 
			
		||||
 | 
			
		||||
// VideoRenderCallback
 | 
			
		||||
int32_t VideoRenderExternalImpl::RenderFrame(const uint32_t streamId,
 | 
			
		||||
                                             const I420VideoFrame& videoFrame)
 | 
			
		||||
{
 | 
			
		||||
                                             const VideoFrame& videoFrame) {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
}  // namespace webrtc
 | 
			
		||||
 
 | 
			
		||||
@@ -115,7 +115,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // VideoRenderCallback
 | 
			
		||||
    virtual int32_t RenderFrame(const uint32_t streamId,
 | 
			
		||||
                                const I420VideoFrame& videoFrame);
 | 
			
		||||
                                const VideoFrame& videoFrame);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    CriticalSectionWrapper& _critSect;
 | 
			
		||||
 
 | 
			
		||||
@@ -254,16 +254,15 @@ public:
 | 
			
		||||
    /*
 | 
			
		||||
     * Set a start image. The image is rendered before the first image has been delivered
 | 
			
		||||
     */
 | 
			
		||||
    virtual int32_t
 | 
			
		||||
            SetStartImage(const uint32_t streamId,
 | 
			
		||||
                          const I420VideoFrame& videoFrame) = 0;
 | 
			
		||||
    virtual int32_t SetStartImage(const uint32_t streamId,
 | 
			
		||||
                                  const VideoFrame& videoFrame) = 0;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Set a timout image. The image is rendered if no videoframe has been delivered
 | 
			
		||||
     */
 | 
			
		||||
    virtual int32_t SetTimeoutImage(const uint32_t streamId,
 | 
			
		||||
                                    const I420VideoFrame& videoFrame,
 | 
			
		||||
                                    const uint32_t timeout)= 0;
 | 
			
		||||
                                    const VideoFrame& videoFrame,
 | 
			
		||||
                                    const uint32_t timeout) = 0;
 | 
			
		||||
};
 | 
			
		||||
}  // namespace webrtc
 | 
			
		||||
#endif  // WEBRTC_MODULES_VIDEO_RENDER_MAIN_INTERFACE_VIDEO_RENDER_H_
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
#include "webrtc/modules/video_render/include/video_render_defines.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This OpenGles20 is the class of renderer for I420VideoFrame into a GLES 2.0
 | 
			
		||||
 * This OpenGles20 is the class of renderer for VideoFrame into a GLES 2.0
 | 
			
		||||
 * windows used in the VideoRenderIosView class.
 | 
			
		||||
 */
 | 
			
		||||
namespace webrtc {
 | 
			
		||||
@@ -26,7 +26,7 @@ class OpenGles20 {
 | 
			
		||||
  ~OpenGles20();
 | 
			
		||||
 | 
			
		||||
  bool Setup(int32_t width, int32_t height);
 | 
			
		||||
  bool Render(const I420VideoFrame& frame);
 | 
			
		||||
  bool Render(const VideoFrame& frame);
 | 
			
		||||
 | 
			
		||||
  // SetCoordinates
 | 
			
		||||
  // Sets the coordinates where the stream shall be rendered.
 | 
			
		||||
@@ -45,10 +45,10 @@ class OpenGles20 {
 | 
			
		||||
  GLuint CreateProgram(const char* vertex_source, const char* fragment_source);
 | 
			
		||||
 | 
			
		||||
  // Initialize the textures by the frame width and height
 | 
			
		||||
  void SetupTextures(const I420VideoFrame& frame);
 | 
			
		||||
  void SetupTextures(const VideoFrame& frame);
 | 
			
		||||
 | 
			
		||||
  // Update the textures by the YUV data from the frame
 | 
			
		||||
  void UpdateTextures(const I420VideoFrame& frame);
 | 
			
		||||
  void UpdateTextures(const VideoFrame& frame);
 | 
			
		||||
 | 
			
		||||
  GLuint texture_ids_[3];  // Texture id of Y,U and V texture.
 | 
			
		||||
  GLuint program_;
 | 
			
		||||
 
 | 
			
		||||
@@ -151,7 +151,7 @@ bool OpenGles20::SetCoordinates(const float z_order,
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool OpenGles20::Render(const I420VideoFrame& frame) {
 | 
			
		||||
bool OpenGles20::Render(const VideoFrame& frame) {
 | 
			
		||||
  if (texture_width_ != (GLsizei)frame.width() ||
 | 
			
		||||
      texture_height_ != (GLsizei)frame.height()) {
 | 
			
		||||
    SetupTextures(frame);
 | 
			
		||||
@@ -261,7 +261,7 @@ static void InitializeTexture(int name, int id, int width, int height) {
 | 
			
		||||
               NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGles20::SetupTextures(const I420VideoFrame& frame) {
 | 
			
		||||
void OpenGles20::SetupTextures(const VideoFrame& frame) {
 | 
			
		||||
  const GLsizei width = frame.width();
 | 
			
		||||
  const GLsizei height = frame.height();
 | 
			
		||||
 | 
			
		||||
@@ -310,7 +310,7 @@ static void GlTexSubImage2D(GLsizei width,
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OpenGles20::UpdateTextures(const I420VideoFrame& frame) {
 | 
			
		||||
void OpenGles20::UpdateTextures(const VideoFrame& frame) {
 | 
			
		||||
  const GLsizei width = frame.width();
 | 
			
		||||
  const GLsizei height = frame.height();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ class VideoRenderIosChannel : public VideoRenderCallback {
 | 
			
		||||
 | 
			
		||||
  // Implementation of VideoRenderCallback.
 | 
			
		||||
  int32_t RenderFrame(const uint32_t stream_id,
 | 
			
		||||
                      const I420VideoFrame& video_frame) override;
 | 
			
		||||
                      const VideoFrame& video_frame) override;
 | 
			
		||||
 | 
			
		||||
  int SetStreamSettings(const float z_order,
 | 
			
		||||
                        const float left,
 | 
			
		||||
@@ -37,7 +37,7 @@ class VideoRenderIosChannel : public VideoRenderCallback {
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  VideoRenderIosView* view_;
 | 
			
		||||
  I420VideoFrame* current_frame_;
 | 
			
		||||
  VideoFrame* current_frame_;
 | 
			
		||||
  bool buffer_is_updated_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,13 @@
 | 
			
		||||
using namespace webrtc;
 | 
			
		||||
 | 
			
		||||
VideoRenderIosChannel::VideoRenderIosChannel(VideoRenderIosView* view)
 | 
			
		||||
    : view_(view),
 | 
			
		||||
      current_frame_(new I420VideoFrame()),
 | 
			
		||||
      buffer_is_updated_(false) {}
 | 
			
		||||
    : view_(view), current_frame_(new VideoFrame()), buffer_is_updated_(false) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VideoRenderIosChannel::~VideoRenderIosChannel() { delete current_frame_; }
 | 
			
		||||
 | 
			
		||||
int32_t VideoRenderIosChannel::RenderFrame(const uint32_t stream_id,
 | 
			
		||||
                                           const I420VideoFrame& video_frame) {
 | 
			
		||||
                                           const VideoFrame& video_frame) {
 | 
			
		||||
  current_frame_->CopyFrame(video_frame);
 | 
			
		||||
  current_frame_->set_render_time_ms(0);
 | 
			
		||||
  buffer_is_updated_ = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
- (BOOL)createContext;
 | 
			
		||||
- (BOOL)presentFramebuffer;
 | 
			
		||||
- (BOOL)renderFrame:(webrtc::I420VideoFrame*)frameToRender;
 | 
			
		||||
- (BOOL)renderFrame:(webrtc::VideoFrame*)frameToRender;
 | 
			
		||||
- (BOOL)setCoordinatesForZOrder:(const float)zOrder
 | 
			
		||||
                           Left:(const float)left
 | 
			
		||||
                            Top:(const float)top
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user