blob: 145700f509b4c0b65113ea668f02de33f46af063 [file] [log] [blame]
Peter Boström8c266e62015-09-24 15:06:50 +02001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
kthelgasonb9061722016-10-26 02:48:16 -070011#ifndef WEBRTC_COMMON_VIDEO_H264_H264_BITSTREAM_PARSER_H_
12#define WEBRTC_COMMON_VIDEO_H264_H264_BITSTREAM_PARSER_H_
Peter Boström8c266e62015-09-24 15:06:50 +020013#include <stddef.h>
danilchapb8b6fbb2015-12-10 05:05:27 -080014#include <stdint.h>
Peter Boström8c266e62015-09-24 15:06:50 +020015
kwiberg84f6a3f2017-09-05 08:43:13 -070016#include "webrtc/api/optional.h"
sprang52033d62016-06-02 02:43:32 -070017#include "webrtc/common_video/h264/pps_parser.h"
18#include "webrtc/common_video/h264/sps_parser.h"
19
Peter Boström8c266e62015-09-24 15:06:50 +020020namespace rtc {
sprang52033d62016-06-02 02:43:32 -070021class BitBufferWriter;
Peter Boström8c266e62015-09-24 15:06:50 +020022}
23
24namespace webrtc {
25
26// Stateful H264 bitstream parser (due to SPS/PPS). Used to parse out QP values
27// from the bitstream.
28// TODO(pbos): Unify with RTP SPS parsing and only use one H264 parser.
29// TODO(pbos): If/when this gets used on the receiver side CHECKs must be
30// removed and gracefully abort as we have no control over receive-side
31// bitstreams.
32class H264BitstreamParser {
33 public:
kthelgasonf752bca2016-11-03 17:30:34 -070034 enum Result {
35 kOk,
36 kInvalidStream,
37 kUnsupportedStream,
38 };
39
sprang52033d62016-06-02 02:43:32 -070040 H264BitstreamParser();
41 virtual ~H264BitstreamParser();
42
Peter Boström8c266e62015-09-24 15:06:50 +020043 // Parse an additional chunk of H264 bitstream.
44 void ParseBitstream(const uint8_t* bitstream, size_t length);
45
46 // Get the last extracted QP value from the parsed bitstream.
47 bool GetLastSliceQp(int* qp) const;
48
sprang52033d62016-06-02 02:43:32 -070049 protected:
Peter Boström8c266e62015-09-24 15:06:50 +020050 void ParseSlice(const uint8_t* slice, size_t length);
kthelgasonf752bca2016-11-03 17:30:34 -070051 Result ParseNonParameterSetNalu(const uint8_t* source,
52 size_t source_length,
53 uint8_t nalu_type);
Peter Boström8c266e62015-09-24 15:06:50 +020054
55 // SPS/PPS state, updated when parsing new SPS/PPS, used to parse slices.
sprang52033d62016-06-02 02:43:32 -070056 rtc::Optional<SpsParser::SpsState> sps_;
57 rtc::Optional<PpsParser::PpsState> pps_;
Peter Boström8c266e62015-09-24 15:06:50 +020058
59 // Last parsed slice QP.
sprang52033d62016-06-02 02:43:32 -070060 rtc::Optional<int32_t> last_slice_qp_delta_;
Peter Boström8c266e62015-09-24 15:06:50 +020061};
62
63} // namespace webrtc
64
kthelgasonb9061722016-10-26 02:48:16 -070065#endif // WEBRTC_COMMON_VIDEO_H264_H264_BITSTREAM_PARSER_H_