[MPlayer-cvslog] r29810 - in trunk: libmpdemux/demux_demuxers.c libmpdemux/demuxer.h mpcommon.c

reimar subversion at mplayerhq.hu
Sun Nov 1 10:48:35 CET 2009


Author: reimar
Date: Sun Nov  1 10:48:34 2009
New Revision: 29810

Log:
Unbreak the demuxer-specific code in video.c with e.g.
-audiofile by moving the code to manually interleave
subtitles to mp_common.c.
video.c should still be changed to not be demuxer-specific
anymore, it is bad practice but fully fixing it is non-trivial.

Modified:
   trunk/libmpdemux/demux_demuxers.c
   trunk/libmpdemux/demuxer.h
   trunk/mpcommon.c

Modified: trunk/libmpdemux/demux_demuxers.c
==============================================================================
--- trunk/libmpdemux/demux_demuxers.c	Sat Oct 31 16:34:18 2009	(r29809)
+++ trunk/libmpdemux/demux_demuxers.c	Sun Nov  1 10:48:34 2009	(r29810)
@@ -54,9 +54,15 @@ demuxer_t*  new_demuxers_demuxer(demuxer
   ret->video = vd->video;
   ret->audio = ad->audio;
   ret->sub = sd->sub;
+  if (sd && sd != vd && sd != ad) sd->sub->non_interleaved = 1;
+
+  // without these, demux_demuxers_fill_buffer will never be called,
+  // but they break the demuxer-specific code in video.c
+#if 0
   if (vd) vd->video->demuxer = ret;
   if (ad) ad->audio->demuxer = ret;
   if (sd) sd->sub->demuxer = ret;
+#endif
 
   // HACK?, necessary for subtitle (and audio and video when implemented) switching
   memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams));

Modified: trunk/libmpdemux/demuxer.h
==============================================================================
--- trunk/libmpdemux/demuxer.h	Sat Oct 31 16:34:18 2009	(r29809)
+++ trunk/libmpdemux/demuxer.h	Sun Nov  1 10:48:34 2009	(r29810)
@@ -142,6 +142,8 @@ typedef struct {
   off_t dpos;                // position in the demuxed stream
   int pack_no;		   // serial number of packet
   int flags;               // flags of current packet (keyframe etc)
+  int non_interleaved;     // 1 if this stream is not properly interleaved,
+                           // so e.g. subtitle handling must do explicit reads.
 //---------------
   int packs;              // number of packets in buffer
   int bytes;              // total bytes of packets in buffer

Modified: trunk/mpcommon.c
==============================================================================
--- trunk/mpcommon.c	Sat Oct 31 16:34:18 2009	(r29809)
+++ trunk/mpcommon.c	Sun Nov  1 10:48:34 2009	(r29810)
@@ -145,6 +145,8 @@ void update_subtitles(sh_video_t *sh_vid
     } else if (dvdsub_id >= 0 && (type == 't' || type == 'm' || type == 'a')) {
         double curpts = refpts + sub_delay;
         double endpts;
+        if (d_dvdsub->non_interleaved)
+            ds_get_next_pts(d_dvdsub);
         while (d_dvdsub->first) {
             double subpts = ds_get_next_pts(d_dvdsub);
             if (subpts > curpts)
@@ -195,6 +197,8 @@ void update_subtitles(sh_video_t *sh_vid
                 sub_add_text(&subs, packet, len, endpts);
                 set_osd_subtitle(&subs);
             }
+            if (d_dvdsub->non_interleaved)
+                ds_get_next_pts(d_dvdsub);
         }
         if (sub_clear_text(&subs, curpts))
             set_osd_subtitle(&subs);


More information about the MPlayer-cvslog mailing list