21 |
|
|
22 |
typedef struct { |
typedef struct { |
23 |
turing_state * turing; |
turing_state * turing; |
|
demuxer_t * mpg_demuxer; |
|
|
demuxer_t * demux_demuxer; |
|
24 |
off_t begin_at; |
off_t begin_at; |
25 |
off_t end_at; |
off_t end_at; |
26 |
} tivo_demux_priv; |
} tivo_demux_priv; |
61 |
int retval; |
int retval; |
62 |
ds_free_packs (ds); |
ds_free_packs (ds); |
63 |
mp_dbg(MSGT_DEMUX, MSGL_DBG3, "tivo_stream_seek to 0x%"PRIX64"\n", (int64_t)pos); |
mp_dbg(MSGT_DEMUX, MSGL_DBG3, "tivo_stream_seek to 0x%"PRIX64"\n", (int64_t)pos); |
64 |
|
/* XXX reset eof if the other guy did */ |
65 |
|
ds->demuxer->stream->eof = s->eof; |
66 |
retval = stream_seek(ds->demuxer->stream, ((tivo_demux_priv*)ds->demuxer->priv)->begin_at + pos); |
retval = stream_seek(ds->demuxer->stream, ((tivo_demux_priv*)ds->demuxer->priv)->begin_at + pos); |
67 |
s->pos = ds->dpos = stream_tell(ds->demuxer->stream) - ((tivo_demux_priv*)ds->demuxer->priv)->begin_at; |
s->pos = ds->dpos = stream_tell(ds->demuxer->stream) - ((tivo_demux_priv*)ds->demuxer->priv)->begin_at; |
68 |
|
/* XXX set other guy's eof if stream_seek set it */ |
69 |
|
s->eof = ds->demuxer->stream->eof; |
70 |
return retval; |
return retval; |
71 |
} |
} |
72 |
|
|
89 |
{ |
{ |
90 |
extern int audio_id, video_id, dvdsub_id; |
extern int audio_id, video_id, dvdsub_id; |
91 |
stream_t* s = new_ds_stream(demuxer->video); |
stream_t* s = new_ds_stream(demuxer->video); |
92 |
|
demuxer_t* od; |
93 |
s->seek = &tivo_stream_seek; |
s->seek = &tivo_stream_seek; |
94 |
priv->mpg_demuxer = demux_open(s, DEMUXER_TYPE_MPEG_PS, |
s->end_pos = priv->end_at - priv->begin_at; |
95 |
|
od = demux_open(s, DEMUXER_TYPE_MPEG_PS, |
96 |
audio_id, video_id, dvdsub_id, NULL); |
audio_id, video_id, dvdsub_id, NULL); |
97 |
/* XXX Can't get movi_end initialized at the right point */ |
demuxer = new_demuxers_demuxer(od, od, od); |
|
priv->mpg_demuxer->movi_end = priv->end_at; |
|
|
priv->demux_demuxer = new_demuxers_demuxer(priv->mpg_demuxer, priv->mpg_demuxer, priv->mpg_demuxer); |
|
|
/* XXX Can't get movi_end initialized at the right point */ |
|
|
priv->demux_demuxer->movi_end = priv->end_at; |
|
98 |
} |
} |
99 |
return priv->demux_demuxer; |
return demuxer; |
100 |
} |
} |
101 |
|
|
102 |
void demux_tivo_close(demuxer_t *demuxer) |
void demux_tivo_close(demuxer_t *demuxer) |
131 |
{ |
{ |
132 |
marker = 0xFFFFFFFF; |
marker = 0xFFFFFFFF; |
133 |
demuxer->filepos = stream_tell(demuxer->stream) - priv->begin_at; |
demuxer->filepos = stream_tell(demuxer->stream) - priv->begin_at; |
|
/* XXX setting demux_demuxers filepos */ |
|
|
if(priv->demux_demuxer) priv->demux_demuxer->filepos = demuxer->filepos; |
|
134 |
ds_add_packet(ds, dp); |
ds_add_packet(ds, dp); |
135 |
return 1; |
return 1; |
136 |
} |
} |
141 |
{ |
{ |
142 |
resize_demux_packet(dp, dp->pos); |
resize_demux_packet(dp, dp->pos); |
143 |
demuxer->filepos = stream_tell(demuxer->stream) - priv->begin_at; |
demuxer->filepos = stream_tell(demuxer->stream) - priv->begin_at; |
|
/* XXX setting demux_demuxers filepos */ |
|
|
if(priv->demux_demuxer) priv->demux_demuxer->filepos = demuxer->filepos; |
|
144 |
ds_add_packet(ds, dp); |
ds_add_packet(ds, dp); |
145 |
dp = new_demux_packet (STREAM_BUFFER_SIZE); |
dp = new_demux_packet (STREAM_BUFFER_SIZE); |
146 |
} |
} |
158 |
{ |
{ |
159 |
resize_demux_packet(dp, dp->pos); |
resize_demux_packet(dp, dp->pos); |
160 |
demuxer->filepos = stream_tell(demuxer->stream) - priv->begin_at; |
demuxer->filepos = stream_tell(demuxer->stream) - priv->begin_at; |
|
/* XXX setting demux_demuxers filepos */ |
|
|
if(priv->demux_demuxer) priv->demux_demuxer->filepos = demuxer->filepos; |
|
161 |
ds_add_packet(ds, dp); |
ds_add_packet(ds, dp); |
162 |
dp = new_demux_packet (STREAM_BUFFER_SIZE); |
dp = new_demux_packet (STREAM_BUFFER_SIZE); |
163 |
} |
} |