Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1415)

Unified Diff: media/gpu/video_encode_accelerator_unittest.cc

Issue 2058413003: H264 HW encode using MediaFoundation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/gpu/video_encode_accelerator_unittest.cc
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index 528b24f8d6834570c270de0dd2c7dc51e2af6e1a..ff6ddcdacbbc88a27e9d48b75c5226ac937db86c 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -25,6 +25,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
@@ -59,6 +60,8 @@
#endif // defined(ARCH_CPU_X86_FAMILY)
#elif defined(OS_MACOSX)
#include "media/gpu/vt_video_encode_accelerator_mac.h"
+#elif defined(OS_WIN)
+#include "media/gpu/media_foundation_video_encode_accelerator_win.h"
#else
#error The VideoEncodeAcceleratorUnittest is not supported on this platform.
#endif
@@ -175,6 +178,7 @@ struct TestStream {
std::vector<size_t> aligned_plane_size;
std::string out_filename;
+
VideoCodecProfile requested_profile;
unsigned int requested_bitrate;
unsigned int requested_framerate;
@@ -257,7 +261,11 @@ static void CreateAlignedInputStreamFile(const gfx::Size& coded_size,
padding_sizes[i] = padding_rows * coded_bpl[i] + Align64Bytes(size) - size;
}
+#if defined(OS_POSIX)
base::FilePath src_file(test_stream->in_filename);
+#elif defined(OS_WIN)
+ base::FilePath src_file(base::UTF8ToWide(test_stream->in_filename));
+#endif
int64_t src_file_size = 0;
LOG_ASSERT(base::GetFileSize(src_file, &src_file_size));
@@ -323,7 +331,11 @@ static void ParseAndReadTestStreamData(const base::FilePath::StringType& data,
LOG_ASSERT(fields.size() <= 9U) << data;
TestStream* test_stream = new TestStream();
- test_stream->in_filename = fields[0];
+#if defined(OS_POSIX)
+ test_stream->in_filename = fields[0];
+#elif defined(OS_WIN)
+ test_stream->in_filename = base::WideToUTF8(fields[0]);
+#endif
int width, height;
bool result = base::StringToInt(fields[1], &width);
LOG_ASSERT(result);
@@ -338,8 +350,13 @@ static void ParseAndReadTestStreamData(const base::FilePath::StringType& data,
LOG_ASSERT(profile <= VIDEO_CODEC_PROFILE_MAX);
test_stream->requested_profile = static_cast<VideoCodecProfile>(profile);
- if (fields.size() >= 5 && !fields[4].empty())
+ if (fields.size() >= 5 && !fields[4].empty()) {
+#if defined(OS_POSIX)
test_stream->out_filename = fields[4];
+#elif defined(OS_WIN)
+ test_stream->out_filename = base::WideToUTF8(fields[4]);
+#endif
+ }
if (fields.size() >= 6 && !fields[5].empty())
LOG_ASSERT(
@@ -602,7 +619,7 @@ class VideoFrameQualityValidator {
void VerifyOutputFrame(const scoped_refptr<VideoFrame>& output_frame);
void Decode();
- enum State { UNINITIALIZED, INITIALIZED, DECODING, ERROR };
+ enum State { UNINITIALIZED, INITIALIZED, DECODING, DECODER_ERROR };
const VideoCodecProfile profile_;
std::unique_ptr<FFmpegVideoDecoder> decoder_;
@@ -665,7 +682,7 @@ void VideoFrameQualityValidator::InitializeCB(bool success) {
decoder_state_ = INITIALIZED;
Decode();
} else {
- decoder_state_ = ERROR;
+ decoder_state_ = DECODER_ERROR;
if (IsH264(profile_))
LOG(ERROR) << "Chromium does not support H264 decode. Try Chrome.";
FAIL() << "Decoder initialization error";
@@ -683,7 +700,7 @@ void VideoFrameQualityValidator::DecodeDone(DecodeStatus status) {
decoder_state_ = INITIALIZED;
Decode();
} else {
- decoder_state_ = ERROR;
+ decoder_state_ = DECODER_ERROR;
FAIL() << "Unexpected decode status = " << status << ". Stop decoding.";
decode_error_cb_.Run();
}
@@ -694,7 +711,7 @@ void VideoFrameQualityValidator::FlushDone(DecodeStatus status) {
}
void VideoFrameQualityValidator::Flush() {
- if (decoder_state_ != ERROR) {
+ if (decoder_state_ != DECODER_ERROR) {
decode_buffers_.push(DecoderBuffer::CreateEOSBuffer());
Decode();
}
@@ -702,7 +719,7 @@ void VideoFrameQualityValidator::Flush() {
void VideoFrameQualityValidator::AddDecodeBuffer(
const scoped_refptr<DecoderBuffer>& buffer) {
- if (decoder_state_ != ERROR) {
+ if (decoder_state_ != DECODER_ERROR) {
decode_buffers_.push(buffer);
Decode();
}
@@ -784,6 +801,7 @@ class VEAClient : public VideoEncodeAccelerator::Client {
std::unique_ptr<VideoEncodeAccelerator> CreateV4L2VEA();
std::unique_ptr<VideoEncodeAccelerator> CreateVaapiVEA();
std::unique_ptr<VideoEncodeAccelerator> CreateVTVEA();
+ std::unique_ptr<VideoEncodeAccelerator> CreateMFVEA();
void SetState(ClientState new_state);
@@ -1002,7 +1020,12 @@ VEAClient::VEAClient(TestStream* test_stream,
if (save_to_file_) {
LOG_ASSERT(!test_stream_->out_filename.empty());
+#if defined(OS_POSIX)
base::FilePath out_filename(test_stream_->out_filename);
+#elif defined(OS_WIN)
+ base::FilePath out_filename(
+ base::UTF8ToWide(test_stream_->out_filename));
+#endif
// This creates or truncates out_filename.
// Without it, AppendToFile() will not work.
EXPECT_EQ(0, base::WriteFile(out_filename, NULL, 0));
@@ -1055,12 +1078,21 @@ std::unique_ptr<VideoEncodeAccelerator> VEAClient::CreateVTVEA() {
return encoder;
}
+std::unique_ptr<VideoEncodeAccelerator> VEAClient::CreateMFVEA() {
+ std::unique_ptr<VideoEncodeAccelerator> encoder;
+#if defined(OS_WIN)
+ encoder.reset(new MediaFoundationVideoEncodeAccelerator());
+#endif
+ return encoder;
+}
+
void VEAClient::CreateEncoder() {
DCHECK(thread_checker_.CalledOnValidThread());
LOG_ASSERT(!has_encoder());
std::unique_ptr<VideoEncodeAccelerator> encoders[] = {
- CreateFakeVEA(), CreateV4L2VEA(), CreateVaapiVEA(), CreateVTVEA()};
+ CreateFakeVEA(), CreateV4L2VEA(), CreateVaapiVEA(), CreateVTVEA(),
+ CreateMFVEA()};
DVLOG(1) << "Profile: " << test_stream_->requested_profile
<< ", initial bitrate: " << requested_bitrate_;
@@ -1705,14 +1737,16 @@ int main(int argc, char** argv) {
base::ShadowingAtExitManager at_exit_manager;
base::MessageLoop main_loop;
+ base::FilePath test_data_filepath =
+ media::GetTestDataFilePath(media::g_default_in_filename);
+ base::AppendToFile(test_data_filepath, media::g_default_in_parameters,
+ strlen(media::g_default_in_parameters));
std::unique_ptr<base::FilePath::StringType> test_stream_data(
- new base::FilePath::StringType(
- media::GetTestDataFilePath(media::g_default_in_filename).value() +
- media::g_default_in_parameters));
+ new base::FilePath::StringType(test_data_filepath.value()));
// Needed to enable DVLOG through --vmodule.
logging::LoggingSettings settings;
- settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
+ settings.logging_dest = logging::LOG_DEFAULT;
LOG_ASSERT(logging::InitLogging(settings));
const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();

Powered by Google App Engine
This is Rietveld 408576698