mkvmerge, mkvextract: don't store extra data size in bi_size field

This commit is contained in:
Mats Peterson 2015-03-24 11:56:01 +01:00 committed by Moritz Bunkus
parent b379487df3
commit 45bc332bad
5 changed files with 26 additions and 17 deletions

View File

@ -1,3 +1,9 @@
2015-03-24 Mats Peterson <matsp888@yahoo.com>
* 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 <moritz@bunkus.org>
* mkvmerge: bug fix: When appending unframed HEVC/h.265 tracks and

View File

@ -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);

View File

@ -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);

View File

@ -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<unsigned char *>(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<unsigned char *>(m_avi->bitmap_info_header + 1), m_avi->extradata_size);
if (avc_extra_nalus)
ptzr->add_extra_data(avc_extra_nalus);
}

View File

@ -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