| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // The bulk of this file is support code; sorry about that. Here's an overview | 5 // The bulk of this file is support code; sorry about that. Here's an overview |
| 6 // to hopefully help readers of this code: | 6 // to hopefully help readers of this code: |
| 7 // - RenderingHelper is charged with interacting with X11/{EGL/GLES2,GLX/GL} or | 7 // - RenderingHelper is charged with interacting with X11/{EGL/GLES2,GLX/GL} or |
| 8 // Win/EGL. | 8 // Win/EGL. |
| 9 // - ClientState is an enum for the state of the decode client used by the test. | 9 // - ClientState is an enum for the state of the decode client used by the test. |
| 10 // - ClientStateNotification is a barrier abstraction that allows the test code | 10 // - ClientStateNotification is a barrier abstraction that allows the test code |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 namespace { | 71 namespace { |
| 72 | 72 |
| 73 // Values optionally filled in from flags; see main() below. | 73 // Values optionally filled in from flags; see main() below. |
| 74 // The syntax of multiple test videos is: | 74 // The syntax of multiple test videos is: |
| 75 // test-video1;test-video2;test-video3 | 75 // test-video1;test-video2;test-video3 |
| 76 // where only the first video is required and other optional videos would be | 76 // where only the first video is required and other optional videos would be |
| 77 // decoded by concurrent decoders. | 77 // decoded by concurrent decoders. |
| 78 // The syntax of each test-video is: | 78 // The syntax of each test-video is: |
| 79 // filename:width:height:numframes:numfragments:minFPSwithRender:minFPSnoRender | 79 // filename:width:height:numframes:numfragments:minFPSwithRender:minFPSnoRender |
| 80 // where only the first field is required. Value details: | 80 // where only the first field is required. Value details: |
| 81 // - |filename| must be an h264 Annex B (NAL) stream or an IVF VP8/9 stream. | 81 // - |filename| must be an h264 Annex B (NAL) stream or an IVF VP8 stream. |
| 82 // - |width| and |height| are in pixels. | 82 // - |width| and |height| are in pixels. |
| 83 // - |numframes| is the number of picture frames in the file. | 83 // - |numframes| is the number of picture frames in the file. |
| 84 // - |numfragments| NALU (h264) or frame (VP8/9) count in the stream. | 84 // - |numfragments| NALU (h264) or frame (VP8) count in the stream. |
| 85 // - |minFPSwithRender| and |minFPSnoRender| are minimum frames/second speeds | 85 // - |minFPSwithRender| and |minFPSnoRender| are minimum frames/second speeds |
| 86 // expected to be achieved with and without rendering to the screen, resp. | 86 // expected to be achieved with and without rendering to the screen, resp. |
| 87 // (the latter tests just decode speed). | 87 // (the latter tests just decode speed). |
| 88 // - |profile| is the media::VideoCodecProfile set during Initialization. | 88 // - |profile| is the media::VideoCodecProfile set during Initialization. |
| 89 // An empty value for a numeric field means "ignore". | 89 // An empty value for a numeric field means "ignore". |
| 90 const base::FilePath::CharType* g_test_video_data = | 90 const base::FilePath::CharType* g_test_video_data = |
| 91 // FILE_PATH_LITERAL("test-25fps.vp8:320:240:250:250:50:175:11"); | 91 // FILE_PATH_LITERAL("test-25fps.vp8:320:240:250:250:50:175:11"); |
| 92 FILE_PATH_LITERAL("test-25fps.h264:320:240:250:258:50:175:1"); | 92 FILE_PATH_LITERAL("test-25fps.h264:320:240:250:258:50:175:1"); |
| 93 | 93 |
| 94 // The file path of the test output log. This is used to communicate the test | 94 // The file path of the test output log. This is used to communicate the test |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 // Compute & return the first encoded bytes (including a start frame) to send | 292 // Compute & return the first encoded bytes (including a start frame) to send |
| 293 // to the decoder, starting at |start_pos| and returning one fragment. Skips | 293 // to the decoder, starting at |start_pos| and returning one fragment. Skips |
| 294 // to the first decodable position. | 294 // to the first decodable position. |
| 295 std::string GetBytesForFirstFragment(size_t start_pos, size_t* end_pos); | 295 std::string GetBytesForFirstFragment(size_t start_pos, size_t* end_pos); |
| 296 // Compute & return the encoded bytes of next fragment to send to the decoder | 296 // Compute & return the encoded bytes of next fragment to send to the decoder |
| 297 // (based on |start_pos|). | 297 // (based on |start_pos|). |
| 298 std::string GetBytesForNextFragment(size_t start_pos, size_t* end_pos); | 298 std::string GetBytesForNextFragment(size_t start_pos, size_t* end_pos); |
| 299 // Helpers for GetBytesForNextFragment above. | 299 // Helpers for GetBytesForNextFragment above. |
| 300 void GetBytesForNextNALU(size_t start_pos, size_t* end_pos); // For h.264. | 300 void GetBytesForNextNALU(size_t start_pos, size_t* end_pos); // For h.264. |
| 301 std::string GetBytesForNextFrame( | 301 std::string GetBytesForNextFrame( |
| 302 size_t start_pos, size_t* end_pos); // For VP8/9. | 302 size_t start_pos, size_t* end_pos); // For VP8. |
| 303 | 303 |
| 304 // Request decode of the next fragment in the encoded data. | 304 // Request decode of the next fragment in the encoded data. |
| 305 void DecodeNextFragment(); | 305 void DecodeNextFragment(); |
| 306 | 306 |
| 307 size_t window_id_; | 307 size_t window_id_; |
| 308 RenderingHelper* rendering_helper_; | 308 RenderingHelper* rendering_helper_; |
| 309 gfx::Size frame_size_; | 309 gfx::Size frame_size_; |
| 310 std::string encoded_data_; | 310 std::string encoded_data_; |
| 311 const int num_in_flight_decodes_; | 311 const int num_in_flight_decodes_; |
| 312 int outstanding_decodes_; | 312 int outstanding_decodes_; |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 *end_pos = start_pos; | 675 *end_pos = start_pos; |
| 676 while (*end_pos + 4 < encoded_data_.size()) { | 676 while (*end_pos + 4 < encoded_data_.size()) { |
| 677 if ((encoded_data_[*end_pos + 4] & 0x1f) == 0x7) // SPS start frame | 677 if ((encoded_data_[*end_pos + 4] & 0x1f) == 0x7) // SPS start frame |
| 678 return GetBytesForNextFragment(*end_pos, end_pos); | 678 return GetBytesForNextFragment(*end_pos, end_pos); |
| 679 GetBytesForNextNALU(*end_pos, end_pos); | 679 GetBytesForNextNALU(*end_pos, end_pos); |
| 680 num_skipped_fragments_++; | 680 num_skipped_fragments_++; |
| 681 } | 681 } |
| 682 *end_pos = start_pos; | 682 *end_pos = start_pos; |
| 683 return std::string(); | 683 return std::string(); |
| 684 } | 684 } |
| 685 DCHECK_LE(profile_, media::VP9PROFILE_MAX); | 685 DCHECK_LE(profile_, media::VP8PROFILE_MAX); |
| 686 return GetBytesForNextFragment(start_pos, end_pos); | 686 return GetBytesForNextFragment(start_pos, end_pos); |
| 687 } | 687 } |
| 688 | 688 |
| 689 std::string GLRenderingVDAClient::GetBytesForNextFragment( | 689 std::string GLRenderingVDAClient::GetBytesForNextFragment( |
| 690 size_t start_pos, size_t* end_pos) { | 690 size_t start_pos, size_t* end_pos) { |
| 691 if (profile_ < media::H264PROFILE_MAX) { | 691 if (profile_ < media::H264PROFILE_MAX) { |
| 692 *end_pos = start_pos; | 692 *end_pos = start_pos; |
| 693 GetBytesForNextNALU(*end_pos, end_pos); | 693 GetBytesForNextNALU(*end_pos, end_pos); |
| 694 if (start_pos != *end_pos) { | 694 if (start_pos != *end_pos) { |
| 695 num_queued_fragments_++; | 695 num_queued_fragments_++; |
| 696 } | 696 } |
| 697 return encoded_data_.substr(start_pos, *end_pos - start_pos); | 697 return encoded_data_.substr(start_pos, *end_pos - start_pos); |
| 698 } | 698 } |
| 699 DCHECK_LE(profile_, media::VP9PROFILE_MAX); | 699 DCHECK_LE(profile_, media::VP8PROFILE_MAX); |
| 700 return GetBytesForNextFrame(start_pos, end_pos); | 700 return GetBytesForNextFrame(start_pos, end_pos); |
| 701 } | 701 } |
| 702 | 702 |
| 703 void GLRenderingVDAClient::GetBytesForNextNALU( | 703 void GLRenderingVDAClient::GetBytesForNextNALU( |
| 704 size_t start_pos, size_t* end_pos) { | 704 size_t start_pos, size_t* end_pos) { |
| 705 *end_pos = start_pos; | 705 *end_pos = start_pos; |
| 706 if (*end_pos + 4 > encoded_data_.size()) | 706 if (*end_pos + 4 > encoded_data_.size()) |
| 707 return; | 707 return; |
| 708 CHECK(LookingAtNAL(encoded_data_, start_pos)); | 708 CHECK(LookingAtNAL(encoded_data_, start_pos)); |
| 709 *end_pos += 4; | 709 *end_pos += 4; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 738 parser.SetStream(data, size); | 738 parser.SetStream(data, size); |
| 739 media::H264NALU nalu; | 739 media::H264NALU nalu; |
| 740 media::H264Parser::Result result = parser.AdvanceToNextNALU(&nalu); | 740 media::H264Parser::Result result = parser.AdvanceToNextNALU(&nalu); |
| 741 if (result != media::H264Parser::kOk) { | 741 if (result != media::H264Parser::kOk) { |
| 742 // Let the VDA figure out there's something wrong with the stream. | 742 // Let the VDA figure out there's something wrong with the stream. |
| 743 return false; | 743 return false; |
| 744 } | 744 } |
| 745 | 745 |
| 746 return nalu.nal_unit_type == media::H264NALU::kSPS; | 746 return nalu.nal_unit_type == media::H264NALU::kSPS; |
| 747 } else if (profile >= media::VP8PROFILE_MIN && | 747 } else if (profile >= media::VP8PROFILE_MIN && |
| 748 profile <= media::VP9PROFILE_MAX) { | 748 profile <= media::VP8PROFILE_MAX) { |
| 749 return (size > 0 && !(data[0] & 0x01)); | 749 return (size > 0 && !(data[0] & 0x01)); |
| 750 } | 750 } |
| 751 // Shouldn't happen at this point. | 751 // Shouldn't happen at this point. |
| 752 LOG(FATAL) << "Invalid profile: " << profile; | 752 LOG(FATAL) << "Invalid profile: " << profile; |
| 753 return false; | 753 return false; |
| 754 } | 754 } |
| 755 | 755 |
| 756 void GLRenderingVDAClient::DecodeNextFragment() { | 756 void GLRenderingVDAClient::DecodeNextFragment() { |
| 757 if (decoder_deleted()) | 757 if (decoder_deleted()) |
| 758 return; | 758 return; |
| (...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1472 if (it->first == "ozone-platform" || it->first == "ozone-use-surfaceless") | 1472 if (it->first == "ozone-platform" || it->first == "ozone-use-surfaceless") |
| 1473 continue; | 1473 continue; |
| 1474 LOG(FATAL) << "Unexpected switch: " << it->first << ":" << it->second; | 1474 LOG(FATAL) << "Unexpected switch: " << it->first << ":" << it->second; |
| 1475 } | 1475 } |
| 1476 | 1476 |
| 1477 base::ShadowingAtExitManager at_exit_manager; | 1477 base::ShadowingAtExitManager at_exit_manager; |
| 1478 content::RenderingHelper::InitializeOneOff(); | 1478 content::RenderingHelper::InitializeOneOff(); |
| 1479 | 1479 |
| 1480 return RUN_ALL_TESTS(); | 1480 return RUN_ALL_TESTS(); |
| 1481 } | 1481 } |
| OLD | NEW |