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