AVC/h.264: mark frames with I slices (type I or I2) as key frames (open GOP)

In MP4 such samples aren't marked as sync points but they are marked as
random access points by way of the "rap " atom. In Matroska both kinds
of samples have to be marked as key frames.

Fixes #1671 where only open GOP key frame sequences occur and no regular
key frame sequences (IDR NALUs with I or SI slices) causing mkvmerge not
to find any key frames and to buffer the whole file before writing it out.
This commit is contained in:
Moritz Bunkus 2016-04-26 21:10:27 +02:00
parent d9e2ca294c
commit d5b87747b5
3 changed files with 21 additions and 15 deletions

View File

@ -1,3 +1,8 @@
2016-04-26 Moritz Bunkus <moritz@bunkus.org>
* mkvmerge: AVC/h.264 bug fix: fixed key frame detection for
open-GOP sequences. Fixes #1671.
2016-04-23 Moritz Bunkus <moritz@bunkus.org>
* Released v9.1.0 "Little Earthquakes".

View File

@ -1155,16 +1155,17 @@ mpeg4::p10::avc_es_parser_c::handle_slice_nalu(memory_cptr const &nalu) {
return;
}
bool is_i_slice = (AVC_SLICE_TYPE_I == si.type)
|| (AVC_SLICE_TYPE2_I == si.type)
|| (AVC_SLICE_TYPE_SI == si.type)
auto is_i_slice = (AVC_SLICE_TYPE_I == si.type)
|| (AVC_SLICE_TYPE2_I == si.type);
auto is_si_slice = (AVC_SLICE_TYPE_SI == si.type)
|| (AVC_SLICE_TYPE2_SI == si.type);
bool is_b_slice = (AVC_SLICE_TYPE_B == si.type)
auto is_b_slice = (AVC_SLICE_TYPE_B == si.type)
|| (AVC_SLICE_TYPE2_B == si.type);
m_incomplete_frame.m_si = si;
m_incomplete_frame.m_keyframe = m_recovery_point_valid
|| ( is_i_slice
|| is_i_slice
|| ( is_si_slice
&& (NALU_TYPE_IDR_SLICE == si.nalu_type));
m_incomplete_frame.m_type = m_incomplete_frame.m_keyframe ? 'I' : is_b_slice ? 'B' : 'P';
m_recovery_point_valid = false;

View File

@ -73,12 +73,12 @@ T_223ra_cook_keyframes:0ce8fa241c0da02967c64050a7d0abaf:passed:20061228-150947:1
T_224dts:47835a54a1619207aee2e8f8fc969252-6def59fd2600d177260163ebcf6eaac0:passed:20070206-174735:2.808364528
T_225dts_in_wav:3cb0077865607804c4e7adf5c1ca6166-6d41421cb87b4ecd1c2579cd22d99f5c:passed:20070206-174726:1.066354749
T_226h264:eed1ca7f7ff64da41f19e4863f707c6a:passed:20070208-103558:6.088832141
T_227h264_with_garbage:e21af1f64e2067c8b246fe97521efd0e:passed:20070208-103656:5.660631896
T_227h264_with_garbage:0a45166c513f2e8f1d1f1a91ae2ae5ac:passed:20070208-103656:5.660631896
T_228h264_no_idr_slices:026d7e3a22f287024513cbb2d7ffc243:passed:20070426-103130:3.516955837
T_229rav3_in_rm:3db8200918c4d94c59a1aeb15c0409f1:passed:20070619-220659:0.054850494
T_230h264_nalu_size_len_change:2b5aa2adbcfd47a233c1cad09603eb5f-36123314f547dfd95c172e17acdd73af:passed:20070622-103843:0.273132819
T_231X_ac3_header_removal:6ca341797c5f93e273c8502f4d6f4fba:passed:20070623-111240:0.172661551
T_232h264_changing_sps_pps:e977f9da835069f4806d7e56fddca6ff:passed:20070815-211934:4.982966207
T_232h264_changing_sps_pps:ea69b53fc54abc6aa531ec028320a11c:passed:20070815-211934:4.982966207
T_233srt_with_coordinates:0de6cfc206a5889a5bd7afc8ddd9bdb8:passed:20070819-203105:0.279280932
T_234avi_aac_codecid_0x706d:5d6ff6aca9c26ed9cf51bb1aaa32b10e:passed:20080223-174500:1.065188599
T_235wav_fmt_chunk_length:a51ed8caf33d1b37e56074ac946a0438:passed:20080226-134540:0.199256803
@ -121,7 +121,7 @@ T_272dirac:6e3ed70d54eed1965c9153cc9151c233:passed:20100530-144232:0.447649471
T_273pgssup:bc6c6bca4b0b53ec907a122ce6e8e34a-bc6c6bca4b0b53ec907a122ce6e8e34a-dbba8798fb51a54a748a0a5a7a85f452:passed:20100618-122332:0.133077321
T_274h264_in_nalus_in_avi:087ba4f53383a63904e03c2e6117c965:passed:20100629-090725:0.046335705
T_275srt_mixed_eol_styles:cda87428d4375a91e658630eef7a7d99:passed:20100706-090848:0.206637187
T_276h264_without_nalus_in_avi:122be282a65afe13230b583e4fa55b09:passed:20100706-224102:0.331406412
T_276h264_without_nalus_in_avi:dae1488cebf73eb7c9d59de73717090e:passed:20100706-224102:0.331406412
T_277display_dimensions_fixing_aspect_ratio_usage:5b77977080c7a7965159c4312cdbe0a7-968055b60c6bbf0949c808a92a86aff1-b15b113c7db45bde8a90714a1b6aea7b:passed:20100718-201627:2.064719998
T_278turning_off_compression:073c7af55bddb232702085794c4e75be-073c7af55bddb232702085794c4e75be:passed:20100728-121842:0.662304078
T_279packet_queue_not_empty_ivf:6da5ac72b1e64e2063cdc8d396055058:passed:20100805-230439:0.107456716
@ -135,14 +135,14 @@ T_286vp8_in_ogg:df62ad7afef0c6d7d7000a76b41e7c32:passed:20101222-113225:0.864785
T_287mkvextract_exit_codes:2-2-2-2-2-2:passed:20101222-120655:0.106237695
T_288identify_files_by_amg:26ab0db90d72e28ad0ba1e22ee510510:passed:20110308-151817:0.051036594
T_289wav_unsupported_formattag:3:passed:20110314-133958:0.036326038
T_290seven_bytes_aac_codec_data:8ae84dfd1f4caa8ed66df9b722253345:passed:20110415-123546:0.329324553
T_290seven_bytes_aac_codec_data:657c96b1f1eb0bc5365ffbd31d915148:passed:20110415-123546:0.329324553
T_291waveformatextensible:wav-avi:passed:20110415-124159:0.166486733
T_292avi_aac_706d_privsize_huge:56e0b100ce9afd8f1e2312882bd4ad27:passed:20110422-152313:0.094766072
T_293aac_adif_misdetected_as_video:3:passed:20110426-091956:0.031538701
T_294vobsub_negative_delay:a51f2c37bf021bec35b82a9a82bb7385:passed:20110523-204847:1.854001452
T_295vc1_rederiving_frame_types:7d50880b218a57cf07b7ea18939c3a1b-b56f07d531109e4a6e5e7d1f78e8e7ff:passed:20110525-205715:9.235213171
T_296video_frames_duration_0:9e7c3434d192c422bd019d4c7d434330:passed:20110709-143914:0.376760947
T_297mpeg_transport_streams:d5c0b1e44d4264a735728989b341766d-df12351168b375975897a0676ea11964:passed:20110913-112636:10.36149529
T_297mpeg_transport_streams:d5c0b1e44d4264a735728989b341766d-d87065ed99b60c5aab047f810112598f:passed:20110913-112636:10.36149529
T_298ts_language:81bf464112ef499fe2bea365d7480d7e:passed:20110915-221140:9.028917562
T_299ts_ghost_entries_in_pmt:b73681c3020fdcda61d84cddfd98bf47:passed:20110917-004553:0.898346704
T_300ts_dts_duplicate_timestamps:45804326e8a3bf7461c319d6b7774c0b:passed:20110918-154508:1.728558428
@ -185,7 +185,7 @@ T_336pgs_misdetected_as_dv:4c8379497026cb4a6985f548f8ed234a:passed:20120222-1216
T_337vc1_es_sequence_header_not_at_start:8d7884ab43b5a5bd2c05de18c53e1920:passed:20120222-140257:5.388890792
T_338h264_width_height_pixl_format_non_420:a6c94f0be0f0809ad6a670b0f5567139-ok:passed:20120222-153143:1.938343358
T_339eac3_dependent_frames:79852e0a4068add6d50b4b4ec97f15af:passed:20120226-133623:0.201626612
T_340m2ts_interlaced_h264_timecode_every_second_frame:8463605bff405edc0560b5ac83188fbc:passed:20120304-163131:25.31191697
T_340m2ts_interlaced_h264_timecode_every_second_frame:6cfb75b05bb484353781d6f7cf97cd3a:passed:20120304-163131:25.31191697
T_341vob_interlaced_mpeg2:054b3cda28ac609214623edc52c1f1b8:passed:20120304-163313:5.303087276
T_342m2ts_interlaced_h264_from_arte:fec2b3c0823cff042512cf57496da361:passed:20120304-165917:4.5443942
T_343m2ts_interlaced_h264_match_of_the_day:93b5bd8bd10d46870eeb35560c33771e:passed:20120304-171453:3.858753744
@ -193,9 +193,9 @@ T_344microdvd_recognition:ok:passed:20120304-175209:0.114439546
T_345flag_enabled:3e1db126c768d95ea088383e85e614a9-a3cbb089c5bd12edead8f277ab637850:passed:20120304-181150:0.410047671
T_347h264_misdetected_as_ac3:f2e3101ea1fad1752d24c9143fbea954:passed:20120305-160017:1.722170533
T_348srt_negative_timecodes2:beaee30a910a72560a844628f3a072ac:passed:20120307-115726:0.120842971
T_349h264_interlaced_default_duration:faee8c13c47987ca6e6b7485dede33d1-202375dd8e25e861294f778bbd73912e-202375dd8e25e861294f778bbd73912e-a47d8d16be555f4a553c700bdbf7228d:passed:20120307-184849:7.012794592
T_349h264_interlaced_default_duration:26168492cb6bd57150f2b5bb1e44d378-c8e667663555fba227444b2d1c1b132a-c8e667663555fba227444b2d1c1b132a-6704213511c96dd92f8fa5d0048a80b0:passed:20120307-184849:7.012794592
T_350h264_progressive_default_duration:b9aa65714efabbd495894566243e1c46-68e9d0b67d31ef3ec91178a5f45cd143-27718a40e7f74b73990dc5688eeb443b:passed:20120307-193604:4.699052694
T_351h264_vfr_with_timecode_file:dd62008ff0350577eb654fc0b68c8bdd-baaed325fecfebef0d309f8a9098f8c7:passed:20120307-200246:7.256287477
T_351h264_vfr_with_timecode_file:31e4d54a9b5e3f10b25e986695dc4458-a161045c5e4434d8885a0952068cb78a:passed:20120307-200246:7.256287477
T_352timecode_scale_auto_libmatroska_assert:3ee28c25aa8d8efd03259e94e276d2aa:passed:20120308-083800:3.596606165
T_353ac3-from-ts-with-missing-tcs-with-non-zero-first-tc::new:20120312-134345:0.0
T_353ac3_from_ts_with_missing_tcs_with_non_zero_first_tc:7d9434eae6fb19ea637f7d8e051302e5:passed:20120312-134456:1.302275752
@ -207,7 +207,7 @@ T_358usf:13cc323a8e690b4e1c236010938e1ee3:passed:20120329-142144:0.051754089
T_359split_parts:be3881a6d90a7d2011c1e74f4ad31664+409aad9a66b8bc221692983eafa21d2f+ok-6124bafa3a58f406aaf3270ad4912498+ok-835fc8133f4a3521fe661b3736b0c762+ok-497448adf872f4050f5e34d9aacf5fa0+4f25451d573042cfdff4809a28638e93+782db07154db9054ff9f0ef3bf1235c6+f129ab41e298b6358fc0197c92c3da5f+ea7605c6da77b5181202d0806191d635+4e8b657d7e371b84a7d89232e5c9fb3f+1586ba9b356c823bd58566c58e635889+ok-a4855bf5ef76bbb958a828774df845ff+ok-1e7ab2e26bb63b924562613027df8d94+ok:passed:20120331-133448:2.321768368
T_360X_chapters_hex_format:87a60c81c05fb0a153a2e041485ae2cb-3853793b0d88fc10efadb146ca948833:passed:20120404-152038:0.047282116
T_361file_concatenation:ddb9d5dc7887cdebf1447d55341f8588-5150304df7cc54a8a7ce123fb2139915-5150304df7cc54a8a7ce123fb2139915-18d827a751d6a222faa88f6653217eaa-18d827a751d6a222faa88f6653217eaa-18d827a751d6a222faa88f6653217eaa-16d653d956e995f4703b76b1b49b216a-671db53dd35d077a3cd78b588bb0fabd-f98ff756b0bef6f875ae61c27a3d18c4-f98ff756b0bef6f875ae61c27a3d18c4-f98ff756b0bef6f875ae61c27a3d18c4-f98ff756b0bef6f875ae61c27a3d18c4-174af56dfde3a6a981c5a1330cdeec9e-35725dd002d6504fdaf74aa10374ba8b-d5c0b1e44d4264a735728989b341766d-d5c0b1e44d4264a735728989b341766d:passed:20120406-144928:18.646532342
T_362xtr_avc:faee8c13c47987ca6e6b7485dede33d1-49ae33bdb1e43de90886bc2ac6410c35:passed:20120416-153515:1.811589633
T_362xtr_avc:26168492cb6bd57150f2b5bb1e44d378-49ae33bdb1e43de90886bc2ac6410c35:passed:20120416-153515:1.811589633
T_363srt_colon_decimal_separator:d75be97f27797c8b3fc62e5d39a8d7ea:passed:20120520-180625:0.032379535
T_364qtmp4_track_with_empty_chunkmap_table:4ea0286db77d23ffef924eaaaf7df2ff:passed:20120605-223925:0.168392001
T_365qtmp4_constant_sample_size:4cb8a4f2b99dae68d4778c45807ecb0f-40f7d4ba1f2e9bbf58568c65044ec0b2:passed:20120605-230823:0.675175697
@ -244,7 +244,7 @@ T_395remove_bitstream_ar_info:12d0f2056e9b79cafec12352c94ac846-3c2ba23992cba3441
T_396X_pcm_mono_16bit:49b80add61d8a11514d747c9616f7e80:passed:20130624-200214:0.055106028
T_397mpeg_ts_broken_pes_track_detection:a0a5d71676ca3785174e9a49a39f6fe3:passed:20130624-220549:1.12831027
T_398flv1_no_pixel_dimensions:870014b911f1fcc626a7921525b4c185:passed:20130624-225648:0.103188723
T_399h264_append_and_default_duration:4f77ba444dcc940e4181c44631267f5c:passed:20130627-195946:5.558958754
T_399h264_append_and_default_duration:bbc8d4476f0bd56b395c88a451f36862:passed:20130627-195946:5.558958754
T_400opus_experimental:d74c651a826ccde9053ab088032d5870:passed:20130703-213929:0.055921025
T_401opus_experimental_remux:63632841edfe4a5108822dc292499c7c:passed:20130703-213932:0.06857043
T_402opus_output_order:35ddcb9621bce14b9d3ad1b5def65b60:passed:20130705-115856:0.252820697