History

Add decoder test

jwwang committed 12 years ago

Commit cb0053f1 parent 61f1bac6 files · +263 −33Browse files

Showing the changes to test/decoder_test.cpp (1 of 6 files). Show all

Unified · Split

test/decoder_test.cpp+199−0
@@ -0,0 +1,199 @@
1#include <gtest/gtest.h>
2#include <stdlib.h>
3#include <stdarg.h>
4#include <stdint.h>
5#include <limits.h>
6#include <fstream>
7#include <openssl/sha.h>
8
9#include "codec_def.h"
10#include "codec_app_def.h"
11#include "codec_api.h"
12
13#include "utils/BufferedData.h"
14
15static bool CompareHash(unsigned char(&digest)[SHA_DIGEST_LENGTH],
16 const char* hashStr) {
17
18 char hashStrCmp[SHA_DIGEST_LENGTH * 2 + 1];
19 for (int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
20 sprintf(&hashStrCmp[i*2], "%.2x", digest[i]);
21 }
22 hashStrCmp[SHA_DIGEST_LENGTH * 2] = '\0';
23 return strncmp(hashStr, hashStrCmp, SHA_DIGEST_LENGTH * 2) == 0;
24}
25
26static void UpdateHashFromPlane(SHA_CTX* ctx, const uint8_t* plane,
27 int width, int height, int stride) {
28
29 for (int i = 0; i < height; i++) {
30 SHA1_Update(ctx, plane, width);
31 plane += stride;
32 }
33}
34
35/**
36 * @return frame size (>= 0), or -1 for memory allocation error.
37 */
38static int ReadFrame(std::ifstream* file, BufferedData* buf) {
39 // start code of a frame is {0, 0, 0, 1}
40 int zeroCount = 0;
41 char b;
42
43 while (file->read(&b, 1), file->gcount() == 1) {
44 if (!buf->Push(b)) {
45 return -1;
46 }
47
48 if (buf->Length() <= 4) {
49 continue;
50 }
51
52 if (zeroCount < 3) {
53 zeroCount = b != 0 ? 0 : zeroCount + 1;
54 } else {
55 if (b == 1) {
56 file->seekg(-4, file->cur);
57 return buf->Length() - 4;
58 } else if (b == 0) {
59 zeroCount = 3;
60 } else {
61 zeroCount = 0;
62 }
63 }
64 }
65 return buf->Length();
66}
67
68/**
69 * @return true if a frame is decoded successfully, otherwise false.
70 */
71static bool DecodeAndProcess(ISVCDecoder* decoder, const uint8_t* src,
72 int sliceSize, SHA_CTX* ctx) {
73
74 void* data[3];
75 SBufferInfo bufInfo;
76 memset(data, 0, sizeof(data));
77 memset(&bufInfo, 0, sizeof(SBufferInfo));
78
79 DECODING_STATE rv = decoder->DecodeFrame(src, sliceSize, data, &bufInfo);
80 if (rv == dsErrorFree) {
81 if (bufInfo.iBufferStatus == 1) {
82 // y plane
83 UpdateHashFromPlane(ctx, static_cast<uint8_t*>(data[0]),
84 bufInfo.UsrData.sSystemBuffer.iWidth,
85 bufInfo.UsrData.sSystemBuffer.iHeight,
86 bufInfo.UsrData.sSystemBuffer.iStride[0]);
87 // u plane
88 UpdateHashFromPlane(ctx, static_cast<uint8_t*>(data[1]),
89 bufInfo.UsrData.sSystemBuffer.iWidth / 2,
90 bufInfo.UsrData.sSystemBuffer.iHeight / 2,
91 bufInfo.UsrData.sSystemBuffer.iStride[1]);
92 // v plane
93 UpdateHashFromPlane(ctx, static_cast<uint8_t*>(data[2]),
94 bufInfo.UsrData.sSystemBuffer.iWidth / 2,
95 bufInfo.UsrData.sSystemBuffer.iHeight / 2,
96 bufInfo.UsrData.sSystemBuffer.iStride[1]);
97 }
98 return true;
99 } else {
100 return false;
101 }
102}
103
104static void CompareFileToHash(ISVCDecoder* decoder,
105 const char* fileName, const char* hashStr) {
106
107 std::ifstream file(fileName, std::ios::in | std::ios::binary);
108 ASSERT_TRUE(file.is_open());
109
110 unsigned char digest[SHA_DIGEST_LENGTH];
111 SHA_CTX ctx;
112 SHA1_Init(&ctx);
113
114 BufferedData buf;
115 int sliceSize;
116
117 while ((sliceSize = ReadFrame(&file, &buf)) > 0) {
118 if (DecodeAndProcess(decoder, buf.data(), sliceSize, &ctx)) {
119 buf.Clear();
120 } else {
121 SHA1_Final(digest, &ctx);
122 FAIL() << "unable to decode frame";
123 }
124 }
125
126 if (sliceSize < 0) {
127 SHA1_Final(digest, &ctx);
128 FAIL() << "unable to allocate memory";
129 }
130
131 int32_t iEndOfStreamFlag = true;
132 decoder->SetOption(DECODER_OPTION_END_OF_STREAM, &iEndOfStreamFlag);
133
134 // Get pending last frame
135 if (!DecodeAndProcess(decoder, NULL, 0, &ctx)) {
136 SHA1_Final(digest, &ctx);
137 FAIL() << "unable to decode last frame";
138 }
139
140 SHA1_Final(digest, &ctx);
141 ASSERT_TRUE(CompareHash(digest, hashStr));
142}
143
144class DecoderInitTest : public ::testing::Test {
145public:
146 DecoderInitTest() : decoder_(NULL) {}
147
148 virtual void SetUp() {
149 long rv = CreateDecoder(&decoder_);
150 ASSERT_EQ(0, rv);
151 ASSERT_TRUE(decoder_ != NULL);
152
153 SDecodingParam decParam;
154 memset(&decParam, 0, sizeof(SDecodingParam));
155 decParam.iOutputColorFormat = videoFormatI420;
156 decParam.uiTargetDqLayer = UCHAR_MAX;
157 decParam.uiEcActiveFlag = 1;
158 decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
159
160 rv = decoder_->Initialize(&decParam, INIT_TYPE_PARAMETER_BASED);
161 ASSERT_EQ(0, rv);
162 }
163
164 virtual void TearDown() {
165 if (decoder_ != NULL) {
166 decoder_->Uninitialize();
167 DestroyDecoder(decoder_);
168 }
169 }
170
171protected:
172 ISVCDecoder* decoder_;
173};
174
175
176TEST_F(DecoderInitTest, JustInit) {
177}
178
179struct FileParam {
180 const char* fileName;
181 const char* hashStr;
182};
183
184class DecoderOutputTest : public DecoderInitTest,
185 public ::testing::WithParamInterface<FileParam> {
186};
187
188TEST_P(DecoderOutputTest, CompareOutput) {
189 FileParam p = GetParam();
190 CompareFileToHash(decoder_, p.fileName, p.hashStr);
191}
192
193static const FileParam kFileParamArray[] = {
194 {"res/test_vd_1d.264", "5827d2338b79ff82cd091c707823e466197281d3"},
195 {"res/test_vd_rc.264", "eea02e97bfec89d0418593a8abaaf55d02eaa1ca"}
196};
197
198INSTANTIATE_TEST_CASE_P(DecodeFile, DecoderOutputTest,
199 ::testing::ValuesIn(kFileParamArray));

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t