mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2025-02-26 08:22:31 +00:00
Refactoring: MPEG TS: Use the basic_timecode_c<> class
This commit is contained in:
parent
005ec023b6
commit
98c3cd10dc
@ -50,27 +50,25 @@ int mpeg_ts_reader_c::potential_packet_sizes[] = { 188, 192, 204, 0 };
|
||||
|
||||
void
|
||||
mpeg_ts_track_c::send_to_packetizer() {
|
||||
int64_t timecode_to_use = (-1 == timecode) ? -1
|
||||
: reader.m_dont_use_audio_pts && (ES_AUDIO_TYPE == type) ? -1
|
||||
: m_apply_dts_timecode_fix && (m_previous_timecode == timecode) ? -1
|
||||
: (timecode < reader.m_global_timecode_offset) ? 0
|
||||
: (timecode - reader.m_global_timecode_offset) * 100000ll / 9;
|
||||
|
||||
mxverb(3, boost::format("mpeg_ts: PTS in nanoseconds: %1%\n") % timecode_to_use);
|
||||
auto timecode_to_use = !m_timecode.valid() ? timecode_c{}
|
||||
: reader.m_dont_use_audio_pts && (ES_AUDIO_TYPE == type) ? timecode_c{}
|
||||
: m_apply_dts_timecode_fix && (m_previous_timecode == m_timecode) ? timecode_c{}
|
||||
: (m_timecode < reader.m_global_timecode_offset) ? timecode_c::ns(0)
|
||||
: m_timecode - reader.m_global_timecode_offset;
|
||||
|
||||
mxdebug_if(m_debug_delivery, boost::format("send_to_packetizer() PID %1% expected %2% actual %3% timecode_to_use %4% m_previous_timecode %5%\n")
|
||||
% pid % pes_payload_size % pes_payload->get_size() % format_timecode(timecode_to_use) % (-1 == m_previous_timecode ? std::string("-1") : format_timecode(m_previous_timecode)));
|
||||
% pid % pes_payload_size % pes_payload->get_size() % timecode_to_use % m_previous_timecode);
|
||||
|
||||
if (ptzr != -1)
|
||||
reader.m_reader_packetizers[ptzr]->process(new packet_t(memory_c::clone(pes_payload->get_buffer(), pes_payload->get_size()), timecode_to_use));
|
||||
reader.m_reader_packetizers[ptzr]->process(new packet_t(memory_c::clone(pes_payload->get_buffer(), pes_payload->get_size()), timecode_to_use.to_ns(-1)));
|
||||
|
||||
pes_payload->remove(pes_payload->get_size());
|
||||
processed = false;
|
||||
data_ready = false;
|
||||
pes_payload_size = 0;
|
||||
m_previous_timecode = timecode;
|
||||
timecode = -1;
|
||||
reader.m_packet_sent_to_packetizer = true;
|
||||
m_previous_timecode = m_timecode;
|
||||
m_timecode.reset();
|
||||
}
|
||||
|
||||
void
|
||||
@ -340,7 +338,7 @@ mpeg_ts_reader_c::mpeg_ts_reader_c(const track_info_c &ti,
|
||||
, PMT_found(false)
|
||||
, PMT_pid(-1)
|
||||
, es_to_process(0)
|
||||
, m_global_timecode_offset(-1)
|
||||
, m_global_timecode_offset{}
|
||||
, input_status(INPUT_PROBE)
|
||||
, track_buffer_ready(-1)
|
||||
, file_done(false)
|
||||
@ -736,13 +734,13 @@ mpeg_ts_reader_c::parse_pmt(unsigned char *pmt) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int64_t
|
||||
mpeg_ts_reader_c::read_timestamp(unsigned char *p) {
|
||||
int64_t pts = static_cast<int64_t>( ( p[0] >> 1) & 0x07) << 30;
|
||||
pts |= (static_cast<int64_t>(get_uint16_be(&p[1])) >> 1) << 15;
|
||||
pts |= static_cast<int64_t>(get_uint16_be(&p[3])) >> 1;
|
||||
timecode_c
|
||||
mpeg_ts_reader_c::read_timecode(unsigned char *p) {
|
||||
int64_t mpeg_timecode = static_cast<int64_t>( ( p[0] >> 1) & 0x07) << 30;
|
||||
mpeg_timecode |= (static_cast<int64_t>(get_uint16_be(&p[1])) >> 1) << 15;
|
||||
mpeg_timecode |= static_cast<int64_t>(get_uint16_be(&p[3])) >> 1;
|
||||
|
||||
return pts;
|
||||
return std::move(timecode_c::mpeg(mpeg_timecode));
|
||||
}
|
||||
|
||||
bool
|
||||
@ -939,26 +937,23 @@ mpeg_ts_reader_c::parse_start_unit_packet(mpeg_ts_track_ptr &track,
|
||||
|
||||
ts_payload_size = ((unsigned char *)ts_packet_header + TS_PACKET_SIZE) - (unsigned char *) ts_payload;
|
||||
|
||||
int64_t pts = -1, dts = -1;
|
||||
timecode_c pts, dts;
|
||||
if ((pes_data->get_pts_dts_flags() & 0x02) == 0x02) { // 10 and 11 mean PTS is present
|
||||
pts = read_timestamp(&pes_data->pts_dts);
|
||||
pts = read_timecode(&pes_data->pts_dts);
|
||||
dts = pts;
|
||||
}
|
||||
|
||||
if ((pes_data->get_pts_dts_flags() & 0x01) == 0x01) { // 01 and 11 mean DTS is present
|
||||
dts = read_timestamp(&pes_data->pts_dts + 5);
|
||||
}
|
||||
if ((pes_data->get_pts_dts_flags() & 0x01) == 0x01) // 01 and 11 mean DTS is present
|
||||
dts = read_timecode(&pes_data->pts_dts + 5);
|
||||
|
||||
if (!track->m_use_dts)
|
||||
dts = pts;
|
||||
|
||||
if (-1 != pts) {
|
||||
if ((-1 == m_global_timecode_offset) || (dts < m_global_timecode_offset)) {
|
||||
mxverb(3, boost::format("new global_timecode_offset %1%\n") % dts);
|
||||
if (pts.valid()) {
|
||||
if (!m_global_timecode_offset.valid() || (dts < m_global_timecode_offset))
|
||||
m_global_timecode_offset = dts;
|
||||
}
|
||||
|
||||
if (pts == track->timecode) {
|
||||
if (pts == track->m_timecode) {
|
||||
mxverb(3, boost::format(" Adding PES with same PTS as previous !!\n"));
|
||||
track->add_pes_payload(ts_payload, ts_payload_size);
|
||||
|
||||
@ -970,9 +965,9 @@ mpeg_ts_reader_c::parse_start_unit_packet(mpeg_ts_track_ptr &track,
|
||||
} else if ((0 != track->pes_payload->get_size()) && (INPUT_READ == input_status))
|
||||
track->send_to_packetizer();
|
||||
|
||||
track->timecode = dts;
|
||||
track->m_timecode = dts;
|
||||
|
||||
mxverb(3, boost::format(" PTS/DTS found: %1%\n") % track->timecode);
|
||||
mxverb(3, boost::format(" PTS/DTS found: %1%\n") % track->m_timecode);
|
||||
}
|
||||
|
||||
// this condition is for ES probing when there is still not enough data for detection
|
||||
|
@ -277,7 +277,7 @@ public:
|
||||
bool probed_ok;
|
||||
int ptzr; // the actual packetizer instance
|
||||
|
||||
int64_t timecode, m_previous_timecode;
|
||||
timecode_c m_timecode, m_previous_timecode;
|
||||
|
||||
// video related parameters
|
||||
bool v_interlaced;
|
||||
@ -315,8 +315,8 @@ public:
|
||||
, continuity_counter(0)
|
||||
, probed_ok(false)
|
||||
, ptzr(-1)
|
||||
, timecode(-1)
|
||||
, m_previous_timecode(-1)
|
||||
, m_timecode{}
|
||||
, m_previous_timecode{}
|
||||
, v_interlaced(false)
|
||||
, v_version(0)
|
||||
, v_width(0)
|
||||
@ -358,7 +358,7 @@ protected:
|
||||
bool PAT_found, PMT_found;
|
||||
int16_t PMT_pid;
|
||||
int es_to_process;
|
||||
int64_t m_global_timecode_offset;
|
||||
timecode_c m_global_timecode_offset;
|
||||
|
||||
mpeg_ts_input_type_e input_status; // can be INPUT_PROBE, INPUT_READ
|
||||
int track_buffer_ready;
|
||||
@ -394,7 +394,7 @@ public:
|
||||
|
||||
virtual bool parse_packet(unsigned char *buf);
|
||||
|
||||
static int64_t read_timestamp(unsigned char *p);
|
||||
static timecode_c read_timecode(unsigned char *p);
|
||||
static int detect_packet_size(mm_io_c &in, uint64_t size);
|
||||
|
||||
private:
|
||||
|
@ -143,7 +143,7 @@ T_294vobsub_negative_delay:6e1c59551b7ad05fa570bed2ffc926fe:passed:20110523-2048
|
||||
T_295vc1_rederiving_frame_types:cc8b026954049902d90fcb897e723ff4-5e37cb966edb66a888b41c2e30c61738:passed:20110525-205715:8.761058959
|
||||
T_296video_frames_duration_0:cf3d0bd26a756c9c5e5d3da22922ccfb:passed:20110709-143914:0.458765384
|
||||
T_297mpeg_transport_streams:f44803b98439b320582ec4bafafe27bf-e315ac97c1d1643179ec8caefecdfbce:passed:20110913-112636:10.706480253
|
||||
T_298ts_language:fea49a342e6b5fbd4b640134dc24ca22:passed:20110915-221140:10.526064317
|
||||
T_298ts_language:51d965503b18c5afe3be304e30d6b376:passed:20110915-221140:10.526064317
|
||||
T_299ts_ghost_entries_in_pmt:f2c05fd03c9fd372fd8b4bc35279defb:passed:20110917-004553:0.348880316
|
||||
T_300ts_dts_duplicate_timestamps:20dc3a1cefa6b222f637d50a8e5009b0:passed:20110918-154508:1.230918853
|
||||
T_301ts_pgssub:288073767e64ed273d1c7f528c673d25:passed:20110918-154732:1.237027466
|
||||
|
Loading…
Reference in New Issue
Block a user