annotate libmpdemux/demux_demuxers.c @ 22616:09dc129234a0

Matroska seeking fixes If a relative seek forward went past the last index position the Matroska demuxer did not seek to any index position. It did however set the mkv_d->skip_to_timecode variable which meant that the next fill_buffer() call would read from the current position until the target position (probably the end of the file). Fix this by changing the code to seek to the last index position if that is between the current and target positions. Also change backwards relative seek to accept an exactly matching index position (<= vs <) and reorganize the seeking conditionals to allow making the above change without turning the code into a complete mess.
author uau
date Fri, 16 Mar 2007 14:55:41 +0000
parents 4d81dbdf46b9
children d4fe6e23283e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
1
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
2 #include "config.h"
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17636
diff changeset
3 #include "mp_msg.h"
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17636
diff changeset
4 #include "help_mp.h"
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
5
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
6 #include <stdlib.h>
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
7 #include <stdio.h>
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 20071
diff changeset
8 #include "stream/stream.h"
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
9 #include "demuxer.h"
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
10 #include "stheader.h"
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
11
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
12 typedef struct dd_priv {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
13 demuxer_t* vd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
14 demuxer_t* ad;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
15 demuxer_t* sd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
16 } dd_priv_t;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
17
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
18 extern demuxer_desc_t demuxer_desc_demuxers;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
19
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
20 demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
21 demuxer_t* ret;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
22 dd_priv_t* priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
23
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18710
diff changeset
24 ret = calloc(1,sizeof(demuxer_t));
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
25
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18710
diff changeset
26 priv = malloc(sizeof(dd_priv_t));
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
27 priv->vd = vd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
28 priv->ad = ad;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
29 priv->sd = sd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
30 ret->priv = priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
31
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
32 ret->type = ret->file_format = DEMUXER_TYPE_DEMUXERS;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
33 // Video is the most important :-)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
34 ret->stream = vd->stream;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
35 ret->seekable = vd->seekable && ad->seekable && sd->seekable;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
36
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
37 ret->video = vd->video;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
38 ret->audio = ad->audio;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
39 ret->sub = sd->sub;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
40
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
41 ret->desc = &demuxer_desc_demuxers;
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
42
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
43 return ret;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
44 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
45
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
46 static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) {
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
47 dd_priv_t* priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
48
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
49 priv=demux->priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
50
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
51 if(ds->demuxer == priv->vd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
52 return demux_fill_buffer(priv->vd,ds);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
53 else if(ds->demuxer == priv->ad)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
54 return demux_fill_buffer(priv->ad,ds);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
55 else if(ds->demuxer == priv->sd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
56 return demux_fill_buffer(priv->sd,ds);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
57
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17636
diff changeset
58 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MPDEMUX_DEMUXERS_FillBufferError);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
59 return 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
60 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
61
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
62 static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) {
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
63 dd_priv_t* priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
64 float pos;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
65 priv=demuxer->priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
66
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
67 priv->ad->stream->eof = 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
68 priv->sd->stream->eof = 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
69
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
70 // Seek video
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
71 demux_seek(priv->vd,rel_seek_secs,audio_delay,flags);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
72 // Get the new pos
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
73 pos = demuxer->video->pts;
20071
672123d27ae3 Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents: 18958
diff changeset
74 if (!pos) {
672123d27ae3 Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents: 18958
diff changeset
75 demux_fill_buffer(priv->vd, demuxer->video);
672123d27ae3 Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents: 18958
diff changeset
76 if (demuxer->video->first)
672123d27ae3 Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents: 18958
diff changeset
77 pos = demuxer->video->first->pts;
672123d27ae3 Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents: 18958
diff changeset
78 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
79
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
80 if(priv->ad != priv->vd) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
81 sh_audio_t* sh = (sh_audio_t*)demuxer->audio->sh;
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
82 demux_seek(priv->ad,pos,audio_delay,1);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
83 // In case the demuxer don't set pts
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
84 if(!demuxer->audio->pts)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
85 demuxer->audio->pts = pos-((ds_tell_pts(demuxer->audio)-sh->a_in_buffer_len)/(float)sh->i_bps);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
86 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
87
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
88 if(priv->sd != priv->vd)
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
89 demux_seek(priv->sd,pos,audio_delay,1);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
90
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
91 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
92
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
93 static void demux_close_demuxers(demuxer_t* demuxer) {
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
94 dd_priv_t* priv = demuxer->priv;
9710
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
95 stream_t *s;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
96
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
97 if(priv->vd)
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
98 free_demuxer(priv->vd);
9710
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
99 if(priv->ad && priv->ad != priv->vd) {
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
100 // That's a hack to free the audio file stream
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
101 // It's ok atm but we shouldn't free that here
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
102 s = priv->ad->stream;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
103 free_demuxer(priv->ad);
9710
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
104 free_stream(s);
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
105 } if(priv->sd && priv->sd != priv->vd && priv->sd != priv->ad) {
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
106 s = priv->sd->stream;
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
107 free_demuxer(priv->sd);
9710
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
108 free_stream(s);
e3db09ae5154 Free the stream of the audio and subtitle demuxer.
albeu
parents: 8056
diff changeset
109 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
110
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
111 free(priv);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
112 }
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
113
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
114
16876
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
115 static int demux_demuxers_control(demuxer_t *demuxer,int cmd, void *arg){
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
116 dd_priv_t* priv = demuxer->priv;
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
117 switch (cmd) {
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
118 case DEMUXER_CTRL_GET_TIME_LENGTH:
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
119 *((double *)arg) = demuxer_get_time_length(priv->vd);
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
120 return DEMUXER_CTRL_OK;
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
121 case DEMUXER_CTRL_GET_PERCENT_POS:
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
122 *((int *)arg) = demuxer_get_percent_pos(priv->vd);
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
123 return DEMUXER_CTRL_OK;
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
124 }
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
125 return DEMUXER_CTRL_NOTIMPL;
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
126 }
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
127
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
128 demuxer_desc_t demuxer_desc_demuxers = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
129 "Demuxers demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
130 "", // Not selectable
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
131 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
132 "?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
133 "internal use only",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
134 DEMUXER_TYPE_DEMUXERS,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
135 0, // no autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
136 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
137 demux_demuxers_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
138 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
139 demux_close_demuxers,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
140 demux_demuxers_seek,
16876
9dd44ff7ec32 Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents: 16291
diff changeset
141 demux_demuxers_control
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9710
diff changeset
142 };