[vlc-commits] demux: asf: ignore pts when no delta specified (fix #15090)

Francois Cartegnie git at videolan.org
Tue Sep 22 15:16:56 CEST 2015


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Sep 22 11:21:46 2015 +0200| [2d15ac88ac445331327bd39b33e6cb21b97728f7] | committer: Francois Cartegnie

demux: asf: ignore pts when no delta specified (fix #15090)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2d15ac88ac445331327bd39b33e6cb21b97728f7
---

 modules/demux/asf/asf.c       |    3 ++-
 modules/demux/asf/asfpacket.c |    9 ++++++---
 modules/demux/asf/asfpacket.h |    1 +
 modules/demux/mp4/mp4.c       |    2 ++
 4 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/modules/demux/asf/asf.c b/modules/demux/asf/asf.c
index e442205..22fd8e0 100644
--- a/modules/demux/asf/asf.c
+++ b/modules/demux/asf/asf.c
@@ -844,6 +844,7 @@ static int DemuxInit( demux_t *p_demux )
         tk->p_es = NULL;
         tk->info.p_esp = NULL;
         tk->info.p_frame = NULL;
+        tk->info.i_cat = UNKNOWN_ES;
         tk->queue.p_first = NULL;
         tk->queue.pp_last = &tk->queue.p_first;
 
@@ -1054,7 +1055,7 @@ static int DemuxInit( demux_t *p_demux )
             es_format_Init( &fmt, UNKNOWN_ES, 0 );
         }
 
-        tk->i_cat = fmt.i_cat;
+        tk->i_cat = tk->info.i_cat = fmt.i_cat;
         if( fmt.i_cat != UNKNOWN_ES )
         {
             if( p_esp && p_languages &&
diff --git a/modules/demux/asf/asfpacket.c b/modules/demux/asf/asfpacket.c
index 526fd66..b538b3e 100644
--- a/modules/demux/asf/asfpacket.c
+++ b/modules/demux/asf/asfpacket.c
@@ -95,7 +95,7 @@ static uint32_t SkipBytes( stream_t *s, uint32_t i_bytes )
 static int DemuxSubPayload( asf_packet_sys_t *p_packetsys,
                             uint8_t i_stream_number, block_t **pp_frame,
                             uint32_t i_sub_payload_data_length, mtime_t i_pts, mtime_t i_dts,
-                            uint32_t i_media_object_offset, bool b_keyframe )
+                            uint32_t i_media_object_offset, bool b_keyframe, bool b_ignore_pts )
 {
     /* FIXME I don't use i_media_object_number, sould I ? */
     if( *pp_frame && i_media_object_offset == 0 )
@@ -109,7 +109,7 @@ static int DemuxSubPayload( asf_packet_sys_t *p_packetsys,
         return -1;
     }
 
-    p_frag->i_pts = VLC_TS_0 + i_pts;
+    p_frag->i_pts = (b_ignore_pts) ? VLC_TS_INVALID : VLC_TS_0 + i_pts;
     p_frag->i_dts = VLC_TS_0 + i_dts;
     if ( b_keyframe )
         p_frag->i_flags |= BLOCK_FLAG_TYPE_I;
@@ -226,6 +226,8 @@ static int DemuxPayload(asf_packet_sys_t *p_packetsys, asf_packet_t *pkt, int i_
     if ( !p_tkinfo )
         goto skip;
 
+    bool b_ignore_pts = (p_tkinfo->i_cat == VIDEO_ES); /* ignore PTS delta with video when not set by mux */
+
     /* Non compressed */
     if( i_replicated_data_length > 7 ) // should be at least 8 bytes
     {
@@ -252,6 +254,7 @@ static int DemuxPayload(asf_packet_sys_t *p_packetsys, asf_packet_t *pkt, int i_
         /* i_media_object_offset is presentation time */
         /* Next byte is Presentation Time Delta */
         i_pts_delta = pkt->p_peek[pkt->i_skip];
+        b_ignore_pts = false;
         i_base_pts = (mtime_t)i_media_object_offset;
         i_base_pts -= *p_packetsys->pi_preroll;
         pkt->i_skip++;
@@ -332,7 +335,7 @@ static int DemuxPayload(asf_packet_sys_t *p_packetsys, asf_packet_t *pkt, int i_
         if ( i_sub_payload_data_length &&
              DemuxSubPayload( p_packetsys, i_stream_number, &p_tkinfo->p_frame,
                               i_sub_payload_data_length, i_payload_pts, i_payload_dts,
-                              i_media_object_offset, b_packet_keyframe ) < 0)
+                              i_media_object_offset, b_packet_keyframe, b_ignore_pts ) < 0)
             return -1;
 
         if ( pkt->left > pkt->i_skip + i_sub_payload_data_length )
diff --git a/modules/demux/asf/asfpacket.h b/modules/demux/asf/asfpacket.h
index e8434c0..29c475f 100644
--- a/modules/demux/asf/asfpacket.h
+++ b/modules/demux/asf/asfpacket.h
@@ -33,6 +33,7 @@ typedef struct
     block_t *p_frame; /* used to gather complete frame */
     asf_object_stream_properties_t *p_sp;
     asf_object_extended_stream_properties_t *p_esp;
+    int i_cat;
 } asf_track_info_t;
 
 typedef struct asf_packet_sys_s asf_packet_sys_t;
diff --git a/modules/demux/mp4/mp4.c b/modules/demux/mp4/mp4.c
index 215a585..4b741c7 100644
--- a/modules/demux/mp4/mp4.c
+++ b/modules/demux/mp4/mp4.c
@@ -2819,6 +2819,8 @@ static void MP4_TrackCreate( demux_t *p_demux, mp4_track_t *p_track,
             return;
     }
 
+    p_track->asfinfo.i_cat = p_track->fmt.i_cat;
+
     const MP4_Box_t *p_elst;
     p_track->i_elst = 0;
     p_track->i_elst_time = 0;



More information about the vlc-commits mailing list