5 #include "packager/media/formats/mp2t/es_parser_h264.h"
9 #include "packager/base/logging.h"
10 #include "packager/media/base/media_sample.h"
11 #include "packager/media/base/timestamp.h"
12 #include "packager/media/base/video_stream_info.h"
13 #include "packager/media/filters/avc_decoder_configuration.h"
14 #include "packager/media/filters/h264_byte_to_unit_stream_converter.h"
15 #include "packager/media/filters/h264_parser.h"
16 #include "packager/media/formats/mp2t/mp2t_common.h"
18 namespace edash_packager {
22 EsParserH264::EsParserH264(uint32_t pid,
23 const NewStreamInfoCB& new_stream_info_cb,
24 const EmitSampleCB& emit_sample_cb)
25 : EsParserH26x(Nalu::kH264, pid, emit_sample_cb),
26 new_stream_info_cb_(new_stream_info_cb),
27 decoder_config_check_pending_(false),
28 h264_parser_(new H264Parser()) {}
30 EsParserH264::~EsParserH264() {}
32 void EsParserH264::Reset() {
33 DVLOG(1) <<
"EsParserH264::Reset";
34 h264_parser_.reset(
new H264Parser());
35 last_video_decoder_config_ = scoped_refptr<StreamInfo>();
36 decoder_config_check_pending_ =
false;
37 EsParserH26x::Reset();
40 bool EsParserH264::ProcessNalu(
const Nalu& nalu,
42 int* pps_id_for_access_unit) {
43 switch (nalu.type()) {
44 case Nalu::H264_AUD: {
45 DVLOG(LOG_LEVEL_ES) <<
"Nalu: AUD";
48 case Nalu::H264_SPS: {
49 DVLOG(LOG_LEVEL_ES) <<
"Nalu: SPS";
51 if (h264_parser_->ParseSps(nalu, &sps_id) != H264Parser::kOk)
53 decoder_config_check_pending_ =
true;
56 case Nalu::H264_PPS: {
57 DVLOG(LOG_LEVEL_ES) <<
"Nalu: PPS";
59 if (h264_parser_->ParsePps(nalu, &pps_id) != H264Parser::kOk) {
61 if (last_video_decoder_config_)
64 decoder_config_check_pending_ =
true;
68 case Nalu::H264_IDRSlice:
69 case Nalu::H264_NonIDRSlice: {
70 *is_key_frame = (nalu.type() == Nalu::H264_IDRSlice);
71 DVLOG(LOG_LEVEL_ES) <<
"Nalu: slice IDR=" << is_key_frame;
73 if (h264_parser_->ParseSliceHeader(nalu, &shdr) != H264Parser::kOk) {
76 if (last_video_decoder_config_)
79 *pps_id_for_access_unit = shdr.pic_parameter_set_id;
84 DVLOG(LOG_LEVEL_ES) <<
"Nalu: " << nalu.type();
91 bool EsParserH264::UpdateVideoDecoderConfig(
int pps_id) {
93 if (!decoder_config_check_pending_)
96 const H264Pps* pps = h264_parser_->GetPps(pps_id);
104 return last_video_decoder_config_ ==
nullptr;
106 sps = h264_parser_->GetSps(pps->seq_parameter_set_id);
109 decoder_config_check_pending_ =
false;
112 std::vector<uint8_t> decoder_config_record;
113 if (!stream_converter()->GetDecoderConfigurationRecord(
114 &decoder_config_record)) {
115 DLOG(ERROR) <<
"Failure to construct an AVCDecoderConfigurationRecord";
119 if (last_video_decoder_config_) {
120 if (last_video_decoder_config_->extra_data() != decoder_config_record) {
126 LOG(WARNING) <<
"H.264 decoder configuration has changed.";
127 last_video_decoder_config_->set_extra_data(decoder_config_record);
132 uint32_t coded_width = 0;
133 uint32_t coded_height = 0;
134 uint32_t pixel_width = 0;
135 uint32_t pixel_height = 0;
136 if (!ExtractResolutionFromSps(*sps, &coded_width, &coded_height, &pixel_width,
138 LOG(ERROR) <<
"Failed to parse SPS.";
142 last_video_decoder_config_ = scoped_refptr<StreamInfo>(
149 decoder_config_record[2],
150 decoder_config_record[3]),
157 H264ByteToUnitStreamConverter::kUnitStreamNaluLengthSize,
158 decoder_config_record.data(),
159 decoder_config_record.size(),
161 DVLOG(1) <<
"Profile IDC: " << sps->profile_idc;
162 DVLOG(1) <<
"Level IDC: " << sps->level_idc;
163 DVLOG(1) <<
"log2_max_frame_num_minus4: " << sps->log2_max_frame_num_minus4;
166 new_stream_info_cb_.Run(last_video_decoder_config_);