hevc_dump: calculate & output frame checksums

This commit is contained in:
Moritz Bunkus 2021-03-20 16:36:52 +01:00
parent 3669c5bc58
commit e16b146b70
No known key found for this signature in database
GPG Key ID: 74AF00ADF2E32C85

View File

@ -10,6 +10,7 @@
#include "common/common_pch.h"
#include "common/checksums/base_fwd.h"
#include "common/command_line.h"
#include "common/hevc_es_parser.h"
#include "common/mm_io_x.h"
@ -17,6 +18,8 @@
#include "common/version.h"
static bool s_is_framed{};
static memory_cptr s_frame;
static uint64_t s_frame_fill{};
static void
show_help() {
@ -64,6 +67,29 @@ parse_args(std::vector<std::string> &args) {
return file_name;
}
static void
add_frame_byte(uint8_t byte) {
if (!s_frame)
s_frame = memory_c::alloc(100'000);
else if (s_frame->get_size() == s_frame_fill)
s_frame->resize(s_frame->get_size() + 100'000);
s_frame->get_buffer()[s_frame_fill] = byte;
++s_frame_fill;
}
static std::string
calc_frame_checksum(uint64_t skip_at_end) {
if (skip_at_end >= s_frame_fill)
return 0;
auto checksum = mtx::checksum::calculate_as_hex_string(mtx::checksum::algorithm_e::md5, s_frame->get_buffer(), s_frame_fill - skip_at_end);
s_frame_fill = 0;
return checksum;
}
static void
parse_file(const std::string &file_name) {
mm_file_io_c in{file_name};
@ -89,20 +115,30 @@ parse_file(const std::string &file_name) {
marker_size = 3;
else {
marker = (marker << 8) | in.read_uint8();
auto byte = in.read_uint8();
marker = (marker << 8) | byte;
add_frame_byte(byte);
continue;
}
pos -= marker_size;
if (-1 != previous_pos)
mxinfo(fmt::format("NALU type 0x{0:02x} ({1}) size {2} marker size {3} at {4}\n",
previous_type, mtx::hevc::es_parser_c::get_nalu_type_name(previous_type), pos - previous_pos - previous_marker_size, previous_marker_size, previous_pos));
mxinfo(fmt::format("NALU type 0x{0:02x} ({1}) size {2} marker size {3} at {4} checksum 0x{5}\n",
previous_type, mtx::hevc::es_parser_c::get_nalu_type_name(previous_type), pos - previous_pos - previous_marker_size, previous_marker_size, previous_pos, calc_frame_checksum(marker_size)));
else
s_frame_fill = 0;
auto next_bytes = in.read_uint32_be();
previous_pos = pos;
previous_marker_size = marker_size;
previous_type = (in.read_uint8() >> 1) & 0x3f;
marker = (1ull << 24) | in.read_uint24_be();
previous_type = (next_bytes >> (24 + 1)) & 0x3f;
marker = (1ull << 24) | (next_bytes & 0x00ff'ffff);
for (auto idx = 0; idx < 4; ++idx)
add_frame_byte(next_bytes >> ((3 - idx) * 8));
}
}
@ -120,11 +156,12 @@ parse_file_framed(std::string const &file_name) {
if (!nalu_size)
return;
mxinfo(fmt::format("NALU type 0x{0:02x} ({1}) size {2} at {3}\n", nalu_type, mtx::hevc::es_parser_c::get_nalu_type_name(nalu_type), nalu_size, pos));
in.setFilePointer(pos + 4);
auto frame = in.read(nalu_size);
mxinfo(fmt::format("NALU type 0x{0:02x} ({1}) size {2} at {3} checksum 0x{4}\n", nalu_type, mtx::hevc::es_parser_c::get_nalu_type_name(nalu_type), nalu_size, pos, mtx::checksum::calculate_as_hex_string(mtx::checksum::algorithm_e::md5, *frame)));
pos += nalu_size + 4;
in.setFilePointer(pos);
}
}