summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/demuxers/asfheader.c6
-rw-r--r--src/demuxers/demux_idcin.c27
-rw-r--r--src/demuxers/demux_ts.c92
-rw-r--r--src/demuxers/demux_vmd.c22
-rw-r--r--src/demuxers/demux_vqa.c27
-rw-r--r--src/input/input_dvb.c8
-rw-r--r--src/input/input_v4l2.c2
-rw-r--r--src/input/net_buf_ctrl.c14
8 files changed, 97 insertions, 101 deletions
diff --git a/src/demuxers/asfheader.c b/src/demuxers/asfheader.c
index 54326c1d5..a78c84fd2 100644
--- a/src/demuxers/asfheader.c
+++ b/src/demuxers/asfheader.c
@@ -232,7 +232,7 @@ static int asf_header_get_stream_id(asf_header_t *header_pub, uint16_t stream_nu
static int asf_header_parse_file_properties(asf_header_t *header, uint8_t *buffer, int buffer_len) {
asf_reader_t reader;
asf_file_t *asf_file;
- uint32_t flags;
+ uint32_t flags = 0;
if (buffer_len < 80) {
lprintf("invalid asf file properties object\n");
@@ -284,7 +284,7 @@ static int asf_header_parse_file_properties(asf_header_t *header, uint8_t *buffe
static int asf_header_parse_stream_properties(asf_header_t *header, uint8_t *buffer, int buffer_len) {
asf_reader_t reader;
- uint16_t flags;
+ uint16_t flags = 0;
uint32_t junk;
GUID guid;
asf_stream_t *asf_stream = NULL;
@@ -353,7 +353,7 @@ exit_error:
static int asf_header_parse_stream_extended_properties(asf_header_t *header, uint8_t *buffer, int buffer_len) {
asf_reader_t reader;
- uint32_t flags;
+ uint32_t flags = 0;
uint16_t stream_number;
int i;
int stream_id;
diff --git a/src/demuxers/demux_idcin.c b/src/demuxers/demux_idcin.c
index 34dc1ee4d..b6daaa0b9 100644
--- a/src/demuxers/demux_idcin.c
+++ b/src/demuxers/demux_idcin.c
@@ -105,7 +105,8 @@ typedef struct {
int status;
off_t filesize;
- unsigned char bih[sizeof(xine_bmiheader) + HUFFMAN_TABLE_SIZE];
+ xine_bmiheader bih;
+ unsigned char huffman_table[HUFFMAN_TABLE_SIZE];
xine_waveformatex wave;
int audio_chunk_size1;
@@ -128,7 +129,7 @@ static int demux_idcin_send_chunk(demux_plugin_t *this_gen) {
unsigned char disk_palette[PALETTE_SIZE * 3];
palette_entry_t palette[PALETTE_SIZE];
int i;
- int remaining_sample_bytes;
+ unsigned int remaining_sample_bytes;
int scale_bits;
/* figure out what the next data is */
@@ -273,8 +274,7 @@ static int demux_idcin_send_chunk(demux_plugin_t *this_gen) {
/* returns 1 if the CIN file was opened successfully, 0 otherwise */
static int open_idcin_file(demux_idcin_t *this) {
unsigned char header[IDCIN_HEADER_SIZE];
- xine_bmiheader *bih = (xine_bmiheader *)this->bih;
- unsigned char *huffman_table = this->bih + sizeof(xine_bmiheader);
+ xine_bmiheader *bih = &this->bih;
if (_x_demux_read_header(this->input, header, IDCIN_HEADER_SIZE) != IDCIN_HEADER_SIZE)
return 0;
@@ -328,7 +328,7 @@ static int open_idcin_file(demux_idcin_t *this) {
this->input->seek(this->input, IDCIN_HEADER_SIZE, SEEK_SET);
/* read the Huffman table */
- if (this->input->read(this->input, huffman_table, HUFFMAN_TABLE_SIZE) !=
+ if (this->input->read(this->input, this->huffman_table, HUFFMAN_TABLE_SIZE) !=
HUFFMAN_TABLE_SIZE)
return 0;
@@ -356,9 +356,7 @@ static int open_idcin_file(demux_idcin_t *this) {
static void demux_idcin_send_headers(demux_plugin_t *this_gen) {
demux_idcin_t *this = (demux_idcin_t *) this_gen;
buf_element_t *buf;
- xine_bmiheader *bih = (xine_bmiheader *)this->bih;
- uint32_t i;
- int size;
+ uint32_t i, size;
this->video_fifo = this->stream->video_fifo;
this->audio_fifo = this->stream->audio_fifo;
@@ -369,8 +367,8 @@ static void demux_idcin_send_headers(demux_plugin_t *this_gen) {
_x_demux_control_start(this->stream);
/* send init info to decoders */
- bih->biSize = sizeof(xine_bmiheader) + HUFFMAN_TABLE_SIZE;
- size = bih->biSize;
+ this->bih.biSize = sizeof(xine_bmiheader) + HUFFMAN_TABLE_SIZE;
+ size = this->bih.biSize;
i = 0;
do {
@@ -385,7 +383,14 @@ static void demux_idcin_send_headers(demux_plugin_t *this_gen) {
buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|
BUF_FLAG_FRAMERATE|BUF_FLAG_FRAME_END;
}
- memcpy(buf->content, this->bih + i, buf->size);
+
+ if (i == 0) {
+ memcpy(buf->content, &this->bih, sizeof(xine_bmiheader));
+ memcpy(buf->content + sizeof(xine_bmiheader), this->huffman_table, buf->size - sizeof(xine_bmiheader));
+ } else {
+ memcpy(buf->content, this->huffman_table + i - sizeof(xine_bmiheader), buf->size);
+ }
+
buf->type = BUF_VIDEO_IDCIN;
this->video_fifo->put (this->video_fifo, buf);
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index 999862347..c37a6c488 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -300,7 +300,6 @@ typedef struct {
unsigned int counter;
uint16_t descriptor_tag; /* +0x100 for PES stream IDs (no available TS descriptor tag?) */
int corrupted_pes;
- uint32_t buffered_bytes;
int input_normpos;
int input_time;
@@ -311,16 +310,16 @@ typedef struct {
typedef struct {
spu_dvb_descriptor_t desc;
- int pid;
- int media_index;
+ unsigned int pid;
+ unsigned int media_index;
} demux_ts_spu_lang;
/* Audio Channels */
#define MAX_AUDIO_TRACKS 32
typedef struct {
- int pid;
- int media_index;
+ unsigned int pid;
+ unsigned int media_index;
char lang[4];
} demux_ts_audio_track;
@@ -361,7 +360,7 @@ typedef struct {
int blockSize;
int rate;
- int media_num;
+ unsigned int media_num;
demux_ts_media media[MAX_PIDS];
/* PAT */
@@ -429,7 +428,7 @@ static void demux_ts_tbre_reset (demux_ts_t *this) {
}
}
-static void demux_ts_tbre_update (demux_ts_t *this, int mode, int64_t now) {
+static void demux_ts_tbre_update (demux_ts_t *this, unsigned int mode, int64_t now) {
/* select best available timesource on the fly */
if ((mode < this->tbre_mode) || (now <= 0))
return;
@@ -586,27 +585,37 @@ static void demux_ts_update_spu_channel(demux_ts_t *this)
if ((this->media[this->spu_media].type & BUF_MAJOR_MASK) == BUF_SPU_HDMV) {
buf->type = BUF_SPU_HDMV;
+ buf->type |= this->current_spu_channel;
}
this->video_fifo->put(this->video_fifo, buf);
}
-static void demux_ts_flush_media(demux_ts_media *m)
+static void demux_ts_send_buffer(demux_ts_media *m, int flags)
{
if (m->buf) {
m->buf->content = m->buf->mem;
- m->buf->size = m->buffered_bytes;
m->buf->type = m->type;
- m->buf->decoder_flags |= BUF_FLAG_FRAME_END;
+ m->buf->decoder_flags |= flags;
m->buf->pts = m->pts;
+ m->buf->decoder_info[0] = 1;
m->buf->extra_info->input_normpos = m->input_normpos;
m->buf->extra_info->input_time = m->input_time;
+
m->fifo->put(m->fifo, m->buf);
- m->buffered_bytes = 0;
m->buf = NULL;
+
+#ifdef TS_LOG
+ printf ("demux_ts: produced buffer, pts=%lld\n", m->pts);
+#endif
}
}
+static void demux_ts_flush_media(demux_ts_media *m)
+{
+ demux_ts_send_buffer(m, BUF_FLAG_FRAME_END);
+}
+
static void demux_ts_flush(demux_ts_t *this)
{
unsigned int i;
@@ -1089,25 +1098,11 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts,
m->counter++;
if (pus) { /* new PES packet */
- if (m->buffered_bytes) {
-
- m->buf->content = m->buf->mem;
- m->buf->size = m->buffered_bytes;
- m->buf->type = m->type;
- m->buf->decoder_flags |= BUF_FLAG_FRAME_END;
- m->buf->pts = m->pts;
- m->buf->decoder_info[0] = 1;
- m->buf->extra_info->input_normpos = m->input_normpos;
- m->buf->extra_info->input_time = m->input_time;
- m->fifo->put(m->fifo, m->buf);
- m->buffered_bytes = 0;
- m->buf = NULL; /* forget about buf -- not our responsibility anymore */
-#ifdef TS_LOG
- printf ("demux_ts: produced buffer, pts=%lld\n", m->pts);
-#endif
- }
+
+ demux_ts_flush_media(m);
+
/* allocate the buffer here, as pes_header needs a valid buf for dvbsubs */
- m->buf = m->fifo->buffer_pool_alloc(m->fifo);
+ m->buf = m->fifo->buffer_pool_alloc(m->fifo);
if (!demux_ts_parse_pes_header(this->stream->xine, m, ts, len)) {
m->buf->free_buffer(m->buf);
@@ -1120,7 +1115,7 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts,
m->corrupted_pes = 0;
memcpy(m->buf->mem, ts+len-m->size, m->size);
- m->buffered_bytes = m->size;
+ m->buf->size = m->size;
/* cache frame position */
off_t length = this->input->get_length (this->input);
@@ -1140,25 +1135,12 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts,
} else if (!m->corrupted_pes) { /* no pus -- PES packet continuation */
- if ((m->buffered_bytes + len) > MAX_PES_BUF_SIZE) {
- m->buf->content = m->buf->mem;
- m->buf->size = m->buffered_bytes;
- m->buf->type = m->type;
- m->buf->pts = m->pts;
- m->buf->decoder_info[0] = 1;
- m->buf->extra_info->input_normpos = m->input_normpos;
- m->buf->extra_info->input_time = m->input_time;
- m->fifo->put(m->fifo, m->buf);
- m->buffered_bytes = 0;
+ if ((m->buf->size + len) > MAX_PES_BUF_SIZE) {
+ demux_ts_send_buffer(m, 0);
m->buf = m->fifo->buffer_pool_alloc(m->fifo);
-
-#ifdef TS_LOG
- printf ("demux_ts: produced buffer, pts=%lld\n", m->pts);
-#endif
-
}
- memcpy(m->buf->mem + m->buffered_bytes, ts, len);
- m->buffered_bytes += len;
+ memcpy(m->buf->mem + m->buf->size, ts, len);
+ m->buf->size += len;
}
}
@@ -1182,7 +1164,6 @@ static void demux_ts_pes_new(demux_ts_t*this,
m->counter = INVALID_CC;
m->descriptor_tag = descriptor;
m->corrupted_pes = 1;
- m->buffered_bytes = 0;
}
@@ -2282,17 +2263,23 @@ static int demux_ts_seek (demux_plugin_t *this_gen,
demux_ts_t *this = (demux_ts_t *) this_gen;
int i;
- start_time /= 1000;
start_pos = (off_t) ( (double) start_pos / 65535 *
this->input->get_length (this->input) );
if (this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) {
if ((!start_pos) && (start_time)) {
- start_pos = (int64_t)start_time * this->rate / 1000;
- }
- this->input->seek (this->input, start_pos, SEEK_SET);
+ if (this->input->seek_time) {
+ this->input->seek_time(this->input, start_time, SEEK_SET);
+ } else {
+ start_pos = (int64_t)start_time * this->rate / 1000;
+ this->input->seek (this->input, start_pos, SEEK_SET);
+ }
+
+ } else {
+ this->input->seek (this->input, start_pos, SEEK_SET);
+ }
}
this->send_newpts = 1;
@@ -2305,7 +2292,6 @@ static int demux_ts_seek (demux_plugin_t *this_gen,
m->buf = NULL;
m->counter = INVALID_CC;
m->corrupted_pes = 1;
- m->buffered_bytes = 0;
}
if( !playing ) {
diff --git a/src/demuxers/demux_vmd.c b/src/demuxers/demux_vmd.c
index bcea5e725..1bd052c10 100644
--- a/src/demuxers/demux_vmd.c
+++ b/src/demuxers/demux_vmd.c
@@ -76,7 +76,8 @@ typedef struct {
off_t data_start;
off_t data_size;
- unsigned char bih[sizeof(xine_bmiheader) + VMD_HEADER_SIZE];
+ xine_bmiheader bih;
+ unsigned char vmd_header[VMD_HEADER_SIZE];
xine_waveformatex wave;
unsigned int audio_frames;
@@ -89,7 +90,7 @@ typedef struct {
int64_t video_pts_inc;
int64_t total_pts;
-} demux_vmd_t ;
+} demux_vmd_t;
typedef struct {
demux_class_t demux_class;
@@ -98,8 +99,7 @@ typedef struct {
/* returns 1 if the VMD file was opened successfully, 0 otherwise */
static int open_vmd_file(demux_vmd_t *this) {
- xine_bmiheader *bih = (xine_bmiheader *)this->bih;
- unsigned char *vmd_header = this->bih + sizeof(xine_bmiheader);
+ unsigned char *vmd_header = this->vmd_header;
off_t toc_offset;
unsigned char *raw_frame_table;
unsigned int raw_frame_table_size;
@@ -122,9 +122,9 @@ static int open_vmd_file(demux_vmd_t *this) {
if ( !(this->data_size = this->input->get_length(this->input)) )
this->data_size = 1;
- bih->biSize = sizeof(xine_bmiheader) + VMD_HEADER_SIZE;
- bih->biWidth = _X_LE_16(&vmd_header[12]);
- bih->biHeight = _X_LE_16(&vmd_header[14]);
+ this->bih.biSize = sizeof(xine_bmiheader) + VMD_HEADER_SIZE;
+ this->bih.biWidth = _X_LE_16(&vmd_header[12]);
+ this->bih.biHeight = _X_LE_16(&vmd_header[14]);
this->wave.nSamplesPerSec = _X_LE_16(&vmd_header[804]);
this->wave.nChannels = (vmd_header[811] & 0x80) ? 2 : 1;
this->wave.nBlockAlign = _X_LE_16(&vmd_header[806]);
@@ -323,7 +323,6 @@ static int demux_vmd_send_chunk(demux_plugin_t *this_gen) {
static void demux_vmd_send_headers(demux_plugin_t *this_gen) {
demux_vmd_t *this = (demux_vmd_t *) this_gen;
buf_element_t *buf;
- xine_bmiheader *bih = (xine_bmiheader *)this->bih;
this->video_fifo = this->stream->video_fifo;
this->audio_fifo = this->stream->audio_fifo;
@@ -335,9 +334,9 @@ static void demux_vmd_send_headers(demux_plugin_t *this_gen) {
_x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO,
(this->wave.nSamplesPerSec) ? 1 : 0);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH,
- bih->biWidth);
+ this->bih.biWidth);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HEIGHT,
- bih->biHeight);
+ this->bih.biHeight);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_CHANNELS,
this->wave.nChannels);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE,
@@ -353,7 +352,8 @@ static void demux_vmd_send_headers(demux_plugin_t *this_gen) {
buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAMERATE|
BUF_FLAG_FRAME_END;
buf->decoder_info[0] = this->video_pts_inc; /* initial duration */
- memcpy(buf->content, this->bih, sizeof(xine_bmiheader) + VMD_HEADER_SIZE);
+ memcpy(buf->content, &this->bih, sizeof(xine_bmiheader));
+ memcpy(buf->content + sizeof(xine_bmiheader), this->vmd_header, VMD_HEADER_SIZE);
buf->size = sizeof(xine_bmiheader) + VMD_HEADER_SIZE;
buf->type = BUF_VIDEO_VMD;
this->video_fifo->put (this->video_fifo, buf);
diff --git a/src/demuxers/demux_vqa.c b/src/demuxers/demux_vqa.c
index 9e0f1cb65..6980c6e1a 100644
--- a/src/demuxers/demux_vqa.c
+++ b/src/demuxers/demux_vqa.c
@@ -73,13 +73,14 @@ typedef struct {
off_t data_start;
off_t filesize;
- unsigned char bih[sizeof(xine_bmiheader) + VQA_HEADER_SIZE];
+ xine_bmiheader bih;
+ unsigned char vqa_header[VQA_HEADER_SIZE];
xine_waveformatex wave;
int64_t video_pts;
unsigned int audio_frames;
unsigned int iteration;
-} demux_vqa_t ;
+} demux_vqa_t;
typedef struct {
demux_class_t demux_class;
@@ -89,8 +90,6 @@ typedef struct {
static int open_vqa_file(demux_vqa_t *this) {
unsigned char scratch[12];
unsigned int chunk_size;
- xine_bmiheader *bih = (xine_bmiheader *)this->bih;
- unsigned char *vqa_header = this->bih + sizeof(xine_bmiheader);
if (_x_demux_read_header(this->input, scratch, 12) != 12)
return 0;
@@ -108,15 +107,15 @@ static int open_vqa_file(demux_vqa_t *this) {
this->filesize = 1;
/* load the VQA header */
- if (this->input->read(this->input, vqa_header, VQA_HEADER_SIZE) !=
+ if (this->input->read(this->input, this->vqa_header, VQA_HEADER_SIZE) !=
VQA_HEADER_SIZE)
return 0;
- bih->biSize = sizeof(xine_bmiheader) + VQA_HEADER_SIZE;
- bih->biWidth = _X_LE_16(&vqa_header[6]);
- bih->biHeight = _X_LE_16(&vqa_header[8]);
- this->wave.nSamplesPerSec = _X_LE_16(&vqa_header[24]);
- this->wave.nChannels = vqa_header[26];
+ this->bih.biSize = sizeof(xine_bmiheader) + VQA_HEADER_SIZE;
+ this->bih.biWidth = _X_LE_16(&this->vqa_header[6]);
+ this->bih.biHeight = _X_LE_16(&this->vqa_header[8]);
+ this->wave.nSamplesPerSec = _X_LE_16(&this->vqa_header[24]);
+ this->wave.nChannels = this->vqa_header[26];
this->wave.wBitsPerSample = 16;
/* skip the FINF chunk */
@@ -240,7 +239,6 @@ static int demux_vqa_send_chunk(demux_plugin_t *this_gen) {
static void demux_vqa_send_headers(demux_plugin_t *this_gen) {
demux_vqa_t *this = (demux_vqa_t *) this_gen;
buf_element_t *buf;
- xine_bmiheader *bih = (xine_bmiheader *)this->bih;
this->video_fifo = this->stream->video_fifo;
this->audio_fifo = this->stream->audio_fifo;
@@ -252,9 +250,9 @@ static void demux_vqa_send_headers(demux_plugin_t *this_gen) {
_x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO,
(this->wave.nChannels) ? 1 : 0);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH,
- bih->biWidth);
+ this->bih.biWidth);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HEIGHT,
- bih->biHeight);
+ this->bih.biHeight);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_CHANNELS,
this->wave.nChannels);
_x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE,
@@ -270,7 +268,8 @@ static void demux_vqa_send_headers(demux_plugin_t *this_gen) {
buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAMERATE|
BUF_FLAG_FRAME_END;
buf->decoder_info[0] = VQA_PTS_INC; /* initial video_step */
- memcpy(buf->content, this->bih, sizeof(xine_bmiheader) + VQA_HEADER_SIZE);
+ memcpy(buf->content, &this->bih, sizeof(xine_bmiheader));
+ memcpy(buf->content + sizeof(xine_bmiheader), this->vqa_header, VQA_HEADER_SIZE);
buf->size = sizeof(xine_bmiheader) + VQA_HEADER_SIZE;
buf->type = BUF_VIDEO_VQA;
this->video_fifo->put (this->video_fifo, buf);
diff --git a/src/input/input_dvb.c b/src/input/input_dvb.c
index cb2c48e2c..b5833871f 100644
--- a/src/input/input_dvb.c
+++ b/src/input/input_dvb.c
@@ -2566,8 +2566,12 @@ static off_t dvb_plugin_read (input_plugin_t *this_gen,
ts_rewrite_packets (this, buf,total);
- if ((this->record_fd)&&(!this->record_paused))
- write (this->record_fd, buf, total);
+ if ((this->record_fd > -1) && (!this->record_paused))
+ if (write (this->record_fd, buf, total) != total) {
+ do_record(this);
+ xprintf(this->class->xine, XINE_VERBOSITY_LOG,
+ "input_dvb: Recording failed\n");
+ }
pthread_mutex_unlock( &this->channel_change_mutex );
diff --git a/src/input/input_v4l2.c b/src/input/input_v4l2.c
index b2938d609..7f7da68ba 100644
--- a/src/input/input_v4l2.c
+++ b/src/input/input_v4l2.c
@@ -350,7 +350,7 @@ static uint32_t v4l2_input_get_capabilities(input_plugin_t* this_gen) {
}
static const char* v4l2_input_get_mrl(input_plugin_t* this_gen) {
- v4l2_input_plugin_t* this = (v4l2_input_plugin_t*)this_gen;
+ /*v4l2_input_plugin_t* this = (v4l2_input_plugin_t*)this_gen;*/
/* HACK HACK HACK HACK */
/* So far, the only way to get the yuv_frames demuxer to work with this */
return "v4l:/";
diff --git a/src/input/net_buf_ctrl.c b/src/input/net_buf_ctrl.c
index 81165afcf..d50a6a8c4 100644
--- a/src/input/net_buf_ctrl.c
+++ b/src/input/net_buf_ctrl.c
@@ -186,19 +186,20 @@ static void dvbspeed_put (nbc_t *this, fifo_buffer_t * fifo, buf_element_t *b) {
int used, mode;
const char *name;
/* select vars */
- if (fifo == this->video_fifo) {
+ mode = b->type & BUF_MAJOR_MASK;
+ if (mode == BUF_VIDEO_BASE) {
last = &this->dvbs_video_in;
fill = &this->dvbs_video_fill;
mode = 0x71;
name = "video";
- } else if (fifo == this->audio_fifo) {
+ } else if (mode == BUF_AUDIO_BASE) {
last = &this->dvbs_audio_in;
fill = &this->dvbs_audio_fill;
mode = 0x0f;
name = "audio";
} else return;
/* update fifo fill time */
- if (b->pts && (b->decoder_flags & BUF_FLAG_FRAME_START)) {
+ if (b->pts) {
if (*last) {
diff = b->pts - *last;
if ((diff > -220000) && (diff < 220000)) *fill += diff;
@@ -261,19 +262,20 @@ static void dvbspeed_get (nbc_t *this, fifo_buffer_t * fifo, buf_element_t *b) {
int used, mode;
const char *name;
/* select vars */
- if (fifo == this->video_fifo) {
+ mode = b->type & BUF_MAJOR_MASK;
+ if (mode == BUF_VIDEO_BASE) {
last = &this->dvbs_video_out;
fill = &this->dvbs_video_fill;
mode = 0x71;
name = "video";
- } else if (fifo == this->audio_fifo) {
+ } else if (mode == BUF_AUDIO_BASE) {
last = &this->dvbs_audio_out;
fill = &this->dvbs_audio_fill;
mode = 0x0f;
name = "audio";
} else return;
/* update fifo fill time */
- if (b->pts && (b->decoder_flags & BUF_FLAG_FRAME_START)) {
+ if (b->pts) {
if (*last) {
diff = b->pts - *last;
if ((diff > -220000) && (diff < 220000)) *fill -= diff;