MPEG TS: Use DTS instead of PTS for VC1 video tracks

This commit is contained in:
Moritz Bunkus 2011-10-24 19:43:28 +02:00
parent e2bd541b8a
commit 3f9f39a96e
3 changed files with 24 additions and 11 deletions

View File

@ -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));
}

View File

@ -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)
{
}

View File

@ -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