comparison libmpdemux/demux_ts.c @ 32777:9cc2689e5cd1

Fix r32587: the previous approach to return subtitles in time broke DVB subtitles due to returning incomplete packets and even for PGS subtitles resulted in incorrect pts values for the sub packets.
author reimar
date Sun, 06 Feb 2011 13:52:05 +0000
parents 3e141cd16ef3
children 87504a38a666
comparison
equal deleted inserted replaced
32776:15060bd7df4c 32777:9cc2689e5cd1
2983 } 2983 }
2984 2984
2985 //IS IT TIME TO QUEUE DATA to the dp_packet? 2985 //IS IT TIME TO QUEUE DATA to the dp_packet?
2986 if(is_start && (dp != NULL)) 2986 if(is_start && (dp != NULL))
2987 { 2987 {
2988 // subtitle packets _have_ to be submitted before video, otherwise
2989 // they might get stuck "forever" and subtitles will be completely
2990 // out of sync.
2991 if (is_video)
2992 fill_packet(demuxer, demuxer->sub, &priv->fifo[2].pack, &priv->fifo[2].offset, NULL);
2993 retv = fill_packet(demuxer, ds, dp, dp_offset, si); 2988 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
2994 } 2989 }
2995 2990
2996 2991
2997 if(dp && *dp == NULL) 2992 if(dp && *dp == NULL)
3128 memmove(p, es->start, es->size); 3123 memmove(p, es->start, es->size);
3129 *dp_offset += es->size; 3124 *dp_offset += es->size;
3130 (*dp)->flags = 0; 3125 (*dp)->flags = 0;
3131 (*dp)->pos = stream_tell(demuxer->stream); 3126 (*dp)->pos = stream_tell(demuxer->stream);
3132 (*dp)->pts = es->pts; 3127 (*dp)->pts = es->pts;
3128 // subtitle packets must be returned immediately if possible
3129 if (is_sub && !tss->payload_size)
3130 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
3133 3131
3134 if(retv > 0) 3132 if(retv > 0)
3135 return retv; 3133 return retv;
3136 else 3134 else
3137 continue; 3135 continue;
3169 3167
3170 if(! probe) 3168 if(! probe)
3171 { 3169 {
3172 *dp_offset += sz; 3170 *dp_offset += sz;
3173 3171
3174 if(*dp_offset >= MAX_PACK_BYTES) 3172 // subtitle packets must be returned immediately if possible
3173 if(*dp_offset >= MAX_PACK_BYTES || (is_sub && !tss->payload_size))
3175 { 3174 {
3176 (*dp)->pts = tss->last_pts; 3175 (*dp)->pts = tss->last_pts;
3177 retv = fill_packet(demuxer, ds, dp, dp_offset, si); 3176 retv = fill_packet(demuxer, ds, dp, dp_offset, si);
3178 return 1; 3177 return 1;
3179 } 3178 }