diff --git a/src/input/r_mpeg_ts.cpp b/src/input/r_mpeg_ts.cpp index 6f452f2ce..3f9ddccd2 100644 --- a/src/input/r_mpeg_ts.cpp +++ b/src/input/r_mpeg_ts.cpp @@ -997,15 +997,26 @@ 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; - if (pes_data->get_pts_dts_flags() > 1) { // 10 and 11 mean PTS is present - int64_t PTS = read_timestamp(&pes_data->pts_dts); + int64_t pts = -1, dts = -1; + if ((pes_data->get_pts_dts_flags() & 0x02) == 0x02) { // 10 and 11 mean PTS is present + pts = read_timestamp(&pes_data->pts_dts); + dts = pts; + } - if ((-1 == m_global_timecode_offset) || (PTS < m_global_timecode_offset)) { - mxverb(3, boost::format("global_timecode_offset %1%\n") % PTS); - m_global_timecode_offset = 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 (!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); + m_global_timecode_offset = dts; } - if (PTS == track->timecode) { + if (pts == track->timecode) { mxverb(3, boost::format(" Adding PES with same PTS as previous !!\n")); track->add_pes_payload(ts_payload, ts_payload_size); return false; @@ -1013,9 +1024,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 = PTS; + track->timecode = dts; - mxverb(3, boost::format(" PTS found: %1%\n") % track->timecode); + mxverb(3, boost::format(" PTS/DTS found: %1%\n") % track->timecode); } // this condition is for ES probing when there is still not enough data for detection @@ -1132,7 +1143,8 @@ mpeg_ts_reader_c::create_mpeg4_p10_es_video_packetizer(mpeg_ts_track_ptr &track) void mpeg_ts_reader_c::create_vc1_video_packetizer(mpeg_ts_track_ptr &track) { - track->ptzr = add_packetizer(new vc1_video_packetizer_c(this, m_ti)); + track->m_use_dts = true; + track->ptzr = add_packetizer(new vc1_video_packetizer_c(this, m_ti)); show_packetizer_info(m_ti.m_id, PTZR(track->ptzr)); } diff --git a/src/input/r_mpeg_ts.h b/src/input/r_mpeg_ts.h index 5d6b52934..c1023acb3 100644 --- a/src/input/r_mpeg_ts.h +++ b/src/input/r_mpeg_ts.h @@ -294,7 +294,7 @@ public: dts_header_t a_dts_header; aac_header_t m_aac_header; - bool m_apply_dts_timecode_fix; + bool m_apply_dts_timecode_fix, m_use_dts; // general track parameters std::string language; @@ -332,6 +332,7 @@ public: , a_bits_per_sample(0) , a_bsid(0) , m_apply_dts_timecode_fix(false) + , m_use_dts(false) { } diff --git a/tests/results.txt b/tests/results.txt index 4ddb20140..e88cfdccc 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:b44ddb45845f897b986582c112e9ef1e-9864da369d9cb828ad428bb7e35a0f80:passed:20110525-205715:8.761058959 T_296video_frames_duration_0:5799836e2ff0742618d34a3e817f4c23:passed:20110709-143914:0.458765384 T_297mpeg_transport_streams:5bf7b0adead3cbcae2737b878842dd5e-68a51f8c5cdefcca641c13d7db50a853:passed:20110913-112636:10.706480253 -T_298ts_language:9cdac29098316e9d9561598f55e5518e:passed:20110915-221140:10.526064317 +T_298ts_language:d600fae1d79a3fcb3d35066f938cd8c5:passed:20110915-221140:10.526064317 T_299ts_ghost_entries_in_pmt:5716a012cd61366198ec92772fd216ea: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