diff --git a/src/common/vc1.cpp b/src/common/vc1.cpp index ab407684f..3839e8c57 100644 --- a/src/common/vc1.cpp +++ b/src/common/vc1.cpp @@ -54,6 +54,12 @@ vc1::frame_t::init() { contains_field = false; } +bool +vc1::frame_t::is_key() + const { + return contains_sequence_header || (vc1::FRAME_TYPE_I == header.frame_type); +} + bool vc1::parse_sequence_header(const unsigned char *buf, int size, diff --git a/src/common/vc1.h b/src/common/vc1.h index 71a482fa2..51e3b397d 100644 --- a/src/common/vc1.h +++ b/src/common/vc1.h @@ -119,6 +119,7 @@ struct frame_t { frame_t(); void init(); + bool is_key() const; }; typedef std::shared_ptr frame_cptr; diff --git a/src/output/p_vc1.cpp b/src/output/p_vc1.cpp index 3a2473287..c68f7b95c 100644 --- a/src/output/p_vc1.cpp +++ b/src/output/p_vc1.cpp @@ -152,8 +152,7 @@ void vc1_video_packetizer_c::flush_frames() { while (m_parser.is_frame_available()) { vc1::frame_cptr frame = m_parser.get_frame(); - - add_packet(new packet_t(frame->data, frame->timecode, frame->duration, frame->contains_sequence_header ? -1 : m_previous_timecode)); + add_packet(new packet_t(frame->data, frame->timecode, frame->duration, frame->is_key() ? -1 : m_previous_timecode)); m_previous_timecode = frame->timecode; } diff --git a/tests/results.txt b/tests/results.txt index df050dc05..cee88762d 100644 --- a/tests/results.txt +++ b/tests/results.txt @@ -259,3 +259,4 @@ T_410extract_vp9:b6135380fa07f827384ad1004015d79c:passed:20131019-200643:0.03386 T_411ui_locale_pt_PT:7378e1146862dcb96f11caa91d33c5cb-3182bfa8c7ef57b56185285fbd614c98:passed:20131026-154124:0.073196901 T_412ui_locale_pl_PL:f84afd16653d395b33943ef722c63cfa-a4f512bdc00e1eab4d27a715174df149:passed:20131026-154845:0.077632905 T_413memory_resize_nonfree_smaller:c1085152b4b60a197bf93d598d066924:passed:20131102-115507:0.066828215 +T_414vc1_no_sequence_headers_before_key_frames:48a03189f55b303a98332e6594f7bd31:passed:20131115-164756:0.133015738 diff --git a/tests/test-414vc1_no_sequence_headers_before_key_frames.rb b/tests/test-414vc1_no_sequence_headers_before_key_frames.rb new file mode 100755 index 000000000..e25b4f2ea --- /dev/null +++ b/tests/test-414vc1_no_sequence_headers_before_key_frames.rb @@ -0,0 +1,5 @@ +#!/usr/bin/ruby -w + +# T_414vc1_no_sequence_headers_before_key_frames +describe "mkvmerge / VC1, no sequence headers before key frames" +test_merge "data/mkv/vc1-no-sequence-headers-before-key-frames.mkv"