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 = nullptr; |
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 |