From fc85154bcab0dd68706f1306f52d7c5d293c2cce Mon Sep 17 00:00:00 2001 From: Thomas Inskip Date: Mon, 30 Jun 2014 12:53:56 -0700 Subject: [PATCH] Changed es_parser_h264 to wait for initial I-frame to start emitting samples. Change-Id: I7b9ca4a73a8765501a1c29e467e877e1eee5f9d9 --- media/formats/mp2t/es_parser_h264.cc | 15 ++++++--- media/formats/mp2t/es_parser_h264.h | 3 ++ media/formats/mp2t/es_parser_h264_unittest.cc | 31 +++++++++++++++--- media/test/data/README | 3 ++ media/test/data/bear_no_iframe_start.h264 | Bin 0 -> 52133 bytes 5 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 media/test/data/bear_no_iframe_start.h264 diff --git a/media/formats/mp2t/es_parser_h264.cc b/media/formats/mp2t/es_parser_h264.cc index 472b9fa197..0b17d76e6c 100644 --- a/media/formats/mp2t/es_parser_h264.cc +++ b/media/formats/mp2t/es_parser_h264.cc @@ -39,7 +39,8 @@ EsParserH264::EsParserH264( next_access_unit_pos_(0), stream_converter_(new H264ByteToUnitStreamConverter), decoder_config_check_pending_(false), - pending_sample_duration_(0) { + pending_sample_duration_(0), + waiting_for_key_frame_(true) { } EsParserH264::~EsParserH264() { @@ -102,6 +103,7 @@ void EsParserH264::Reset() { decoder_config_check_pending_ = false; pending_sample_ = scoped_refptr(); pending_sample_duration_ = 0; + waiting_for_key_frame_ = true; } bool EsParserH264::FindAUD(int64* stream_pos) { @@ -233,9 +235,14 @@ bool EsParserH264::ParseInternal() { } } - // Emit a frame and move the stream to the next AUD position. - RCHECK(EmitFrame(current_access_unit_pos_, access_unit_size, - is_key_frame, pps_id_for_access_unit)); + if (waiting_for_key_frame_) { + waiting_for_key_frame_ = !is_key_frame; + } + if (!waiting_for_key_frame_) { + // Emit a frame and move the stream to the next AUD position. + RCHECK(EmitFrame(current_access_unit_pos_, access_unit_size, + is_key_frame, pps_id_for_access_unit)); + } current_access_unit_pos_ = next_access_unit_pos_; es_queue_->Trim(current_access_unit_pos_); diff --git a/media/formats/mp2t/es_parser_h264.h b/media/formats/mp2t/es_parser_h264.h index 8f5ab7f85c..bcc00a79c1 100644 --- a/media/formats/mp2t/es_parser_h264.h +++ b/media/formats/mp2t/es_parser_h264.h @@ -94,6 +94,9 @@ class EsParserH264 : public EsParser { // Frame for which we do not yet have a duration. scoped_refptr pending_sample_; uint64 pending_sample_duration_; + + // Indicates whether waiting for first key frame. + bool waiting_for_key_frame_; }; } // namespace mp2t diff --git a/media/formats/mp2t/es_parser_h264_unittest.cc b/media/formats/mp2t/es_parser_h264_unittest.cc index ae06f89218..ced13709b4 100644 --- a/media/formats/mp2t/es_parser_h264_unittest.cc +++ b/media/formats/mp2t/es_parser_h264_unittest.cc @@ -117,20 +117,24 @@ void AppendAUD( class EsParserH264Test : public testing::Test { public: - EsParserH264Test() : sample_count_(0) { - } + EsParserH264Test() + : sample_count_(0), + first_frame_is_key_frame_(false) {} void LoadStream(const char* filename); void ProcessPesPackets(const std::vector& pes_packets); void EmitSample(uint32 pid, scoped_refptr& sample) { sample_count_++; + if (sample_count_ == 1) + first_frame_is_key_frame_ = sample->is_key_frame(); } void NewVideoConfig(scoped_refptr& config) { } size_t sample_count() const { return sample_count_; } + bool first_frame_is_key_frame() { return first_frame_is_key_frame_; } // Stream with AUD NALUs. std::vector stream_; @@ -140,6 +144,7 @@ class EsParserH264Test : public testing::Test { protected: size_t sample_count_; + bool first_frame_is_key_frame_; }; void EsParserH264Test::LoadStream(const char* filename) { @@ -204,7 +209,8 @@ TEST_F(EsParserH264Test, OneAccessUnitPerPes) { // Process each PES packet. ProcessPesPackets(pes_packets); - ASSERT_EQ(sample_count(), access_units_.size()); + EXPECT_EQ(sample_count(), access_units_.size()); + EXPECT_TRUE(first_frame_is_key_frame()); } TEST_F(EsParserH264Test, NonAlignedPesPacket) { @@ -228,7 +234,8 @@ TEST_F(EsParserH264Test, NonAlignedPesPacket) { // Process each PES packet. ProcessPesPackets(pes_packets); - ASSERT_EQ(sample_count(), access_units_.size()); + EXPECT_EQ(sample_count(), access_units_.size()); + EXPECT_TRUE(first_frame_is_key_frame()); } TEST_F(EsParserH264Test, SeveralPesPerAccessUnit) { @@ -258,7 +265,21 @@ TEST_F(EsParserH264Test, SeveralPesPerAccessUnit) { // Process each PES packet. ProcessPesPackets(pes_packets); - ASSERT_EQ(sample_count(), access_units_.size()); + EXPECT_EQ(sample_count(), access_units_.size()); + EXPECT_TRUE(first_frame_is_key_frame()); +} + +TEST_F(EsParserH264Test, NonIFrameStart) { + LoadStream("bear_no_iframe_start.h264"); + + // One to one equivalence between PES packets and access units. + std::vector pes_packets(access_units_); + + // Process each PES packet. + ProcessPesPackets(pes_packets); + // Ensure samples were emitted, but fewer than number of AUDs. + EXPECT_LT(sample_count(), access_units_.size()); + EXPECT_TRUE(first_frame_is_key_frame()); } } // namespace mp2t diff --git a/media/test/data/README b/media/test/data/README index e3e8699710..ee0d0ab0f9 100644 --- a/media/test/data/README +++ b/media/test/data/README @@ -75,5 +75,8 @@ bear.h264: ffmpeg -i bear.mp4 -vcodec copy -vbsf h264_mp4toannexb \ -an bear.h264 +bear_no_i_frame_start.h264 + Derived from bear.h264. Consists of 29-non-I-frames, followed by a single I-frame, and 29 non-I-frames. + avc-byte-stream-frame.h264 - Single IDR frame extracted from test-25fps.h264 in Annex B byte stream format. avc-unit-stream-frame.h264 - Single IDR frame from avc-byte-stream-frame.h264 converted to unit stream format. diff --git a/media/test/data/bear_no_iframe_start.h264 b/media/test/data/bear_no_iframe_start.h264 new file mode 100644 index 0000000000000000000000000000000000000000..8bb175d703d4e66bba5280412a90b9859ea152f2 GIT binary patch literal 52133 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