ffmpeg_aac_bitstream_converter_unittest.cc 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <stddef.h>
  5. #include <stdint.h>
  6. #include "media/ffmpeg/ffmpeg_common.h"
  7. #include "media/ffmpeg/scoped_av_packet.h"
  8. #include "media/filters/ffmpeg_aac_bitstream_converter.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace media {
  11. namespace {
  12. const int kAacMainProfile = 0;
  13. const int kAacLowComplexityProfile = 1;
  14. } // namespace
  15. // Class for testing the FFmpegAACBitstreamConverter.
  16. class FFmpegAACBitstreamConverterTest : public testing::Test {
  17. public:
  18. FFmpegAACBitstreamConverterTest(const FFmpegAACBitstreamConverterTest&) =
  19. delete;
  20. FFmpegAACBitstreamConverterTest& operator=(
  21. const FFmpegAACBitstreamConverterTest&) = delete;
  22. protected:
  23. FFmpegAACBitstreamConverterTest() {
  24. // Minimal extra data header
  25. memset(extradata_header_, 0, sizeof(extradata_header_));
  26. // Set up reasonable aac parameters
  27. memset(&test_parameters_, 0, sizeof(AVCodecParameters));
  28. test_parameters_.codec_id = AV_CODEC_ID_AAC;
  29. test_parameters_.profile = FF_PROFILE_AAC_MAIN;
  30. test_parameters_.ch_layout.nb_channels = 2;
  31. test_parameters_.extradata = extradata_header_;
  32. test_parameters_.extradata_size = sizeof(extradata_header_);
  33. }
  34. void CreatePacket(AVPacket* packet, const uint8_t* data, uint32_t data_size) {
  35. // Create new packet sized of |data_size| from |data|.
  36. EXPECT_EQ(av_new_packet(packet, data_size), 0);
  37. memcpy(packet->data, data, data_size);
  38. }
  39. // Variable to hold valid dummy parameters for testing.
  40. AVCodecParameters test_parameters_;
  41. private:
  42. uint8_t extradata_header_[2];
  43. };
  44. TEST_F(FFmpegAACBitstreamConverterTest, Conversion_Success) {
  45. FFmpegAACBitstreamConverter converter(&test_parameters_);
  46. uint8_t dummy_packet[1000];
  47. // Fill dummy packet with junk data. aac converter doesn't look into packet
  48. // data, just header, so can fill with whatever we want for test.
  49. for(size_t i = 0; i < sizeof(dummy_packet); i++) {
  50. dummy_packet[i] = i & 0xFF; // Repeated sequences of 0-255
  51. }
  52. auto test_packet = ScopedAVPacket::Allocate();
  53. CreatePacket(test_packet.get(), dummy_packet,
  54. sizeof(dummy_packet));
  55. // Try out the actual conversion (should be successful and allocate new
  56. // packet and destroy the old one).
  57. EXPECT_TRUE(converter.ConvertPacket(test_packet.get()));
  58. // Check that a header was added and that packet data was preserved
  59. EXPECT_EQ(static_cast<long>(test_packet->size),
  60. static_cast<long>(sizeof(dummy_packet) +
  61. FFmpegAACBitstreamConverter::kAdtsHeaderSize));
  62. EXPECT_EQ(memcmp(
  63. reinterpret_cast<void*>(test_packet->data +
  64. FFmpegAACBitstreamConverter::kAdtsHeaderSize),
  65. reinterpret_cast<void*>(dummy_packet),
  66. sizeof(dummy_packet)), 0);
  67. }
  68. TEST_F(FFmpegAACBitstreamConverterTest, Conversion_FailureNullParams) {
  69. // Set up AVCConfigurationRecord to represent NULL data.
  70. AVCodecParameters dummy_parameters;
  71. dummy_parameters.extradata = nullptr;
  72. dummy_parameters.extradata_size = 0;
  73. FFmpegAACBitstreamConverter converter(&dummy_parameters);
  74. uint8_t dummy_packet[1000] = {0};
  75. // Try out the actual conversion with NULL parameter.
  76. EXPECT_FALSE(converter.ConvertPacket(NULL));
  77. // Create new packet to test actual conversion.
  78. auto test_packet = ScopedAVPacket::Allocate();
  79. CreatePacket(test_packet.get(), dummy_packet, sizeof(dummy_packet));
  80. // Try out the actual conversion. This should fail due to missing extradata.
  81. EXPECT_FALSE(converter.ConvertPacket(test_packet.get()));
  82. }
  83. TEST_F(FFmpegAACBitstreamConverterTest, Conversion_AudioProfileType) {
  84. FFmpegAACBitstreamConverter converter(&test_parameters_);
  85. uint8_t dummy_packet[1000] = {0};
  86. auto test_packet = ScopedAVPacket::Allocate();
  87. CreatePacket(test_packet.get(), dummy_packet,
  88. sizeof(dummy_packet));
  89. EXPECT_TRUE(converter.ConvertPacket(test_packet.get()));
  90. // Check that the ADTS header profile matches the parameters
  91. int profile = ((test_packet->data[2] & 0xC0) >> 6);
  92. EXPECT_EQ(profile, kAacMainProfile);
  93. test_parameters_.profile = FF_PROFILE_AAC_HE;
  94. FFmpegAACBitstreamConverter converter_he(&test_parameters_);
  95. test_packet = ScopedAVPacket::Allocate();
  96. CreatePacket(test_packet.get(), dummy_packet,
  97. sizeof(dummy_packet));
  98. EXPECT_TRUE(converter_he.ConvertPacket(test_packet.get()));
  99. profile = ((test_packet->data[2] & 0xC0) >> 6);
  100. EXPECT_EQ(profile, kAacLowComplexityProfile);
  101. test_parameters_.profile = FF_PROFILE_AAC_ELD;
  102. FFmpegAACBitstreamConverter converter_eld(&test_parameters_);
  103. test_packet = ScopedAVPacket::Allocate();
  104. CreatePacket(test_packet.get(), dummy_packet,
  105. sizeof(dummy_packet));
  106. EXPECT_FALSE(converter_eld.ConvertPacket(test_packet.get()));
  107. }
  108. TEST_F(FFmpegAACBitstreamConverterTest, Conversion_MultipleLength) {
  109. FFmpegAACBitstreamConverter converter(&test_parameters_);
  110. uint8_t dummy_packet[1000];
  111. auto test_packet = ScopedAVPacket::Allocate();
  112. CreatePacket(test_packet.get(), dummy_packet,
  113. sizeof(dummy_packet));
  114. // Try out the actual conversion (should be successful and allocate new
  115. // packet and destroy the old one).
  116. EXPECT_TRUE(converter.ConvertPacket(test_packet.get()));
  117. // Check that the ADTS header frame length matches the packet size
  118. int frame_length = ((test_packet->data[3] & 0x03) << 11) |
  119. ((test_packet->data[4] & 0xFF) << 3) |
  120. ((test_packet->data[5] & 0xE0) >> 5);
  121. EXPECT_EQ(frame_length, test_packet->size);
  122. // Create a second packet that is 1 byte smaller than the first one
  123. auto second_test_packet = ScopedAVPacket::Allocate();
  124. CreatePacket(second_test_packet.get(), dummy_packet,
  125. sizeof(dummy_packet) - 1);
  126. // Try out the actual conversion (should be successful and allocate new
  127. // packet and destroy the old one).
  128. EXPECT_TRUE(converter.ConvertPacket(second_test_packet.get()));
  129. // Check that the ADTS header frame length matches the packet size
  130. frame_length = ((second_test_packet->data[3] & 0x03) << 11) |
  131. ((second_test_packet->data[4] & 0xFF) << 3) |
  132. ((second_test_packet->data[5] & 0xE0) >> 5);
  133. EXPECT_EQ(frame_length, second_test_packet->size);
  134. }
  135. } // namespace media