Index: media/filters/bitstream_converter_unittest.cc |
diff --git a/media/filters/bitstream_converter_unittest.cc b/media/filters/bitstream_converter_unittest.cc |
index 1e8434113f65aaa7e246625c6d0e63d6c1af4912..3330df7b45101bced995aee0f9f7872c9cd4e7d9 100644 |
--- a/media/filters/bitstream_converter_unittest.cc |
+++ b/media/filters/bitstream_converter_unittest.cc |
@@ -4,73 +4,94 @@ |
#include <deque> |
-#include "media/base/mock_ffmpeg.h" |
#include "media/ffmpeg/ffmpeg_common.h" |
#include "media/filters/bitstream_converter.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-using ::testing::DoAll; |
-using ::testing::Mock; |
-using ::testing::Return; |
-using ::testing::ReturnNull; |
-using ::testing::SetArgumentPointee; |
-using ::testing::StrEq; |
-using ::testing::StrictMock; |
-using ::testing::_; |
- |
namespace media { |
+static const char kTestFilterName[] = "test_filter"; |
+static uint8_t kFailData[] = { 3, 2, 1 }; |
+static uint8_t kNewBufferData[] = { 2, 1 }; |
+static uint8_t kInPlaceData[] = { 1 }; |
+static const int kFailSize = 3; |
+static const int kNewBufferSize = 2; |
+static const int kInPlaceSize = 1; |
+ |
+ |
+// Test filter function that looks for specific input data and changes it's |
+// behavior based on what is passed to |buf| & |buf_size|. The three behaviors |
+// simulated are the following: |
+// - Create a new output buffer. Triggered by |buf| == |kNewBufferData|. |
+// - Use the existing output buffer. Triggered by |buf| == |kInPlaceData|. |
+// - Signal an error. Triggered by |buf| == |kFailData|. |
+static int DoFilter(AVBitStreamFilterContext* bsfc, |
+ AVCodecContext* avctx, |
+ const char* args, |
+ uint8_t** poutbuf, |
+ int* poutbuf_size, |
+ const uint8_t* buf, |
+ int buf_size, |
+ int keyframe) { |
+ if (buf_size == kNewBufferSize && |
+ !memcmp(buf, kNewBufferData, kNewBufferSize)) { |
+ *poutbuf_size = buf_size + 1; |
+ *poutbuf = static_cast<uint8*>(av_malloc(*poutbuf_size)); |
+ *poutbuf[0] = 0; |
+ memcpy((*poutbuf) + 1, buf, buf_size); |
+ return 0; |
+ } else if (buf_size == kInPlaceSize && |
+ !memcmp(buf, kInPlaceData, kInPlaceSize)) { |
+ return 0; |
+ } |
+ |
+ return -1; |
+} |
+ |
+static void DoClose(AVBitStreamFilterContext* bsfc) {} |
+ |
+static AVBitStreamFilter g_stream_filter = { |
+ kTestFilterName, |
+ 0, // Private Data Size |
+ DoFilter, |
+ DoClose, |
+ 0, // Next filter pointer. |
+}; |
+ |
class BitstreamConverterTest : public testing::Test { |
protected: |
BitstreamConverterTest() { |
memset(&test_stream_context_, 0, sizeof(test_stream_context_)); |
- memset(&test_filter_, 0, sizeof(test_filter_)); |
memset(&test_packet_, 0, sizeof(test_packet_)); |
- test_packet_.data = kData1; |
- test_packet_.size = kTestSize1; |
+ test_packet_.data = kFailData; |
+ test_packet_.size = kFailSize; |
+ } |
+ |
+ virtual ~BitstreamConverterTest() { |
+ av_free_packet(&test_packet_); |
} |
- virtual ~BitstreamConverterTest() {} |
+ static void SetUpTestCase() { |
+ // Register g_stream_filter if it isn't already registered. |
+ if (!g_stream_filter.next) |
+ av_register_bitstream_filter(&g_stream_filter); |
+ } |
AVCodecContext test_stream_context_; |
- AVBitStreamFilterContext test_filter_; |
AVPacket test_packet_; |
- StrictMock<MockFFmpeg> mock_ffmpeg_; |
- |
- static const char kTestFilterName[]; |
- static uint8_t kData1[]; |
- static uint8_t kData2[]; |
- static const int kTestSize1; |
- static const int kTestSize2; |
- |
private: |
DISALLOW_COPY_AND_ASSIGN(BitstreamConverterTest); |
}; |
-const char BitstreamConverterTest::kTestFilterName[] = "test_filter"; |
-uint8_t BitstreamConverterTest::kData1[] = { 1 }; |
-uint8_t BitstreamConverterTest::kData2[] = { 2 }; |
-const int BitstreamConverterTest::kTestSize1 = 1; |
-const int BitstreamConverterTest::kTestSize2 = 2; |
+TEST_F(BitstreamConverterTest, InitializeFailed) { |
+ FFmpegBitstreamConverter converter("BAD_FILTER_NAME", &test_stream_context_); |
-TEST_F(BitstreamConverterTest, Initialize) { |
- FFmpegBitstreamConverter converter(kTestFilterName, &test_stream_context_); |
- |
- // Test Initialize returns false on a bad initialization, and cleanup is not |
- // done. |
- EXPECT_CALL(mock_ffmpeg_, AVBitstreamFilterInit(StrEq(kTestFilterName))) |
- .WillOnce(ReturnNull()); |
EXPECT_FALSE(converter.Initialize()); |
+} |
- EXPECT_TRUE(Mock::VerifyAndClearExpectations(&mock_ffmpeg_)); |
- |
- // Test Initialize returns true on successful initialization, and cleanup is |
- // done. The cleanup will be activated when the converter object goes out of |
- // scope. |
- EXPECT_CALL(mock_ffmpeg_, AVBitstreamFilterInit(StrEq(kTestFilterName))) |
- .WillOnce(Return(&test_filter_)); |
- EXPECT_CALL(mock_ffmpeg_, AVBitstreamFilterClose(&test_filter_)); |
+TEST_F(BitstreamConverterTest, InitializeSuccess) { |
+ FFmpegBitstreamConverter converter(kTestFilterName, &test_stream_context_); |
EXPECT_TRUE(converter.Initialize()); |
} |
@@ -83,81 +104,42 @@ TEST_F(BitstreamConverterTest, ConvertPacket_NotInitialized) { |
TEST_F(BitstreamConverterTest, ConvertPacket_FailedFilter) { |
FFmpegBitstreamConverter converter(kTestFilterName, &test_stream_context_); |
- // Inject mock filter instance. |
- converter.stream_filter_ = &test_filter_; |
- |
- // Simulate a successful filter call, that allocates a new data buffer. |
- EXPECT_CALL(mock_ffmpeg_, |
- AVBitstreamFilterFilter(&test_filter_, &test_stream_context_, |
- NULL, _, _, |
- test_packet_.data, test_packet_.size, _)) |
- .WillOnce(Return(AVERROR(EINVAL))); |
+ EXPECT_TRUE(converter.Initialize()); |
EXPECT_FALSE(converter.ConvertPacket(&test_packet_)); |
- |
- // Uninject mock filter instance to avoid cleanup code on destruction of |
- // converter. |
- converter.stream_filter_ = NULL; |
} |
TEST_F(BitstreamConverterTest, ConvertPacket_Success) { |
FFmpegBitstreamConverter converter(kTestFilterName, &test_stream_context_); |
- // Inject mock filter instance. |
- converter.stream_filter_ = &test_filter_; |
+ EXPECT_TRUE(converter.Initialize()); |
// Ensure our packet doesn't already have a destructor. |
ASSERT_TRUE(test_packet_.destruct == NULL); |
- // Simulate a successful filter call, that allocates a new data buffer. |
- EXPECT_CALL(mock_ffmpeg_, |
- AVBitstreamFilterFilter(&test_filter_, &test_stream_context_, |
- NULL, _, _, |
- test_packet_.data, test_packet_.size, _)) |
- .WillOnce(DoAll(SetArgumentPointee<3>(&kData2[0]), |
- SetArgumentPointee<4>(kTestSize2), |
- Return(0))); |
- EXPECT_CALL(mock_ffmpeg_, AVFreePacket(&test_packet_)); |
+ test_packet_.data = kNewBufferData; |
+ test_packet_.size = kNewBufferSize; |
EXPECT_TRUE(converter.ConvertPacket(&test_packet_)); |
- EXPECT_EQ(kData2, test_packet_.data); |
- EXPECT_EQ(kTestSize2, test_packet_.size); |
+ EXPECT_NE(kNewBufferData, test_packet_.data); |
+ EXPECT_EQ(kNewBufferSize + 1, test_packet_.size); |
EXPECT_TRUE(test_packet_.destruct != NULL); |
- |
- // Uninject mock filter instance to avoid cleanup code on destruction of |
- // converter. |
- converter.stream_filter_ = NULL; |
} |
TEST_F(BitstreamConverterTest, ConvertPacket_SuccessInPlace) { |
FFmpegBitstreamConverter converter(kTestFilterName, &test_stream_context_); |
- // Inject mock filter instance. |
- converter.stream_filter_ = &test_filter_; |
+ EXPECT_TRUE(converter.Initialize()); |
// Ensure our packet is in a sane start state. |
ASSERT_TRUE(test_packet_.destruct == NULL); |
- ASSERT_EQ(kData1, test_packet_.data); |
- ASSERT_EQ(kTestSize1, test_packet_.size); |
- |
- // Simulate a successful filter call, that reuses the input buffer. We should |
- // not free the packet here or alter the packet's destructor. |
- EXPECT_CALL(mock_ffmpeg_, |
- AVBitstreamFilterFilter(&test_filter_, &test_stream_context_, |
- NULL, _, _, |
- test_packet_.data, test_packet_.size, _)) |
- .WillOnce(DoAll(SetArgumentPointee<3>(test_packet_.data), |
- SetArgumentPointee<4>(test_packet_.size), |
- Return(0))); |
+ test_packet_.data = kInPlaceData; |
+ test_packet_.size = kInPlaceSize; |
EXPECT_TRUE(converter.ConvertPacket(&test_packet_)); |
- EXPECT_EQ(kData1, test_packet_.data); |
- EXPECT_EQ(kTestSize1, test_packet_.size); |
+ EXPECT_EQ(kInPlaceData, test_packet_.data); |
+ EXPECT_EQ(kInPlaceSize, test_packet_.size); |
EXPECT_TRUE(test_packet_.destruct == NULL); |
- |
- // Uninject mock filter instance to avoid cleanup code on destruction of |
- // converter. |
- converter.stream_filter_ = NULL; |
} |
} // namespace media |