From 45bc332badba6333c5ba314d33eed41ec821e431 Mon Sep 17 00:00:00 2001 From: Mats Peterson Date: Tue, 24 Mar 2015 11:56:01 +0100 Subject: [PATCH] mkvmerge, mkvextract: don't store extra data size in bi_size field --- ChangeLog | 6 ++++++ lib/avilib-0.6.10/avilib.c | 16 +++++++++------- src/extract/xtr_avi.cpp | 6 ++++-- src/input/r_avi.cpp | 7 +++---- tests/results.txt | 8 ++++---- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index abd21f7d6..fb1cc271b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-03-24 Mats Peterson + + * mkvmerge: bug fix: Fixed handling of the BITIMAPINFOHEADER extra + data size handling during merging and extraction for codecs like + HuffYUV. + 2015-03-23 Moritz Bunkus * mkvmerge: bug fix: When appending unframed HEVC/h.265 tracks and diff --git a/lib/avilib-0.6.10/avilib.c b/lib/avilib-0.6.10/avilib.c index 9c8123ae6..2edb97528 100644 --- a/lib/avilib-0.6.10/avilib.c +++ b/lib/avilib-0.6.10/avilib.c @@ -895,7 +895,8 @@ int avi_update_header(avi_t *AVI) OUT4CC ("strf"); OUTLONG(40 + xd_size); /* # of bytes to follow */ - OUTLONG(40 + xd_size); /* Size */ + /* Check for HuffYUV, if so, add xd_size */ + OUTLONG(40 + (!strcmp(AVI->compressor, "HFYU") ? xd_size : 0)); /* Size */ OUTLONG(AVI->width); /* Width */ OUTLONG(AVI->height); /* Height */ OUTSHRT(1); OUTSHRT(AVI->bpp); /* Planes, Count */ @@ -1355,7 +1356,8 @@ static int avi_close_output_file(avi_t *AVI) OUT4CC ("strf"); OUTLONG(40 + xd_size); /* # of bytes to follow */ - OUTLONG(40 + xd_size); /* Size */ + /* Check for HuffYUV, if so, add xd_size */ + OUTLONG(40 + (!strcmp(AVI->compressor, "HFYU") ? xd_size : 0)); /* Size */ OUTLONG(AVI->width); /* Width */ OUTLONG(AVI->height); /* Height */ OUTSHRT(1); OUTSHRT(AVI->bpp); /* Planes, Count */ @@ -2446,12 +2448,12 @@ int avi_parse_input_file(avi_t *AVI, int getIndex) if(lasttag == 1) { uint32_t ck_size = str2ulong(hdrl_data + i - 4); - uint32_t bih_size = str2ulong(hdrl_data + i); - uint32_t bi_size = bih_size > 40 ? bih_size : ck_size; - AVI->bitmap_info_header = (alBITMAPINFOHEADER *)malloc(bi_size); + AVI->bitmap_info_header = (alBITMAPINFOHEADER *)malloc(ck_size); if (AVI->bitmap_info_header != NULL) { - memcpy(AVI->bitmap_info_header, hdrl_data + i, bi_size); - long2str(&AVI->bitmap_info_header->bi_size, bi_size); + memcpy(AVI->bitmap_info_header, hdrl_data + i, ck_size); + long2str(&AVI->bitmap_info_header->bi_size, + !strcmp(AVI->compressor, "HFYU") ? ck_size : sizeof(alBITMAPINFOHEADER)); + AVI->extradata_size = ck_size - sizeof(alBITMAPINFOHEADER); } AVI->width = str2ulong(hdrl_data+i+4); diff --git a/src/extract/xtr_avi.cpp b/src/extract/xtr_avi.cpp index 16a488cca..f48febfd4 100644 --- a/src/extract/xtr_avi.cpp +++ b/src/extract/xtr_avi.cpp @@ -70,9 +70,11 @@ xtr_avi_c::create_file(xtr_base_c *master, memcpy(ccodec, &m_bih->bi_compression, 4); ccodec[4] = 0; - if (get_uint32_le(&m_bih->bi_size) != sizeof(alBITMAPINFOHEADER)) { + auto mpriv_size = mpriv->get_size(); + + if (mpriv_size != sizeof(alBITMAPINFOHEADER)) { m_avi->extradata = m_bih + 1; - m_avi->extradata_size = get_uint32_le(&m_bih->bi_size) - sizeof(alBITMAPINFOHEADER); + m_avi->extradata_size = mpriv_size - std::min(mpriv_size, sizeof(alBITMAPINFOHEADER)); } AVI_set_video(m_avi, kt_get_v_pixel_width(track), kt_get_v_pixel_height(track), get_uint16_le(&m_bih->bi_bit_count), m_fps, ccodec); diff --git a/src/input/r_avi.cpp b/src/input/r_avi.cpp index b0851c329..e3bc26661 100644 --- a/src/input/r_avi.cpp +++ b/src/input/r_avi.cpp @@ -219,7 +219,7 @@ avi_reader_c::create_video_packetizer() { } if (m_avi->bitmap_info_header) { - m_ti.m_private_data = memory_c::clone(m_avi->bitmap_info_header, get_uint32_le(&m_avi->bitmap_info_header->bi_size)); + m_ti.m_private_data = memory_c::clone(m_avi->bitmap_info_header, sizeof(alBITMAPINFOHEADER) + m_avi->extradata_size); mxverb(4, boost::format("track extra data size: %1%\n") % (m_ti.m_private_data->get_size() - sizeof(alBITMAPINFOHEADER))); @@ -329,9 +329,8 @@ avi_reader_c::create_mpeg4_p10_packetizer() { if (0 != m_fps) ptzr->set_container_default_field_duration(1000000000ll / m_fps / 2); - uint32_t extra_data_size = get_uint32_le(&m_avi->bitmap_info_header->bi_size) - sizeof(alBITMAPINFOHEADER); - if (0 < extra_data_size) { - memory_cptr avc_extra_nalus = mpeg4::p10::avcc_to_nalus(reinterpret_cast(m_avi->bitmap_info_header + 1), extra_data_size); + if (0 < m_avi->extradata_size) { + auto avc_extra_nalus = mpeg4::p10::avcc_to_nalus(reinterpret_cast(m_avi->bitmap_info_header + 1), m_avi->extradata_size); if (avc_extra_nalus) ptzr->add_extra_data(avc_extra_nalus); } diff --git a/tests/results.txt b/tests/results.txt index 02d5c88cd..606c8420f 100644 --- a/tests/results.txt +++ b/tests/results.txt @@ -60,8 +60,8 @@ T_210splitting_and_chapters:895c8c7c12cce3d164a0e8ae1a381f6e-821a0a5e37931ff3aef T_211bug_segfault_reading_mp4:ca45eb9ee2878d4e0f6538f3c0836f22:passed:20050728-083402:0.139717571 T_212ssa_attachments:999a77e089a78cae86d546266c0f6898-9a5a5ed80808c9d448ca5b44b640d8aa-2c8ef428ff00aeea74ee10d12a3702b5-63703180da67852a7ecf01c118869ed8-5d0c6721f48ab7dd9230820e14706bf9:passed:20050824-131320:0.97327624 T_213mp4_broken_pixel_dimensions:b0ffac7af09e87a2e4c7ace7b09b1b46:passed:20050919-094831:0.167783191 -T_214one_frame_avi:6743e82c9a2610f612d692326a0fc41c:passed:20051004-192755:0.039489971 -T_215X_codec_extradata_avi:3a52a255093b5bef5a79f311756a3495-74ac799ad899f703cbb6c6654e5f9f51:passed:20051004-194707:0.052219855 +T_214one_frame_avi:a4b223e7f22b5e3c2bcf70e455188f79:passed:20051004-192755:0.039489971 +T_215X_codec_extradata_avi:6d668338e66c695c72098902b0ce513c-74ac799ad899f703cbb6c6654e5f9f51:passed:20051004-194707:0.052219855 T_216mp4_editlists:adabd9fc8f7f51f4915ecdc634a0c59b:passed:20051118-191453:0.106975045 T_217file_identification:dd26e4b2f3388a73e9ec7aacfb1b294e-85a2a482ec7a7c5ecaa99abef9af3a40-8bc54a3b93ce7471ff42a6ca95f92f0f-03dd46e98c889ebf764955b996a6a740-b51f69615d6a4b970784b4ffcef95dc7-2f43b435a9811390aefb63e1ad308339-d745c32579925ea9e9ada600b58ae1cb-b82c40794db84b4f4d3060eea310161f-aefcb7609d13d45054913360804c01d7-37ca736d65cc46fca53a22eede3162ac-ae9797fdc1f6e17dea7e92f48ee32b47-41d1a270454f005a0183019cfb189c56-ef8adc91fe129e7c68b8ccd065a761b0-d743d7d07d80d7e037bfb1f2be33f88c-fbd358ed87fca9961ad06893eaeb6d23-6a556928c705520619b9b8f05a97a019-7e47ede1405c19ab8f1e7827495147eb-627f309a01939ba2210953816650bea7-c26e3a2941379574c5dc39e6db414686-b1e60bf1ba3650ba009b7cadacc6f3c8-195cd42346b7944fc0c918e6db58d1b9-69bb1cdf3d3dd07278595b5b2a1cd808:passed:20051209-180815:1.882517588 T_218theora:76f31a635d611bf81c076284decfbcb8-902b1d711e150c3e923aa43a88970ff4:passed:20060428-105054:0.392912102 @@ -137,7 +137,7 @@ T_288identify_files_by_amg:26ab0db90d72e28ad0ba1e22ee510510:passed:20110308-1518 T_289wav_unsupported_formattag:3:passed:20110314-133958:0.036326038 T_290seven_bytes_aac_codec_data:7f15c795818e4a90407b214a5c6f3276:passed:20110415-123546:0.329324553 T_291waveformatextensible:wav-avi:passed:20110415-124159:0.166486733 -T_292avi_aac_706d_privsize_huge:bf40b1fb2a91b7d751f24f066dfa84e6:passed:20110422-152313:0.094766072 +T_292avi_aac_706d_privsize_huge:1c1dd587a851e3cccf3634688373321a:passed:20110422-152313:0.094766072 T_293aac_adif_misdetected_as_video:3:passed:20110426-091956:0.031538701 T_294vobsub_negative_delay:3a8482eb6f1b7149a745a92949fda29b:passed:20110523-204847:1.854001452 T_295vc1_rederiving_frame_types:d3bfc8a270cb1a535fc51d8feb9f6a80-91192150a502386f2d57b84e07afdd21:passed:20110525-205715:9.235213171 @@ -311,7 +311,7 @@ T_462dtshd_reduce_to_core:c284b0e29c3b7040e14b89a7e4790ce1-1e8b4d2eac574607bbaa5 T_463a_ms_acm_with_track_tags:7766fe047ed88b8561caa4fba7c40ea6-45aa68321f4c3785d2e38ddbfd7cd850:passed:20150218-142924:0.139369636 T_464mp4_mp3_track_sampling_rate_0:51ec17a6dcfae5d8ac0f5fcf44e31eb6-b2c1dca03505c75c694c0de113a450f6:passed:20150223-190257:0.939161518 T_465propedit_gaps_of_130_bytes:aaee6a36641e36dc3976c9e505b645da:passed:20150223-210006:0.085134008 -T_466mkvextract_avi_8bpp:b70f9d23df556cca8eedd3ad0dede80c:passed:20150223-213412:0.034601052 +T_466mkvextract_avi_8bpp:2327a134fc9d96098b29af8f69bdbf1d:passed:20150223-213412:0.034601052 T_467mpeg_ts_eac3_type_0xa1:6c97721782afd53bc41776abf2d7f445:passed:20150223-221854:0.595330952 T_468extract_cues:337fe77a5fb2f3d30deea092820c7ae8-f58aa81140411b045ce403f4d07de361+b71e065b26dd67f03fff849f1cbb929a:passed:20150225-202605:0.373426759 T_469avi_keyframes:cabe8cc129d7e1f72476c606e7e0f0d2:passed:20150225-223922:0.055489645