diff --git a/src/input/r_mpeg_ts.cpp b/src/input/r_mpeg_ts.cpp index 221fec259..c95075711 100644 --- a/src/input/r_mpeg_ts.cpp +++ b/src/input/r_mpeg_ts.cpp @@ -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( ( p[0] >> 1) & 0x07) << 30; - pts |= (static_cast(get_uint16_be(&p[1])) >> 1) << 15; - pts |= static_cast(get_uint16_be(&p[3])) >> 1; +timecode_c +mpeg_ts_reader_c::read_timecode(unsigned char *p) { + int64_t mpeg_timecode = static_cast( ( p[0] >> 1) & 0x07) << 30; + mpeg_timecode |= (static_cast(get_uint16_be(&p[1])) >> 1) << 15; + mpeg_timecode |= static_cast(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 diff --git a/src/input/r_mpeg_ts.h b/src/input/r_mpeg_ts.h index ba965cc4f..9399d057f 100644 --- a/src/input/r_mpeg_ts.h +++ b/src/input/r_mpeg_ts.h @@ -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: diff --git a/tests/results.txt b/tests/results.txt index 1f770b5c7..ed14427f3 100644 --- a/tests/results.txt +++ b/tests/results.txt @@ -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