OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <inttypes.h> | 5 #include <inttypes.h> |
6 #include <stddef.h> | 6 #include <stddef.h> |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 ~VEAClient() override; | 767 ~VEAClient() override; |
768 void CreateEncoder(); | 768 void CreateEncoder(); |
769 void DestroyEncoder(); | 769 void DestroyEncoder(); |
770 | 770 |
771 // VideoDecodeAccelerator::Client implementation. | 771 // VideoDecodeAccelerator::Client implementation. |
772 void RequireBitstreamBuffers(unsigned int input_count, | 772 void RequireBitstreamBuffers(unsigned int input_count, |
773 const gfx::Size& input_coded_size, | 773 const gfx::Size& input_coded_size, |
774 size_t output_buffer_size) override; | 774 size_t output_buffer_size) override; |
775 void BitstreamBufferReady(int32_t bitstream_buffer_id, | 775 void BitstreamBufferReady(int32_t bitstream_buffer_id, |
776 size_t payload_size, | 776 size_t payload_size, |
777 bool key_frame) override; | 777 bool key_frame, |
| 778 base::TimeDelta timestamp) override; |
778 void NotifyError(VideoEncodeAccelerator::Error error) override; | 779 void NotifyError(VideoEncodeAccelerator::Error error) override; |
779 | 780 |
780 private: | 781 private: |
781 bool has_encoder() { return encoder_.get(); } | 782 bool has_encoder() { return encoder_.get(); } |
782 | 783 |
783 // Return the number of encoded frames per second. | 784 // Return the number of encoded frames per second. |
784 double frames_per_second(); | 785 double frames_per_second(); |
785 | 786 |
786 std::unique_ptr<media::VideoEncodeAccelerator> CreateFakeVEA(); | 787 std::unique_ptr<media::VideoEncodeAccelerator> CreateFakeVEA(); |
787 std::unique_ptr<media::VideoEncodeAccelerator> CreateV4L2VEA(); | 788 std::unique_ptr<media::VideoEncodeAccelerator> CreateV4L2VEA(); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
948 unsigned int requested_framerate_; | 949 unsigned int requested_framerate_; |
949 | 950 |
950 // Bitrate to switch to in the middle of the stream. | 951 // Bitrate to switch to in the middle of the stream. |
951 unsigned int requested_subsequent_bitrate_; | 952 unsigned int requested_subsequent_bitrate_; |
952 | 953 |
953 // Framerate to switch to in the middle of the stream. | 954 // Framerate to switch to in the middle of the stream. |
954 unsigned int requested_subsequent_framerate_; | 955 unsigned int requested_subsequent_framerate_; |
955 | 956 |
956 // The timer used to feed the encoder with the input frames. | 957 // The timer used to feed the encoder with the input frames. |
957 std::unique_ptr<base::RepeatingTimer> input_timer_; | 958 std::unique_ptr<base::RepeatingTimer> input_timer_; |
| 959 |
| 960 // The timestamps for each frame in the order of CreateFrame() invocation. |
| 961 std::queue<base::TimeDelta> frame_timestamps_; |
958 }; | 962 }; |
959 | 963 |
960 VEAClient::VEAClient(TestStream* test_stream, | 964 VEAClient::VEAClient(TestStream* test_stream, |
961 ClientStateNotification<ClientState>* note, | 965 ClientStateNotification<ClientState>* note, |
962 bool save_to_file, | 966 bool save_to_file, |
963 unsigned int keyframe_period, | 967 unsigned int keyframe_period, |
964 bool force_bitrate, | 968 bool force_bitrate, |
965 bool test_perf, | 969 bool test_perf, |
966 bool mid_stream_bitrate_switch, | 970 bool mid_stream_bitrate_switch, |
967 bool mid_stream_framerate_switch, | 971 bool mid_stream_framerate_switch, |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1209 base::Bind(&VEAClient::OnInputTimer, base::Unretained(this))); | 1213 base::Bind(&VEAClient::OnInputTimer, base::Unretained(this))); |
1210 } else { | 1214 } else { |
1211 while (inputs_at_client_.size() < | 1215 while (inputs_at_client_.size() < |
1212 num_required_input_buffers_ + kNumExtraInputFrames) | 1216 num_required_input_buffers_ + kNumExtraInputFrames) |
1213 FeedEncoderWithOneInput(); | 1217 FeedEncoderWithOneInput(); |
1214 } | 1218 } |
1215 } | 1219 } |
1216 | 1220 |
1217 void VEAClient::BitstreamBufferReady(int32_t bitstream_buffer_id, | 1221 void VEAClient::BitstreamBufferReady(int32_t bitstream_buffer_id, |
1218 size_t payload_size, | 1222 size_t payload_size, |
1219 bool key_frame) { | 1223 bool key_frame, |
| 1224 base::TimeDelta timestamp) { |
1220 DCHECK(thread_checker_.CalledOnValidThread()); | 1225 DCHECK(thread_checker_.CalledOnValidThread()); |
1221 ASSERT_LE(payload_size, output_buffer_size_); | 1226 ASSERT_LE(payload_size, output_buffer_size_); |
1222 | 1227 |
1223 IdToSHM::iterator it = output_buffers_at_client_.find(bitstream_buffer_id); | 1228 IdToSHM::iterator it = output_buffers_at_client_.find(bitstream_buffer_id); |
1224 ASSERT_NE(it, output_buffers_at_client_.end()); | 1229 ASSERT_NE(it, output_buffers_at_client_.end()); |
1225 base::SharedMemory* shm = it->second; | 1230 base::SharedMemory* shm = it->second; |
1226 output_buffers_at_client_.erase(it); | 1231 output_buffers_at_client_.erase(it); |
1227 | 1232 |
1228 if (state_ == CS_FINISHED || state_ == CS_VALIDATED) | 1233 if (state_ == CS_FINISHED || state_ == CS_VALIDATED) |
1229 return; | 1234 return; |
1230 | 1235 |
| 1236 ASSERT_FALSE(frame_timestamps_.empty()); |
| 1237 ASSERT_EQ(timestamp, frame_timestamps_.front()); |
| 1238 frame_timestamps_.pop(); |
| 1239 |
1231 encoded_stream_size_since_last_check_ += payload_size; | 1240 encoded_stream_size_since_last_check_ += payload_size; |
1232 | 1241 |
1233 const uint8_t* stream_ptr = static_cast<const uint8_t*>(shm->memory()); | 1242 const uint8_t* stream_ptr = static_cast<const uint8_t*>(shm->memory()); |
1234 if (payload_size > 0) { | 1243 if (payload_size > 0) { |
1235 if (stream_validator_) { | 1244 if (stream_validator_) { |
1236 stream_validator_->ProcessStreamBuffer(stream_ptr, payload_size); | 1245 stream_validator_->ProcessStreamBuffer(stream_ptr, payload_size); |
1237 } else { | 1246 } else { |
1238 HandleEncodedFrame(key_frame); | 1247 HandleEncodedFrame(key_frame); |
1239 } | 1248 } |
1240 | 1249 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 // we require for bitrate tests. | 1369 // we require for bitrate tests. |
1361 pos_in_input_stream_ = 0; | 1370 pos_in_input_stream_ = 0; |
1362 } | 1371 } |
1363 | 1372 |
1364 if (quality_validator_) | 1373 if (quality_validator_) |
1365 quality_validator_->AddOriginalFrame(CreateFrame(pos_in_input_stream_)); | 1374 quality_validator_->AddOriginalFrame(CreateFrame(pos_in_input_stream_)); |
1366 | 1375 |
1367 int32_t input_id; | 1376 int32_t input_id; |
1368 scoped_refptr<media::VideoFrame> video_frame = | 1377 scoped_refptr<media::VideoFrame> video_frame = |
1369 PrepareInputFrame(pos_in_input_stream_, &input_id); | 1378 PrepareInputFrame(pos_in_input_stream_, &input_id); |
| 1379 frame_timestamps_.push(video_frame->timestamp()); |
1370 pos_in_input_stream_ += test_stream_->aligned_buffer_size; | 1380 pos_in_input_stream_ += test_stream_->aligned_buffer_size; |
1371 | 1381 |
1372 bool force_keyframe = false; | 1382 bool force_keyframe = false; |
1373 if (keyframe_period_ && input_id % keyframe_period_ == 0) { | 1383 if (keyframe_period_ && input_id % keyframe_period_ == 0) { |
1374 force_keyframe = true; | 1384 force_keyframe = true; |
1375 ++num_keyframes_requested_; | 1385 ++num_keyframes_requested_; |
1376 } | 1386 } |
1377 | 1387 |
1378 if (input_id == 0) { | 1388 if (input_id == 0) { |
1379 first_frame_start_time_ = base::TimeTicks::Now(); | 1389 first_frame_start_time_ = base::TimeTicks::Now(); |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1783 | 1793 |
1784 media::g_env = | 1794 media::g_env = |
1785 reinterpret_cast<media::VideoEncodeAcceleratorTestEnvironment*>( | 1795 reinterpret_cast<media::VideoEncodeAcceleratorTestEnvironment*>( |
1786 testing::AddGlobalTestEnvironment( | 1796 testing::AddGlobalTestEnvironment( |
1787 new media::VideoEncodeAcceleratorTestEnvironment( | 1797 new media::VideoEncodeAcceleratorTestEnvironment( |
1788 std::move(test_stream_data), log_path, run_at_fps, | 1798 std::move(test_stream_data), log_path, run_at_fps, |
1789 needs_encode_latency, verify_all_output))); | 1799 needs_encode_latency, verify_all_output))); |
1790 | 1800 |
1791 return RUN_ALL_TESTS(); | 1801 return RUN_ALL_TESTS(); |
1792 } | 1802 } |
OLD | NEW |