Merge "Omx VTS tests" into oc-dev

This commit is contained in:
Zhuoyao Zhang 2017-05-03 16:24:45 +00:00 committed by Android (Google) Code Review
commit 9ec2c9e099
26 changed files with 3900 additions and 1628 deletions

View file

@ -1,49 +1,33 @@
## Codec OMX Tests
## Omx Hal @ 1.0 tests ##
---
## Overview :
The scope of the tests presented here is not restricted solely to testing omx hal @ 1.0 API but also test to omx core functionality and to an extent omx components as well. The current directory contains the following folders: audio, common, component, master and video. Besides common all other folders contain test fixtures for testing AV decoder, encoder components. Common constitutes files that are used across by these test applications.
The current directory contains the following folders: audio, common, component, master
and video.
#### master :
Functionality of master is to enumerate all the omx components (and the roles it supports) available in android media framework.
Besides common, all other folders contain basic OMX unit tests for testing audio and video decoder-encoder
components. common constitutes files that are used across test applications.
usage: VtsHalMediaOmxV1\_0TargetMasterTest -I default
## master
Enumerates all the omx components (and their roles) available in android media framework.
#### component :
This folder includes test fixtures that tests aspects common to all omx compatible components. For instance, port enabling/disabling, enumerating port formats, state transitions, flush, ..., stay common to all components irrespective of the service they offer. Test fixtures are directed towards testing the omx core. Every standard OMX compatible component is expected to pass these tests.
Usage:
usage: VtsHalMediaOmxV1\_0TargetComponentTest -I default -C <comp name> -R <comp role>
VtsHalMediaOmxV1\_0TargetMasterTest -I default
#### audio :
This folder includes test fixtures associated with testing audio encoder and decoder components such as simple encoding of a raw clip or decoding of an elementary stream, end of stream test, timestamp deviations test, flush test and so on. These tests are aimed towards testing the plugin that connects the component to the omx core.
## component
This folder includes test fixtures that tests aspects common to all OMX compatible components. For instance, port enabling/disabling, enumerating port formats, state transitions, flush etc. stay common to all components irrespective of the service they offer. In a way this tests the OMX Core. Every standard OMX compatible component is expected to pass these tests.
usage:
VtsHalMediaOmxV1\_0TargetAudioDecTest -I default -C <comp name> -R audio_decoder.<comp class> -P /sdcard/media/
Usage:
VtsHalMediaOmxV1\_0TargetAudioEncTest -I default -C <comp name> -R audio_encoder.<comp class> -P /sdcard/media/
VtsHalMediaOmxV1\_0TargetComponentTest -I default -C <component name> -R <component role>
#### video :
This folder includes test fixtures associated with testing video encoder and decoder components such as simple encoding of a raw clip or decoding of an elementary stream, end of stream test, timestamp deviations test, flush test and so on. These tests are aimed towards testing the plugin that connects the component to the omx core.
## audio
This folder includes test fixtures associated with audio encoder/decoder components such as encoding/decoding, EOS test, timestamp test etc. These tests are aimed towards testing the component specific aspects.
usage:
Usage:
VtsHalMediaOmxV1\_0TargetVideoDecTest -I default -C <comp name> -R video_decoder.<comp class> -P /sdcard/media/
VtsHalMediaOmxV1\_0TargetAudioDecTest -I default -C <component name> -R audio_decoder.<class>
VtsHalMediaOmxV1\_0TargetAudioEncTest -I default -C <component name> -R audio_encoder.<class>
## video
This folder includes test fixtures associated with video encoder/decoder components like encoding/decoding, EOS test, timestamp test etc. These tests are aimed towards testing the component specific aspects.
Usage:
VtsHalMediaOmxV1\_0TargetVideoDecTest -I default -C <component name> -R video_decoder.<class>
VtsHalMediaOmxV1\_0TargetVideoEncTest -I default -C <component name> -R video_encoder.<class>
## notes
Every component shall be tested by two applications,
* ComponentTest.
* AudioDecTest/AudioEncTest/VideoDecTest/VideoEncTest depending on the component class.
VtsHalMediaOmxV1\_0TargetVideoEncTest -I default -C <comp name> -R video_encoder.<comp class> -P /sdcard/media/

View file

@ -51,7 +51,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
virtual void SetUp() {}
virtual void TearDown() {}
ComponentTestEnvironment() : instance("default") {}
ComponentTestEnvironment() : instance("default"), res("/sdcard/media/") {}
void setInstance(const char* _instance) { instance = _instance; }
@ -59,7 +59,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
void setRole(const char* _role) { role = _role; }
void setQuirks(int _quirks) { quirks = _quirks; }
void setRes(const char* _res) { res = _res; }
const hidl_string getInstance() const { return instance; }
@ -67,19 +67,19 @@ class ComponentTestEnvironment : public ::testing::Environment {
const hidl_string getRole() const { return role; }
int getQuirks() const { return quirks; }
const hidl_string getRes() const { return res; }
int initFromOptions(int argc, char** argv) {
static struct option options[] = {
{"instance", required_argument, 0, 'I'},
{"component", required_argument, 0, 'C'},
{"role", required_argument, 0, 'R'},
{"quirks", required_argument, 0, 'Q'},
{"res", required_argument, 0, 'P'},
{0, 0, 0, 0}};
while (true) {
int index = 0;
int c = getopt_long(argc, argv, "I:C:Q:R:", options, &index);
int c = getopt_long(argc, argv, "I:C:R:P:", options, &index);
if (c == -1) {
break;
}
@ -91,12 +91,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
case 'C':
setComponent(optarg);
break;
case 'Q':
setQuirks(atoi(optarg));
break;
case 'R':
setRole(optarg);
break;
case 'P':
setRes(optarg);
break;
case '?':
break;
}
@ -109,8 +109,8 @@ class ComponentTestEnvironment : public ::testing::Environment {
"test options are:\n\n"
"-I, --instance: HAL instance to test\n"
"-C, --component: OMX component to test\n"
"-R, --Role: OMX component Role\n"
"-Q, --quirks: Component quirks\n",
"-R, --role: OMX component Role\n"
"-P, --res: Resource files directory location\n",
argv[optind ?: 1], argv[0]);
return 2;
}
@ -121,12 +121,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
hidl_string instance;
hidl_string component;
hidl_string role;
// to be removed when IOmxNode::setQuirks is removed
int quirks;
hidl_string res;
};
static ComponentTestEnvironment* gEnv = nullptr;
// audio decoder test fixture class
class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
@ -134,7 +134,8 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
gEnv->getInstance());
ASSERT_NE(omx, nullptr);
observer = new CodecObserver();
observer =
new CodecObserver([this](Message msg) { handleMessage(msg); });
ASSERT_NE(observer, nullptr);
ASSERT_EQ(strncmp(gEnv->getComponent().c_str(), "OMX.", 4), 0)
<< "Invalid Component Name";
@ -195,6 +196,10 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
}
}
ASSERT_NE(i, kNumCompToCoding);
eosFlag = false;
framesReceived = 0;
timestampUs = 0;
timestampDevTest = false;
}
virtual void TearDown() override {
@ -204,6 +209,51 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
}
}
// callback function to process messages received by onMessages() from IL
// client.
void handleMessage(Message msg) {
if (msg.type == Message::Type::FILL_BUFFER_DONE) {
if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) {
eosFlag = true;
}
if (msg.data.extendedBufferData.rangeLength != 0) {
framesReceived += 1;
// For decoder components current timestamp always exceeds
// previous timestamp
EXPECT_GE(msg.data.extendedBufferData.timestampUs, timestampUs);
timestampUs = msg.data.extendedBufferData.timestampUs;
// Test if current timestamp is among the list of queued
// timestamps
if (timestampDevTest) {
bool tsHit = false;
android::List<uint64_t>::iterator it =
timestampUslist.begin();
while (it != timestampUslist.end()) {
if (*it == timestampUs) {
timestampUslist.erase(it);
tsHit = true;
break;
}
it++;
}
if (tsHit == false) {
if (timestampUslist.empty() == false) {
EXPECT_EQ(tsHit, true)
<< "TimeStamp not recognized";
} else {
std::cerr
<< "[ ] Warning ! Received non-zero "
"output / TimeStamp not recognized \n";
}
}
}
}
}
}
void testEOS(android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer, bool signalEOS = false);
enum standardComp {
mp3,
amrnb,
@ -220,6 +270,11 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
sp<IOmxNode> omxNode;
standardComp compName;
OMX_AUDIO_CODINGTYPE eEncoding;
bool eosFlag;
uint32_t framesReceived;
uint64_t timestampUs;
::android::List<uint64_t> timestampUslist;
bool timestampDevTest;
protected:
static void description(const std::string& description) {
@ -227,6 +282,44 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
}
};
// end of stream test for audio decoder components
void AudioDecHidlTest::testEOS(android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
bool signalEOS) {
android::hardware::media::omx::V1_0::Status status;
size_t i = 0;
if (signalEOS) {
if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
// signal an empty buffer with flag set to EOS
dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0);
} else {
ASSERT_TRUE(false);
}
}
// Dispatch all client owned output buffers to recover remaining frames
while (1) {
if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
dispatchOutputBuffer(omxNode, oBuffer, i);
} else {
break;
}
}
while (1) {
Message msg;
status =
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
EXPECT_EQ(status,
android::hardware::media::omx::V1_0::Status::TIMED_OUT);
for (; i < iBuffer->size(); i++) {
if ((*iBuffer)[i].owner != client) break;
}
if (i == iBuffer->size()) break;
}
// test for flag
EXPECT_EQ(eosFlag, true);
eosFlag = false;
}
// Set Default port param.
void setDefaultPortParam(
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding,
@ -340,8 +433,8 @@ void getInputChannelInfo(sp<IOmxNode> omxNode, OMX_U32 kPortIndexInput,
}
// LookUpTable of clips and metadata for component testing
void GetURLForComponent(AudioDecHidlTest::standardComp comp, const char** mURL,
const char** info) {
void GetURLForComponent(AudioDecHidlTest::standardComp comp, char* mURL,
char* info) {
struct CompToURL {
AudioDecHidlTest::standardComp comp;
const char* mURL;
@ -349,42 +442,155 @@ void GetURLForComponent(AudioDecHidlTest::standardComp comp, const char** mURL,
};
static const CompToURL kCompToURL[] = {
{AudioDecHidlTest::standardComp::mp3,
"/sdcard/media/bbb_mp3_stereo_192kbps_48000hz.mp3",
"/sdcard/media/bbb_mp3_stereo_192kbps_48000hz.info"},
"bbb_mp3_stereo_192kbps_48000hz.mp3",
"bbb_mp3_stereo_192kbps_48000hz.info"},
{AudioDecHidlTest::standardComp::aac,
"/sdcard/media/bbb_aac_stereo_128kbps_48000hz.aac",
"/sdcard/media/bbb_aac_stereo_128kbps_48000hz.info"},
"bbb_aac_stereo_128kbps_48000hz.aac",
"bbb_aac_stereo_128kbps_48000hz.info"},
{AudioDecHidlTest::standardComp::amrnb,
"/sdcard/media/sine_amrnb_1ch_12kbps_8000hz.amrnb",
"/sdcard/media/sine_amrnb_1ch_12kbps_8000hz.info"},
"sine_amrnb_1ch_12kbps_8000hz.amrnb",
"sine_amrnb_1ch_12kbps_8000hz.info"},
{AudioDecHidlTest::standardComp::amrwb,
"/sdcard/media/sine_amrwb_1ch_24kbps_16000hz.amrwb",
"/sdcard/media/sine_amrwb_1ch_24kbps_16000hz.info"},
"sine_amrwb_1ch_24kbps_16000hz.amrwb",
"sine_amrwb_1ch_24kbps_16000hz.info"},
{AudioDecHidlTest::standardComp::vorbis,
"/sdcard/media/bbb_vorbis_stereo_128kbps_48000hz.vorbis",
"/sdcard/media/bbb_vorbis_stereo_128kbps_48000hz.info"},
"bbb_vorbis_stereo_128kbps_48000hz.vorbis",
"bbb_vorbis_stereo_128kbps_48000hz.info"},
{AudioDecHidlTest::standardComp::opus,
"/sdcard/media/bbb_opus_stereo_128kbps_48000hz.opus",
"/sdcard/media/bbb_opus_stereo_128kbps_48000hz.info"},
"bbb_opus_stereo_128kbps_48000hz.opus",
"bbb_opus_stereo_128kbps_48000hz.info"},
};
*mURL = *info = nullptr;
for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
if (kCompToURL[i].comp == comp) {
*mURL = kCompToURL[i].mURL;
*info = kCompToURL[i].info;
strcat(mURL, kCompToURL[i].mURL);
strcat(info, kCompToURL[i].info);
return;
}
}
}
// port settings reconfiguration during runtime. reconfigures sample rate and
// number
void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
OMX_AUDIO_CODINGTYPE eEncoding,
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
Message msg) {
android::hardware::media::omx::V1_0::Status status;
if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable),
kPortIndexOutput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
status =
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
if (status == android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
for (size_t i = 0; i < oBuffer->size(); ++i) {
// test if client got all its buffers back
EXPECT_EQ((*oBuffer)[i].owner, client);
// free the buffers
status =
omxNode->freeBuffer(kPortIndexOutput, (*oBuffer)[i].id);
ASSERT_EQ(status,
android::hardware::media::omx::V1_0::Status::OK);
}
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer,
oBuffer);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput);
// set Port Params
int32_t nChannels;
int32_t nSampleRate;
getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels,
&nSampleRate);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_AUDIO_CodingPCM,
nChannels, nSampleRate);
// If you can disable a port, then you should be able to
// enable
// it as well
status = omxNode->sendCommand(
toRawCommandType(OMX_CommandPortEnable), kPortIndexOutput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
// do not enable the port until all the buffers are supplied
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer,
oBuffer);
ASSERT_EQ(status,
android::hardware::media::omx::V1_0::Status::TIMED_OUT);
allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer,
oBuffer);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput);
// dispatch output buffers
for (size_t i = 0; i < oBuffer->size(); i++) {
dispatchOutputBuffer(omxNode, oBuffer, i);
}
} else {
ASSERT_TRUE(false);
}
} else {
EXPECT_TRUE(false);
return;
}
}
// blocking call to ensures application to Wait till all the inputs are consumed
void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
OMX_AUDIO_CODINGTYPE eEncoding,
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) {
android::hardware::media::omx::V1_0::Status status;
Message msg;
while (1) {
size_t i = 0;
status =
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
if (status == android::hardware::media::omx::V1_0::Status::OK) {
EXPECT_EQ(msg.type, Message::Type::EVENT);
portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, msg);
}
// status == TIMED_OUT, it could be due to process time being large
// than DEFAULT_TIMEOUT or component needs output buffers to start
// processing.
for (; i < iBuffer->size(); i++) {
if ((*iBuffer)[i].owner != client) break;
}
if (i == iBuffer->size()) break;
// Dispatch an output buffer assuming outQueue.empty() is true
size_t index;
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
dispatchOutputBuffer(omxNode, oBuffer, index);
}
}
}
// Decode N Frames
void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
OMX_AUDIO_CODINGTYPE eEncoding, OMX_U32 kPortIndexInput,
OMX_U32 kPortIndexOutput, uint32_t nFrames,
std::ifstream& eleStream, std::ifstream& eleInfo) {
OMX_U32 kPortIndexOutput, std::ifstream& eleStream,
android::Vector<FrameData>* Info, int offset, int range,
bool signalEOS = true) {
android::hardware::media::omx::V1_0::Status status;
Message msg;
@ -393,21 +599,24 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
dispatchOutputBuffer(omxNode, oBuffer, i);
}
// dispatch input buffers
int bytesCount = 0;
uint32_t flags = 0;
uint64_t timestamp = 0;
for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) {
int frameID = offset;
for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) &&
(frameID < (offset + range));
i++) {
char* ipBuffer = static_cast<char*>(
static_cast<void*>((*iBuffer)[i].mMemory->getPointer()));
if (!(eleInfo >> bytesCount)) break;
ASSERT_LE(bytesCount,
ASSERT_LE((*Info)[frameID].bytesCount,
static_cast<int>((*iBuffer)[i].mMemory->getSize()));
eleStream.read(ipBuffer, bytesCount);
ASSERT_EQ(eleStream.gcount(), bytesCount);
eleInfo >> flags;
eleInfo >> timestamp;
dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, 0, timestamp);
nFrames--;
eleStream.read(ipBuffer, (*Info)[frameID].bytesCount);
ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount);
flags = (*Info)[frameID].flags;
if (signalEOS && ((frameID == (int)Info->size() - 1) ||
(frameID == (offset + range - 1))))
flags |= OMX_BUFFERFLAG_EOS;
dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount,
flags, (*Info)[frameID].timestamp);
frameID++;
}
while (1) {
@ -417,101 +626,29 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
// Port Reconfiguration
if (status == android::hardware::media::omx::V1_0::Status::OK &&
msg.type == Message::Type::EVENT) {
if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
status = omxNode->sendCommand(
toRawCommandType(OMX_CommandPortDisable), kPortIndexOutput);
ASSERT_EQ(status,
android::hardware::media::omx::V1_0::Status::OK);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
iBuffer, oBuffer);
if (status ==
android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
for (size_t i = 0; i < oBuffer->size(); ++i) {
// test if client got all its buffers back
EXPECT_EQ((*oBuffer)[i].owner, client);
// free the buffers
status = omxNode->freeBuffer(kPortIndexOutput,
(*oBuffer)[i].id);
ASSERT_EQ(
status,
android::hardware::media::omx::V1_0::Status::OK);
}
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
iBuffer, oBuffer);
ASSERT_EQ(status,
android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable);
ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput);
// set Port Params
int32_t nChannels;
int32_t nSampleRate;
getInputChannelInfo(omxNode, kPortIndexInput, eEncoding,
&nChannels, &nSampleRate);
setDefaultPortParam(omxNode, kPortIndexOutput,
OMX_AUDIO_CodingPCM, nChannels,
nSampleRate);
// If you can disable a port, then you should be able to
// enable
// it as well
status = omxNode->sendCommand(
toRawCommandType(OMX_CommandPortEnable),
kPortIndexOutput);
ASSERT_EQ(status,
android::hardware::media::omx::V1_0::Status::OK);
// do not enable the port until all the buffers are supplied
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
iBuffer, oBuffer);
ASSERT_EQ(
status,
android::hardware::media::omx::V1_0::Status::TIMED_OUT);
allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
iBuffer, oBuffer);
ASSERT_EQ(status,
android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput);
// dispatch output buffers
for (size_t i = 0; i < oBuffer->size(); i++) {
dispatchOutputBuffer(omxNode, oBuffer, i);
}
} else {
ASSERT_TRUE(false);
}
} else {
EXPECT_TRUE(false);
return;
}
portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, msg);
}
if (nFrames == 0) break;
if (frameID == (int)Info->size() || frameID == (offset + range)) break;
// Dispatch input buffer
size_t index = 0;
if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
char* ipBuffer = static_cast<char*>(
static_cast<void*>((*iBuffer)[index].mMemory->getPointer()));
if (!(eleInfo >> bytesCount)) break;
ASSERT_LE(bytesCount,
ASSERT_LE((*Info)[frameID].bytesCount,
static_cast<int>((*iBuffer)[index].mMemory->getSize()));
eleStream.read(ipBuffer, bytesCount);
ASSERT_EQ(eleStream.gcount(), bytesCount);
eleInfo >> flags;
eleInfo >> timestamp;
dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, 0,
timestamp);
nFrames--;
eleStream.read(ipBuffer, (*Info)[frameID].bytesCount);
ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount);
flags = (*Info)[frameID].flags;
if (signalEOS && ((frameID == (int)Info->size() - 1) ||
(frameID == (offset + range - 1))))
flags |= OMX_BUFFERFLAG_EOS;
dispatchInputBuffer(omxNode, iBuffer, index,
(*Info)[frameID].bytesCount, flags,
(*Info)[frameID].timestamp);
frameID++;
}
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
dispatchOutputBuffer(omxNode, oBuffer, index);
@ -519,6 +656,7 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// set component role
TEST_F(AudioDecHidlTest, SetRole) {
description("Test Set Component Role");
android::hardware::media::omx::V1_0::Status status;
@ -526,6 +664,7 @@ TEST_F(AudioDecHidlTest, SetRole) {
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// port format enumeration
TEST_F(AudioDecHidlTest, EnumeratePortFormat) {
description("Test Component on Mandatory Port Parameters (Port Format)");
android::hardware::media::omx::V1_0::Status status;
@ -545,8 +684,10 @@ TEST_F(AudioDecHidlTest, EnumeratePortFormat) {
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// test port settings reconfiguration, elementary stream decode and timestamp
// deviation
TEST_F(AudioDecHidlTest, DecodeTest) {
description("Tests Port Reconfiguration and Decode");
description("Tests Port Reconfiguration, Decode and timestamp deviation");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
status = setRole(omxNode, gEnv->getRole().c_str());
@ -558,16 +699,29 @@ TEST_F(AudioDecHidlTest, DecodeTest) {
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
const char *mURL = nullptr, *info = nullptr;
GetURLForComponent(compName, &mURL, &info);
EXPECT_NE(mURL, nullptr);
EXPECT_NE(info, nullptr);
char mURL[512], info[512];
strcpy(mURL, gEnv->getRes().c_str());
strcpy(info, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL, info);
std::ifstream eleStream, eleInfo;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
eleInfo.open(info);
ASSERT_EQ(eleInfo.is_open(), true);
android::Vector<FrameData> Info;
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
timestampDevTest = true;
while (1) {
if (!(eleInfo >> bytesCount)) break;
eleInfo >> flags;
eleInfo >> timestamp;
Info.push_back({bytesCount, flags, timestamp});
if (flags != OMX_BUFFERFLAG_CODECCONFIG)
timestampUslist.push_back(timestamp);
}
eleInfo.close();
int32_t nChannels, nSampleRate;
// Configure input port
@ -586,16 +740,234 @@ TEST_F(AudioDecHidlTest, DecodeTest) {
// set state to executing
changeStateIdletoExecute(omxNode, observer);
// Port Reconfiguration
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, 1024, eleStream, eleInfo);
kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0,
(int)Info.size());
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer);
EXPECT_EQ(timestampUslist.empty(), true);
// set state to idle
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
// set state to executing
changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
}
// end of sequence test
TEST_F(AudioDecHidlTest, EOSTest) {
description("Test end of stream");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
status = setRole(omxNode, gEnv->getRole().c_str());
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
OMX_PORT_PARAM_TYPE params;
status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
ASSERT_EQ(params.nPorts, 2U);
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
char mURL[512], info[512];
strcpy(mURL, gEnv->getRes().c_str());
strcpy(info, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL, info);
std::ifstream eleStream, eleInfo;
eleInfo.open(info);
ASSERT_EQ(eleInfo.is_open(), true);
android::Vector<FrameData> Info;
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
while (1) {
if (!(eleInfo >> bytesCount)) break;
eleInfo >> flags;
eleInfo >> timestamp;
Info.push_back({bytesCount, flags, timestamp});
}
eleInfo.close();
int32_t nChannels, nSampleRate;
// Configure input port
setDefaultPortParam(omxNode, kPortIndexInput, eEncoding);
getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels,
&nSampleRate);
// Configure output port
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_AUDIO_CodingPCM,
nChannels, nSampleRate);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
// set state to executing
changeStateIdletoExecute(omxNode, observer);
// request EOS at the start
testEOS(&iBuffer, &oBuffer, true);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
EXPECT_GE(framesReceived, 0U);
framesReceived = 0;
timestampUs = 0;
// request EOS for thumbnail
// signal EOS flag with last frame
size_t i = 0;
while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0,
i + 1);
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
EXPECT_GE(framesReceived, 1U);
framesReceived = 0;
timestampUs = 0;
// signal EOS flag after last frame
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, i + 1,
false);
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer, true);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
EXPECT_GE(framesReceived, 1U);
framesReceived = 0;
timestampUs = 0;
// request EOS at the end
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0,
(int)Info.size());
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
framesReceived = 0;
timestampUs = 0;
// set state to idle
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
// set state to executing
changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
}
// test input/output port flush
TEST_F(AudioDecHidlTest, FlushTest) {
description("Test Flush");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
status = setRole(omxNode, gEnv->getRole().c_str());
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
OMX_PORT_PARAM_TYPE params;
status = getParam(omxNode, OMX_IndexParamAudioInit, &params);
if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
ASSERT_EQ(params.nPorts, 2U);
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
char mURL[512], info[512];
strcpy(mURL, gEnv->getRes().c_str());
strcpy(info, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL, info);
std::ifstream eleStream, eleInfo;
eleInfo.open(info);
ASSERT_EQ(eleInfo.is_open(), true);
android::Vector<FrameData> Info;
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
while (1) {
if (!(eleInfo >> bytesCount)) break;
eleInfo >> flags;
eleInfo >> timestamp;
Info.push_back({bytesCount, flags, timestamp});
}
eleInfo.close();
int32_t nChannels, nSampleRate;
// Configure input port
setDefaultPortParam(omxNode, kPortIndexInput, eEncoding);
getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels,
&nSampleRate);
// Configure output port
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_AUDIO_CodingPCM,
nChannels, nSampleRate);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
// set state to executing
changeStateIdletoExecute(omxNode, observer);
// Decode 128 frames and flush. here 128 is chosen to ensure there is a key
// frame after this so that the below section can be convered for all
// components
int nFrames = 128;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0,
nFrames, false);
// Note: Assumes 200 ms is enough to end any decode call that started
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, 200000);
framesReceived = 0;
// Seek to next key frame and start decoding till the end
int index = nFrames;
bool keyFrame = false;
while (index < (int)Info.size()) {
if ((Info[index].flags & OMX_BUFFERFLAG_SYNCFRAME) ==
OMX_BUFFERFLAG_SYNCFRAME) {
timestampUs = Info[index - 1].timestamp;
keyFrame = true;
break;
}
eleStream.ignore(Info[index].bytesCount);
index++;
}
if (keyFrame) {
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
kPortIndexInput, kPortIndexOutput, eleStream, &Info,
index, Info.size() - index, false);
}
// Note: Assumes 200 ms is enough to end any decode call that started
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, 200000);
framesReceived = 0;
// set state to idle
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
// set state to executing
changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
}
int main(int argc, char** argv) {

View file

@ -51,7 +51,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
virtual void SetUp() {}
virtual void TearDown() {}
ComponentTestEnvironment() : instance("default") {}
ComponentTestEnvironment() : instance("default"), res("/sdcard/media/") {}
void setInstance(const char* _instance) { instance = _instance; }
@ -59,7 +59,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
void setRole(const char* _role) { role = _role; }
void setQuirks(int _quirks) { quirks = _quirks; }
void setRes(const char* _res) { res = _res; }
const hidl_string getInstance() const { return instance; }
@ -67,19 +67,19 @@ class ComponentTestEnvironment : public ::testing::Environment {
const hidl_string getRole() const { return role; }
int getQuirks() const { return quirks; }
const hidl_string getRes() const { return res; }
int initFromOptions(int argc, char** argv) {
static struct option options[] = {
{"instance", required_argument, 0, 'I'},
{"component", required_argument, 0, 'C'},
{"role", required_argument, 0, 'R'},
{"quirks", required_argument, 0, 'Q'},
{"res", required_argument, 0, 'P'},
{0, 0, 0, 0}};
while (true) {
int index = 0;
int c = getopt_long(argc, argv, "I:C:Q:R:", options, &index);
int c = getopt_long(argc, argv, "I:C:R:P:", options, &index);
if (c == -1) {
break;
}
@ -91,12 +91,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
case 'C':
setComponent(optarg);
break;
case 'Q':
setQuirks(atoi(optarg));
break;
case 'R':
setRole(optarg);
break;
case 'P':
setRes(optarg);
break;
case '?':
break;
}
@ -109,8 +109,8 @@ class ComponentTestEnvironment : public ::testing::Environment {
"test options are:\n\n"
"-I, --instance: HAL instance to test\n"
"-C, --component: OMX component to test\n"
"-R, --Role: OMX component Role\n"
"-Q, --quirks: Component quirks\n",
"-R, --role: OMX component Role\n"
"-P, --res: Resource files directory location\n",
argv[optind ?: 1], argv[0]);
return 2;
}
@ -121,12 +121,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
hidl_string instance;
hidl_string component;
hidl_string role;
// to be removed when IOmxNode::setQuirks is removed
int quirks;
hidl_string res;
};
static ComponentTestEnvironment* gEnv = nullptr;
// audio encoder test fixture class
class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
@ -134,7 +134,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
gEnv->getInstance());
ASSERT_NE(omx, nullptr);
observer = new CodecObserver();
observer = new CodecObserver([this](Message msg) { (void)msg; });
ASSERT_NE(observer, nullptr);
ASSERT_EQ(strncmp(gEnv->getComponent().c_str(), "OMX.", 4), 0)
<< "Invalid Component Name";
@ -257,27 +257,21 @@ void setDefaultPortParam(sp<IOmxNode> omxNode, OMX_U32 portIndex,
}
// LookUpTable of clips and metadata for component testing
void GetURLForComponent(AudioEncHidlTest::standardComp comp,
const char** mURL) {
void GetURLForComponent(AudioEncHidlTest::standardComp comp, char* mURL) {
struct CompToURL {
AudioEncHidlTest::standardComp comp;
const char* mURL;
};
static const CompToURL kCompToURL[] = {
{AudioEncHidlTest::standardComp::aac,
"/sdcard/media/bbb_raw_2ch_48khz_s16le.raw"},
{AudioEncHidlTest::standardComp::amrnb,
"/sdcard/media/bbb_raw_1ch_8khz_s16le.raw"},
{AudioEncHidlTest::standardComp::amrwb,
"/sdcard/media/bbb_raw_1ch_16khz_s16le.raw"},
{AudioEncHidlTest::standardComp::flac,
"/sdcard/media/bbb_raw_2ch_48khz_s16le.raw"},
{AudioEncHidlTest::standardComp::aac, "bbb_raw_2ch_48khz_s16le.raw"},
{AudioEncHidlTest::standardComp::amrnb, "bbb_raw_1ch_8khz_s16le.raw"},
{AudioEncHidlTest::standardComp::amrwb, "bbb_raw_1ch_16khz_s16le.raw"},
{AudioEncHidlTest::standardComp::flac, "bbb_raw_2ch_48khz_s16le.raw"},
};
*mURL = nullptr;
for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
if (kCompToURL[i].comp == comp) {
*mURL = kCompToURL[i].mURL;
strcat(mURL, kCompToURL[i].mURL);
return;
}
}
@ -343,6 +337,7 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// set component role
TEST_F(AudioEncHidlTest, SetRole) {
description("Test Set Component Role");
android::hardware::media::omx::V1_0::Status status;
@ -350,6 +345,7 @@ TEST_F(AudioEncHidlTest, SetRole) {
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// port format enumeration
TEST_F(AudioEncHidlTest, EnumeratePortFormat) {
description("Test Component on Mandatory Port Parameters (Port Format)");
android::hardware::media::omx::V1_0::Status status;
@ -369,6 +365,7 @@ TEST_F(AudioEncHidlTest, EnumeratePortFormat) {
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// test raw stream encode
TEST_F(AudioEncHidlTest, EncodeTest) {
description("Tests Encode");
android::hardware::media::omx::V1_0::Status status;
@ -382,9 +379,9 @@ TEST_F(AudioEncHidlTest, EncodeTest) {
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
const char* mURL = nullptr;
GetURLForComponent(compName, &mURL);
EXPECT_NE(mURL, nullptr);
char mURL[512];
strcpy(mURL, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL);
std::ifstream eleStream;
eleStream.open(mURL, std::ifstream::binary);

View file

@ -235,6 +235,26 @@ size_t getEmptyBufferID(android::Vector<BufferInfo>* buffArray) {
return buffArray->size();
}
// dispatch buffer to output port
void dispatchOutputBuffer(sp<IOmxNode> omxNode,
android::Vector<BufferInfo>* buffArray,
size_t bufferIndex) {
android::hardware::media::omx::V1_0::Status status;
CodecBuffer t;
t.sharedMemory = android::hardware::hidl_memory();
t.nativeHandle = android::hardware::hidl_handle();
t.type = CodecBuffer::Type::PRESET;
t.attr.preset.rangeOffset = 0;
t.attr.preset.rangeLength = 0;
native_handle_t* fenceNh = native_handle_create(0, 0);
ASSERT_NE(fenceNh, nullptr);
status = omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh);
native_handle_close(fenceNh);
native_handle_delete(fenceNh);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
buffArray->editItemAt(bufferIndex).owner = component;
}
// dispatch buffer to input port
void dispatchInputBuffer(sp<IOmxNode> omxNode,
android::Vector<BufferInfo>* buffArray,
@ -257,31 +277,11 @@ void dispatchInputBuffer(sp<IOmxNode> omxNode,
buffArray->editItemAt(bufferIndex).owner = component;
}
// dispatch buffer to output port
void dispatchOutputBuffer(sp<IOmxNode> omxNode,
android::Vector<BufferInfo>* buffArray,
size_t bufferIndex) {
android::hardware::media::omx::V1_0::Status status;
CodecBuffer t;
t.sharedMemory = android::hardware::hidl_memory();
t.nativeHandle = android::hardware::hidl_handle();
t.type = CodecBuffer::Type::PRESET;
t.attr.preset.rangeOffset = 0;
t.attr.preset.rangeLength = 0;
native_handle_t* fenceNh = native_handle_create(0, 0);
ASSERT_NE(fenceNh, nullptr);
status = omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh);
native_handle_close(fenceNh);
native_handle_delete(fenceNh);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
buffArray->editItemAt(bufferIndex).owner = component;
}
// Flush input and output ports
void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
OMX_U32 kPortIndexOutput) {
OMX_U32 kPortIndexOutput, int64_t timeoutUs) {
android::hardware::media::omx::V1_0::Status status;
Message msg;
@ -289,7 +289,7 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
kPortIndexInput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
status = observer->dequeueMessage(&msg, timeoutUs, iBuffer, oBuffer);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
@ -304,7 +304,7 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
kPortIndexOutput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
status = observer->dequeueMessage(&msg, timeoutUs, iBuffer, oBuffer);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
@ -317,10 +317,10 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE encoding) {
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) {
OMX_U32 index = 0;
OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat;
std::vector<OMX_AUDIO_CODINGTYPE> eEncoding;
std::vector<OMX_AUDIO_CODINGTYPE> arrEncoding;
android::hardware::media::omx::V1_0::Status status;
while (1) {
@ -328,24 +328,26 @@ Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex,
&portFormat);
if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
eEncoding.push_back(portFormat.eEncoding);
arrEncoding.push_back(portFormat.eEncoding);
index++;
if (index == 512) {
// enumerated way too many formats, highly unusual for this to
// happen.
EXPECT_LE(index, 512U)
<< "Expecting OMX_ErrorNoMore but not received";
break;
}
}
if (!index) return status;
for (index = 0; index < eEncoding.size(); index++) {
if (eEncoding[index] == encoding) {
portFormat.eEncoding = eEncoding[index];
for (index = 0; index < arrEncoding.size(); index++) {
if (arrEncoding[index] == eEncoding) {
portFormat.eEncoding = arrEncoding[index];
break;
}
}
if (index == eEncoding.size()) {
if (index == arrEncoding.size()) {
ALOGI("setting default Port format");
portFormat.eEncoding = eEncoding[0];
portFormat.eEncoding = arrEncoding[0];
}
// In setParam call nIndex shall be ignored as per omx-il specification.
// see how this holds up by corrupting nIndex

View file

@ -48,22 +48,22 @@ void changeStateExecutetoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
size_t getEmptyBufferID(android::Vector<BufferInfo>* buffArray);
void dispatchOutputBuffer(sp<IOmxNode> omxNode,
android::Vector<BufferInfo>* buffArray,
size_t bufferIndex);
void dispatchInputBuffer(sp<IOmxNode> omxNode,
android::Vector<BufferInfo>* buffArray,
size_t bufferIndex, int bytesCount, uint32_t flags,
uint64_t timestamp);
void dispatchOutputBuffer(sp<IOmxNode> omxNode,
android::Vector<BufferInfo>* buffArray,
size_t bufferIndex);
void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
OMX_U32 kPortIndexOutput);
OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT);
Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE encoding);
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding);
Return<android::hardware::media::omx::V1_0::Status> setRole(
sp<IOmxNode> omxNode, const char* role);

View file

@ -71,8 +71,15 @@ struct BufferInfo {
::android::sp<IMemory> mMemory;
};
struct FrameData {
int bytesCount;
uint32_t flags;
uint32_t timestamp;
};
struct CodecObserver : public IOmxObserver {
public:
CodecObserver(std::function<void(Message)> fn) : callBack(fn) {}
Return<void> onMessages(const hidl_vec<Message>& messages) override {
android::Mutex::Autolock autoLock(msgLock);
for (hidl_vec<Message>::const_iterator it = messages.begin();
@ -103,6 +110,7 @@ struct CodecObserver : public IOmxObserver {
for (i = 0; i < oBuffers->size(); ++i) {
if ((*oBuffers)[i].id ==
it->data.bufferData.buffer) {
if (callBack) callBack(*it);
oBuffers->editItemAt(i).owner = client;
msgQueue.erase(it);
break;
@ -127,12 +135,14 @@ struct CodecObserver : public IOmxObserver {
}
++it;
}
if (finishBy - android::ALooper::GetNowUs() < 0)
return toStatus(android::TIMED_OUT);
android::status_t err =
(timeoutUs < 0)
? msgCondition.wait(msgLock)
: msgCondition.waitRelative(
msgLock,
(finishBy - android::ALooper::GetNowUs()) * 1000);
(finishBy - android::ALooper::GetNowUs()) * 1000ll);
if (err == android::TIMED_OUT) return toStatus(err);
}
}
@ -140,6 +150,7 @@ struct CodecObserver : public IOmxObserver {
android::List<Message> msgQueue;
android::Mutex msgLock;
android::Condition msgCondition;
std::function<void(Message)> callBack;
};
/*

View file

@ -57,27 +57,22 @@ class ComponentTestEnvironment : public ::testing::Environment {
void setRole(const char* _role) { role = _role; }
void setQuirks(int _quirks) { quirks = _quirks; }
const hidl_string getInstance() const { return instance; }
const hidl_string getComponent() const { return component; }
const hidl_string getRole() const { return role; }
int getQuirks() const { return quirks; }
int initFromOptions(int argc, char** argv) {
static struct option options[] = {
{"instance", required_argument, 0, 'I'},
{"component", required_argument, 0, 'C'},
{"role", required_argument, 0, 'R'},
{"quirks", required_argument, 0, 'Q'},
{0, 0, 0, 0}};
while (true) {
int index = 0;
int c = getopt_long(argc, argv, "I:C:Q:R:", options, &index);
int c = getopt_long(argc, argv, "I:C:R:", options, &index);
if (c == -1) {
break;
}
@ -89,9 +84,6 @@ class ComponentTestEnvironment : public ::testing::Environment {
case 'C':
setComponent(optarg);
break;
case 'Q':
setQuirks(atoi(optarg));
break;
case 'R':
setRole(optarg);
break;
@ -107,8 +99,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
"test options are:\n\n"
"-I, --instance: HAL instance to test\n"
"-C, --component: OMX component to test\n"
"-R, --Role: OMX component Role\n"
"-Q, --quirks: Component quirks\n",
"-R, --Role: OMX component Role\n",
argv[optind ?: 1], argv[0]);
return 2;
}
@ -119,12 +110,11 @@ class ComponentTestEnvironment : public ::testing::Environment {
hidl_string instance;
hidl_string component;
hidl_string role;
// to be removed when IOmxNode::setQuirks is removed
int quirks;
};
static ComponentTestEnvironment* gEnv = nullptr;
// generic component test fixture class
class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
@ -132,7 +122,7 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase {
omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
gEnv->getInstance());
ASSERT_NE(omx, nullptr);
observer = new CodecObserver();
observer = new CodecObserver(nullptr);
ASSERT_NE(observer, nullptr);
ASSERT_EQ(strncmp(gEnv->getComponent().c_str(), "OMX.", 4), 0)
<< "Invalid Component Name";
@ -465,14 +455,15 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// get/set video component port format
Return<android::hardware::media::omx::V1_0::Status> setVideoPortFormat(
sp<IOmxNode> omxNode, OMX_U32 portIndex,
OMX_VIDEO_CODINGTYPE compressionFormat, OMX_COLOR_FORMATTYPE colorFormat,
OMX_U32 frameRate) {
OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat,
OMX_U32 xFramerate) {
OMX_U32 index = 0;
OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat;
std::vector<OMX_COLOR_FORMATTYPE> eColorFormat;
std::vector<OMX_VIDEO_CODINGTYPE> eCompressionFormat;
std::vector<OMX_COLOR_FORMATTYPE> arrColorFormat;
std::vector<OMX_VIDEO_CODINGTYPE> arrCompressionFormat;
android::hardware::media::omx::V1_0::Status status;
while (1) {
@ -480,10 +471,10 @@ Return<android::hardware::media::omx::V1_0::Status> setVideoPortFormat(
status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex,
&portFormat);
if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
if (compressionFormat == OMX_VIDEO_CodingUnused)
eColorFormat.push_back(portFormat.eColorFormat);
if (eCompressionFormat == OMX_VIDEO_CodingUnused)
arrColorFormat.push_back(portFormat.eColorFormat);
else
eCompressionFormat.push_back(portFormat.eCompressionFormat);
arrCompressionFormat.push_back(portFormat.eCompressionFormat);
index++;
if (index == 512) {
// enumerated way too many formats, highly unusual for this to
@ -494,45 +485,46 @@ Return<android::hardware::media::omx::V1_0::Status> setVideoPortFormat(
}
}
if (!index) return status;
if (compressionFormat == OMX_VIDEO_CodingUnused) {
for (index = 0; index < eColorFormat.size(); index++) {
if (eColorFormat[index] == colorFormat) {
portFormat.eColorFormat = eColorFormat[index];
if (eCompressionFormat == OMX_VIDEO_CodingUnused) {
for (index = 0; index < arrColorFormat.size(); index++) {
if (arrColorFormat[index] == eColorFormat) {
portFormat.eColorFormat = arrColorFormat[index];
break;
}
}
if (index == eColorFormat.size()) {
if (index == arrColorFormat.size()) {
ALOGI("setting default color format");
portFormat.eColorFormat = eColorFormat[0];
portFormat.eColorFormat = arrColorFormat[0];
}
portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
} else {
for (index = 0; index < eCompressionFormat.size(); index++) {
if (eCompressionFormat[index] == compressionFormat) {
portFormat.eCompressionFormat = eCompressionFormat[index];
for (index = 0; index < arrCompressionFormat.size(); index++) {
if (arrCompressionFormat[index] == eCompressionFormat) {
portFormat.eCompressionFormat = arrCompressionFormat[index];
break;
}
}
if (index == eCompressionFormat.size()) {
if (index == arrCompressionFormat.size()) {
ALOGI("setting default compression format");
portFormat.eCompressionFormat = eCompressionFormat[0];
portFormat.eCompressionFormat = arrCompressionFormat[0];
}
portFormat.eColorFormat = OMX_COLOR_FormatUnused;
}
// In setParam call nIndex shall be ignored as per omx-il specification.
// see how this holds up by corrupting nIndex
portFormat.nIndex = RANDOM_INDEX;
portFormat.xFramerate = frameRate;
portFormat.xFramerate = xFramerate;
status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex,
&portFormat);
return status;
}
// get/set audio component port format
Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE encoding) {
sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) {
OMX_U32 index = 0;
OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat;
std::vector<OMX_AUDIO_CODINGTYPE> eEncoding;
std::vector<OMX_AUDIO_CODINGTYPE> arrEncoding;
android::hardware::media::omx::V1_0::Status status;
while (1) {
@ -540,7 +532,7 @@ Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex,
&portFormat);
if (status != ::android::hardware::media::omx::V1_0::Status::OK) break;
eEncoding.push_back(portFormat.eEncoding);
arrEncoding.push_back(portFormat.eEncoding);
index++;
if (index == 512) {
// enumerated way too many formats, highly unusual for this to
@ -551,15 +543,15 @@ Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
}
}
if (!index) return status;
for (index = 0; index < eEncoding.size(); index++) {
if (eEncoding[index] == encoding) {
portFormat.eEncoding = eEncoding[index];
for (index = 0; index < arrEncoding.size(); index++) {
if (arrEncoding[index] == eEncoding) {
portFormat.eEncoding = arrEncoding[index];
break;
}
}
if (index == eEncoding.size()) {
if (index == arrEncoding.size()) {
ALOGI("setting default Port format");
portFormat.eEncoding = eEncoding[0];
portFormat.eEncoding = arrEncoding[0];
}
// In setParam call nIndex shall be ignored as per omx-il specification.
// see how this holds up by corrupting nIndex
@ -569,6 +561,7 @@ Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat(
return status;
}
// set component role
Return<android::hardware::media::omx::V1_0::Status> setRole(
sp<IOmxNode> omxNode, const char* role) {
OMX_PARAM_COMPONENTROLETYPE params;
@ -576,6 +569,7 @@ Return<android::hardware::media::omx::V1_0::Status> setRole(
return setParam(omxNode, OMX_IndexParamStandardComponentRole, &params);
}
// set component role
TEST_F(ComponentHidlTest, SetRole) {
description("Test Set Component Role");
android::hardware::media::omx::V1_0::Status status;
@ -583,8 +577,9 @@ TEST_F(ComponentHidlTest, SetRole) {
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// port indices enumeration
TEST_F(ComponentHidlTest, GetPortIndices) {
description("Test Component on Mandatory Port Parameters (Port ID's)");
description("Test Component on Mandatory Port Parameters (Port Indices)");
android::hardware::media::omx::V1_0::Status status;
OMX_PORT_PARAM_TYPE params;
@ -604,6 +599,7 @@ TEST_F(ComponentHidlTest, GetPortIndices) {
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// port format enumeration
TEST_F(ComponentHidlTest, EnumeratePortFormat) {
description("Test Component on Mandatory Port Parameters (Port Format)");
android::hardware::media::omx::V1_0::Status status;
@ -623,8 +619,8 @@ TEST_F(ComponentHidlTest, EnumeratePortFormat) {
kPortIndexOutput = kPortIndexInput + 1;
}
OMX_COLOR_FORMATTYPE colorFormat = OMX_COLOR_FormatYUV420Planar;
OMX_U32 frameRate = 24 << 16;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
OMX_U32 xFramerate = 24U << 16;
// Enumerate Port Format
if (compClass == audio_encoder) {
@ -644,7 +640,7 @@ TEST_F(ComponentHidlTest, EnumeratePortFormat) {
} else if (compClass == video_encoder) {
status =
setVideoPortFormat(omxNode, kPortIndexInput, OMX_VIDEO_CodingUnused,
colorFormat, frameRate);
eColorFormat, xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
status = setVideoPortFormat(omxNode, kPortIndexOutput,
OMX_VIDEO_CodingAutoDetect,
@ -655,13 +651,14 @@ TEST_F(ComponentHidlTest, EnumeratePortFormat) {
OMX_VIDEO_CodingAutoDetect,
OMX_COLOR_FormatUnused, 0U);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
status =
setVideoPortFormat(omxNode, kPortIndexOutput,
OMX_VIDEO_CodingUnused, colorFormat, frameRate);
status = setVideoPortFormat(omxNode, kPortIndexOutput,
OMX_VIDEO_CodingUnused, eColorFormat,
xFramerate);
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
}
// get/set default port settings of a component
TEST_F(ComponentHidlTest, SetDefaultPortParams) {
description(
"Test Component on Mandatory Port Parameters (Port Definition)");
@ -700,11 +697,15 @@ TEST_F(ComponentHidlTest, SetDefaultPortParams) {
status = setPortParam(omxNode, OMX_IndexParamPortDefinition,
kPortIndexInput, &iPortDef);
}
EXPECT_EQ(status,
::android::hardware::media::omx::V1_0::Status::OK);
} else if (compClass == video_encoder || compClass == video_decoder) {
EXPECT_EQ(iPortDef.eDomain, OMX_PortDomainVideo);
if (compClass == video_decoder) {
iPortDef.format.video.bFlagErrorConcealment = OMX_TRUE;
status = setPortParam(omxNode, OMX_IndexParamPortDefinition,
kPortIndexInput, &iPortDef);
}
}
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
OMX_PARAM_PORTDEFINITIONTYPE dummy = iPortDef;
iPortDef.nBufferCountActual = iPortDef.nBufferCountMin - 1;
status = setPortParam(omxNode, OMX_IndexParamPortDefinition,
@ -748,11 +749,15 @@ TEST_F(ComponentHidlTest, SetDefaultPortParams) {
status = setPortParam(omxNode, OMX_IndexParamPortDefinition,
kPortIndexOutput, &oPortDef);
}
EXPECT_EQ(status,
::android::hardware::media::omx::V1_0::Status::OK);
} else if (compClass == video_encoder || compClass == video_decoder) {
EXPECT_EQ(oPortDef.eDomain, OMX_PortDomainVideo);
if (compClass == video_encoder) {
oPortDef.format.video.bFlagErrorConcealment = OMX_TRUE;
status = setPortParam(omxNode, OMX_IndexParamPortDefinition,
kPortIndexOutput, &oPortDef);
}
}
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
OMX_PARAM_PORTDEFINITIONTYPE dummy = oPortDef;
oPortDef.nBufferCountActual = oPortDef.nBufferCountMin - 1;
status = setPortParam(omxNode, OMX_IndexParamPortDefinition,
@ -780,6 +785,7 @@ TEST_F(ComponentHidlTest, SetDefaultPortParams) {
}
}
// populate port test
TEST_F(ComponentHidlTest, PopulatePort) {
description("Verify bPopulated field of a component port");
android::hardware::media::omx::V1_0::Status status;
@ -843,11 +849,12 @@ TEST_F(ComponentHidlTest, PopulatePort) {
getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef);
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
// A port is populated when all of the buffers indicated by
// nBufferCountActual
// with a size of at least nBufferSizehave been allocated on the port.
// nBufferCountActual with a size of at least nBufferSizehave been
// allocated on the port.
ASSERT_EQ(portDef.bPopulated, OMX_FALSE);
}
// Flush test
TEST_F(ComponentHidlTest, Flush) {
description("Test Flush");
android::hardware::media::omx::V1_0::Status status;
@ -896,8 +903,9 @@ TEST_F(ComponentHidlTest, Flush) {
kPortIndexInput, kPortIndexOutput);
}
// state transitions test
TEST_F(ComponentHidlTest, StateTransitions) {
description("Test State Transitions");
description("Test State Transitions Loaded<->Idle<->Execute");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
Message msg;
@ -942,6 +950,7 @@ TEST_F(ComponentHidlTest, StateTransitions) {
kPortIndexInput, kPortIndexOutput);
}
// state transitions test - monkeying
TEST_F(ComponentHidlTest, StateTransitions_M) {
description("Test State Transitions monkeying");
android::hardware::media::omx::V1_0::Status status;
@ -1004,6 +1013,7 @@ TEST_F(ComponentHidlTest, StateTransitions_M) {
kPortIndexInput, kPortIndexOutput);
}
// port enable disable test
TEST_F(ComponentHidlTest, PortEnableDisable_Loaded) {
description("Test Port Enable and Disable (Component State :: Loaded)");
android::hardware::media::omx::V1_0::Status status;
@ -1052,6 +1062,7 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Loaded) {
}
}
// port enable disable test
TEST_F(ComponentHidlTest, PortEnableDisable_Idle) {
description("Test Port Enable and Disable (Component State :: Idle)");
android::hardware::media::omx::V1_0::Status status;
@ -1145,6 +1156,7 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) {
kPortIndexInput, kPortIndexOutput);
}
// port enable disable test
TEST_F(ComponentHidlTest, PortEnableDisable_Execute) {
description("Test Port Enable and Disable (Component State :: Execute)");
android::hardware::media::omx::V1_0::Status status;
@ -1252,6 +1264,7 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) {
kPortIndexInput, kPortIndexOutput);
}
// port enable disable test - monkeying
TEST_F(ComponentHidlTest, PortEnableDisable_M) {
description(
"Test Port Enable and Disable Monkeying (Component State :: Loaded)");

View file

@ -51,7 +51,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
virtual void SetUp() {}
virtual void TearDown() {}
ComponentTestEnvironment() : instance("default") {}
ComponentTestEnvironment() : instance("default"), res("/sdcard/media/") {}
void setInstance(const char* _instance) { instance = _instance; }
@ -59,7 +59,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
void setRole(const char* _role) { role = _role; }
void setQuirks(int _quirks) { quirks = _quirks; }
void setRes(const char* _res) { res = _res; }
const hidl_string getInstance() const { return instance; }
@ -67,19 +67,19 @@ class ComponentTestEnvironment : public ::testing::Environment {
const hidl_string getRole() const { return role; }
int getQuirks() const { return quirks; }
const hidl_string getRes() const { return res; }
int initFromOptions(int argc, char** argv) {
static struct option options[] = {
{"instance", required_argument, 0, 'I'},
{"component", required_argument, 0, 'C'},
{"role", required_argument, 0, 'R'},
{"quirks", required_argument, 0, 'Q'},
{"res", required_argument, 0, 'P'},
{0, 0, 0, 0}};
while (true) {
int index = 0;
int c = getopt_long(argc, argv, "I:C:Q:R:", options, &index);
int c = getopt_long(argc, argv, "I:C:R:P:", options, &index);
if (c == -1) {
break;
}
@ -91,12 +91,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
case 'C':
setComponent(optarg);
break;
case 'Q':
setQuirks(atoi(optarg));
break;
case 'R':
setRole(optarg);
break;
case 'P':
setRes(optarg);
break;
case '?':
break;
}
@ -109,8 +109,8 @@ class ComponentTestEnvironment : public ::testing::Environment {
"test options are:\n\n"
"-I, --instance: HAL instance to test\n"
"-C, --component: OMX component to test\n"
"-R, --Role: OMX component Role\n"
"-Q, --quirks: Component quirks\n",
"-R, --role: OMX component Role\n"
"-P, --res: Resource files directory location\n",
argv[optind ?: 1], argv[0]);
return 2;
}
@ -121,12 +121,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
hidl_string instance;
hidl_string component;
hidl_string role;
// to be removed when IOmxNode::setQuirks is removed
int quirks;
hidl_string res;
};
static ComponentTestEnvironment* gEnv = nullptr;
// video decoder test fixture class
class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
@ -134,7 +134,8 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
gEnv->getInstance());
ASSERT_NE(omx, nullptr);
observer = new CodecObserver();
observer =
new CodecObserver([this](Message msg) { handleMessage(msg); });
ASSERT_NE(observer, nullptr);
ASSERT_EQ(strncmp(gEnv->getComponent().c_str(), "OMX.", 4), 0)
<< "Invalid Component Name";
@ -191,6 +192,10 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
}
}
ASSERT_NE(i, kNumCompToCompression);
eosFlag = false;
framesReceived = 0;
timestampUs = 0;
timestampDevTest = false;
}
virtual void TearDown() override {
@ -200,6 +205,51 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
}
}
// callback function to process messages received by onMessages() from IL
// client.
void handleMessage(Message msg) {
if (msg.type == Message::Type::FILL_BUFFER_DONE) {
if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) {
eosFlag = true;
}
if (msg.data.extendedBufferData.rangeLength != 0) {
framesReceived += 1;
// For decoder components current timestamp always exceeds
// previous timestamp
EXPECT_GE(msg.data.extendedBufferData.timestampUs, timestampUs);
timestampUs = msg.data.extendedBufferData.timestampUs;
// Test if current timestamp is among the list of queued
// timestamps
if (timestampDevTest) {
bool tsHit = false;
android::List<uint64_t>::iterator it =
timestampUslist.begin();
while (it != timestampUslist.end()) {
if (*it == timestampUs) {
timestampUslist.erase(it);
tsHit = true;
break;
}
it++;
}
if (tsHit == false) {
if (timestampUslist.empty() == false) {
EXPECT_EQ(tsHit, true)
<< "TimeStamp not recognized";
} else {
std::cerr
<< "[ ] Warning ! Received non-zero "
"output / TimeStamp not recognized \n";
}
}
}
}
}
}
void testEOS(android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer, bool signalEOS = false);
enum standardComp {
h263,
avc,
@ -216,6 +266,11 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
sp<IOmxNode> omxNode;
standardComp compName;
OMX_VIDEO_CODINGTYPE eCompressionFormat;
bool eosFlag;
uint32_t framesReceived;
uint64_t timestampUs;
::android::List<uint64_t> timestampUslist;
bool timestampDevTest;
protected:
static void description(const std::string& description) {
@ -223,6 +278,44 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase {
}
};
// end of stream test for video decoder components
void VideoDecHidlTest::testEOS(android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
bool signalEOS) {
android::hardware::media::omx::V1_0::Status status;
size_t i = 0;
if (signalEOS) {
if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
// signal an empty buffer with flag set to EOS
dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0);
} else {
ASSERT_TRUE(false);
}
}
// Dispatch all client owned output buffers to recover remaining frames
while (1) {
if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
dispatchOutputBuffer(omxNode, oBuffer, i);
} else {
break;
}
}
while (1) {
Message msg;
status =
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
EXPECT_EQ(status,
android::hardware::media::omx::V1_0::Status::TIMED_OUT);
for (; i < iBuffer->size(); i++) {
if ((*iBuffer)[i].owner != client) break;
}
if (i == iBuffer->size()) break;
}
// test for flag
EXPECT_EQ(eosFlag, true);
eosFlag = false;
}
// Set Default port param.
void setDefaultPortParam(sp<IOmxNode> omxNode, OMX_U32 portIndex,
OMX_VIDEO_CODINGTYPE eCompressionFormat,
@ -264,8 +357,8 @@ void getInputChannelInfo(sp<IOmxNode> omxNode, OMX_U32 kPortIndexInput,
}
// LookUpTable of clips and metadata for component testing
void GetURLForComponent(VideoDecHidlTest::standardComp comp, const char** mURL,
const char** info) {
void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL,
char* info) {
struct CompToURL {
VideoDecHidlTest::standardComp comp;
const char* mURL;
@ -273,20 +366,37 @@ void GetURLForComponent(VideoDecHidlTest::standardComp comp, const char** mURL,
};
static const CompToURL kCompToURL[] = {
{VideoDecHidlTest::standardComp::avc,
"/sdcard/media/bbb_avc_1920x1080_5000kbps_30fps.h264",
"/sdcard/media/bbb_avc_1920x1080_5000kbps_30fps.info"},
"bbb_avc_1920x1080_5000kbps_30fps.h264",
"bbb_avc_1920x1080_5000kbps_30fps.info"},
{VideoDecHidlTest::standardComp::hevc,
"bbb_hevc_640x360_1600kbps_30fps.hevc",
"bbb_hevc_640x360_1600kbps_30fps.info"},
{VideoDecHidlTest::standardComp::mpeg2,
"bbb_mpeg2_176x144_105kbps_25fps.m2v",
"bbb_mpeg2_176x144_105kbps_25fps.info"},
{VideoDecHidlTest::standardComp::h263,
"bbb_h263_352x288_300kbps_12fps.h263",
"bbb_h263_352x288_300kbps_12fps.info"},
{VideoDecHidlTest::standardComp::mpeg4,
"bbb_mpeg4_1280x720_1000kbps_25fps.m4v",
"bbb_mpeg4_1280x720_1000kbps_25fps.info"},
{VideoDecHidlTest::standardComp::vp8, "bbb_vp8_640x360_2mbps_30fps.vp8",
"bbb_vp8_640x360_2mbps_30fps.info"},
{VideoDecHidlTest::standardComp::vp9,
"bbb_vp9_640x360_1600kbps_30fps.vp9",
"bbb_vp9_640x360_1600kbps_30fps.info"},
};
*mURL = *info = nullptr;
for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
if (kCompToURL[i].comp == comp) {
*mURL = kCompToURL[i].mURL;
*info = kCompToURL[i].info;
strcat(mURL, kCompToURL[i].mURL);
strcat(info, kCompToURL[i].info);
return;
}
}
}
// port settings reconfiguration during runtime. reconfigures frame dimensions
void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
@ -382,13 +492,46 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// blocking call to ensures application to Wait till all the inputs are consumed
void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) {
android::hardware::media::omx::V1_0::Status status;
Message msg;
while (1) {
size_t i = 0;
status =
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
if (status == android::hardware::media::omx::V1_0::Status::OK) {
EXPECT_EQ(msg.type, Message::Type::EVENT);
portReconfiguration(omxNode, observer, iBuffer, oBuffer,
kPortIndexInput, kPortIndexOutput, msg);
}
// status == TIMED_OUT, it could be due to process time being large
// than DEFAULT_TIMEOUT or component needs output buffers to start
// processing.
for (; i < iBuffer->size(); i++) {
if ((*iBuffer)[i].owner != client) break;
}
if (i == iBuffer->size()) break;
// Dispatch an output buffer assuming outQueue.empty() is true
size_t index;
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
dispatchOutputBuffer(omxNode, oBuffer, index);
}
}
}
// Decode N Frames
void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer,
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
uint32_t nFrames, std::ifstream& eleStream,
std::ifstream& eleInfo) {
std::ifstream& eleStream, android::Vector<FrameData>* Info,
int offset, int range, bool signalEOS = true) {
android::hardware::media::omx::V1_0::Status status;
Message msg;
@ -397,24 +540,24 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
dispatchOutputBuffer(omxNode, oBuffer, i);
}
// dispatch input buffers
int bytesCount = 0;
uint32_t sampleflags = 0, flags = 0;
uint64_t timestamp = 0;
for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) {
uint32_t flags = 0;
int frameID = offset;
for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) &&
(frameID < (offset + range));
i++) {
char* ipBuffer = static_cast<char*>(
static_cast<void*>((*iBuffer)[i].mMemory->getPointer()));
if (!(eleInfo >> bytesCount)) break;
ASSERT_LE(bytesCount,
ASSERT_LE((*Info)[frameID].bytesCount,
static_cast<int>((*iBuffer)[i].mMemory->getSize()));
eleStream.read(ipBuffer, bytesCount);
ASSERT_EQ(eleStream.gcount(), bytesCount);
eleInfo >> sampleflags;
eleInfo >> timestamp;
flags = 0;
// Map MediaExtractor flags to OMX Buffer flags
if (sampleflags & 1) flags |= OMX_BUFFERFLAG_SYNCFRAME;
dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp);
nFrames--;
eleStream.read(ipBuffer, (*Info)[frameID].bytesCount);
ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount);
flags = (*Info)[frameID].flags;
if (signalEOS && ((frameID == (int)Info->size() - 1) ||
(frameID == (offset + range - 1))))
flags |= OMX_BUFFERFLAG_EOS;
dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount,
flags, (*Info)[frameID].timestamp);
frameID++;
}
while (1) {
@ -428,26 +571,25 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
kPortIndexInput, kPortIndexOutput, msg);
}
if (nFrames == 0) break;
if (frameID == (int)Info->size() || frameID == (offset + range)) break;
// Dispatch input buffer
size_t index = 0;
if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
char* ipBuffer = static_cast<char*>(
static_cast<void*>((*iBuffer)[index].mMemory->getPointer()));
if (!(eleInfo >> bytesCount)) break;
ASSERT_LE(bytesCount,
ASSERT_LE((*Info)[frameID].bytesCount,
static_cast<int>((*iBuffer)[index].mMemory->getSize()));
eleStream.read(ipBuffer, bytesCount);
ASSERT_EQ(eleStream.gcount(), bytesCount);
eleInfo >> sampleflags;
eleInfo >> timestamp;
flags = 0;
// Map MediaExtractor flags to OMX Buffer flags
if (sampleflags & 1) flags |= OMX_BUFFERFLAG_SYNCFRAME;
dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags,
timestamp);
nFrames--;
eleStream.read(ipBuffer, (*Info)[frameID].bytesCount);
ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount);
flags = (*Info)[frameID].flags;
if (signalEOS && ((frameID == (int)Info->size() - 1) ||
(frameID == (offset + range - 1))))
flags |= OMX_BUFFERFLAG_EOS;
dispatchInputBuffer(omxNode, iBuffer, index,
(*Info)[frameID].bytesCount, flags,
(*Info)[frameID].timestamp);
frameID++;
}
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
dispatchOutputBuffer(omxNode, oBuffer, index);
@ -455,6 +597,7 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// set component role
TEST_F(VideoDecHidlTest, SetRole) {
description("Test Set Component Role");
android::hardware::media::omx::V1_0::Status status;
@ -462,6 +605,7 @@ TEST_F(VideoDecHidlTest, SetRole) {
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// port format enumeration
TEST_F(VideoDecHidlTest, EnumeratePortFormat) {
description("Test Component on Mandatory Port Parameters (Port Format)");
android::hardware::media::omx::V1_0::Status status;
@ -486,8 +630,10 @@ TEST_F(VideoDecHidlTest, EnumeratePortFormat) {
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// test port settings reconfiguration, elementary stream decode and timestamp
// deviation
TEST_F(VideoDecHidlTest, DecodeTest) {
description("Tests Port Reconfiguration and Decode");
description("Tests Port Reconfiguration, Decode and timestamp deviation");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
status = setRole(omxNode, gEnv->getRole().c_str());
@ -499,16 +645,29 @@ TEST_F(VideoDecHidlTest, DecodeTest) {
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
const char *mURL = nullptr, *info = nullptr;
GetURLForComponent(compName, &mURL, &info);
EXPECT_NE(mURL, nullptr);
EXPECT_NE(info, nullptr);
char mURL[512], info[512];
strcpy(mURL, gEnv->getRes().c_str());
strcpy(info, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL, info);
std::ifstream eleStream, eleInfo;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
eleInfo.open(info);
ASSERT_EQ(eleInfo.is_open(), true);
android::Vector<FrameData> Info;
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
timestampDevTest = true;
while (1) {
if (!(eleInfo >> bytesCount)) break;
eleInfo >> flags;
eleInfo >> timestamp;
Info.push_back({bytesCount, flags, timestamp});
if (flags != OMX_BUFFERFLAG_CODECCONFIG)
timestampUslist.push_back(timestamp);
}
eleInfo.close();
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
@ -526,16 +685,225 @@ TEST_F(VideoDecHidlTest, DecodeTest) {
// set state to executing
changeStateIdletoExecute(omxNode, observer);
// Port Reconfiguration
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, 1024, eleStream, eleInfo);
kPortIndexOutput, eleStream, &Info, 0, (int)Info.size());
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer);
EXPECT_EQ(timestampUslist.empty(), true);
// set state to idle
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
// set state to executing
changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
}
// end of sequence test
TEST_F(VideoDecHidlTest, EOSTest) {
description("Test End of stream");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
status = setRole(omxNode, gEnv->getRole().c_str());
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
OMX_PORT_PARAM_TYPE params;
status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
ASSERT_EQ(params.nPorts, 2U);
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
char mURL[512], info[512];
strcpy(mURL, gEnv->getRes().c_str());
strcpy(info, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL, info);
std::ifstream eleStream, eleInfo;
eleInfo.open(info);
ASSERT_EQ(eleInfo.is_open(), true);
android::Vector<FrameData> Info;
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
while (1) {
if (!(eleInfo >> bytesCount)) break;
eleInfo >> flags;
eleInfo >> timestamp;
Info.push_back({bytesCount, flags, timestamp});
}
eleInfo.close();
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
// set state to executing
changeStateIdletoExecute(omxNode, observer);
// request EOS at the start
testEOS(&iBuffer, &oBuffer, true);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
EXPECT_GE(framesReceived, 0U);
framesReceived = 0;
timestampUs = 0;
// request EOS for thumbnail
size_t i = 0;
while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, eleStream, &Info, 0, i + 1);
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
EXPECT_GE(framesReceived, 1U);
framesReceived = 0;
timestampUs = 0;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, eleStream, &Info, 0, i + 1, false);
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer, true);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
EXPECT_GE(framesReceived, 1U);
framesReceived = 0;
timestampUs = 0;
// request EOS at the end
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, eleStream, &Info, 0, (int)Info.size());
eleStream.close();
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
testEOS(&iBuffer, &oBuffer);
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput);
framesReceived = 0;
timestampUs = 0;
// set state to idle
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
// set state to executing
changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
}
// test input/output port flush
TEST_F(VideoDecHidlTest, FlushTest) {
description("Test Flush");
android::hardware::media::omx::V1_0::Status status;
uint32_t kPortIndexInput = 0, kPortIndexOutput = 1;
status = setRole(omxNode, gEnv->getRole().c_str());
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
OMX_PORT_PARAM_TYPE params;
status = getParam(omxNode, OMX_IndexParamVideoInit, &params);
if (status == ::android::hardware::media::omx::V1_0::Status::OK) {
ASSERT_EQ(params.nPorts, 2U);
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
char mURL[512], info[512];
strcpy(mURL, gEnv->getRes().c_str());
strcpy(info, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL, info);
std::ifstream eleStream, eleInfo;
eleInfo.open(info);
ASSERT_EQ(eleInfo.is_open(), true);
android::Vector<FrameData> Info;
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
while (1) {
if (!(eleInfo >> bytesCount)) break;
eleInfo >> flags;
eleInfo >> timestamp;
Info.push_back({bytesCount, flags, timestamp});
}
eleInfo.close();
// set Port Params
uint32_t nFrameWidth, nFrameHeight, xFramerate;
OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar;
getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight,
&xFramerate);
setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused,
eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate);
android::Vector<BufferInfo> iBuffer, oBuffer;
// set state to idle
changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
// set state to executing
changeStateIdletoExecute(omxNode, observer);
// Decode 128 frames and flush. here 128 is chosen to ensure there is a key
// frame after this so that the below section can be convered for all
// components
int nFrames = 128;
eleStream.open(mURL, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, eleStream, &Info, 0, nFrames, false);
// Note: Assumes 200 ms is enough to end any decode call that started
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, 200000);
framesReceived = 0;
// Seek to next key frame and start decoding till the end
int index = nFrames;
bool keyFrame = false;
while (index < (int)Info.size()) {
if ((Info[index].flags & OMX_BUFFERFLAG_SYNCFRAME) ==
OMX_BUFFERFLAG_SYNCFRAME) {
timestampUs = Info[index - 1].timestamp;
keyFrame = true;
break;
}
eleStream.ignore(Info[index].bytesCount);
index++;
}
if (keyFrame) {
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, eleStream, &Info, index,
Info.size() - index, false);
}
// Note: Assumes 200 ms is enough to end any decode call that started
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
kPortIndexOutput, 200000);
framesReceived = 0;
// set state to idle
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
// set state to executing
changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer,
kPortIndexInput, kPortIndexOutput);
}
int main(int argc, char** argv) {

View file

@ -51,7 +51,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
virtual void SetUp() {}
virtual void TearDown() {}
ComponentTestEnvironment() : instance("default") {}
ComponentTestEnvironment() : instance("default"), res("/sdcard/media/") {}
void setInstance(const char* _instance) { instance = _instance; }
@ -59,7 +59,7 @@ class ComponentTestEnvironment : public ::testing::Environment {
void setRole(const char* _role) { role = _role; }
void setQuirks(int _quirks) { quirks = _quirks; }
void setRes(const char* _res) { res = _res; }
const hidl_string getInstance() const { return instance; }
@ -67,19 +67,19 @@ class ComponentTestEnvironment : public ::testing::Environment {
const hidl_string getRole() const { return role; }
int getQuirks() const { return quirks; }
const hidl_string getRes() const { return res; }
int initFromOptions(int argc, char** argv) {
static struct option options[] = {
{"instance", required_argument, 0, 'I'},
{"component", required_argument, 0, 'C'},
{"role", required_argument, 0, 'R'},
{"quirks", required_argument, 0, 'Q'},
{"res", required_argument, 0, 'P'},
{0, 0, 0, 0}};
while (true) {
int index = 0;
int c = getopt_long(argc, argv, "I:C:Q:R:", options, &index);
int c = getopt_long(argc, argv, "I:C:R:P:", options, &index);
if (c == -1) {
break;
}
@ -91,12 +91,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
case 'C':
setComponent(optarg);
break;
case 'Q':
setQuirks(atoi(optarg));
break;
case 'R':
setRole(optarg);
break;
case 'P':
setRes(optarg);
break;
case '?':
break;
}
@ -109,8 +109,8 @@ class ComponentTestEnvironment : public ::testing::Environment {
"test options are:\n\n"
"-I, --instance: HAL instance to test\n"
"-C, --component: OMX component to test\n"
"-R, --Role: OMX component Role\n"
"-Q, --quirks: Component quirks\n",
"-R, --role: OMX component Role\n"
"-P, --res: Resource files directory location\n",
argv[optind ?: 1], argv[0]);
return 2;
}
@ -121,12 +121,12 @@ class ComponentTestEnvironment : public ::testing::Environment {
hidl_string instance;
hidl_string component;
hidl_string role;
// to be removed when IOmxNode::setQuirks is removed
int quirks;
hidl_string res;
};
static ComponentTestEnvironment* gEnv = nullptr;
// video encoder test fixture class
class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
@ -134,7 +134,7 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase {
omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>(
gEnv->getInstance());
ASSERT_NE(omx, nullptr);
observer = new CodecObserver();
observer = new CodecObserver([this](Message msg) { (void)msg; });
ASSERT_NE(observer, nullptr);
ASSERT_EQ(strncmp(gEnv->getComponent().c_str(), "OMX.", 4), 0)
<< "Invalid Component Name";
@ -252,21 +252,19 @@ void setDefaultPortParam(sp<IOmxNode> omxNode, OMX_U32 portIndex,
}
// LookUpTable of clips and metadata for component testing
void GetURLForComponent(VideoEncHidlTest::standardComp comp,
const char** mURL) {
void GetURLForComponent(VideoEncHidlTest::standardComp comp, char* mURL) {
struct CompToURL {
VideoEncHidlTest::standardComp comp;
const char* mURL;
};
static const CompToURL kCompToURL[] = {
{VideoEncHidlTest::standardComp::avc,
"/sdcard/media/bbb_480x360_420p_30fps_32frames.yuv"},
"bbb_480x360_420p_30fps_32frames.yuv"},
};
*mURL = nullptr;
for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) {
if (kCompToURL[i].comp == comp) {
*mURL = kCompToURL[i].mURL;
strcat(mURL, kCompToURL[i].mURL);
return;
}
}
@ -328,6 +326,7 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
}
}
// set component role
TEST_F(VideoEncHidlTest, SetRole) {
description("Test Set Component Role");
android::hardware::media::omx::V1_0::Status status;
@ -335,6 +334,7 @@ TEST_F(VideoEncHidlTest, SetRole) {
ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// port format enumeration
TEST_F(VideoEncHidlTest, EnumeratePortFormat) {
description("Test Component on Mandatory Port Parameters (Port Format)");
android::hardware::media::omx::V1_0::Status status;
@ -360,6 +360,7 @@ TEST_F(VideoEncHidlTest, EnumeratePortFormat) {
EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK);
}
// test raw stream encode
TEST_F(VideoEncHidlTest, EncodeTest) {
description("Test Encode");
android::hardware::media::omx::V1_0::Status status;
@ -373,9 +374,9 @@ TEST_F(VideoEncHidlTest, EncodeTest) {
kPortIndexInput = params.nStartPortNumber;
kPortIndexOutput = kPortIndexInput + 1;
}
const char* mURL = nullptr;
GetURLForComponent(compName, &mURL);
EXPECT_NE(mURL, nullptr);
char mURL[512];
strcpy(mURL, gEnv->getRes().c_str());
GetURLForComponent(compName, mURL);
std::ifstream eleStream;
eleStream.open(mURL, std::ifstream::binary);

View file

@ -281,7 +281,7 @@ void dispatchInputBuffer(sp<IOmxNode> omxNode,
void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
OMX_U32 kPortIndexOutput) {
OMX_U32 kPortIndexOutput, int64_t timeoutUs) {
android::hardware::media::omx::V1_0::Status status;
Message msg;
@ -289,7 +289,7 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
kPortIndexInput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
status = observer->dequeueMessage(&msg, timeoutUs, iBuffer, oBuffer);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);
@ -304,7 +304,7 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush),
kPortIndexOutput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
status = observer->dequeueMessage(&msg, timeoutUs, iBuffer, oBuffer);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
ASSERT_EQ(msg.type, Message::Type::EVENT);
ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete);

View file

@ -59,7 +59,7 @@ void dispatchInputBuffer(sp<IOmxNode> omxNode,
void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
android::Vector<BufferInfo>* iBuffer,
android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
OMX_U32 kPortIndexOutput);
OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT);
Return<android::hardware::media::omx::V1_0::Status> setVideoPortFormat(
sp<IOmxNode> omxNode, OMX_U32 portIndex,

View file

@ -1,6 +1,6 @@
31 0 0
8 0 0
481702 1 0
31 128 0
8 128 0
481702 32 0
137895 0 33333
81863 0 100000
98914 0 133333
@ -44,7 +44,7 @@
4028 0 1700000
2303 0 1766666
845 0 1800000
191414 1 1833333
191414 32 1833333
13266 0 1866666
16120 0 1933333
19751 0 1966666
@ -137,7 +137,7 @@
10305 0 5600000
10120 0 5633333
7706 0 5666666
112698 1 5700000
112698 32 5700000
1544 0 5766666
1285 0 5800000
1576 0 5833333

Binary file not shown.

View file

@ -0,0 +1,122 @@
26362 32 0
12023 0 83333
10647 0 166666
10269 0 250000
11076 0 333333
11104 0 416666
5909 0 500000
4291 0 583333
5149 0 666666
5353 0 750000
5185 0 833333
2736 0 916666
21575 32 1000000
2196 0 1083333
4340 0 1166666
3109 0 1250000
4410 0 1333333
1731 0 1416666
4557 0 1500000
3376 0 1583333
1352 0 1666666
2844 0 1750000
1787 0 1833333
1088 0 1916666
36843 32 2000000
2520 0 2083333
3749 0 2166666
3784 0 2250000
3402 0 2333333
3795 0 2416666
2345 0 2500000
3142 0 2583333
2948 0 2666666
2018 0 2750000
5133 0 2833333
2276 0 2916666
23468 32 3000000
1522 0 3083333
2299 0 3166666
3273 0 3250000
2630 0 3333333
2915 0 3416666
3032 0 3500000
1890 0 3583333
3718 0 3666666
1990 0 3750000
3139 0 3833333
1806 0 3916666
23208 32 4000000
1419 0 4083333
2263 0 4166666
3131 0 4250000
2645 0 4333333
1880 0 4416666
2239 0 4500000
3637 0 4583333
1941 0 4666666
1577 0 4750000
3777 0 4833333
1816 0 4916666
19601 32 5000000
1104 0 5083333
2808 0 5166666
2411 0 5250000
2159 0 5333333
2411 0 5416666
2408 0 5500000
2388 0 5583333
2418 0 5666666
1481 0 5750000
1926 0 5833333
9022 32 5916666
292 0 6000000
701 0 6083333
747 0 6166666
2059 0 6250000
1693 0 6333333
2078 0 6416666
2975 0 6500000
1317 0 6583333
1742 0 6666666
1019 0 6750000
1053 0 6833333
14183 32 6916666
1467 0 7000000
994 0 7083333
1709 0 7166666
838 0 7250000
1328 0 7333333
2292 0 7416666
1829 0 7500000
1728 0 7583333
2436 0 7666666
1852 0 7750000
2190 0 7833333
15167 32 7916666
1188 0 8000000
2070 0 8083333
3316 0 8166666
2636 0 8250000
950 0 8333333
1260 0 8416666
906 0 8500000
1294 0 8583333
1298 0 8666666
1897 0 8750000
1348 0 8833333
13194 32 8916666
1042 0 9000000
1258 0 9083333
1457 0 9166666
990 0 9250000
900 0 9333333
963 0 9416666
3448 0 9500000
774 0 9583333
1075 0 9666666
750 0 9750000
1054 0 9833333
13139 32 9916666
3104 0 10000000
3366 0 10083333

Binary file not shown.

View file

@ -0,0 +1,302 @@
1075 128 0
1075 128 0
68613 32 66687
19025 0 199687
2405 0 133687
777 0 99687
681 0 166687
20254 0 333687
2927 0 266687
766 0 233687
658 0 299687
20786 0 466687
4214 0 399687
609 0 366687
661 0 433687
20838 0 599687
4209 0 533687
506 0 499687
586 0 566687
20415 0 733687
4207 0 666687
427 0 633687
514 0 699687
24457 0 899687
1904 0 833687
921 0 766687
992 0 799687
543 0 866687
24342 0 1066687
1822 0 999687
840 0 933687
892 0 966687
715 0 1033687
22893 0 1233687
1618 0 1166687
881 0 1099687
890 0 1133687
794 0 1199687
24292 0 1399687
1673 0 1333687
755 0 1266687
810 0 1299687
588 0 1366687
19828 0 1533687
1538 0 1466687
894 0 1433687
933 0 1499687
19853 0 1666687
2011 0 1599687
981 0 1566687
900 0 1633687
22869 0 1833687
1562 0 1766687
842 0 1699687
765 0 1733687
665 0 1799687
22346 0 1966687
2245 0 1899687
516 0 1866687
604 0 1933687
24333 0 2099687
1765 0 2033687
318 0 1999687
320 0 2066687
18577 0 2199687
1123 0 2166687
337 0 2133687
17509 0 2299687
869 0 2266687
901 0 2233687
23366 0 2433687
1217 0 2366687
380 0 2333687
347 0 2399687
19542 0 2533687
1887 0 2499687
467 0 2466687
18939 0 2666687
2863 0 2599687
317 0 2566687
272 0 2633687
19353 0 2799687
2092 0 2733687
203 0 2699687
310 0 2766687
18800 0 2933687
2038 0 2866687
242 0 2833687
199 0 2899687
17452 0 3099687
1060 0 3033687
301 0 2966687
452 0 2999687
256 0 3066687
21352 0 3199687
409 0 3166687
173 0 3133687
19142 0 3299687
642 0 3266687
468 0 3233687
19066 0 3433687
635 0 3366687
197 0 3333687
190 0 3399687
18813 0 3566687
969 0 3499687
165 0 3466687
203 0 3533687
17362 0 3733687
246 0 3666687
236 0 3599687
174 0 3633687
164 0 3699687
17081 0 3899687
353 0 3833687
222 0 3766687
181 0 3799687
148 0 3866687
10835 0 3999687
185 0 3966687
139 0 3933687
7510 0 4133687
149 0 4066687
129 0 4033687
132 0 4099687
1063 0 4166687
805 0 4266687
157 0 4233687
394 0 4199687
90840 0 4399687
6159 0 4333687
1752 0 4299687
985 0 4366687
31338 0 4533687
3390 0 4466687
772 0 4433687
781 0 4499687
31084 0 4666687
3498 0 4599687
818 0 4566687
881 0 4633687
30416 0 4799687
3265 0 4733687
815 0 4699687
790 0 4766687
31053 0 4933687
3106 0 4866687
708 0 4833687
713 0 4899687
30230 0 5066687
3214 0 4999687
639 0 4966687
768 0 5033687
29657 0 5199687
3013 0 5133687
622 0 5099687
720 0 5166687
29344 0 5333687
3196 0 5266687
713 0 5233687
775 0 5299687
30420 0 5466687
3374 0 5399687
803 0 5366687
717 0 5433687
29960 0 5599687
3283 0 5533687
793 0 5499687
790 0 5566687
31011 0 5733687
3397 0 5666687
809 0 5633687
831 0 5699687
31194 0 5866687
3401 0 5799687
807 0 5766687
827 0 5833687
30326 0 5999687
3186 0 5933687
818 0 5899687
863 0 5966687
31559 0 6133687
3364 0 6066687
840 0 6033687
919 0 6099687
32013 0 6266687
3495 0 6199687
871 0 6166687
803 0 6233687
30294 0 6399687
3153 0 6333687
716 0 6299687
812 0 6366687
29952 0 6533687
3299 0 6466687
801 0 6433687
749 0 6499687
30598 0 6666687
3536 0 6599687
887 0 6566687
850 0 6633687
17246 0 6699687
31110 0 6833687
3198 0 6766687
809 0 6733687
836 0 6799687
29784 0 6966687
3155 0 6899687
859 0 6866687
958 0 6933687
30666 0 7099687
3371 0 7033687
886 0 6999687
861 0 7066687
30416 0 7233687
3350 0 7166687
917 0 7133687
987 0 7199687
29509 0 7366687
3574 0 7299687
972 0 7266687
885 0 7333687
30872 0 7499687
3399 0 7433687
898 0 7399687
1027 0 7466687
31155 0 7633687
3454 0 7566687
965 0 7533687
841 0 7599687
28487 0 7766687
3616 0 7699687
921 0 7666687
991 0 7733687
23208 0 7899687
3551 0 7833687
918 0 7799687
894 0 7866687
16982 0 8033687
3458 0 7966687
844 0 7933687
943 0 7999687
30396 0 8199687
4963 0 8133687
1416 0 8066687
1639 0 8099687
524 0 8166687
1368 0 8299687
565 0 8266687
392 0 8233687
41317 32 8399687
185 0 8366687
477 0 8333687
5342 0 8533687
1275 0 8466687
121 0 8433687
982 0 8499687
6465 0 8699687
2606 0 8633687
1163 0 8566687
943 0 8599687
1186 0 8666687
11593 0 8833687
3122 0 8766687
1278 0 8733687
1593 0 8799687
9099 0 8999687
978 0 8933687
748 0 8866687
835 0 8899687
364 0 8966687
4799 0 9099687
365 0 9066687
215 0 9033687
4367 0 9199687
302 0 9166687
480 0 9133687
6180 0 9333687
771 0 9266687
246 0 9233687
281 0 9299687
4636 0 9399687
211 0 9366687
4037 0 9499687
382 0 9466687
486 0 9433687
3975 0 9599687
312 0 9566687
474 0 9533687
6880 0 9733687
1116 0 9666687
206 0 9633687
698 0 9699687
6254 0 9899687
2581 0 9833687
1303 0 9766687
985 0 9799687
967 0 9866687
6486 0 10033687
3555 0 9966687
1430 0 9933687
1605 0 9999687

View file

@ -1,414 +1,414 @@
576 1 0
576 1 24000
576 1 48000
576 1 72000
576 1 96000
576 1 120000
576 1 144000
576 1 168000
576 1 192000
576 1 216000
576 1 240000
576 1 264000
576 1 288000
576 1 312000
576 1 336000
576 1 360000
576 1 384000
576 1 408000
576 1 432000
576 1 456000
576 1 480000
576 1 504000
576 1 528000
576 1 552000
576 1 576000
576 1 600000
576 1 624000
576 1 648000
576 1 672000
576 1 696000
576 1 720000
576 1 744000
576 1 768000
576 1 792000
576 1 816000
576 1 840000
576 1 864000
576 1 888000
576 1 912000
576 1 936000
576 1 960000
576 1 984000
576 1 1008000
576 1 1032000
576 1 1056000
576 1 1080000
576 1 1104000
576 1 1128000
576 1 1152000
576 1 1176000
576 1 1200000
576 1 1224000
576 1 1248000
576 1 1272000
576 1 1296000
576 1 1320000
576 1 1344000
576 1 1368000
576 1 1392000
576 1 1416000
576 1 1440000
576 1 1464000
576 1 1488000
576 1 1512000
576 1 1536000
576 1 1560000
576 1 1584000
576 1 1608000
576 1 1632000
576 1 1656000
576 1 1680000
576 1 1704000
576 1 1728000
576 1 1752000
576 1 1776000
576 1 1800000
576 1 1824000
576 1 1848000
576 1 1872000
576 1 1896000
576 1 1920000
576 1 1944000
576 1 1968000
576 1 1992000
576 1 2016000
576 1 2040000
576 1 2064000
576 1 2088000
576 1 2112000
576 1 2136000
576 1 2160000
576 1 2184000
576 1 2208000
576 1 2232000
576 1 2256000
576 1 2280000
576 1 2304000
576 1 2328000
576 1 2352000
576 1 2376000
576 1 2400000
576 1 2424000
576 1 2448000
576 1 2472000
576 1 2496000
576 1 2520000
576 1 2544000
576 1 2568000
576 1 2592000
576 1 2616000
576 1 2640000
576 1 2664000
576 1 2688000
576 1 2712000
576 1 2736000
576 1 2760000
576 1 2784000
576 1 2808000
576 1 2832000
576 1 2856000
576 1 2880000
576 1 2904000
576 1 2928000
576 1 2952000
576 1 2976000
576 1 3000000
576 1 3024000
576 1 3048000
576 1 3072000
576 1 3096000
576 1 3120000
576 1 3144000
576 1 3168000
576 1 3192000
576 1 3216000
576 1 3240000
576 1 3264000
576 1 3288000
576 1 3312000
576 1 3336000
576 1 3360000
576 1 3384000
576 1 3408000
576 1 3432000
576 1 3456000
576 1 3480000
576 1 3504000
576 1 3528000
576 1 3552000
576 1 3576000
576 1 3600000
576 1 3624000
576 1 3648000
576 1 3672000
576 1 3696000
576 1 3720000
576 1 3744000
576 1 3768000
576 1 3792000
576 1 3816000
576 1 3840000
576 1 3864000
576 1 3888000
576 1 3912000
576 1 3936000
576 1 3960000
576 1 3984000
576 1 4008000
576 1 4032000
576 1 4056000
576 1 4080000
576 1 4104000
576 1 4128000
576 1 4152000
576 1 4176000
576 1 4200000
576 1 4224000
576 1 4248000
576 1 4272000
576 1 4296000
576 1 4320000
576 1 4344000
576 1 4368000
576 1 4392000
576 1 4416000
576 1 4440000
576 1 4464000
576 1 4488000
576 1 4512000
576 1 4536000
576 1 4560000
576 1 4584000
576 1 4608000
576 1 4632000
576 1 4656000
576 1 4680000
576 1 4704000
576 1 4728000
576 1 4752000
576 1 4776000
576 1 4800000
576 1 4824000
576 1 4848000
576 1 4872000
576 1 4896000
576 1 4920000
576 1 4944000
576 1 4968000
576 1 4992000
576 1 5016000
576 1 5040000
576 1 5064000
576 1 5088000
576 1 5112000
576 1 5136000
576 1 5160000
576 1 5184000
576 1 5208000
576 1 5232000
576 1 5256000
576 1 5280000
576 1 5304000
576 1 5328000
576 1 5352000
576 1 5376000
576 1 5400000
576 1 5424000
576 1 5448000
576 1 5472000
576 1 5496000
576 1 5520000
576 1 5544000
576 1 5568000
576 1 5592000
576 1 5616000
576 1 5640000
576 1 5664000
576 1 5688000
576 1 5712000
576 1 5736000
576 1 5760000
576 1 5784000
576 1 5808000
576 1 5832000
576 1 5856000
576 1 5880000
576 1 5904000
576 1 5928000
576 1 5952000
576 1 5976000
576 1 6000000
576 1 6024000
576 1 6048000
576 1 6072000
576 1 6096000
576 1 6120000
576 1 6144000
576 1 6168000
576 1 6192000
576 1 6216000
576 1 6240000
576 1 6264000
576 1 6288000
576 1 6312000
576 1 6336000
576 1 6360000
576 1 6384000
576 1 6408000
576 1 6432000
576 1 6456000
576 1 6480000
576 1 6504000
576 1 6528000
576 1 6552000
576 1 6576000
576 1 6600000
576 1 6624000
576 1 6648000
576 1 6672000
576 1 6696000
576 1 6720000
576 1 6744000
576 1 6768000
576 1 6792000
576 1 6816000
576 1 6840000
576 1 6864000
576 1 6888000
576 1 6912000
576 1 6936000
576 1 6960000
576 1 6984000
576 1 7008000
576 1 7032000
576 1 7056000
576 1 7080000
576 1 7104000
576 1 7128000
576 1 7152000
576 1 7176000
576 1 7200000
576 1 7224000
576 1 7248000
576 1 7272000
576 1 7296000
576 1 7320000
576 1 7344000
576 1 7368000
576 1 7392000
576 1 7416000
576 1 7440000
576 1 7464000
576 1 7488000
576 1 7512000
576 1 7536000
576 1 7560000
576 1 7584000
576 1 7608000
576 1 7632000
576 1 7656000
576 1 7680000
576 1 7704000
576 1 7728000
576 1 7752000
576 1 7776000
576 1 7800000
576 1 7824000
576 1 7848000
576 1 7872000
576 1 7896000
576 1 7920000
576 1 7944000
576 1 7968000
576 1 7992000
576 1 8016000
576 1 8040000
576 1 8064000
576 1 8088000
576 1 8112000
576 1 8136000
576 1 8160000
576 1 8184000
576 1 8208000
576 1 8232000
576 1 8256000
576 1 8280000
576 1 8304000
576 1 8328000
576 1 8352000
576 1 8376000
576 1 8400000
576 1 8424000
576 1 8448000
576 1 8472000
576 1 8496000
576 1 8520000
576 1 8544000
576 1 8568000
576 1 8592000
576 1 8616000
576 1 8640000
576 1 8664000
576 1 8688000
576 1 8712000
576 1 8736000
576 1 8760000
576 1 8784000
576 1 8808000
576 1 8832000
576 1 8856000
576 1 8880000
576 1 8904000
576 1 8928000
576 1 8952000
576 1 8976000
576 1 9000000
576 1 9024000
576 1 9048000
576 1 9072000
576 1 9096000
576 1 9120000
576 1 9144000
576 1 9168000
576 1 9192000
576 1 9216000
576 1 9240000
576 1 9264000
576 1 9288000
576 1 9312000
576 1 9336000
576 1 9360000
576 1 9384000
576 1 9408000
576 1 9432000
576 1 9456000
576 1 9480000
576 1 9504000
576 1 9528000
576 1 9552000
576 1 9576000
576 1 9600000
576 1 9624000
576 1 9648000
576 1 9672000
576 1 9696000
576 1 9720000
576 1 9744000
576 1 9768000
576 1 9792000
576 1 9816000
576 1 9840000
576 1 9864000
576 1 9888000
576 1 9912000
576 32 0
576 32 24000
576 32 48000
576 32 72000
576 32 96000
576 32 120000
576 32 144000
576 32 168000
576 32 192000
576 32 216000
576 32 240000
576 32 264000
576 32 288000
576 32 312000
576 32 336000
576 32 360000
576 32 384000
576 32 408000
576 32 432000
576 32 456000
576 32 480000
576 32 504000
576 32 528000
576 32 552000
576 32 576000
576 32 600000
576 32 624000
576 32 648000
576 32 672000
576 32 696000
576 32 720000
576 32 744000
576 32 768000
576 32 792000
576 32 816000
576 32 840000
576 32 864000
576 32 888000
576 32 912000
576 32 936000
576 32 960000
576 32 984000
576 32 1008000
576 32 1032000
576 32 1056000
576 32 1080000
576 32 1104000
576 32 1128000
576 32 1152000
576 32 1176000
576 32 1200000
576 32 1224000
576 32 1248000
576 32 1272000
576 32 1296000
576 32 1320000
576 32 1344000
576 32 1368000
576 32 1392000
576 32 1416000
576 32 1440000
576 32 1464000
576 32 1488000
576 32 1512000
576 32 1536000
576 32 1560000
576 32 1584000
576 32 1608000
576 32 1632000
576 32 1656000
576 32 1680000
576 32 1704000
576 32 1728000
576 32 1752000
576 32 1776000
576 32 1800000
576 32 1824000
576 32 1848000
576 32 1872000
576 32 1896000
576 32 1920000
576 32 1944000
576 32 1968000
576 32 1992000
576 32 2016000
576 32 2040000
576 32 2064000
576 32 2088000
576 32 2112000
576 32 2136000
576 32 2160000
576 32 2184000
576 32 2208000
576 32 2232000
576 32 2256000
576 32 2280000
576 32 2304000
576 32 2328000
576 32 2352000
576 32 2376000
576 32 2400000
576 32 2424000
576 32 2448000
576 32 2472000
576 32 2496000
576 32 2520000
576 32 2544000
576 32 2568000
576 32 2592000
576 32 2616000
576 32 2640000
576 32 2664000
576 32 2688000
576 32 2712000
576 32 2736000
576 32 2760000
576 32 2784000
576 32 2808000
576 32 2832000
576 32 2856000
576 32 2880000
576 32 2904000
576 32 2928000
576 32 2952000
576 32 2976000
576 32 3000000
576 32 3024000
576 32 3048000
576 32 3072000
576 32 3096000
576 32 3120000
576 32 3144000
576 32 3168000
576 32 3192000
576 32 3216000
576 32 3240000
576 32 3264000
576 32 3288000
576 32 3312000
576 32 3336000
576 32 3360000
576 32 3384000
576 32 3408000
576 32 3432000
576 32 3456000
576 32 3480000
576 32 3504000
576 32 3528000
576 32 3552000
576 32 3576000
576 32 3600000
576 32 3624000
576 32 3648000
576 32 3672000
576 32 3696000
576 32 3720000
576 32 3744000
576 32 3768000
576 32 3792000
576 32 3816000
576 32 3840000
576 32 3864000
576 32 3888000
576 32 3912000
576 32 3936000
576 32 3960000
576 32 3984000
576 32 4008000
576 32 4032000
576 32 4056000
576 32 4080000
576 32 4104000
576 32 4128000
576 32 4152000
576 32 4176000
576 32 4200000
576 32 4224000
576 32 4248000
576 32 4272000
576 32 4296000
576 32 4320000
576 32 4344000
576 32 4368000
576 32 4392000
576 32 4416000
576 32 4440000
576 32 4464000
576 32 4488000
576 32 4512000
576 32 4536000
576 32 4560000
576 32 4584000
576 32 4608000
576 32 4632000
576 32 4656000
576 32 4680000
576 32 4704000
576 32 4728000
576 32 4752000
576 32 4776000
576 32 4800000
576 32 4824000
576 32 4848000
576 32 4872000
576 32 4896000
576 32 4920000
576 32 4944000
576 32 4968000
576 32 4992000
576 32 5016000
576 32 5040000
576 32 5064000
576 32 5088000
576 32 5112000
576 32 5136000
576 32 5160000
576 32 5184000
576 32 5208000
576 32 5232000
576 32 5256000
576 32 5280000
576 32 5304000
576 32 5328000
576 32 5352000
576 32 5376000
576 32 5400000
576 32 5424000
576 32 5448000
576 32 5472000
576 32 5496000
576 32 5520000
576 32 5544000
576 32 5568000
576 32 5592000
576 32 5616000
576 32 5640000
576 32 5664000
576 32 5688000
576 32 5712000
576 32 5736000
576 32 5760000
576 32 5784000
576 32 5808000
576 32 5832000
576 32 5856000
576 32 5880000
576 32 5904000
576 32 5928000
576 32 5952000
576 32 5976000
576 32 6000000
576 32 6024000
576 32 6048000
576 32 6072000
576 32 6096000
576 32 6120000
576 32 6144000
576 32 6168000
576 32 6192000
576 32 6216000
576 32 6240000
576 32 6264000
576 32 6288000
576 32 6312000
576 32 6336000
576 32 6360000
576 32 6384000
576 32 6408000
576 32 6432000
576 32 6456000
576 32 6480000
576 32 6504000
576 32 6528000
576 32 6552000
576 32 6576000
576 32 6600000
576 32 6624000
576 32 6648000
576 32 6672000
576 32 6696000
576 32 6720000
576 32 6744000
576 32 6768000
576 32 6792000
576 32 6816000
576 32 6840000
576 32 6864000
576 32 6888000
576 32 6912000
576 32 6936000
576 32 6960000
576 32 6984000
576 32 7008000
576 32 7032000
576 32 7056000
576 32 7080000
576 32 7104000
576 32 7128000
576 32 7152000
576 32 7176000
576 32 7200000
576 32 7224000
576 32 7248000
576 32 7272000
576 32 7296000
576 32 7320000
576 32 7344000
576 32 7368000
576 32 7392000
576 32 7416000
576 32 7440000
576 32 7464000
576 32 7488000
576 32 7512000
576 32 7536000
576 32 7560000
576 32 7584000
576 32 7608000
576 32 7632000
576 32 7656000
576 32 7680000
576 32 7704000
576 32 7728000
576 32 7752000
576 32 7776000
576 32 7800000
576 32 7824000
576 32 7848000
576 32 7872000
576 32 7896000
576 32 7920000
576 32 7944000
576 32 7968000
576 32 7992000
576 32 8016000
576 32 8040000
576 32 8064000
576 32 8088000
576 32 8112000
576 32 8136000
576 32 8160000
576 32 8184000
576 32 8208000
576 32 8232000
576 32 8256000
576 32 8280000
576 32 8304000
576 32 8328000
576 32 8352000
576 32 8376000
576 32 8400000
576 32 8424000
576 32 8448000
576 32 8472000
576 32 8496000
576 32 8520000
576 32 8544000
576 32 8568000
576 32 8592000
576 32 8616000
576 32 8640000
576 32 8664000
576 32 8688000
576 32 8712000
576 32 8736000
576 32 8760000
576 32 8784000
576 32 8808000
576 32 8832000
576 32 8856000
576 32 8880000
576 32 8904000
576 32 8928000
576 32 8952000
576 32 8976000
576 32 9000000
576 32 9024000
576 32 9048000
576 32 9072000
576 32 9096000
576 32 9120000
576 32 9144000
576 32 9168000
576 32 9192000
576 32 9216000
576 32 9240000
576 32 9264000
576 32 9288000
576 32 9312000
576 32 9336000
576 32 9360000
576 32 9384000
576 32 9408000
576 32 9432000
576 32 9456000
576 32 9480000
576 32 9504000
576 32 9528000
576 32 9552000
576 32 9576000
576 32 9600000
576 32 9624000
576 32 9648000
576 32 9672000
576 32 9696000
576 32 9720000
576 32 9744000
576 32 9768000
576 32 9792000
576 32 9816000
576 32 9840000
576 32 9864000
576 32 9888000
576 32 9912000

View file

@ -0,0 +1,249 @@
6458 32 40000
4040 0 80000
3255 0 120000
3026 0 160000
3293 0 200000
3089 0 240000
3305 0 280000
1794 0 320000
1848 0 360000
1288 0 400000
1511 0 440000
1527 0 480000
6146 32 520000
1243 0 560000
1099 0 600000
1354 0 640000
1366 0 680000
1042 0 720000
1600 0 760000
875 0 800000
1728 0 840000
1254 0 880000
994 0 920000
1591 0 960000
6265 32 1000000
1018 0 1040000
825 0 1080000
869 0 1120000
921 0 1160000
975 0 1200000
924 0 1240000
834 0 1280000
1066 0 1320000
793 0 1360000
889 0 1400000
2050 0 1440000
6276 32 1480000
881 0 1520000
260 0 1560000
730 0 1600000
431 0 1640000
351 0 1680000
321 0 1720000
3802 0 1760000
146 0 1800000
6462 0 1840000
3246 0 1880000
533 0 1920000
6231 32 1960000
1378 0 2000000
719 0 2040000
818 0 2080000
856 0 2120000
937 0 2160000
611 0 2200000
3031 0 2240000
1041 0 2280000
604 0 2320000
714 0 2360000
1283 0 2400000
7565 32 2440000
602 0 2480000
530 0 2520000
2579 0 2560000
115 0 2600000
1058 0 2640000
689 0 2680000
1119 0 2720000
698 0 2760000
1006 0 2800000
545 0 2840000
1617 0 2880000
9123 32 2920000
527 0 2960000
1576 0 3000000
465 0 3040000
741 0 3080000
521 0 3120000
1322 0 3160000
775 0 3200000
863 0 3240000
910 0 3280000
915 0 3320000
926 0 3360000
7556 32 3400000
741 0 3440000
527 0 3480000
2516 0 3520000
459 0 3560000
404 0 3600000
509 0 3640000
1227 0 3680000
1561 0 3720000
490 0 3760000
712 0 3800000
803 0 3840000
7524 32 3880000
730 0 3920000
461 0 3960000
2526 0 4000000
453 0 4040000
632 0 4080000
783 0 4120000
843 0 4160000
918 0 4200000
961 0 4240000
948 0 4280000
959 0 4320000
7598 32 4360000
678 0 4400000
569 0 4440000
893 0 4480000
624 0 4520000
755 0 4560000
2234 0 4600000
556 0 4640000
944 0 4680000
739 0 4720000
862 0 4760000
938 0 4800000
7574 32 4840000
699 0 4880000
701 0 4920000
530 0 4960000
689 0 5000000
778 0 5040000
856 0 5080000
930 0 5120000
975 0 5160000
1021 0 5200000
1074 0 5240000
978 0 5280000
8021 32 5320000
704 0 5360000
610 0 5400000
697 0 5440000
711 0 5480000
820 0 5520000
843 0 5560000
251 0 5600000
3367 0 5640000
507 0 5680000
3168 32 5720000
779 0 5760000
316 0 5800000
635 0 5840000
204 0 5880000
978 0 5920000
127 0 5960000
589 0 6000000
604 0 6040000
666 0 6080000
582 0 6120000
729 0 6160000
4152 32 6200000
858 0 6240000
739 0 6280000
885 0 6320000
749 0 6360000
950 0 6400000
593 0 6440000
771 0 6480000
678 0 6520000
529 0 6560000
835 0 6600000
391 0 6640000
4692 32 6680000
473 0 6720000
724 0 6760000
381 0 6800000
909 0 6840000
394 0 6880000
659 0 6920000
367 0 6960000
658 0 7000000
523 0 7040000
554 0 7080000
553 0 7120000
6080 32 7160000
496 0 7200000
763 0 7240000
939 0 7280000
715 0 7320000
672 0 7360000
614 0 7400000
811 0 7440000
916 0 7480000
1153 0 7520000
940 0 7560000
322 0 7600000
6613 32 7640000
851 0 7680000
1007 0 7720000
520 0 7760000
456 0 7800000
639 0 7840000
758 0 7880000
879 0 7920000
1152 0 7960000
1061 0 8000000
946 0 8040000
859 0 8080000
3610 32 8120000
871 0 8160000
746 0 8200000
367 0 8240000
397 0 8280000
930 0 8320000
337 0 8360000
418 0 8400000
740 0 8440000
637 0 8480000
666 0 8520000
627 0 8560000
4338 32 8600000
745 0 8640000
783 0 8680000
465 0 8720000
460 0 8760000
455 0 8800000
506 0 8840000
492 0 8880000
485 0 8920000
517 0 8960000
534 0 9000000
395 0 9040000
5626 32 9080000
1169 0 9120000
564 0 9160000
261 0 9200000
327 0 9240000
303 0 9280000
1145 0 9320000
257 0 9360000
498 0 9400000
465 0 9440000
414 0 9480000
553 0 9520000
5617 32 9560000
1052 0 9600000
592 0 9640000
323 0 9680000
497 0 9720000
467 0 9760000
705 0 9800000
1086 0 9840000
1253 0 9880000
1252 0 9920000
776 0 9960000

Binary file not shown.

View file

@ -0,0 +1,251 @@
49 128 0
49 128 0
57542 32 0
50961 0 40000
29136 0 80000
28146 0 120000
25472 0 160000
5752 0 200000
4373 0 240000
4261 0 280000
5083 0 320000
6504 0 360000
5080 0 400000
5688 0 440000
50834 32 480000
4559 0 520000
4118 0 560000
3937 0 600000
4262 0 640000
4649 0 680000
3995 0 720000
3899 0 760000
3896 0 800000
3998 0 840000
4129 0 880000
4064 0 920000
42872 32 960000
3265 0 1000000
2506 0 1040000
2178 0 1080000
2445 0 1120000
2461 0 1160000
3267 0 1200000
2700 0 1240000
2924 0 1280000
2405 0 1320000
2656 0 1360000
2494 0 1400000
47454 32 1440000
2956 0 1480000
1434 0 1520000
707 0 1560000
1310 0 1600000
1791 0 1640000
2088 0 1680000
1078 0 1720000
738 0 1760000
74837 32 1800000
3304 0 1840000
3656 0 1880000
2822 0 1920000
2566 0 1960000
2816 0 2000000
2590 0 2040000
2471 0 2080000
2553 0 2120000
2547 0 2160000
2628 0 2200000
2664 0 2240000
38161 32 2280000
2995 0 2320000
2205 0 2360000
2055 0 2400000
2122 0 2440000
2236 0 2480000
2407 0 2520000
893 0 2560000
2511 0 2600000
2703 0 2640000
2511 0 2680000
2564 0 2720000
35944 32 2760000
3002 0 2800000
2188 0 2840000
2109 0 2880000
2058 0 2920000
2242 0 2960000
2240 0 3000000
2346 0 3040000
2223 0 3080000
2430 0 3120000
2486 0 3160000
2379 0 3200000
34014 32 3240000
3009 0 3280000
2073 0 3320000
2005 0 3360000
2052 0 3400000
2167 0 3440000
2331 0 3480000
2201 0 3520000
896 0 3560000
2594 0 3600000
2589 0 3640000
2542 0 3680000
33973 32 3720000
2913 0 3760000
1978 0 3800000
1943 0 3840000
1983 0 3880000
2234 0 3920000
2142 0 3960000
2106 0 4000000
2253 0 4040000
2327 0 4080000
2186 0 4120000
2366 0 4160000
32094 32 4200000
3050 0 4240000
1913 0 4280000
2016 0 4320000
2097 0 4360000
2112 0 4400000
2163 0 4440000
2258 0 4480000
2231 0 4520000
882 0 4560000
2575 0 4600000
2700 0 4640000
33754 32 4680000
3011 0 4720000
2034 0 4760000
1986 0 4800000
1983 0 4840000
2180 0 4880000
2067 0 4920000
2262 0 4960000
2323 0 5000000
2367 0 5040000
2289 0 5080000
2263 0 5120000
31806 32 5160000
3285 0 5200000
1957 0 5240000
2073 0 5280000
2057 0 5320000
2134 0 5360000
2086 0 5400000
2217 0 5440000
2314 0 5480000
2176 0 5520000
852 0 5560000
2421 0 5600000
37236 32 5640000
16140 32 5680000
3491 0 5720000
2891 0 5760000
1499 0 5800000
659 0 5840000
652 0 5880000
648 0 5920000
1892 0 5960000
3050 0 6000000
2235 0 6040000
1925 0 6080000
1790 0 6120000
16441 32 6160000
5341 0 6200000
2445 0 6240000
2878 0 6280000
2366 0 6320000
1732 0 6360000
1858 0 6400000
1632 0 6440000
1514 0 6480000
1874 0 6520000
1059 0 6560000
1795 0 6600000
20153 32 6640000
3589 0 6680000
2418 0 6720000
1896 0 6760000
1577 0 6800000
1629 0 6840000
1717 0 6880000
1717 0 6920000
1815 0 6960000
1663 0 7000000
1855 0 7040000
1699 0 7080000
21184 32 7120000
3395 0 7160000
3276 0 7200000
3825 0 7240000
2747 0 7280000
1684 0 7320000
2141 0 7360000
2372 0 7400000
2777 0 7440000
2828 0 7480000
2442 0 7520000
1302 0 7560000
20702 32 7600000
4043 0 7640000
2875 0 7680000
2026 0 7720000
1983 0 7760000
2173 0 7800000
2670 0 7840000
3145 0 7880000
5312 0 7920000
5547 0 7960000
4262 0 8000000
2637 0 8040000
15761 32 8080000
2693 0 8120000
1433 0 8160000
2108 0 8200000
2253 0 8240000
1846 0 8280000
1281 0 8320000
2294 0 8360000
2217 0 8400000
2370 0 8440000
1809 0 8480000
1899 0 8520000
21630 32 8560000
3189 0 8600000
1679 0 8640000
1732 0 8680000
1672 0 8720000
1788 0 8760000
1656 0 8800000
1765 0 8840000
1579 0 8880000
2142 0 8920000
1954 0 8960000
1854 0 9000000
24966 32 9040000
2176 0 9080000
1236 0 9120000
1282 0 9160000
1526 0 9200000
1369 0 9240000
1283 0 9280000
1434 0 9320000
1335 0 9360000
2144 0 9400000
1917 0 9440000
1409 0 9480000
27745 32 9520000
1905 0 9560000
1495 0 9600000
1685 0 9640000
1745 0 9680000
1894 0 9720000
3667 0 9760000
5546 0 9800000
5729 0 9840000
4479 0 9880000
3829 0 9920000

Binary file not shown.

View file

@ -0,0 +1,300 @@
86980 32 0
6741 0 33000
9433 0 67000
9363 0 100000
8671 0 133000
9003 0 167000
7751 0 200000
13207 0 233000
8542 0 267000
9344 0 300000
8069 0 333000
8588 0 367000
12087 0 400000
7315 0 433000
9654 0 467000
13100 0 500000
7832 0 533000
10060 0 567000
8540 0 600000
8667 0 633000
8532 0 667000
6018 0 700000
8520 0 733000
15350 0 767000
6110 0 800000
7876 0 833000
6133 0 867000
9476 0 900000
11002 0 933000
7484 0 967000
8760 0 1000000
16515 0 1033000
7482 0 1067000
6983 0 1100000
7561 0 1133000
8263 0 1167000
10682 0 1200000
8108 0 1233000
7924 0 1267000
8693 0 1300000
14190 0 1333000
7393 0 1367000
6864 0 1400000
9431 0 1433000
7674 0 1467000
8458 0 1500000
5899 0 1533000
8259 0 1567000
7963 0 1600000
14779 0 1633000
6877 0 1667000
7268 0 1700000
8526 0 1733000
8467 0 1767000
11200 0 1800000
7261 0 1833000
8280 0 1867000
6718 0 1900000
17742 0 1933000
5206 0 1967000
5700 0 2000000
5872 0 2033000
7915 0 2067000
8493 0 2100000
6545 0 2133000
9072 0 2167000
13200 0 2200000
9632 0 2233000
10016 0 2267000
7824 0 2300000
10628 0 2333000
10401 0 2367000
10892 0 2400000
9023 0 2433000
10734 0 2467000
15045 0 2500000
7940 0 2533000
9657 0 2567000
8743 0 2600000
8074 0 2633000
9445 0 2667000
6494 0 2700000
8601 0 2733000
13478 0 2767000
6942 0 2800000
8002 0 2833000
7940 0 2867000
8320 0 2900000
12215 0 2933000
6668 0 2967000
11384 0 3000000
8378 0 3033000
12908 0 3067000
8420 0 3100000
7502 0 3133000
8482 0 3167000
10968 0 3200000
12338 0 3233000
8657 0 3267000
10468 0 3300000
13878 0 3333000
9374 0 3367000
9857 0 3400000
10381 0 3433000
9984 0 3467000
9956 0 3500000
8905 0 3533000
8672 0 3567000
8122 0 3600000
9677 0 3633000
9812 0 3667000
9622 0 3700000
9023 0 3733000
7147 0 3767000
9146 0 3800000
7488 0 3833000
10812 0 3867000
8340 0 3900000
13280 0 3933000
5167 0 3967000
6991 0 4000000
6543 0 4033000
5952 0 4067000
5164 0 4100000
4011 0 4133000
3794 0 4167000
12959 0 4200000
71020 32 4233000
5351 0 4267000
6283 0 4300000
5080 0 4333000
6707 0 4367000
5857 0 4400000
5221 0 4433000
10972 0 4467000
7023 0 4500000
6907 0 4533000
7851 0 4567000
4843 0 4600000
6085 0 4633000
4868 0 4667000
5093 0 4700000
12807 0 4733000
6330 0 4767000
4209 0 4800000
4596 0 4833000
6316 0 4867000
4954 0 4900000
5533 0 4933000
7749 0 4967000
12486 0 5000000
5468 0 5033000
4353 0 5067000
5786 0 5100000
5551 0 5133000
6711 0 5167000
5688 0 5200000
6258 0 5233000
12975 0 5267000
4873 0 5300000
4552 0 5333000
4844 0 5367000
4774 0 5400000
5025 0 5433000
5204 0 5467000
4814 0 5500000
14835 0 5533000
5343 0 5567000
4808 0 5600000
5071 0 5633000
6324 0 5667000
5243 0 5700000
4995 0 5733000
5134 0 5767000
11054 0 5800000
4807 0 5833000
5118 0 5867000
6424 0 5900000
4984 0 5933000
7187 0 5967000
5505 0 6000000
6941 0 6033000
11517 0 6067000
5646 0 6100000
6832 0 6133000
5294 0 6167000
6200 0 6200000
6328 0 6233000
4348 0 6267000
4607 0 6300000
12958 0 6333000
4308 0 6367000
6084 0 6400000
4494 0 6433000
5338 0 6467000
5742 0 6500000
5472 0 6533000
8459 0 6567000
13075 0 6600000
8986 0 6633000
9583 0 6667000
8792 0 6700000
9004 0 6733000
9632 0 6767000
9393 0 6800000
9259 0 6833000
11927 0 6867000
10323 0 6900000
15248 0 6933000
11244 0 6967000
15558 0 7000000
6197 0 7033000
8044 0 7067000
11432 0 7100000
8737 0 7133000
13885 0 7167000
11158 0 7200000
15152 0 7233000
7025 0 7267000
8025 0 7300000
13362 0 7333000
8090 0 7367000
13637 0 7400000
6148 0 7433000
9270 0 7467000
8633 0 7500000
10673 0 7533000
14208 0 7567000
8084 0 7600000
13783 0 7633000
10660 0 7667000
7466 0 7700000
14433 0 7733000
10934 0 7767000
7239 0 7800000
12548 0 7833000
6564 0 7867000
10761 0 7900000
10992 0 7933000
12924 0 7967000
12348 0 8000000
6770 0 8033000
14288 0 8067000
29345 32 8100000
1822 0 8133000
1087 0 8167000
1109 0 8200000
2007 0 8233000
1798 0 8267000
1635 0 8300000
19607 0 8333000
919 0 8367000
2357 0 8400000
3578 0 8433000
4497 0 8467000
4314 0 8500000
3851 0 8533000
3822 0 8567000
4252 0 8600000
4775 0 8633000
12203 0 8667000
5078 0 8700000
5876 0 8733000
6124 0 8767000
4490 0 8800000
3538 0 8833000
3450 0 8867000
3611 0 8900000
2847 0 8933000
2605 0 8967000
12243 0 9000000
1946 0 9033000
1847 0 9067000
2035 0 9100000
2572 0 9133000
2326 0 9167000
2645 0 9200000
2938 0 9233000
2495 0 9267000
2609 0 9300000
9744 0 9333000
1796 0 9367000
1985 0 9400000
1759 0 9433000
2259 0 9467000
2233 0 9500000
2044 0 9533000
2502 0 9567000
2307 0 9600000
2739 0 9633000
11707 0 9667000
5168 0 9700000
4483 0 9733000
3044 0 9767000
4241 0 9800000
4392 0 9833000
4934 0 9867000
5934 0 9900000
5647 0 9933000
5326 0 9967000

Binary file not shown.

View file

@ -0,0 +1,300 @@
54918 32 0
46280 0 33000
2006 0 67000
2841 0 100000
3044 0 133000
3429 0 167000
3196 0 200000
2926 0 233000
2821 0 267000
1150 0 300000
36 0 333000
38084 0 367000
3689 0 400000
3473 0 433000
3011 0 467000
3090 0 500000
2516 0 533000
2771 0 567000
3250 0 600000
1159 0 633000
34 0 667000
39690 0 700000
3615 0 733000
2494 0 767000
2893 0 800000
3329 0 833000
2939 0 867000
2352 0 900000
2732 0 933000
1746 0 967000
33 0 1000000
41501 0 1033000
2997 0 1067000
2666 0 1100000
3582 0 1133000
2616 0 1167000
2923 0 1200000
2696 0 1233000
1628 0 1267000
1887 0 1300000
33 0 1333000
42876 0 1367000
2588 0 1400000
3316 0 1433000
2287 0 1467000
3375 0 1500000
2108 0 1533000
2961 0 1567000
1730 0 1600000
1800 0 1633000
34 0 1667000
43797 0 1700000
2484 0 1733000
2556 0 1767000
2671 0 1800000
2338 0 1833000
3133 0 1867000
2002 0 1900000
1794 0 1933000
1279 0 1967000
32 0 2000000
42642 0 2033000
2686 0 2067000
2202 0 2100000
2145 0 2133000
2566 0 2167000
2190 0 2200000
1580 0 2233000
1711 0 2267000
648 0 2300000
32 0 2333000
40409 0 2367000
2628 0 2400000
1973 0 2433000
2360 0 2467000
3043 0 2500000
1730 0 2533000
1456 0 2567000
2312 0 2600000
369 0 2633000
32 0 2667000
41391 0 2700000
2967 0 2733000
2454 0 2767000
1825 0 2800000
1853 0 2833000
1746 0 2867000
2347 0 2900000
1362 0 2933000
441 0 2967000
34 0 3000000
42503 0 3033000
1877 0 3067000
1690 0 3100000
1367 0 3133000
1520 0 3167000
1240 0 3200000
1094 0 3233000
739 0 3267000
392 0 3300000
33 0 3333000
35104 0 3367000
1463 0 3400000
2029 0 3433000
1626 0 3467000
1956 0 3500000
799 0 3533000
556 0 3567000
584 0 3600000
191 0 3633000
36 0 3667000
37652 0 3700000
862 0 3733000
524 0 3767000
641 0 3800000
584 0 3833000
360 0 3867000
365 0 3900000
361 0 3933000
154 0 3967000
36 0 4000000
125740 0 4033000
332 0 4067000
381 0 4100000
420 0 4133000
464 0 4167000
288 0 4200000
2660 0 4233000
127564 32 4267000
30696 0 4300000
3423 0 4333000
3310 0 4367000
3513 0 4400000
3735 0 4433000
3358 0 4467000
3108 0 4500000
2800 0 4533000
1751 0 4567000
41 0 4600000
39862 0 4633000
3739 0 4667000
3755 0 4700000
3408 0 4733000
3783 0 4767000
3423 0 4800000
2801 0 4833000
2549 0 4867000
1461 0 4900000
40 0 4933000
41667 0 4967000
3623 0 5000000
3356 0 5033000
3424 0 5067000
3548 0 5100000
3119 0 5133000
2905 0 5167000
2772 0 5200000
1623 0 5233000
43 0 5267000
46783 0 5300000
3462 0 5333000
3470 0 5367000
3677 0 5400000
3684 0 5433000
3266 0 5467000
3127 0 5500000
2809 0 5533000
1750 0 5567000
40 0 5600000
46215 0 5633000
3599 0 5667000
3558 0 5700000
3544 0 5733000
3632 0 5767000
3548 0 5800000
2968 0 5833000
2715 0 5867000
1729 0 5900000
41 0 5933000
45958 0 5967000
3776 0 6000000
3525 0 6033000
3644 0 6067000
3786 0 6100000
3222 0 6133000
2923 0 6167000
2752 0 6200000
1592 0 6233000
41 0 6267000
46031 0 6300000
3520 0 6333000
3380 0 6367000
3371 0 6400000
3427 0 6433000
3135 0 6467000
2988 0 6500000
2730 0 6533000
1671 0 6567000
41 0 6600000
45846 0 6633000
3535 0 6667000
3507 0 6700000
3429 0 6733000
3491 0 6767000
3325 0 6800000
2979 0 6833000
2800 0 6867000
1610 0 6900000
40 0 6933000
45958 0 6967000
3762 0 7000000
3254 0 7033000
3408 0 7067000
3860 0 7100000
3198 0 7133000
2966 0 7167000
2882 0 7200000
1763 0 7233000
42 0 7267000
46130 0 7300000
3593 0 7333000
3523 0 7367000
3939 0 7400000
3980 0 7433000
3470 0 7467000
3191 0 7500000
2969 0 7533000
1740 0 7567000
41 0 7600000
46300 0 7633000
3739 0 7667000
3781 0 7700000
3964 0 7733000
4023 0 7767000
3480 0 7800000
3065 0 7833000
2934 0 7867000
1805 0 7900000
42 0 7933000
38166 0 7967000
4062 0 8000000
3844 0 8033000
4547 0 8067000
934 0 8100000
365 0 8133000
181 0 8167000
463 0 8200000
419 0 8233000
38 0 8267000
9702 0 8300000
344 0 8333000
276 0 8367000
1350 0 8400000
1703 0 8433000
1843 0 8467000
1228 0 8500000
35580 32 8533000
27458 0 8567000
2144 0 8600000
2482 0 8633000
2004 0 8667000
2822 0 8700000
2570 0 8733000
1726 0 8767000
1248 0 8800000
844 0 8833000
35 0 8867000
14207 0 8900000
1037 0 8933000
749 0 8967000
829 0 9000000
915 0 9033000
685 0 9067000
767 0 9100000
798 0 9133000
342 0 9167000
31 0 9200000
12590 0 9233000
923 0 9267000
819 0 9300000
776 0 9333000
863 0 9367000
729 0 9400000
471 0 9433000
638 0 9467000
276 0 9500000
38 0 9533000
17272 0 9567000
856 0 9600000
1158 0 9633000
2172 0 9667000
2751 0 9700000
2142 0 9733000
1267 0 9767000
1965 0 9800000
1510 0 9833000
34 0 9867000
2692 0 9900000
2778 0 9933000
2585 0 9967000

Binary file not shown.

File diff suppressed because it is too large Load diff