summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libffmpeg/ff_video_decoder.c18
-rw-r--r--src/libsputext/xine_sputext_decoder.c6
-rw-r--r--src/xine-utils/xmlparser.c2
3 files changed, 19 insertions, 7 deletions
diff --git a/src/libffmpeg/ff_video_decoder.c b/src/libffmpeg/ff_video_decoder.c
index 6cbb152a2..3c69e360d 100644
--- a/src/libffmpeg/ff_video_decoder.c
+++ b/src/libffmpeg/ff_video_decoder.c
@@ -1154,6 +1154,7 @@ static void ff_handle_buffer (ff_video_decoder_t *this, buf_element_t *buf) {
int got_one_picture = 0;
int offset = 0;
int codec_type = buf->type & 0xFFFF0000;
+ int video_step_to_use;
/* pad input data */
/* note: bitstream, alt bitstream reader or something will cause
@@ -1194,6 +1195,9 @@ static void ff_handle_buffer (ff_video_decoder_t *this, buf_element_t *buf) {
}
}
+ /* use externally provided video_step or fall back to stream's time_base otherwise */
+ video_step_to_use = (this->video_step || !this->context->time_base.den) ? this->video_step : (int)(90000ll * this->context->time_base.num / this->context->time_base.den);
+
/* aspect ratio provided by ffmpeg, override previous setting */
if ((this->aspect_ratio_prio < 2) &&
av_cmp_q(this->context->sample_aspect_ratio, avr00)) {
@@ -1283,16 +1287,20 @@ static void ff_handle_buffer (ff_video_decoder_t *this, buf_element_t *buf) {
img->pts = this->pts;
this->pts = 0;
+ /* workaround for demux_mpeg_pes sending fields as frames */
+ if (!this->video_step && this->av_frame->interlaced_frame)
+ video_step_to_use /= 2;
+
/* workaround for weird 120fps streams */
- if( this->video_step == 750 ) {
+ if( video_step_to_use == 750 ) {
/* fallback to the VIDEO_PTS_MODE */
- this->video_step = 0;
+ video_step_to_use = 0;
}
if (this->av_frame->repeat_pict)
- img->duration = this->video_step * 3 / 2;
+ img->duration = video_step_to_use * 3 / 2;
else
- img->duration = this->video_step;
+ img->duration = video_step_to_use;
img->crop_right = this->crop_right;
img->crop_bottom = this->crop_bottom;
@@ -1316,7 +1324,7 @@ static void ff_handle_buffer (ff_video_decoder_t *this, buf_element_t *buf) {
img->pts = this->pts;
this->pts = 0;
- img->duration = this->video_step;
+ img->duration = video_step_to_use;
img->bad_frame = 1;
this->skipframes = img->draw(img, this->stream);
img->free(img);
diff --git a/src/libsputext/xine_sputext_decoder.c b/src/libsputext/xine_sputext_decoder.c
index ea3a69189..66ce4a533 100644
--- a/src/libsputext/xine_sputext_decoder.c
+++ b/src/libsputext/xine_sputext_decoder.c
@@ -703,9 +703,11 @@ static void spudec_decode_data (spu_decoder_t *this_gen, buf_element_t *buf) {
lprintf("started\n");
this->width = this->height = 0;
- this->started = 1;
- update_output_size( this );
+ update_output_size( this );
+ if( this->width && this->height ) {
+ this->started = 1;
+ }
}
if( this->started ) {
diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c
index 9fad38e5d..66ab28ce4 100644
--- a/src/xine-utils/xmlparser.c
+++ b/src/xine-utils/xmlparser.c
@@ -239,6 +239,8 @@ static int xml_parser_get_node_internal (xml_node_t *current_node, char *root_na
if (rec < MAX_RECURSION) {
+ memset (tok, 0, TOKEN_SIZE);
+
while ((bypass_get_token) || (res = lexer_get_token(tok, TOKEN_SIZE)) != T_ERROR) {
bypass_get_token = 0;
lprintf("info: %d - %d : '%s'\n", state, res, tok);