Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(423)

Side by Side Diff: webrtc/common_video/h264/sps_parser.cc

Issue 2728093002: Optimize ParseRbsp method in H264 bitstream parser. (Closed)
Patch Set: return vector to avoid copy Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/common_video/h264/sps_parser.h" 11 #include "webrtc/common_video/h264/sps_parser.h"
12 12
13 #include <memory> 13 #include <memory>
14 #include <vector>
14 15
15 #include "webrtc/common_video/h264/h264_common.h" 16 #include "webrtc/common_video/h264/h264_common.h"
16 #include "webrtc/base/bitbuffer.h" 17 #include "webrtc/base/bitbuffer.h"
17 #include "webrtc/base/bytebuffer.h" 18 #include "webrtc/base/bytebuffer.h"
magjed_webrtc 2017/03/03 15:10:32 can you remove this include?
18 #include "webrtc/base/logging.h" 19 #include "webrtc/base/logging.h"
19 20
20 typedef rtc::Optional<webrtc::SpsParser::SpsState> OptionalSps; 21 typedef rtc::Optional<webrtc::SpsParser::SpsState> OptionalSps;
21 22
22 #define RETURN_EMPTY_ON_FAIL(x) \ 23 #define RETURN_EMPTY_ON_FAIL(x) \
23 if (!(x)) { \ 24 if (!(x)) { \
24 return OptionalSps(); \ 25 return OptionalSps(); \
25 } 26 }
26 27
27 namespace webrtc { 28 namespace webrtc {
28 29
29 // General note: this is based off the 02/2014 version of the H.264 standard. 30 // General note: this is based off the 02/2014 version of the H.264 standard.
30 // You can find it on this page: 31 // You can find it on this page:
31 // http://www.itu.int/rec/T-REC-H.264 32 // http://www.itu.int/rec/T-REC-H.264
32 33
33 // Unpack RBSP and parse SPS state from the supplied buffer. 34 // Unpack RBSP and parse SPS state from the supplied buffer.
34 rtc::Optional<SpsParser::SpsState> SpsParser::ParseSps(const uint8_t* data, 35 rtc::Optional<SpsParser::SpsState> SpsParser::ParseSps(const uint8_t* data,
35 size_t length) { 36 size_t length) {
36 std::unique_ptr<rtc::Buffer> unpacked_buffer = H264::ParseRbsp(data, length); 37 std::vector<uint8_t> unpacked_buffer = H264::ParseRbsp(data, length);
37 rtc::BitBuffer bit_buffer(unpacked_buffer->data(), unpacked_buffer->size()); 38 rtc::BitBuffer bit_buffer(unpacked_buffer.data(), unpacked_buffer.size());
38 return ParseSpsUpToVui(&bit_buffer); 39 return ParseSpsUpToVui(&bit_buffer);
39 } 40 }
40 41
41 rtc::Optional<SpsParser::SpsState> SpsParser::ParseSpsUpToVui( 42 rtc::Optional<SpsParser::SpsState> SpsParser::ParseSpsUpToVui(
42 rtc::BitBuffer* buffer) { 43 rtc::BitBuffer* buffer) {
43 // Now, we need to use a bit buffer to parse through the actual AVC SPS 44 // Now, we need to use a bit buffer to parse through the actual AVC SPS
44 // format. See Section 7.3.2.1.1 ("Sequence parameter set data syntax") of the 45 // format. See Section 7.3.2.1.1 ("Sequence parameter set data syntax") of the
45 // H.264 standard for a complete description. 46 // H.264 standard for a complete description.
46 // Since we only care about resolution, we ignore the majority of fields, but 47 // Since we only care about resolution, we ignore the majority of fields, but
47 // we still have to actively parse through a lot of the data, since many of 48 // we still have to actively parse through a lot of the data, since many of
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 213 }
213 } 214 }
214 // Subtract the crop for each dimension. 215 // Subtract the crop for each dimension.
215 sps.width -= (frame_crop_left_offset + frame_crop_right_offset); 216 sps.width -= (frame_crop_left_offset + frame_crop_right_offset);
216 sps.height -= (frame_crop_top_offset + frame_crop_bottom_offset); 217 sps.height -= (frame_crop_top_offset + frame_crop_bottom_offset);
217 218
218 return OptionalSps(sps); 219 return OptionalSps(sps);
219 } 220 }
220 221
221 } // namespace webrtc 222 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698