| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <deque> | 5 #include <deque> |
| 6 #include <string> | 6 #include <string> |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/gtest_prod_util.h" | 9 #include "base/gtest_prod_util.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| 11 #include "cc/scheduler/begin_frame_source.h" | 11 #include "cc/scheduler/begin_frame_source.h" |
| 12 #include "cc/test/begin_frame_args_test.h" | 12 #include "cc/test/begin_frame_args_test.h" |
| 13 #include "cc/test/scheduler_test_common.h" | 13 #include "cc/test/scheduler_test_common.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" | 14 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 // Macros to help set up expected calls on the MockBeginFrameObserver. | 17 // Macros to help set up expected calls on the MockBeginFrameObserver. |
| 18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ | 18 #define EXPECT_BEGIN_FRAME_DROP(obs, frame_time, deadline, interval) \ |
| 19 { \ | 19 { \ |
| 20 ::testing::Expectation exp = \ | 20 ::testing::Expectation exp = \ |
| 21 EXPECT_CALL((obs), \ | 21 EXPECT_CALL((obs), OnBeginFrame(CreateBeginFrameArgsForTesting( \ |
| 22 OnBeginFrame(CreateBeginFrameArgsForTesting( \ | 22 BEGINFRAME_FROM_HERE, frame_time, deadline, \ |
| 23 frame_time, deadline, interval))) \ | 23 interval))).InSequence((obs).sequence); \ |
| 24 .InSequence((obs).sequence); \ | |
| 25 } | 24 } |
| 26 | 25 |
| 27 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ | 26 #define EXPECT_BEGIN_FRAME_USED(obs, frame_time, deadline, interval) \ |
| 28 { \ | 27 { \ |
| 29 BeginFrameArgs args = \ | 28 BeginFrameArgs args = CreateBeginFrameArgsForTesting( \ |
| 30 CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \ | 29 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
| 31 ::testing::Expectation exp = \ | 30 ::testing::Expectation exp = \ |
| 32 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ | 31 EXPECT_CALL((obs), OnBeginFrame(args)).InSequence((obs).sequence); \ |
| 33 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ | 32 EXPECT_CALL((obs), LastUsedBeginFrameArgs()) \ |
| 34 .Times(::testing::AnyNumber()) \ | 33 .Times(::testing::AnyNumber()) \ |
| 35 .After(exp) \ | 34 .After(exp) \ |
| 36 .WillRepeatedly(::testing::Return(args)); \ | 35 .WillRepeatedly(::testing::Return(args)); \ |
| 37 } | 36 } |
| 38 | 37 |
| 39 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting | 38 // Macros to send BeginFrameArgs on a FakeBeginFrameSink (and verify resulting |
| 40 // observer behaviour). | 39 // observer behaviour). |
| 41 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ | 40 #define SEND_BEGIN_FRAME(args_equal_to, source, frame_time, deadline, \ |
| 42 interval) \ | 41 interval) \ |
| 43 { \ | 42 { \ |
| 44 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ | 43 BeginFrameArgs old_args = (source).TestLastUsedBeginFrameArgs(); \ |
| 45 BeginFrameArgs new_args = \ | 44 BeginFrameArgs new_args = CreateBeginFrameArgsForTesting( \ |
| 46 CreateBeginFrameArgsForTesting(frame_time, deadline, interval); \ | 45 BEGINFRAME_FROM_HERE, frame_time, deadline, interval); \ |
| 47 ASSERT_FALSE(old_args == new_args); \ | 46 ASSERT_FALSE(old_args == new_args); \ |
| 48 (source).TestOnBeginFrame(new_args); \ | 47 (source).TestOnBeginFrame(new_args); \ |
| 49 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ | 48 EXPECT_EQ(args_equal_to, (source).TestLastUsedBeginFrameArgs()); \ |
| 50 } | 49 } |
| 51 | 50 |
| 52 // When dropping LastUsedBeginFrameArgs **shouldn't** change. | 51 // When dropping LastUsedBeginFrameArgs **shouldn't** change. |
| 53 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ | 52 #define SEND_BEGIN_FRAME_DROP(source, frame_time, deadline, interval) \ |
| 54 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); | 53 SEND_BEGIN_FRAME(old_args, source, frame_time, deadline, interval); |
| 55 | 54 |
| 56 // When used LastUsedBeginFrameArgs **should** be updated. | 55 // When used LastUsedBeginFrameArgs **should** be updated. |
| 57 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ | 56 #define SEND_BEGIN_FRAME_USED(source, frame_time, deadline, interval) \ |
| 58 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); | 57 SEND_BEGIN_FRAME(new_args, source, frame_time, deadline, interval); |
| 59 | 58 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { | 91 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrame) { |
| 93 ::testing::NiceMock<MockBeginFrameObserver> obs; | 92 ::testing::NiceMock<MockBeginFrameObserver> obs; |
| 94 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | 93 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
| 95 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); | 94 EXPECT_BEGIN_FRAME_USED(obs, 400, 600, 300); |
| 96 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | 95 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
| 97 | 96 |
| 98 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 97 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
| 99 MockBeginFrameObserver::kDefaultBeginFrameArgs); | 98 MockBeginFrameObserver::kDefaultBeginFrameArgs); |
| 100 | 99 |
| 101 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 100 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 102 100, 200, 300)); // One call to LastUsedBeginFrameArgs | 101 BEGINFRAME_FROM_HERE, 100, 200, |
| 103 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 102 300)); // One call to LastUsedBeginFrameArgs |
| 104 CreateBeginFrameArgsForTesting(100, 200, 300)); | 103 EXPECT_EQ( |
| 104 obs.LastUsedBeginFrameArgs(), |
| 105 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 105 | 106 |
| 106 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 107 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 107 400, 600, 300)); // Multiple calls to LastUsedBeginFrameArgs | 108 BEGINFRAME_FROM_HERE, 400, 600, |
| 108 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 109 300)); // Multiple calls to LastUsedBeginFrameArgs |
| 109 CreateBeginFrameArgsForTesting(400, 600, 300)); | 110 EXPECT_EQ( |
| 110 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 111 obs.LastUsedBeginFrameArgs(), |
| 111 CreateBeginFrameArgsForTesting(400, 600, 300)); | 112 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 113 EXPECT_EQ( |
| 114 obs.LastUsedBeginFrameArgs(), |
| 115 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 112 | 116 |
| 113 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( | 117 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 114 700, 900, 300)); // No calls to LastUsedBeginFrameArgs | 118 BEGINFRAME_FROM_HERE, 700, 900, |
| 119 300)); // No calls to LastUsedBeginFrameArgs |
| 115 } | 120 } |
| 116 | 121 |
| 117 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { | 122 TEST(MockBeginFrameObserverTest, ExpectOnBeginFrameStatus) { |
| 118 ::testing::NiceMock<MockBeginFrameObserver> obs; | 123 ::testing::NiceMock<MockBeginFrameObserver> obs; |
| 119 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); | 124 EXPECT_BEGIN_FRAME_USED(obs, 100, 200, 300); |
| 120 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); | 125 EXPECT_BEGIN_FRAME_DROP(obs, 400, 600, 300); |
| 121 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); | 126 EXPECT_BEGIN_FRAME_DROP(obs, 450, 650, 300); |
| 122 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); | 127 EXPECT_BEGIN_FRAME_USED(obs, 700, 900, 300); |
| 123 | 128 |
| 124 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 129 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), |
| 125 MockBeginFrameObserver::kDefaultBeginFrameArgs); | 130 MockBeginFrameObserver::kDefaultBeginFrameArgs); |
| 126 | 131 |
| 127 // Used | 132 // Used |
| 128 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(100, 200, 300)); | 133 obs.OnBeginFrame( |
| 129 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 134 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 130 CreateBeginFrameArgsForTesting(100, 200, 300)); | 135 EXPECT_EQ( |
| 136 obs.LastUsedBeginFrameArgs(), |
| 137 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 131 | 138 |
| 132 // Dropped | 139 // Dropped |
| 133 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(400, 600, 300)); | 140 obs.OnBeginFrame( |
| 134 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 141 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 400, 600, 300)); |
| 135 CreateBeginFrameArgsForTesting(100, 200, 300)); | 142 EXPECT_EQ( |
| 143 obs.LastUsedBeginFrameArgs(), |
| 144 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 136 | 145 |
| 137 // Dropped | 146 // Dropped |
| 138 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(450, 650, 300)); | 147 obs.OnBeginFrame( |
| 139 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 148 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 450, 650, 300)); |
| 140 CreateBeginFrameArgsForTesting(100, 200, 300)); | 149 EXPECT_EQ( |
| 150 obs.LastUsedBeginFrameArgs(), |
| 151 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300)); |
| 141 | 152 |
| 142 // Used | 153 // Used |
| 143 obs.OnBeginFrame(CreateBeginFrameArgsForTesting(700, 900, 300)); | 154 obs.OnBeginFrame( |
| 144 EXPECT_EQ(obs.LastUsedBeginFrameArgs(), | 155 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
| 145 CreateBeginFrameArgsForTesting(700, 900, 300)); | 156 EXPECT_EQ( |
| 157 obs.LastUsedBeginFrameArgs(), |
| 158 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 700, 900, 300)); |
| 146 } | 159 } |
| 147 | 160 |
| 148 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = | 161 const BeginFrameArgs MockBeginFrameObserver::kDefaultBeginFrameArgs = |
| 149 CreateBeginFrameArgsForTesting(-1, -1, -1); | 162 CreateBeginFrameArgsForTesting( |
| 163 #ifdef NDEBUG |
| 164 nullptr, |
| 165 #else |
| 166 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 167 "MockBeginFrameObserver::kDefaultBeginFrameArgs"), |
| 168 #endif |
| 169 -1, |
| 170 -1, |
| 171 -1); |
| 150 | 172 |
| 151 // BeginFrameObserverMixIn testing --------------------------------------- | 173 // BeginFrameObserverMixIn testing --------------------------------------- |
| 152 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { | 174 class MockMinimalBeginFrameObserverMixIn : public BeginFrameObserverMixIn { |
| 153 public: | 175 public: |
| 154 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); | 176 MOCK_METHOD1(OnBeginFrameMixInDelegate, bool(const BeginFrameArgs&)); |
| 155 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } | 177 int64_t dropped_begin_frame_args() const { return dropped_begin_frame_args_; } |
| 156 }; | 178 }; |
| 157 | 179 |
| 158 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { | 180 TEST(BeginFrameObserverMixInTest, OnBeginFrameImplementation) { |
| 159 using ::testing::Return; | 181 using ::testing::Return; |
| 160 MockMinimalBeginFrameObserverMixIn obs; | 182 MockMinimalBeginFrameObserverMixIn obs; |
| 161 ::testing::InSequence ordered; // These calls should be ordered | 183 ::testing::InSequence ordered; // These calls should be ordered |
| 162 | 184 |
| 163 // Initial conditions | 185 // Initial conditions |
| 164 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); | 186 EXPECT_EQ(BeginFrameArgs(), obs.LastUsedBeginFrameArgs()); |
| 165 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | 187 EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
| 166 | 188 |
| 167 #ifndef NDEBUG | 189 #ifndef NDEBUG |
| 168 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); | 190 EXPECT_DEATH({ obs.OnBeginFrame(BeginFrameArgs()); }, ""); |
| 169 #endif | 191 #endif |
| 170 | 192 |
| 171 BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(100, 200, 300); | 193 BeginFrameArgs args1 = |
| 194 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 100, 200, 300); |
| 172 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); | 195 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args1)).WillOnce(Return(true)); |
| 173 obs.OnBeginFrame(args1); | 196 obs.OnBeginFrame(args1); |
| 174 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | 197 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
| 175 EXPECT_EQ(0, obs.dropped_begin_frame_args()); | 198 EXPECT_EQ(0, obs.dropped_begin_frame_args()); |
| 176 | 199 |
| 177 #ifndef NDEBUG | 200 #ifndef NDEBUG |
| 178 EXPECT_DEATH( | 201 EXPECT_DEATH({ |
| 179 { obs.OnBeginFrame(CreateBeginFrameArgsForTesting(50, 200, 300)); }, ""); | 202 obs.OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 203 BEGINFRAME_FROM_HERE, 50, 200, 300)); |
| 204 }, |
| 205 ""); |
| 180 #endif | 206 #endif |
| 181 | 207 |
| 182 // Returning false shouldn't update the LastUsedBeginFrameArgs value. | 208 // Returning false shouldn't update the LastUsedBeginFrameArgs value. |
| 183 BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(200, 300, 400); | 209 BeginFrameArgs args2 = |
| 210 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 200, 300, 400); |
| 184 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); | 211 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args2)).WillOnce(Return(false)); |
| 185 obs.OnBeginFrame(args2); | 212 obs.OnBeginFrame(args2); |
| 186 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); | 213 EXPECT_EQ(args1, obs.LastUsedBeginFrameArgs()); |
| 187 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | 214 EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
| 188 | 215 |
| 189 BeginFrameArgs args3 = CreateBeginFrameArgsForTesting(150, 300, 400); | 216 BeginFrameArgs args3 = |
| 217 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 150, 300, 400); |
| 190 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); | 218 EXPECT_CALL(obs, OnBeginFrameMixInDelegate(args3)).WillOnce(Return(true)); |
| 191 obs.OnBeginFrame(args3); | 219 obs.OnBeginFrame(args3); |
| 192 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); | 220 EXPECT_EQ(args3, obs.LastUsedBeginFrameArgs()); |
| 193 EXPECT_EQ(1, obs.dropped_begin_frame_args()); | 221 EXPECT_EQ(1, obs.dropped_begin_frame_args()); |
| 194 } | 222 } |
| 195 | 223 |
| 196 // BeginFrameSource testing ---------------------------------------------- | 224 // BeginFrameSource testing ---------------------------------------------- |
| 197 TEST(BeginFrameSourceMixInTest, ObserverManipulation) { | 225 TEST(BeginFrameSourceMixInTest, ObserverManipulation) { |
| 198 MockBeginFrameObserver obs; | 226 MockBeginFrameObserver obs; |
| 199 MockBeginFrameObserver otherObs; | 227 MockBeginFrameObserver otherObs; |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 source_->AddObserver(obs_.get()); | 516 source_->AddObserver(obs_.get()); |
| 489 } | 517 } |
| 490 | 518 |
| 491 void TearDown() override { obs_.reset(); } | 519 void TearDown() override { obs_.reset(); } |
| 492 }; | 520 }; |
| 493 | 521 |
| 494 TEST_F(SyntheticBeginFrameSourceTest, | 522 TEST_F(SyntheticBeginFrameSourceTest, |
| 495 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { | 523 SetNeedsBeginFramesCallsOnBeginFrameWithMissedTick) { |
| 496 now_src_->SetNowMicroseconds(10010); | 524 now_src_->SetNowMicroseconds(10010); |
| 497 EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( | 525 EXPECT_CALL((*obs_), OnBeginFrame(CreateBeginFrameArgsForTesting( |
| 498 10000, 20000, 10000, BeginFrameArgs::MISSED))); | 526 BEGINFRAME_FROM_HERE, 10000, 20000, 10000, |
| 527 BeginFrameArgs::MISSED))); |
| 499 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent | 528 source_->SetNeedsBeginFrames(true); // Should cause the last tick to be sent |
| 500 // No tasks should need to be run for this to occur. | 529 // No tasks should need to be run for this to occur. |
| 501 } | 530 } |
| 502 | 531 |
| 503 TEST_F(SyntheticBeginFrameSourceTest, | 532 TEST_F(SyntheticBeginFrameSourceTest, |
| 504 SetNeedsBeginFramesCallsCausesOnBeginFrame) { | 533 SetNeedsBeginFramesCallsCausesOnBeginFrame) { |
| 505 source_->SetNeedsBeginFrames(true); | 534 source_->SetNeedsBeginFrames(true); |
| 506 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); | 535 EXPECT_EQ(10000, task_runner_->NextTaskTime().ToInternalValue()); |
| 507 | 536 |
| 508 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); | 537 EXPECT_BEGIN_FRAME_USED(*obs_, 10000, 20000, 10000); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 mux_->SetActiveSource(source2_); | 766 mux_->SetActiveSource(source2_); |
| 738 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); | 767 SEND_BEGIN_FRAME_DROP(*source2_, 750, 1050, 300); |
| 739 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); | 768 SEND_BEGIN_FRAME_USED(*source2_, 1050, 1250, 300); |
| 740 | 769 |
| 741 mux_->SetActiveSource(source1_); | 770 mux_->SetActiveSource(source1_); |
| 742 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); | 771 SEND_BEGIN_FRAME_DROP(*source2_, 1100, 1400, 300); |
| 743 } | 772 } |
| 744 | 773 |
| 745 } // namespace | 774 } // namespace |
| 746 } // namespace cc | 775 } // namespace cc |
| OLD | NEW |