1ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org/*
2ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *
4ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *  Use of this source code is governed by a BSD-style license
5ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *  that can be found in the LICENSE file in the root of the source
6ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *  tree. An additional intellectual property rights grant can be found
7ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *  in the file PATENTS.  All contributing project authors may
8ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org */
10ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
111bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org#include "webrtc/common_video/interface/texture_video_frame.h"
121bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org
13ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org#include "webrtc/common_video/interface/native_handle.h"
15ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
16ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.orgnamespace webrtc {
17ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
18ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.orgclass NativeHandleImpl : public NativeHandle {
19ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org public:
20ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  NativeHandleImpl() : ref_count_(0) {}
21ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  virtual ~NativeHandleImpl() {}
22ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  virtual int32_t AddRef() { return ++ref_count_; }
23ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  virtual int32_t Release() { return --ref_count_; }
24ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  virtual void* GetHandle() { return NULL; }
25ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
26ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  int32_t ref_count() { return ref_count_; }
27ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org private:
28ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  int32_t ref_count_;
29ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org};
30ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
311bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.orgbool EqualTextureFrames(const I420VideoFrame& frame1,
321bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org                        const I420VideoFrame& frame2);
331bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org
34ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.orgTEST(TestTextureVideoFrame, InitialValues) {
35ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  NativeHandleImpl handle;
36ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  TextureVideoFrame frame(&handle, 640, 480, 100, 10);
37ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(640, frame.width());
38ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(480, frame.height());
39ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(100u, frame.timestamp());
40ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(10, frame.render_time_ms());
41ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(&handle, frame.native_handle());
42ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
43ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(0, frame.set_width(320));
44ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(320, frame.width());
45ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(0, frame.set_height(240));
46ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(240, frame.height());
47ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  frame.set_timestamp(200);
48ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(200u, frame.timestamp());
49ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  frame.set_render_time_ms(20);
50ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(20, frame.render_time_ms());
51ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org}
52ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
53ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.orgTEST(TestTextureVideoFrame, RefCount) {
54ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  NativeHandleImpl handle;
55ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(0, handle.ref_count());
56ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  TextureVideoFrame *frame = new TextureVideoFrame(&handle, 640, 480, 100, 200);
57ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(1, handle.ref_count());
58ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  delete frame;
59ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org  EXPECT_EQ(0, handle.ref_count());
60ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org}
61ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org
621bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.orgTEST(TestTextureVideoFrame, CloneFrame) {
631bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  NativeHandleImpl handle;
641bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  TextureVideoFrame frame1(&handle, 640, 480, 100, 200);
651bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  scoped_ptr<I420VideoFrame> frame2(frame1.CloneFrame());
661bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  EXPECT_TRUE(frame2.get() != NULL);
671bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  EXPECT_TRUE(EqualTextureFrames(frame1, *frame2));
681bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org}
691bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org
701bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.orgbool EqualTextureFrames(const I420VideoFrame& frame1,
711bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org                        const I420VideoFrame& frame2) {
721bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org  return ((frame1.native_handle() == frame2.native_handle()) &&
731bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org          (frame1.width() == frame2.width()) &&
741bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org          (frame1.height() == frame2.height()) &&
751bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org          (frame1.timestamp() == frame2.timestamp()) &&
761bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org          (frame1.render_time_ms() == frame2.render_time_ms()));
771bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org}
781bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org
79ea7b33ee032bd2d1528384e26ba079dee0d280fbwu@webrtc.org}  // namespace webrtc
80