Add H264 bitstream rewriting to limit frame reordering marker in header
The VUI part an SPS may specify max_num_reorder_frames and max_dec_frame_buffering. These may cause a decoder to buffer a number of frame prior allowing decode, leading to delays, even if no frames using such references (ie B-frames) are sent. Because of this we update any SPS block emitted by the encoder. Also, a bunch of refactoring of H264-related code to reduce code duplication. BUG= Review-Url: https://codereview.webrtc.org/1979443004 Cr-Commit-Position: refs/heads/master@{#13010}
This commit is contained in:
@ -10,12 +10,15 @@
|
||||
|
||||
#ifndef WEBRTC_MODULES_VIDEO_CODING_UTILITY_H264_BITSTREAM_PARSER_H_
|
||||
#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_H264_BITSTREAM_PARSER_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "webrtc/base/optional.h"
|
||||
#include "webrtc/common_video/h264/pps_parser.h"
|
||||
#include "webrtc/common_video/h264/sps_parser.h"
|
||||
|
||||
namespace rtc {
|
||||
class BitBuffer;
|
||||
class BitBufferWriter;
|
||||
}
|
||||
|
||||
namespace webrtc {
|
||||
@ -28,51 +31,27 @@ namespace webrtc {
|
||||
// bitstreams.
|
||||
class H264BitstreamParser {
|
||||
public:
|
||||
H264BitstreamParser();
|
||||
virtual ~H264BitstreamParser();
|
||||
|
||||
// Parse an additional chunk of H264 bitstream.
|
||||
void ParseBitstream(const uint8_t* bitstream, size_t length);
|
||||
|
||||
// Get the last extracted QP value from the parsed bitstream.
|
||||
bool GetLastSliceQp(int* qp) const;
|
||||
|
||||
private:
|
||||
// Captured in SPS and used when parsing slice NALUs.
|
||||
struct SpsState {
|
||||
SpsState();
|
||||
|
||||
uint32_t delta_pic_order_always_zero_flag = 0;
|
||||
uint32_t separate_colour_plane_flag = 0;
|
||||
uint32_t frame_mbs_only_flag = 0;
|
||||
uint32_t log2_max_frame_num_minus4 = 0;
|
||||
uint32_t log2_max_pic_order_cnt_lsb_minus4 = 0;
|
||||
uint32_t pic_order_cnt_type = 0;
|
||||
};
|
||||
|
||||
struct PpsState {
|
||||
PpsState();
|
||||
|
||||
bool bottom_field_pic_order_in_frame_present_flag = false;
|
||||
bool weighted_pred_flag = false;
|
||||
uint32_t weighted_bipred_idc = false;
|
||||
uint32_t redundant_pic_cnt_present_flag = 0;
|
||||
int pic_init_qp_minus26 = 0;
|
||||
};
|
||||
|
||||
protected:
|
||||
void ParseSlice(const uint8_t* slice, size_t length);
|
||||
bool ParseSpsNalu(const uint8_t* sps_nalu, size_t length);
|
||||
bool ParsePpsNalu(const uint8_t* pps_nalu, size_t length);
|
||||
bool ParseNonParameterSetNalu(const uint8_t* source,
|
||||
size_t source_length,
|
||||
uint8_t nalu_type);
|
||||
|
||||
// SPS/PPS state, updated when parsing new SPS/PPS, used to parse slices.
|
||||
bool sps_parsed_ = false;
|
||||
SpsState sps_;
|
||||
bool pps_parsed_ = false;
|
||||
PpsState pps_;
|
||||
rtc::Optional<SpsParser::SpsState> sps_;
|
||||
rtc::Optional<PpsParser::PpsState> pps_;
|
||||
|
||||
// Last parsed slice QP.
|
||||
bool last_slice_qp_delta_parsed_ = false;
|
||||
int32_t last_slice_qp_delta_ = 0;
|
||||
rtc::Optional<int32_t> last_slice_qp_delta_;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user