Mercurial > mplayer.hg
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 } |