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:
parent
597ce31ff8
commit
096224ffc2
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
1
y4menc.c
1
y4menc.c
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user