Use custom mkstemp() to fix Win issue in y4m_test

Uses mkstmp() with directory being the same as the test data
directory to create temporary output file. For Windows
GetTempFileNameA() function is used.

Change-Id: Ie4681b2b4f44f8c22d3b3faf134c44087b484f94
This commit is contained in:
Deb Mukherjee 2014-07-14 13:31:29 -07:00
parent 597ce31ff8
commit 096224ffc2
3 changed files with 77 additions and 14 deletions

View File

@ -10,6 +10,9 @@
#ifndef TEST_VIDEO_SOURCE_H_ #ifndef TEST_VIDEO_SOURCE_H_
#define TEST_VIDEO_SOURCE_H_ #define TEST_VIDEO_SOURCE_H_
#if defined(_WIN32)
#include <windows.h>
#endif
#include <cstdio> #include <cstdio>
#include <cstdlib> #include <cstdlib>
#include <string> #include <string>
@ -55,10 +58,70 @@ static FILE *OpenTestOutFile(const std::string& file_name) {
return fopen(path_to_source.c_str(), "wb"); return fopen(path_to_source.c_str(), "wb");
} }
static FILE *OpenTempOutFile() { static std::string GetTempOutFilename() {
return tmpfile(); std::string basename;
#if defined(_WIN32)
char fname[MAX_PATH];
// Assume for now that the filename generated is unique per process
const UINT ret = GetTempFileNameA(
GetDataPath().c_str(), "lvx", 0, fname);
if (ret != 0) {
const char *slash = strrchr(fname, '\\');
if (slash == NULL) slash = strrchr(fname, '/');
if (slash == NULL)
basename.assign(fname);
else
basename.assign(slash + 1);
} else {
basename.clear();
}
#else
char fname[256];
const std::string templ = GetDataPath() + "/libvpx_test_XXXXXX";
strncpy(fname, templ.c_str(), templ.size());
fname[templ.size()] = '\0';
const int fd = mkstemp(fname);
if (fd != -1) {
close(fd);
basename.assign(strrchr(fname, '/') + 1);
} else {
basename.clear();
}
#endif
return basename;
} }
class TempOutFile {
public:
TempOutFile() {
file_name_ = GetTempOutFilename();
file_ = OpenTestOutFile(file_name_);
}
~TempOutFile() {
CloseFile();
if (!file_name_.empty()) {
const std::string path_to_source = GetDataPath() + "/" + file_name_;
EXPECT_EQ(0, remove(path_to_source.c_str()));
}
}
FILE *file() {
return file_;
}
const std::string& file_name() {
return file_name_;
}
void CloseFile() {
if (file_) {
fclose(file_);
file_ = NULL;
}
}
protected:
FILE *file_;
std::string file_name_;
};
// Abstract base class for test video sources, which provide a stream of // Abstract base class for test video sources, which provide a stream of
// vpx_image_t images with associated timestamps and duration. // vpx_image_t images with associated timestamps and duration.
class VideoSource { class VideoSource {

View File

@ -138,14 +138,11 @@ INSTANTIATE_TEST_CASE_P(C, Y4mVideoSourceTest,
class Y4mVideoWriteTest class Y4mVideoWriteTest
: public Y4mVideoSourceTest { : public Y4mVideoSourceTest {
protected: protected:
Y4mVideoWriteTest() : Y4mVideoSourceTest() {} Y4mVideoWriteTest() {}
virtual void ReplaceInputFp(FILE *input_file) { virtual ~Y4mVideoWriteTest() {
CloseSource(); CloseSource();
frame_ = 0; delete tmpfile_;
input_file_ = input_file;
rewind(input_file_);
ReadSourceToStart();
} }
// Writes out a y4m file and then reads it back // Writes out a y4m file and then reads it back
@ -153,26 +150,28 @@ class Y4mVideoWriteTest
ASSERT_TRUE(input_file_ != NULL); ASSERT_TRUE(input_file_ != NULL);
char buf[Y4M_BUFFER_SIZE] = {0}; char buf[Y4M_BUFFER_SIZE] = {0};
const struct VpxRational framerate = {y4m_.fps_n, y4m_.fps_d}; const struct VpxRational framerate = {y4m_.fps_n, y4m_.fps_d};
FILE *out_file = libvpx_test::OpenTempOutFile(); tmpfile_ = new libvpx_test::TempOutFile;
ASSERT_TRUE(out_file != NULL); ASSERT_TRUE(tmpfile_->file() != NULL);
y4m_write_file_header(buf, sizeof(buf), y4m_write_file_header(buf, sizeof(buf),
kWidth, kHeight, kWidth, kHeight,
&framerate, y4m_.vpx_fmt, &framerate, y4m_.vpx_fmt,
y4m_.bit_depth); y4m_.bit_depth);
fputs(buf, out_file); fputs(buf, tmpfile_->file());
for (unsigned int i = start_; i < limit_; i++) { for (unsigned int i = start_; i < limit_; i++) {
y4m_write_frame_header(buf, sizeof(buf)); y4m_write_frame_header(buf, sizeof(buf));
fputs(buf, out_file); fputs(buf, tmpfile_->file());
write_image_file(img(), out_file); write_image_file(img(), tmpfile_->file());
Next(); Next();
} }
ReplaceInputFp(out_file); tmpfile_->CloseFile();
Y4mVideoSourceTest::Init(tmpfile_->file_name(), limit_);
} }
virtual void Init(const std::string &file_name, int limit) { virtual void Init(const std::string &file_name, int limit) {
Y4mVideoSourceTest::Init(file_name, limit); Y4mVideoSourceTest::Init(file_name, limit);
WriteY4mAndReadBack(); WriteY4mAndReadBack();
} }
libvpx_test::TempOutFile *tmpfile_;
}; };
TEST_P(Y4mVideoWriteTest, WriteTest) { TEST_P(Y4mVideoWriteTest, WriteTest) {

View File

@ -48,6 +48,7 @@ int y4m_write_file_header(char *buf, size_t len, int width, int height,
"C420p16 XYSCSS=420P16\n"; "C420p16 XYSCSS=420P16\n";
break; break;
default: default:
color = NULL;
assert(0); assert(0);
} }
return snprintf(buf, len, "YUV4MPEG2 W%u H%u F%u:%u I%c %s", width, height, return snprintf(buf, len, "YUV4MPEG2 W%u H%u F%u:%u I%c %s", width, height,