Merge "Omx VTS tests" into oc-dev
This commit is contained in:
commit
9ec2c9e099
26 changed files with 3900 additions and 1628 deletions
|
@ -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/
|
||||
|
||||
|
|
|
@ -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, ¶ms);
|
||||
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, ¶ms);
|
||||
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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -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, ¶ms);
|
||||
}
|
||||
|
||||
// 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)");
|
||||
|
|
|
@ -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, ¶ms);
|
||||
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, ¶ms);
|
||||
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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
BIN
media/res/bbb_h263_352x288_300kbps_12fps.h263
Normal file
BIN
media/res/bbb_h263_352x288_300kbps_12fps.h263
Normal file
Binary file not shown.
122
media/res/bbb_h263_352x288_300kbps_12fps.info
Normal file
122
media/res/bbb_h263_352x288_300kbps_12fps.info
Normal 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
|
BIN
media/res/bbb_hevc_640x360_1600kbps_30fps.hevc
Normal file
BIN
media/res/bbb_hevc_640x360_1600kbps_30fps.hevc
Normal file
Binary file not shown.
302
media/res/bbb_hevc_640x360_1600kbps_30fps.info
Normal file
302
media/res/bbb_hevc_640x360_1600kbps_30fps.info
Normal 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
|
|
@ -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
|
||||
|
|
249
media/res/bbb_mpeg2_176x144_105kbps_25fps.info
Normal file
249
media/res/bbb_mpeg2_176x144_105kbps_25fps.info
Normal 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
|
BIN
media/res/bbb_mpeg2_176x144_105kbps_25fps.m2v
Normal file
BIN
media/res/bbb_mpeg2_176x144_105kbps_25fps.m2v
Normal file
Binary file not shown.
251
media/res/bbb_mpeg4_1280x720_1000kbps_25fps.info
Normal file
251
media/res/bbb_mpeg4_1280x720_1000kbps_25fps.info
Normal 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
|
BIN
media/res/bbb_mpeg4_1280x720_1000kbps_25fps.m4v
Normal file
BIN
media/res/bbb_mpeg4_1280x720_1000kbps_25fps.m4v
Normal file
Binary file not shown.
300
media/res/bbb_vp8_640x360_2mbps_30fps.info
Normal file
300
media/res/bbb_vp8_640x360_2mbps_30fps.info
Normal 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
|
BIN
media/res/bbb_vp8_640x360_2mbps_30fps.vp8
Normal file
BIN
media/res/bbb_vp8_640x360_2mbps_30fps.vp8
Normal file
Binary file not shown.
300
media/res/bbb_vp9_640x360_1600kbps_30fps.info
Normal file
300
media/res/bbb_vp9_640x360_1600kbps_30fps.info
Normal 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
|
BIN
media/res/bbb_vp9_640x360_1600kbps_30fps.vp9
Normal file
BIN
media/res/bbb_vp9_640x360_1600kbps_30fps.vp9
Normal file
Binary file not shown.
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue