mkvinfo: report picture type based on number of references, not on their value

This commit is contained in:
Moritz Bunkus 2014-11-19 12:13:51 +01:00
parent 36b7a6514e
commit 04acfff20f
2 changed files with 16 additions and 14 deletions

View File

@ -1,3 +1,9 @@
2014-11-19 Moritz Bunkus <moritz@bunkus.org>
* mkvinfo: bug fix: summary mode: reported frame types in block
groups are now derived from the number of references found and not
by the references' values.
2014-11-16 Moritz Bunkus <moritz@bunkus.org> 2014-11-16 Moritz Bunkus <moritz@bunkus.org>
* mkvmerge: bug fix: Fixed muxing open GOPs after I frames in * mkvmerge: bug fix: Fixed muxing open GOPs after I frames in

View File

@ -1148,9 +1148,7 @@ handle_block_group(EbmlStream *&es,
std::vector<uint32_t> frame_adlers; std::vector<uint32_t> frame_adlers;
std::vector<std::string> frame_hexdumps; std::vector<std::string> frame_hexdumps;
bool bref_found = false; auto num_references = 0u;
bool fref_found = false;
int64_t lf_timecode = 0; int64_t lf_timecode = 0;
int64_t lf_tnum = 0; int64_t lf_tnum = 0;
int64_t frame_pos = 0; int64_t frame_pos = 0;
@ -1199,17 +1197,15 @@ handle_block_group(EbmlStream *&es,
show_element(l3, 3, BF_BLOCK_GROUP_DURATION % (duration * s_tc_scale / 1000000) % (duration * s_tc_scale % 1000000)); show_element(l3, 3, BF_BLOCK_GROUP_DURATION % (duration * s_tc_scale / 1000000) % (duration * s_tc_scale % 1000000));
} else if (Is<KaxReferenceBlock>(l3)) { } else if (Is<KaxReferenceBlock>(l3)) {
++num_references;
int64_t reference = static_cast<KaxReferenceBlock *>(l3)->GetValue() * s_tc_scale; int64_t reference = static_cast<KaxReferenceBlock *>(l3)->GetValue() * s_tc_scale;
if (0 >= reference) { if (0 >= reference)
bref_found = true; show_element(l3, 3, BF_BLOCK_GROUP_REFERENCE_1 % (std::abs(reference) / 1000000) % (std::abs(reference) % 1000000));
reference *= -1;
show_element(l3, 3, BF_BLOCK_GROUP_REFERENCE_1 % (reference / 1000000) % (reference % 1000000));
} else if (0 < reference) { else if (0 < reference)
fref_found = true;
show_element(l3, 3, BF_BLOCK_GROUP_REFERENCE_2 % (reference / 1000000) % (reference % 1000000)); show_element(l3, 3, BF_BLOCK_GROUP_REFERENCE_2 % (reference / 1000000) % (reference % 1000000));
}
} else if (Is<KaxReferencePriority>(l3)) } else if (Is<KaxReferencePriority>(l3))
show_element(l3, 3, BF_BLOCK_GROUP_REFERENCE_PRIORITY % static_cast<KaxReferencePriority *>(l3)->GetValue()); show_element(l3, 3, BF_BLOCK_GROUP_REFERENCE_PRIORITY % static_cast<KaxReferencePriority *>(l3)->GetValue());
@ -1294,7 +1290,7 @@ handle_block_group(EbmlStream *&es,
if (bduration != -1.0) if (bduration != -1.0)
mxinfo(BF_BLOCK_GROUP_SUMMARY_WITH_DURATION mxinfo(BF_BLOCK_GROUP_SUMMARY_WITH_DURATION
% (bref_found && fref_found ? 'B' : bref_found ? 'P' : !fref_found ? 'I' : 'P') % (num_references >= 2 ? 'B' : num_references == 1 ? 'P' : 'I')
% lf_tnum % lf_tnum
% (lf_timecode / 1000000) % (lf_timecode / 1000000)
% format_timecode(lf_timecode, 3) % format_timecode(lf_timecode, 3)
@ -1305,7 +1301,7 @@ handle_block_group(EbmlStream *&es,
% position); % position);
else else
mxinfo(BF_BLOCK_GROUP_SUMMARY_NO_DURATION mxinfo(BF_BLOCK_GROUP_SUMMARY_NO_DURATION
% (bref_found && fref_found ? 'B' : bref_found ? 'P' : !fref_found ? 'I' : 'P') % (num_references >= 2 ? 'B' : num_references == 1 ? 'P' : 'I')
% lf_tnum % lf_tnum
% (lf_timecode / 1000000) % (lf_timecode / 1000000)
% format_timecode(lf_timecode, 3) % format_timecode(lf_timecode, 3)
@ -1318,14 +1314,14 @@ handle_block_group(EbmlStream *&es,
} else if (g_options.m_verbose > 2) } else if (g_options.m_verbose > 2)
show_element(nullptr, 2, show_element(nullptr, 2,
BF_BLOCK_GROUP_SUMMARY_V2 BF_BLOCK_GROUP_SUMMARY_V2
% (bref_found && fref_found ? 'B' : bref_found ? 'P' : !fref_found ? 'I' : 'P') % (num_references >= 2 ? 'B' : num_references == 1 ? 'P' : 'I')
% lf_tnum % lf_tnum
% (lf_timecode / 1000000)); % (lf_timecode / 1000000));
track_info_t &tinfo = s_track_info[lf_tnum]; track_info_t &tinfo = s_track_info[lf_tnum];
tinfo.m_blocks += frame_sizes.size(); tinfo.m_blocks += frame_sizes.size();
tinfo.m_blocks_by_ref_num[bref_found && fref_found ? 2 : bref_found ? 1 : !fref_found ? 0 : 1] += frame_sizes.size(); tinfo.m_blocks_by_ref_num[std::min(num_references, 2u)] += frame_sizes.size();
tinfo.m_min_timecode = std::min(tinfo.m_min_timecode, lf_timecode); tinfo.m_min_timecode = std::min(tinfo.m_min_timecode, lf_timecode);
tinfo.m_size += boost::accumulate(frame_sizes, 0); tinfo.m_size += boost::accumulate(frame_sizes, 0);