summaryrefslogtreecommitdiff
path: root/src/demuxers/demux_real.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers/demux_real.c')
-rw-r--r--src/demuxers/demux_real.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/demuxers/demux_real.c b/src/demuxers/demux_real.c
index 438ce33ba..60f170ce8 100644
--- a/src/demuxers/demux_real.c
+++ b/src/demuxers/demux_real.c
@@ -31,7 +31,7 @@
*
* Based on FFmpeg's libav/rm.c.
*
- * $Id: demux_real.c,v 1.99 2004/05/27 11:10:13 miguelfreitas Exp $
+ * $Id: demux_real.c,v 1.100 2004/06/13 21:28:54 miguelfreitas Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -679,8 +679,8 @@ unknown:
buf->size = this->video_stream->mdpr->type_specific_len;
buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_FRAME_END;
buf->type = this->video_stream->buf_type;
- buf->extra_info->input_pos = 0;
- buf->extra_info->input_time = 0;
+ buf->extra_info->input_normpos = 0;
+ buf->extra_info->input_time = 0;
this->video_fifo->put (this->video_fifo, buf);
@@ -973,6 +973,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
uint32_t id, timestamp;
int64_t pts;
off_t offset, input_length = 0;
+ int normpos = 0;
if(this->reference_mode)
return demux_real_parse_references(this);
@@ -1121,6 +1122,8 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
if(this->data_start && this->data_chunk_size)
input_length = this->data_start + 18 + this->data_chunk_size;
+ if( input_length )
+ normpos = (int)((double) this->input->get_current_pos(this->input) * 65535 / input_length);
check_newpts (this, pts, PTS_VIDEO, 0);
@@ -1224,8 +1227,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
buf->pts = pts;
pts = 0;
- buf->extra_info->input_pos = this->input->get_current_pos(this->input);
- buf->extra_info->input_length = input_length;
+ buf->extra_info->input_normpos = normpos;
buf->extra_info->input_time = input_time;
buf->extra_info->total_time = this->duration;
@@ -1269,6 +1271,9 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
input_length = this->data_start + 18 + this->data_chunk_size;
else
input_length = 0;
+
+ if( input_length )
+ normpos = (int)((double) this->input->get_current_pos(this->input) * 65535 / input_length);
check_newpts (this, pts, PTS_AUDIO, 0);
@@ -1287,8 +1292,8 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
for(i = 0; i < frames; i++) {
if(_x_demux_read_send_data(this->audio_fifo, this->input, sizes[i], pts,
- this->audio_stream->buf_type, 0, this->input->get_current_pos(this->input),
- input_length, input_time, this->duration, 0) < 0) {
+ this->audio_stream->buf_type, 0, normpos,
+ input_time, this->duration, 0) < 0) {
xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "read error 44\n");
@@ -1303,8 +1308,8 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
free(sizes);
} else {
if(_x_demux_read_send_data(this->audio_fifo, this->input, size, pts,
- this->audio_stream->buf_type, 0, this->input->get_current_pos(this->input),
- input_length, input_time, this->duration, 0) < 0) {
+ this->audio_stream->buf_type, 0, normpos,
+ input_time, this->duration, 0) < 0) {
xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "read error 44\n");
@@ -1405,6 +1410,9 @@ static int demux_real_seek (demux_plugin_t *this_gen,
demux_real_t *this = (demux_real_t *) this_gen;
real_index_entry_t *index, *other_index = NULL;
int i = 0, entries;
+
+ start_pos = (off_t) ( (double) start_pos / 65535 *
+ this->input->get_length (this->input) );
if((this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) &&
((this->audio_stream && this->audio_stream->index) ||
@@ -1650,6 +1658,6 @@ demuxer_info_t demux_info_real = {
plugin_info_t xine_plugin_info[] = {
/* type, API, "name", version, special_info, init_function */
- { PLUGIN_DEMUX, 24, "real", XINE_VERSION_CODE, &demux_info_real, init_class },
+ { PLUGIN_DEMUX, 25, "real", XINE_VERSION_CODE, &demux_info_real, init_class },
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
};