You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(235) |
Aug
(290) |
Sep
(419) |
Oct
(496) |
Nov
(545) |
Dec
(434) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(346) |
Feb
(224) |
Mar
(339) |
Apr
(401) |
May
(366) |
Jun
(570) |
Jul
(491) |
Aug
(369) |
Sep
(479) |
Oct
(681) |
Nov
(752) |
Dec
(998) |
2003 |
Jan
(902) |
Feb
(510) |
Mar
(590) |
Apr
(467) |
May
(529) |
Jun
(210) |
Jul
(208) |
Aug
(219) |
Sep
(155) |
Oct
(497) |
Nov
(416) |
Dec
(400) |
2004 |
Jan
(270) |
Feb
(175) |
Mar
(285) |
Apr
(404) |
May
(271) |
Jun
(323) |
Jul
(196) |
Aug
(145) |
Sep
(238) |
Oct
(260) |
Nov
(382) |
Dec
(437) |
2005 |
Jan
(251) |
Feb
(151) |
Mar
(80) |
Apr
(205) |
May
(266) |
Jun
(125) |
Jul
(308) |
Aug
(184) |
Sep
(188) |
Oct
(221) |
Nov
(132) |
Dec
(98) |
2006 |
Jan
(123) |
Feb
(150) |
Mar
(161) |
Apr
(152) |
May
(115) |
Jun
(259) |
Jul
(265) |
Aug
(81) |
Sep
(185) |
Oct
(121) |
Nov
(86) |
Dec
(257) |
2007 |
Jan
(233) |
Feb
(210) |
Mar
(306) |
Apr
(628) |
May
(347) |
Jun
(373) |
Jul
(71) |
Aug
(122) |
Sep
(53) |
Oct
(66) |
Nov
(156) |
Dec
(451) |
2008 |
Jan
(407) |
Feb
(136) |
Mar
(277) |
Apr
(119) |
May
(254) |
Jun
(162) |
Jul
(53) |
Aug
(43) |
Sep
(6) |
Oct
(3) |
Nov
(58) |
Dec
(51) |
2009 |
Jan
(161) |
Feb
(43) |
Mar
(30) |
Apr
(31) |
May
(15) |
Jun
(9) |
Jul
(1) |
Aug
(13) |
Sep
(1) |
Oct
(32) |
Nov
(319) |
Dec
(66) |
2010 |
Jan
(93) |
Feb
(41) |
Mar
(76) |
Apr
(56) |
May
(15) |
Jun
(21) |
Jul
(35) |
Aug
|
Sep
|
Oct
(6) |
Nov
|
Dec
|
2012 |
Jan
(77) |
Feb
(54) |
Mar
(5) |
Apr
(29) |
May
(35) |
Jun
(63) |
Jul
(26) |
Aug
(22) |
Sep
(3) |
Oct
|
Nov
|
Dec
(8) |
2013 |
Jan
(14) |
Feb
(5) |
Mar
(8) |
Apr
(12) |
May
(4) |
Jun
(2) |
Jul
(8) |
Aug
(10) |
Sep
(90) |
Oct
(21) |
Nov
(28) |
Dec
(12) |
2014 |
Jan
(6) |
Feb
(27) |
Mar
(19) |
Apr
(47) |
May
(67) |
Jun
(22) |
Jul
(6) |
Aug
(19) |
Sep
(1) |
Oct
(2) |
Nov
(15) |
Dec
(11) |
2015 |
Jan
|
Feb
(5) |
Mar
(1) |
Apr
(3) |
May
(1) |
Jun
|
Jul
(2) |
Aug
(4) |
Sep
|
Oct
(1) |
Nov
|
Dec
(10) |
2016 |
Jan
(1) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
(3) |
Jul
|
Aug
(5) |
Sep
(20) |
Oct
(6) |
Nov
(24) |
Dec
(12) |
2017 |
Jan
(37) |
Feb
(159) |
Mar
(206) |
Apr
(167) |
May
(49) |
Jun
(14) |
Jul
(48) |
Aug
(9) |
Sep
(79) |
Oct
(101) |
Nov
(68) |
Dec
(42) |
2018 |
Jan
(70) |
Feb
(76) |
Mar
(152) |
Apr
(161) |
May
(15) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Petri H. <phi...@us...> - 2018-04-13 10:28:31
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523614931 -10800 # Node ID 8d996c54b662cbd87ef8855e8006ea77a4358533 # Branch default # Parent 6a48177c61148a5d23b214f74e58b9edcd1a506f ffmpeg_video_decoder: make postproc optional diff --git a/src/combined/ffmpeg/Makefile.am b/src/combined/ffmpeg/Makefile.am --- a/src/combined/ffmpeg/Makefile.am +++ b/src/combined/ffmpeg/Makefile.am @@ -16,7 +16,6 @@ noinst_HEADERS = ffmpeg_compat.h if ENABLE_FFMPEG -if ENABLE_POSTPROC BUILT_SOURCES = $(ff_generated) @@ -70,4 +69,3 @@ .PHONY: report endif -endif --git a/src/combined/ffmpeg/ff_video_decoder.c b/src/combined/ffmpeg/ff_video_decoder.c --- a/src/combined/ffmpeg/ff_video_decoder.c +++ b/src/combined/ffmpeg/ff_video_decoder.c @@ -44,12 +44,14 @@ #include "ffmpeg_decoder.h" #include "ff_mpeg_parser.h" +#ifdef HAVE_POSTPROC #ifdef HAVE_FFMPEG_AVUTIL_H # include <postprocess.h> #else # include <libpostproc/postprocess.h> # include <libavutil/mem.h> #endif +#endif #ifdef HAVE_VA_VA_X11_H # include <libavcodec/vaapi.h> @@ -80,7 +82,9 @@ typedef struct ff_video_class_s { video_decoder_class_t decoder_class; +#ifdef HAVE_POSTPROC int pp_quality; +#endif int thread_count; int8_t skip_loop_filter_enum; int8_t choose_speed_over_accuracy; @@ -110,7 +114,9 @@ uint8_t decoder_ok:1; uint8_t decoder_init_mode:1; uint8_t is_mpeg12:1; +#ifdef HAVE_POSTPROC uint8_t pp_available:1; +#endif uint8_t is_direct_rendering_disabled:1; /* used only to avoid flooding log */ uint8_t cs_convert_init:1; uint8_t assume_bad_field_picture:1; @@ -131,10 +137,12 @@ AVCodecContext *context; AVCodec *codec; +#ifdef HAVE_POSTPROC int pp_quality; int pp_flags; pp_context *our_context; pp_mode *our_mode; +#endif /* HAVE_POSTPROC */ /* mpeg-es parsing */ mpeg_parser_t *mpeg_parser; @@ -1125,11 +1133,13 @@ class->thread_count = 8; } +#ifdef HAVE_POSTPROC static void pp_quality_cb(void *user_data, xine_cfg_entry_t *entry) { ff_video_class_t *class = (ff_video_class_t *) user_data; class->pp_quality = entry->num_value; } +#endif static void dri_cb(void *user_data, xine_cfg_entry_t *entry) { ff_video_class_t *class = (ff_video_class_t *) user_data; @@ -1137,6 +1147,7 @@ class->enable_dri = entry->num_value; } +#ifdef HAVE_POSTPROC static void pp_change_quality (ff_video_decoder_t *this) { this->pp_quality = this->class->pp_quality; @@ -1161,8 +1172,10 @@ } } } +#endif /* HAVE_POSTPROC */ static void init_postprocess (ff_video_decoder_t *this) { +#ifdef HAVE_POSTPROC #if defined(ARCH_X86) uint32_t cpu_caps; #endif @@ -1200,6 +1213,7 @@ /* Set level */ pp_change_quality(this); +#endif /* HAVE_POSTPROC */ } static int ff_handle_mpeg_sequence(ff_video_decoder_t *this, mpeg_parser_t *parser) { @@ -2083,6 +2097,7 @@ } } +#ifdef HAVE_POSTPROC static void ff_postprocess (ff_video_decoder_t *this, AVFrame *av_frame, vo_frame_t *img) { int qstride, qtype; int8_t *qtable; @@ -2106,6 +2121,7 @@ qtable, qstride, this->our_mode, this->our_context, av_frame->pict_type | (qtype ? PP_PICT_TYPE_QP2 : 0)); } +#endif /* HAVE_POSTPROC */ static void ff_handle_buffer (ff_video_decoder_t *this, buf_element_t *buf) { uint8_t *chunk_buf = this->buf; @@ -2328,6 +2344,7 @@ } /* post processing */ +#ifdef HAVE_POSTPROC if(this->pp_quality != this->class->pp_quality && this->context->pix_fmt != PIX_FMT_VAAPI_VLD) pp_change_quality(this); @@ -2347,7 +2364,9 @@ free_img = 1; } ff_postprocess (this, this->av_frame, img); - } else if (free_img) { + } else +#endif /* HAVE_POSTPROC */ + if (free_img) { /* colorspace conversion or copy */ ff_convert_frame(this, img, this->av_frame); } @@ -2559,6 +2578,7 @@ } /* post processing */ +#ifdef HAVE_POSTPROC if (this->pp_quality != this->class->pp_quality && this->context->pix_fmt != PIX_FMT_VAAPI_VLD) pp_change_quality (this); if (this->pp_available && this->pp_quality && this->context->pix_fmt != PIX_FMT_VAAPI_VLD) { @@ -2572,7 +2592,9 @@ free_img = 1; } ff_postprocess (this, this->av_frame2, img); - } else if (free_img) { + } else +#endif /* HAVE_POSTPROC */ + if (free_img) { /* colorspace conversion or copy */ ff_convert_frame (this, img, this->av_frame2); } @@ -2771,11 +2793,13 @@ free(this->buf); this->buf = NULL; +#ifdef HAVEPOSTPROC if(this->our_context) pp_free_context(this->our_context); if(this->our_mode) pp_free_mode(this->our_mode); +#endif /* HAVE_POSTPROC */ mpeg_parser_dispose(this->mpeg_parser); @@ -2817,9 +2841,11 @@ this->decoder_ok = 0; this->is_mpeg12 = 0; this->aspect_ratio = 0; +#ifdef HAVE_POSTPROC this->pp_quality = 0; this->our_context = NULL; this->our_mode = NULL; +#endif this->mpeg_parser = NULL; this->set_stream_info = 0; this->rgb2yuy2 = NULL; @@ -2909,7 +2935,9 @@ ff_video_class_t *this = (ff_video_class_t *)this_gen; config_values_t *config = this->xine->config; +#ifdef HAVE_POSTPROC config->unregister_callback (config, "video.processing.ffmpeg_pp_quality"); +#endif config->unregister_callback (config, "video.processing.ffmpeg_thread_count"); config->unregister_callback (config, "video.processing.ffmpeg_skip_loop_filter"); config->unregister_callback (config, "video.processing.ffmpeg_choose_speed_over_accuracy"); @@ -2944,6 +2972,7 @@ * moment */ config = xine->config; +#ifdef HAVE_POSTPROC this->pp_quality = xine->config->register_range(config, "video.processing.ffmpeg_pp_quality", 3, 0, PP_QUALITY_MAX, _("MPEG-4 postprocessing quality"), @@ -2953,6 +2982,7 @@ "too heavy post processing can actually make the image worse by blurring it " "too much."), 10, pp_quality_cb, this); +#endif /* HAVE_POSTPROC */ this->thread_count = xine->config->register_num(config, "video.processing.ffmpeg_thread_count", 1, _("FFmpeg video decoding thread count"), |
From: Petri H. <phi...@us...> - 2018-04-12 10:40:00
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523528951 -10800 # Node ID d5a2ee1db6f789dd53faa3af6511bdacd2ab1049 # Branch default # Parent 1b10ca2b9e9b01b4ee8ac4cf0c9bd0d3fde58381 demux_mpeg_pes: fix null deref (no audio fifo) diff --git a/src/demuxers/demux_mpeg_pes.c b/src/demuxers/demux_mpeg_pes.c --- a/src/demuxers/demux_mpeg_pes.c +++ b/src/demuxers/demux_mpeg_pes.c @@ -1062,8 +1062,16 @@ if( !this->preview_mode ) check_newpts( this, this->pts, PTS_AUDIO ); - this->audio_fifo->put (this->audio_fifo, buf); - lprintf ("A52 PACK put on fifo\n"); + if (this->audio_fifo) { + this->audio_fifo->put (this->audio_fifo, buf); + lprintf ("A52 PACK put on fifo\n"); + } else { + buf->free_buffer(buf); + /* skip tail */ + if (this->input->seek (this->input, this->packet_len - size, SEEK_CUR) < 0) + return -1; + return this->packet_len + result; + } if (size == this->packet_len) { return this->packet_len + result; @@ -1088,12 +1096,8 @@ buf->type = BUF_AUDIO_A52; buf->pts = 0; - if(this->audio_fifo) { - this->audio_fifo->put (this->audio_fifo, buf); - lprintf ("A52 PACK put on fifo\n"); - } else { - buf->free_buffer(buf); - } + this->audio_fifo->put (this->audio_fifo, buf); + lprintf ("A52 PACK put on fifo\n"); } return this->packet_len + result; |
From: Petri H. <phi...@us...> - 2018-04-12 10:40:00
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523528489 -10800 # Node ID 1b10ca2b9e9b01b4ee8ac4cf0c9bd0d3fde58381 # Branch default # Parent 8c8fe479c5d11fc750fc36aac8cd8e78ae2cf821 Remove write-only variable diff --git a/src/demuxers/demux_iff.c b/src/demuxers/demux_iff.c --- a/src/demuxers/demux_iff.c +++ b/src/demuxers/demux_iff.c @@ -133,8 +133,6 @@ off_t data_start; off_t data_size; - - int seek_flag; /* this is set when a seek just occurred */ } demux_iff_t; @@ -608,7 +606,6 @@ this->running_time = 0; this->data_start = 0; this->data_size = 0; - this->seek_flag = 0; this->audio_interleave_buffer = 0; this->audio_interleave_buffer_size = 0; this->audio_read_buffer = 0; @@ -1099,7 +1096,6 @@ switch( this->iff_type ) { case IFF_8SVX_CHUNK: case IFF_16SV_CHUNK: - this->seek_flag = 1; this->status = DEMUX_OK; _x_demux_flush_engine (this->stream); @@ -1116,7 +1112,6 @@ case IFF_ILBM_CHUNK: case IFF_ANIM_CHUNK: /* disable seeking for ILBM and ANIM */ - this->seek_flag = 0; if( !playing ) { this->status = DEMUX_OK; } |
From: Petri H. <phi...@us...> - 2018-04-12 10:39:54
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523528409 -10800 # Node ID 8c8fe479c5d11fc750fc36aac8cd8e78ae2cf821 # Branch default # Parent 1bf7363851fc308f4c819c7b6a520f58d368383f Add missing break diff --git a/src/demuxers/demux_iff.c b/src/demuxers/demux_iff.c --- a/src/demuxers/demux_iff.c +++ b/src/demuxers/demux_iff.c @@ -1112,6 +1112,7 @@ this->audio_position = (start_pos < 0) ? 0 : ((start_pos >= this->data_size) ? this->data_size : start_pos); + break; case IFF_ILBM_CHUNK: case IFF_ANIM_CHUNK: /* disable seeking for ILBM and ANIM */ |
From: Petri H. <phi...@us...> - 2018-04-12 10:39:54
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523527973 -10800 # Node ID 1bf7363851fc308f4c819c7b6a520f58d368383f # Branch default # Parent 904408faf499a73872344e03590a1541d8fafa84 Move NULL initialization diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c --- a/src/demuxers/demux_flac.c +++ b/src/demuxers/demux_flac.c @@ -87,8 +87,6 @@ unsigned char *streaminfo = flac->streaminfo + sizeof(xine_waveformatex); int i; - flac->seekpoints = NULL; - /* fetch the file signature, 4 bytes will read both the fLaC * signature and the */ if (_x_demux_read_header(flac->input, &signature, 4) != 4) @@ -540,6 +538,10 @@ } this = calloc(1, sizeof(demux_flac_t)); + if (!this) + return NULL; + + this->seekpoints = NULL; this->stream = stream; this->input = input; |
From: Petri H. <phi...@us...> - 2018-04-12 10:39:53
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523527707 -10800 # Node ID 904408faf499a73872344e03590a1541d8fafa84 # Branch default # Parent 5ed98b50f96687ae74d4ea2b52ef126827ab6685 Use calloc diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c --- a/src/demuxers/demux_flac.c +++ b/src/demuxers/demux_flac.c @@ -166,9 +166,10 @@ if (!flac->sample_rate) break; flac->seekpoint_count = block_length / FLAC_SEEKPOINT_SIZE; - flac->seekpoints = xine_xcalloc(flac->seekpoint_count, - sizeof(flac_seekpoint_t)); - if (flac->seekpoint_count && !flac->seekpoints) + if (!flac->seekpoint_count) + break; + flac->seekpoints = calloc(flac->seekpoint_count, sizeof(flac_seekpoint_t)); + if (!flac->seekpoints) return 0; for (i = 0; i < flac->seekpoint_count; i++) { if (flac->input->read(flac->input, buffer, FLAC_SEEKPOINT_SIZE) != FLAC_SEEKPOINT_SIZE) |
From: Petri H. <phi...@us...> - 2018-04-12 10:39:51
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523526398 -10800 # Node ID 5ed98b50f96687ae74d4ea2b52ef126827ab6685 # Branch default # Parent 72fe37ee6572f3b85844454a28fd59a4f44cb53d input_cdda: Fix OOB write sanity check title array index, it is from external source diff --git a/src/input/input_cdda.c b/src/input/input_cdda.c --- a/src/input/input_cdda.c +++ b/src/input/input_cdda.c @@ -1597,8 +1597,10 @@ this->cddb.disc_category = strdup (pt + 1); } else if (sscanf (buffer, "TTITLE%d=%s", &track_no, &buf[0]) == 2) { - char *pt = strchr(buffer, '='); - this->cddb.track[track_no].title = _cdda_append (this->cddb.track[track_no].title, pt + 1); + if (track_no >= 0 && track_no < this->cddb.num_tracks) { + char *pt = strchr(buffer, '='); + this->cddb.track[track_no].title = _cdda_append (this->cddb.track[track_no].title, pt + 1); + } } else if (!strncmp (buffer, "EXTD=", 5)) { |
From: Petri H. <phi...@us...> - 2018-04-12 10:39:49
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523525772 -10800 # Node ID 72fe37ee6572f3b85844454a28fd59a4f44cb53d # Branch default # Parent 1e8e3a13791ef25981170addfbf55113dbcd599e demux_iff: fix NULL derefs diff --git a/src/demuxers/demux_iff.c b/src/demuxers/demux_iff.c --- a/src/demuxers/demux_iff.c +++ b/src/demuxers/demux_iff.c @@ -297,6 +297,8 @@ /* not yet implemented */ break; case IFF_CHAN_CHUNK: + if (!this->vhdr) + break; this->chan_settings = _X_BE_32(&buffer[0]); switch( this->chan_settings ) { case STEREO: @@ -321,6 +323,8 @@ } break; case IFF_PAN_CHUNK: + if (!this->vhdr) + break; this->chan_settings = PAN; this->pan_sposition = _X_BE_32(&buffer[0]); this->audio_channels = 2; @@ -521,6 +525,8 @@ break; case IFF_BODY_CHUNK: case IFF_DLTA_CHUNK: + if (!this->vhdr) + break; this->data_start = this->input->get_current_pos(this->input); this->data_size = junk_size; switch( this->iff_type ) |
From: Petri H. <phi...@us...> - 2018-04-12 10:39:48
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523526012 -10800 # Node ID 1e8e3a13791ef25981170addfbf55113dbcd599e # Branch default # Parent 79585b9e29677be17740ded2ff432d9fd29d7606 Fix possible division by zero diff --git a/src/demuxers/demux_aiff.c b/src/demuxers/demux_aiff.c --- a/src/demuxers/demux_aiff.c +++ b/src/demuxers/demux_aiff.c @@ -168,7 +168,8 @@ this->data_start = this->input->get_current_pos(this->input); this->data_size = this->audio_frames * this->audio_channels * (this->audio_bits / 8); - this->running_time = (this->audio_frames / this->audio_sample_rate) * 1000; + if (this->audio_sample_rate) + this->running_time = (this->audio_frames / this->audio_sample_rate) * 1000; /* we should send only complete frames to decoder, as it * doesn't handle underconsumption yet */ --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c --- a/src/demuxers/demux_avi.c +++ b/src/demuxers/demux_avi.c @@ -432,6 +432,8 @@ return (int64_t)((double)((postot + posb) / (double)at->wavex->nBlockAlign + at->dwStart) * (double)at->dwScale / (double)at->dwRate * 90000.0); } else { + if (!at->dwSampleSize) + return 0; return (int64_t)((double)((postot + posb) / (double)at->dwSampleSize + at->dwStart) * (double)at->dwScale / (double)at->dwRate * 90000.0); } --git a/src/post/visualizations/fftgraph.c b/src/post/visualizations/fftgraph.c --- a/src/post/visualizations/fftgraph.c +++ b/src/post/visualizations/fftgraph.c @@ -232,6 +232,8 @@ this->ratio = (double)FFTGRAPH_WIDTH / (double)FFTGRAPH_HEIGHT; this->channels = _x_ao_mode2channels(mode); + if (this->channels < 1) + this->channels = 1; if( this->channels > MAXCHANNELS ) this->channels = MAXCHANNELS; this->lines_per_channel = FFTGRAPH_HEIGHT / this->channels; |
From: Petri H. <phi...@us...> - 2018-04-11 16:53:08
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523465568 -10800 # Node ID 79585b9e29677be17740ded2ff432d9fd29d7606 # Branch default # Parent 3be831bddd89ed8eac09c286acefc89ee4007c31 Simplify diff --git a/src/demuxers/demux_rawdv.c b/src/demuxers/demux_rawdv.c --- a/src/demuxers/demux_rawdv.c +++ b/src/demuxers/demux_rawdv.c @@ -343,8 +343,31 @@ input_plugin_t *input) { demux_raw_dv_t *this; + uint8_t buf[8]; - this = calloc(1, sizeof(demux_raw_dv_t)); + switch (stream->content_detection_method) { + + case METHOD_BY_CONTENT: + if (_x_demux_read_header(input, buf, 8) != 8) + return NULL; + + /* DIF (DV) movie file */ + if (memcmp(buf, "\x1F\x07\x00", 3) != 0 || !(buf[4] ^ 0x01)) + return NULL; + break; + + case METHOD_BY_MRL: + case METHOD_EXPLICIT: + break; + + default: + return NULL; + } + + this = calloc(1, sizeof(demux_raw_dv_t)); + if (!this) + return NULL; + this->stream = stream; this->input = input; @@ -360,33 +383,6 @@ this->status = DEMUX_FINISHED; - switch (stream->content_detection_method) { - - case METHOD_BY_CONTENT: { - uint8_t buf[8]; - - if (_x_demux_read_header(input, buf, 8) != 8) { - free (this); - return NULL; - } - - /* DIF (DV) movie file */ - if (memcmp(buf, "\x1F\x07\x00", 3) != 0 || !(buf[4] ^ 0x01)) { - free (this); - return NULL; - } - } - break; - - case METHOD_BY_MRL: - case METHOD_EXPLICIT: - break; - - default: - free (this); - return NULL; - } - if (!INPUT_IS_SEEKABLE(this->input)) { /* "live" DV streams require more prebuffering */ this->stream->metronom->set_option(this->stream->metronom, METRONOM_PREBUFFER, 90000); |
From: Petri H. <phi...@us...> - 2018-04-11 16:53:06
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523465422 -10800 # Node ID 3be831bddd89ed8eac09c286acefc89ee4007c31 # Branch default # Parent e76312104cd31cd8ed2f023552359fc7bf469269 Fix leaks diff --git a/src/demuxers/demux_rawdv.c b/src/demuxers/demux_rawdv.c --- a/src/demuxers/demux_rawdv.c +++ b/src/demuxers/demux_rawdv.c @@ -151,18 +151,17 @@ scratch = (unsigned char *) malloc(NTSC_FRAME_SIZE); if (scratch == NULL ) return; - if (INPUT_IS_SEEKABLE(this->input)) { if (this->input->seek(this->input, 0, SEEK_SET) != 0) - return; + goto out; if( this->input->read (this->input, scratch, NTSC_FRAME_SIZE) != NTSC_FRAME_SIZE ) - return; + goto out; if (this->input->seek(this->input, 0, SEEK_SET) != 0) - return; + goto out; } else { if( this->input->read (this->input, scratch, NTSC_FRAME_SIZE) != NTSC_FRAME_SIZE ) - return; + goto out; if( !(scratch[3] & 0x80) ) i = NTSC_FRAME_SIZE; else @@ -171,7 +170,7 @@ i -= NTSC_FRAME_SIZE; while (i > 0) { if( this->input->read (this->input, scratch2, 4) != 4 ) - return; + goto out; i -= 4; } } @@ -288,6 +287,8 @@ _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO, 1); } + out: + free(scratch); } static int demux_raw_dv_seek (demux_plugin_t *this_gen, |
From: Petri H. <phi...@us...> - 2018-04-11 16:42:10
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523464911 -10800 # Node ID e76312104cd31cd8ed2f023552359fc7bf469269 # Branch default # Parent abd98d8ad26cf952f7da55019482445106b24b31 Add missing break diff --git a/src/demuxers/demux_mod.c b/src/demuxers/demux_mod.c --- a/src/demuxers/demux_mod.c +++ b/src/demuxers/demux_mod.c @@ -325,6 +325,7 @@ case METHOD_BY_CONTENT: if (!probe_mod_file(input)) return NULL; + break; default: return NULL; } |
From: Petri H. <phi...@us...> - 2018-04-11 15:58:58
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523462308 -10800 # Node ID abd98d8ad26cf952f7da55019482445106b24b31 # Branch default # Parent 51d12874ce47e9a50a5128898ab233443d5105e9 Check seek result in _x_demux_read_header() diff --git a/src/xine-engine/demux.c b/src/xine-engine/demux.c --- a/src/xine-engine/demux.c +++ b/src/xine-engine/demux.c @@ -498,9 +498,11 @@ return 0; if (input->get_capabilities(input) & INPUT_CAP_SEEKABLE) { - input->seek (input, 0, SEEK_SET); + if (input->seek (input, 0, SEEK_SET) != 0) + return 0; want_size = input->read (input, buffer, want_size); - input->seek (input, 0, SEEK_SET); + if (input->seek (input, 0, SEEK_SET) != 0) + return 0; /* no point to continue any further */ return want_size; } |
From: Petri H. <phi...@us...> - 2018-04-11 15:56:03
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523461110 -10800 # Node ID 51d12874ce47e9a50a5128898ab233443d5105e9 # Branch default # Parent b80975b12a4675e66339900bd88ef77b10eecdd6 demux_real: fix null deref diff --git a/src/demuxers/demux_real.c b/src/demuxers/demux_real.c --- a/src/demuxers/demux_real.c +++ b/src/demuxers/demux_real.c @@ -1870,7 +1870,8 @@ this->fragment_size = 0; this->fragment_count = 0; this->audio_need_keyframe = 1; - this->audio_stream->sub_packet_cnt = 0; + if (this->audio_stream) + this->audio_stream->sub_packet_cnt = 0; if (playing) _x_demux_flush_engine (this->stream); |
From: Petri H. <phi...@us...> - 2018-04-11 15:56:02
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523444501 -10800 # Node ID b80975b12a4675e66339900bd88ef77b10eecdd6 # Branch default # Parent aa4293049c6a4d7ffb0e52100302b6bb14b11228 Mark only internally used _x_parse_url() static diff --git a/src/input/http_helper.c b/src/input/http_helper.c --- a/src/input/http_helper.c +++ b/src/input/http_helper.c @@ -37,7 +37,7 @@ return NULL; } -int _x_parse_url (const char *url, +static int _x_parse_url (const char *url, char **proto, char** host, int *port, char **user, char **password, char **uri, const char **user_agent) --git a/src/input/http_helper.h b/src/input/http_helper.h --- a/src/input/http_helper.h +++ b/src/input/http_helper.h @@ -45,11 +45,6 @@ * 0 invalid url * 1 valid url */ -int _x_parse_url (const char *url, - char **proto, char** host, int *port, - char **user, char **password, char **uri, - const char **user_agent); - typedef struct { char *proto; |
From: Petri H. <phi...@us...> - 2018-04-11 15:56:01
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523439880 -10800 # Node ID aa4293049c6a4d7ffb0e52100302b6bb14b11228 # Branch default # Parent a563ce57d89ab14d84c52fbfc7e7b5c9beeb2380 check seek result diff --git a/src/combined/nsf_demuxer.c b/src/combined/nsf_demuxer.c --- a/src/combined/nsf_demuxer.c +++ b/src/combined/nsf_demuxer.c @@ -88,7 +88,8 @@ static int open_nsf_file(demux_nsf_t *this) { unsigned char header[NSF_HEADER_SIZE]; - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) + return 0; if (this->input->read(this->input, header, NSF_HEADER_SIZE) != NSF_HEADER_SIZE) return 0; --git a/src/combined/xine_ogg_demuxer.c b/src/combined/xine_ogg_demuxer.c --- a/src/combined/xine_ogg_demuxer.c +++ b/src/combined/xine_ogg_demuxer.c @@ -1823,7 +1823,8 @@ this->num_spu_streams = 0; this->avg_bitrate = 1; - this->input->seek (this->input, 0, SEEK_SET); + if (this->input->seek (this->input, 0, SEEK_SET) != 0) + this->status = DEMUX_FINISHED; if (this->status == DEMUX_OK) { _x_demux_control_start(this->stream); --git a/src/demuxers/demux_aud.c b/src/demuxers/demux_aud.c --- a/src/demuxers/demux_aud.c +++ b/src/demuxers/demux_aud.c @@ -109,7 +109,8 @@ return 0; /* file is qualified; skip over the header bytes in the stream */ - this->input->seek(this->input, AUD_HEADER_SIZE, SEEK_SET); + if (this->input->seek(this->input, AUD_HEADER_SIZE, SEEK_SET) != AUD_HEADER_SIZE) + return 0; /* flag 0 indicates stereo */ this->audio_channels = (header[10] & 0x1) + 1; --git a/src/demuxers/demux_eawve.c b/src/demuxers/demux_eawve.c --- a/src/demuxers/demux_eawve.c +++ b/src/demuxers/demux_eawve.c @@ -104,7 +104,8 @@ uint8_t header[12]; if (this->input->get_current_pos(this->input) != 0) - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) + return 0; if (this->input->read(this->input, header, sizeof(header)) != sizeof(header)) return 0; --git a/src/demuxers/demux_elem.c b/src/demuxers/demux_elem.c --- a/src/demuxers/demux_elem.c +++ b/src/demuxers/demux_elem.c @@ -119,7 +119,8 @@ if (INPUT_IS_SEEKABLE(this->input)) { int num_buffers = NUM_PREVIEW_BUFFERS; - this->input->seek (this->input, 0, SEEK_SET); + if (this->input->seek (this->input, 0, SEEK_SET) != 0) + return; this->status = DEMUX_OK ; while ((num_buffers > 0) && (this->status == DEMUX_OK)) { --git a/src/demuxers/demux_fli.c b/src/demuxers/demux_fli.c --- a/src/demuxers/demux_fli.c +++ b/src/demuxers/demux_fli.c @@ -87,17 +87,17 @@ return 0; /* file is qualified; skip over the signature bytes in the stream */ - this->input->seek(this->input, FLI_HEADER_SIZE, SEEK_SET); + if (this->input->seek(this->input, FLI_HEADER_SIZE, SEEK_SET) != FLI_HEADER_SIZE) + return 0; /* check if this is a special FLI file from Magic Carpet game */ if (_X_LE_16(&this->fli_header[16]) == FLI_CHUNK_MAGIC_1) { /* if the input is non-seekable, do not bother with playing the * special file type */ - if (INPUT_IS_SEEKABLE(this->input)) { - this->input->seek(this->input, FLI_HEADER_SIZE_MC, SEEK_SET); - } else { + if (!INPUT_IS_SEEKABLE(this->input)) return 0; - } + if (this->input->seek(this->input, FLI_HEADER_SIZE_MC, SEEK_SET) < 0) + return 0; /* use a contrived internal FLI type, 0xAF13 */ this->magic_number = FLI_FILE_MAGIC_3; @@ -209,8 +209,11 @@ this->video_fifo->put(this->video_fifo, buf); } this->pts_counter += this->frame_pts_inc; - } else - this->input->seek(this->input, chunk_size, SEEK_CUR); + } else { + if (this->input->seek(this->input, chunk_size, SEEK_CUR) < 0) { + this->status = DEMUX_FINISHED; + } + } return this->status; } --git a/src/demuxers/demux_idcin.c b/src/demuxers/demux_idcin.c --- a/src/demuxers/demux_idcin.c +++ b/src/demuxers/demux_idcin.c @@ -322,7 +322,8 @@ this->wave.wBitsPerSample); /* file is qualified; skip over the signature bytes in the stream */ - this->input->seek(this->input, IDCIN_HEADER_SIZE, SEEK_SET); + if (this->input->seek(this->input, IDCIN_HEADER_SIZE, SEEK_SET) != IDCIN_HEADER_SIZE) + return 0; /* read the Huffman table */ if (this->input->read(this->input, this->huffman_table, HUFFMAN_TABLE_SIZE) != --git a/src/demuxers/demux_iff.c b/src/demuxers/demux_iff.c --- a/src/demuxers/demux_iff.c +++ b/src/demuxers/demux_iff.c @@ -668,7 +668,9 @@ return 0; /* file is qualified; skip over the header bytes in the stream */ - this->input->seek(this->input, IFF_SIGNATURE_SIZE, SEEK_SET); + if (this->input->seek(this->input, IFF_SIGNATURE_SIZE, SEEK_SET) + != IFF_SIGNATURE_SIZE) + return 0; return read_iff_chunk( this ); --git a/src/demuxers/demux_image.c b/src/demuxers/demux_image.c --- a/src/demuxers/demux_image.c +++ b/src/demuxers/demux_image.c @@ -109,7 +109,10 @@ _x_demux_control_start(this->stream); - this->input->seek (this->input, 0, SEEK_SET); + if (this->input->seek (this->input, 0, SEEK_SET) != 0) { + this->status = DEMUX_FINISHED; + return; + } this->bytes_left = this->input->get_length (this->input); if (this->bytes_left < 0) this->bytes_left = 0; --git a/src/demuxers/demux_mng.c b/src/demuxers/demux_mng.c --- a/src/demuxers/demux_mng.c +++ b/src/demuxers/demux_mng.c @@ -84,7 +84,9 @@ if (!INPUT_IS_SEEKABLE(this->input)) { return MNG_FALSE; } - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) { + return MNG_FALSE; + } } return MNG_TRUE; --git a/src/demuxers/demux_mpc.c b/src/demuxers/demux_mpc.c --- a/src/demuxers/demux_mpc.c +++ b/src/demuxers/demux_mpc.c @@ -149,7 +149,8 @@ lprintf("first frame size: %u\n", first_frame_size); /* Move input to start of data (to nearest multiple of 4) */ - this->input->seek(this->input, 28+id3v2_size, SEEK_SET); + if (this->input->seek(this->input, 28+id3v2_size, SEEK_SET) < 0) + return 0; /* Set stream info */ _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO, 1); --git a/src/demuxers/demux_mpeg_block.c b/src/demuxers/demux_mpeg_block.c --- a/src/demuxers/demux_mpeg_block.c +++ b/src/demuxers/demux_mpeg_block.c @@ -1046,7 +1046,8 @@ they should continue to be so throughout. */ - this->input->seek (this->input, pos, SEEK_SET); + if (this->input->seek (this->input, pos, SEEK_SET) != pos) + return 0; while ( (buf = this->input->read_block (this->input, this->video_fifo, blocksize)) && count < MAX_SAMPLES && reads++ < MAX_READS ) { @@ -1181,14 +1182,16 @@ input_plugin_t *input) { uint8_t scratch[4]; - input->seek(input, 2048, SEEK_SET); + if (input->seek(input, 2048, SEEK_SET) != 2048) + return 0; if (input->read(input, scratch, 4) != 4) return 0; if (scratch[0] || scratch[1] || (scratch[2] != 0x01) || (scratch[3] != 0xba)) { - input->seek(input, 2324, SEEK_SET); + if (input->seek(input, 2324, SEEK_SET) != 2324) + return 0; if (input->read(input, scratch, 4) != 4) return 0; if (scratch[0] || scratch[1] @@ -1233,7 +1236,8 @@ int num_buffers = NUM_PREVIEW_BUFFERS; - this->input->seek (this->input, 0, SEEK_SET); + if (this->input->seek (this->input, 0, SEEK_SET) != 0) + return; this->status = DEMUX_OK ; while ( (num_buffers>0) && (this->status == DEMUX_OK) ) { @@ -1387,7 +1391,10 @@ return NULL; } - input->seek(input, 0, SEEK_SET); + if (input->seek(input, 0, SEEK_SET) != 0) { + free (this); + return NULL; + } if (input->read(input, scratch, 5)) { lprintf("open_plugin:read worked\n"); @@ -1406,7 +1413,10 @@ return NULL; } - input->seek(input, 0, SEEK_SET); + if (input->seek(input, 0, SEEK_SET) != 0) { + free (this); + return NULL; + } lprintf("open_plugin:Accepting detection_method XINE_DEMUX_CONTENT_STRATEGY blocksize=%d\n", this->blocksize); --git a/src/demuxers/demux_mpgaudio.c b/src/demuxers/demux_mpgaudio.c --- a/src/demuxers/demux_mpgaudio.c +++ b/src/demuxers/demux_mpgaudio.c @@ -860,7 +860,8 @@ * try to skip by seeking. */ if (INPUT_IS_SEEKABLE (input)) { - input->seek (input, 10 + tag_size, SEEK_SET); + if (input->seek (input, 10 + tag_size, SEEK_SET) < 0) + return 0; preview_len = input->read (input, buf, MAX_PREVIEW_SIZE); if (!sniff_buffer_looks_like_mp3 (buf, preview_len, version, layer)) { lprintf ("sniff_buffer_looks_like_mp3 failed\n"); @@ -918,7 +919,10 @@ } /* seek back to the beginning */ - this->input->seek (this->input, 0, SEEK_SET); + if (this->input->seek (this->input, 0, SEEK_SET) != 0) { + this->status = DEMUX_FINISHED; + return; + } /* * send preview buffers --git a/src/demuxers/demux_playlist.c b/src/demuxers/demux_playlist.c --- a/src/demuxers/demux_playlist.c +++ b/src/demuxers/demux_playlist.c @@ -558,7 +558,8 @@ _x_demux_control_start (this->stream); - this->input->seek (this->input, 0, SEEK_SET); + if (this->input->seek (this->input, 0, SEEK_SET) != 0) + this->status = DEMUX_FINISHED; } --git a/src/demuxers/demux_pva.c b/src/demuxers/demux_pva.c --- a/src/demuxers/demux_pva.c +++ b/src/demuxers/demux_pva.c @@ -190,7 +190,9 @@ /* audio */ if(!this->audio_fifo) { - this->input->seek(this->input, chunk_size, SEEK_CUR); + if (this->input->seek(this->input, chunk_size, SEEK_CUR) < 0) { + this->status = DEMUX_FINISHED; + } return this->status; } @@ -236,7 +238,10 @@ } /* skip rest of header */ - this->input->seek (this->input, header_len, SEEK_CUR); + if (this->input->seek (this->input, header_len, SEEK_CUR) < 0) { + this->status = DEMUX_FINISHED; + return this->status; + } buf = this->input->read_block (this->input, this->audio_fifo, chunk_size); @@ -256,7 +261,10 @@ } else { /* unknown, skip it */ - this->input->seek(this->input, chunk_size, SEEK_CUR); + if (this->input->seek(this->input, chunk_size, SEEK_CUR) < 0) { + this->status = DEMUX_FINISHED; + return this->status; + } } --git a/src/demuxers/demux_rawdv.c b/src/demuxers/demux_rawdv.c --- a/src/demuxers/demux_rawdv.c +++ b/src/demuxers/demux_rawdv.c @@ -153,10 +153,12 @@ return; if (INPUT_IS_SEEKABLE(this->input)) { - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) + return; if( this->input->read (this->input, scratch, NTSC_FRAME_SIZE) != NTSC_FRAME_SIZE ) return; - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) + return; } else { if( this->input->read (this->input, scratch, NTSC_FRAME_SIZE) != NTSC_FRAME_SIZE ) --git a/src/demuxers/demux_roq.c b/src/demuxers/demux_roq.c --- a/src/demuxers/demux_roq.c +++ b/src/demuxers/demux_roq.c @@ -150,13 +150,15 @@ } /* skip the rest of the chunk */ - this->input->seek(this->input, chunk_size, SEEK_CUR); + if (this->input->seek(this->input, chunk_size, SEEK_CUR) < 0) + break; } /* after all is said and done, if there is a width and a height, * regard it as being a valid file and reset to the first chunk */ if (this->bih.biWidth && this->bih.biHeight) { - this->input->seek(this->input, 8, SEEK_SET); + if (this->input->seek(this->input, 8, SEEK_SET) != 8) + return 0; } else { return 0; } --git a/src/demuxers/demux_smjpeg.c b/src/demuxers/demux_smjpeg.c --- a/src/demuxers/demux_smjpeg.c +++ b/src/demuxers/demux_smjpeg.c @@ -105,7 +105,8 @@ return 0; /* file is qualified; jump over the header + version to the duration */ - this->input->seek(this->input, sizeof(SMJPEG_SIGNATURE) + 4, SEEK_SET); + if (this->input->seek(this->input, sizeof(SMJPEG_SIGNATURE) + 4, SEEK_SET) < 0) + return 0; if (this->input->read(this->input, header_chunk, 4) != 4) return 0; this->duration = _X_BE_32(&header_chunk[0]); @@ -169,7 +170,8 @@ * of the chunk */ if (this->input->read(this->input, header_chunk, 4) != 4) return 0; - this->input->seek(this->input, _X_BE_32(&header_chunk[0]), SEEK_CUR); + if (this->input->seek(this->input, _X_BE_32(&header_chunk[0]), SEEK_CUR) < 0) + return 0; break; } } @@ -285,8 +287,10 @@ } else { /* skip the chunk if it can't be handled */ - this->input->seek(this->input, remaining_sample_bytes, SEEK_CUR); - + if (this->input->seek(this->input, remaining_sample_bytes, SEEK_CUR) < 0) { + this->status = DEMUX_FINISHED; + return this->status; + } } if (chunk_tag == vidD_TAG) --git a/src/demuxers/demux_str.c b/src/demuxers/demux_str.c --- a/src/demuxers/demux_str.c +++ b/src/demuxers/demux_str.c @@ -181,7 +181,8 @@ memset(this->channel_type, 0, sizeof(this->channel_type)); - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) + return 0; if (this->input->read(this->input, check_bytes, STR_CHECK_BYTES) != STR_CHECK_BYTES) { lprintf("read error\n"); @@ -273,8 +274,11 @@ /* seek to the next sector and read in the header */ local_offset = 0; - this->input->seek(this->input, this->data_start + - ((sector+1) * CD_RAW_SECTOR_SIZE), SEEK_SET); + if (this->input->seek(this->input, this->data_start + + ((sector+1) * CD_RAW_SECTOR_SIZE), SEEK_SET) < 0) { + lprintf("sector %d seek error\n", sector); + return 0; + } if (this->input->read(this->input, check_bytes, 0x30) != 0x30) { lprintf("sector %d read error\n", sector); return 0; --git a/src/demuxers/demux_vmd.c b/src/demuxers/demux_vmd.c --- a/src/demuxers/demux_vmd.c +++ b/src/demuxers/demux_vmd.c @@ -146,7 +146,8 @@ * independently */ toc_offset = _X_LE_32(&vmd_header[812]); this->frame_count = _X_LE_16(&vmd_header[6]); - this->input->seek(this->input, toc_offset + this->frame_count * 6, SEEK_SET); + if (this->input->seek(this->input, toc_offset + this->frame_count * 6, SEEK_SET) < 0) + return 0; /* while we have the toal number of blocks, calculate the total running * time */ @@ -222,7 +223,11 @@ frame = &this->frame_table[this->current_frame]; /* position the stream (will probably be there already) */ - this->input->seek(this->input, frame->frame_offset, SEEK_SET); + if (this->input->seek(this->input, frame->frame_offset, SEEK_SET) < 0) { + /* skip to next frame */ + this->current_frame++; + return this->status; + } remaining_bytes = frame->frame_size; if (!frame->is_audio_frame) { --git a/src/demuxers/demux_vox.c b/src/demuxers/demux_vox.c --- a/src/demuxers/demux_vox.c +++ b/src/demuxers/demux_vox.c @@ -139,7 +139,8 @@ this->status = DEMUX_OK; /* start at the beginning of the file */ - this->input->seek(this->input, 0, SEEK_SET); + if (this->input->seek(this->input, 0, SEEK_SET) != 0) + this->status = DEMUX_FINISHED; } return this->status; --git a/src/demuxers/demux_yuv4mpeg2.c b/src/demuxers/demux_yuv4mpeg2.c --- a/src/demuxers/demux_yuv4mpeg2.c +++ b/src/demuxers/demux_yuv4mpeg2.c @@ -228,7 +228,8 @@ } /* file is qualified; seek to first frame */ - this->input->seek(this->input, this->data_start, SEEK_SET); + if (this->input->seek(this->input, this->data_start, SEEK_SET) != this->data_start) + return 0; return 1; } |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:59
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523437162 -10800 # Node ID a563ce57d89ab14d84c52fbfc7e7b5c9beeb2380 # Branch default # Parent bf05dc8edc95bf300e3bed091f9436c1d8113eca http: reduce instance size No need to store function-local data in plugin instance diff --git a/src/input/input_http.c b/src/input/input_http.c --- a/src/input/input_http.c +++ b/src/input/input_http.c @@ -85,8 +85,6 @@ off_t curpos; off_t contentlength; - char buf[BUFSIZE]; - char preview[MAX_PREVIEW_SIZE]; off_t preview_size; @@ -565,6 +563,7 @@ int proxyport; int mpegurl_redirect = 0; char mime_type[256]; + char buf[BUFSIZE]; mime_type[0] = 0; use_proxy = this_class->proxyhost && strlen(this_class->proxyhost); @@ -635,46 +634,46 @@ if (use_proxy) { if (this->url.port != DEFAULT_HTTP_PORT) { - snprintf (this->buf, BUFSIZE, "GET http://%s:%d%s HTTP/1.0\015\012", + snprintf (buf, sizeof(buf), "GET http://%s:%d%s HTTP/1.0\015\012", this->url.host, this->url.port, this->url.uri); } else { - snprintf (this->buf, BUFSIZE, "GET http://%s%s HTTP/1.0\015\012", + snprintf (buf, sizeof(buf), "GET http://%s%s HTTP/1.0\015\012", this->url.host, this->url.uri); } } else - snprintf (this->buf, BUFSIZE, "GET %s HTTP/1.0\015\012", this->url.uri); + snprintf (buf, sizeof(buf), "GET %s HTTP/1.0\015\012", this->url.uri); - buflen = strlen(this->buf); + buflen = strlen(buf); if (this->url.port != DEFAULT_HTTP_PORT) - snprintf (this->buf + buflen, BUFSIZE - buflen, "Host: %s:%d\015\012", + snprintf (buf + buflen, sizeof(buf) - buflen, "Host: %s:%d\015\012", this->url.host, this->url.port); else - snprintf (this->buf + buflen, BUFSIZE - buflen, "Host: %s\015\012", + snprintf (buf + buflen, sizeof(buf) - buflen, "Host: %s\015\012", this->url.host); - buflen = strlen(this->buf); + buflen = strlen(buf); if (use_proxy && this_class->proxyuser && strlen(this_class->proxyuser)) { char *proxyauth; http_plugin_basicauth (this_class->proxyuser, this_class->proxypassword, &proxyauth); - snprintf (this->buf + buflen, BUFSIZE - buflen, + snprintf (buf + buflen, sizeof(buf) - buflen, "Proxy-Authorization: Basic %s\015\012", proxyauth); - buflen = strlen(this->buf); + buflen = strlen(buf); free(proxyauth); } if (this->url.user && strlen(this->url.user)) { char *auth; http_plugin_basicauth (this->url.user, this->url.password, &auth); - snprintf (this->buf + buflen, BUFSIZE - buflen, + snprintf (buf + buflen, sizeof(buf) - buflen, "Authorization: Basic %s\015\012", auth); - buflen = strlen(this->buf); + buflen = strlen(buf); free(auth); } - snprintf(this->buf + buflen, BUFSIZE - buflen, + snprintf(buf + buflen, sizeof(buf) - buflen, "User-Agent: %s%sxine/%s\015\012" "Accept: */*\015\012" "Icy-MetaData: 1\015\012" @@ -682,14 +681,14 @@ this->user_agent ? this->user_agent : "", this->user_agent ? " " : "", VERSION); - buflen = strlen(this->buf); - if (_x_io_tcp_write (this->stream, this->fh, this->buf, buflen) != buflen) { + buflen = strlen(buf); + if (_x_io_tcp_write (this->stream, this->fh, buf, buflen) != buflen) { _x_message(this->stream, XINE_MSG_CONNECTION_REFUSED, "couldn't send request", NULL); xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "input_http: couldn't send request\n"); return -4; } - lprintf ("request sent: >%s<\n", this->buf); + lprintf ("request sent: >%s<\n", buf); /* read and parse reply */ done = 0; len = 0; linenum = 0; @@ -698,34 +697,34 @@ while (!done) { /* fprintf (stderr, "input_http: read...\n"); */ - if (_x_io_tcp_read (this->stream, this->fh, &this->buf[len], 1) <= 0) { + if (_x_io_tcp_read (this->stream, this->fh, &buf[len], 1) <= 0) { return -5; } - if (this->buf[len] == '\012') { + if (buf[len] == '\012') { - this->buf[len] = '\0'; + buf[len] = '\0'; len--; - if (len >= 0 && this->buf[len] == '\015') { - this->buf[len] = '\0'; + if (len >= 0 && buf[len] == '\015') { + buf[len] = '\0'; len--; } linenum++; - lprintf ("answer: >%s<\n", this->buf); + lprintf ("answer: >%s<\n", buf); if (linenum == 1) { int httpver, httpsub; char httpstatus[51] = { 0, }; [... 29 lines omitted ...] + char *href = (buf + 10); lprintf ("trying to open target of redirection: >%s<\n", href); @@ -786,13 +785,13 @@ return http_plugin_open(this_gen); } - if (!strncasecmp (this->buf, "WWW-Authenticate: ", 18)) - strcpy (this->preview, this->buf + 18); + if (!strncasecmp (buf, "WWW-Authenticate: ", 18)) + strcpy (this->preview, buf + 18); { static const char mpegurl_ct_str[] = "Content-Type: audio/x-mpegurl"; static const size_t mpegurl_ct_size = sizeof(mpegurl_ct_str)-1; - if (!strncasecmp(this->buf, mpegurl_ct_str, mpegurl_ct_size)) { + if (!strncasecmp(buf, mpegurl_ct_str, mpegurl_ct_size)) { lprintf("Opening an audio/x-mpegurl file, late redirect."); mpegurl_redirect = 1; @@ -800,42 +799,42 @@ } /* Icecast / ShoutCast Stuff */ - if (!strncasecmp(this->buf, TAG_ICY_NAME, sizeof(TAG_ICY_NAME) - 1)) { + if (!strncasecmp(buf, TAG_ICY_NAME, sizeof(TAG_ICY_NAME) - 1)) { _x_meta_info_set(this->stream, XINE_META_INFO_ALBUM, - (this->buf + sizeof(TAG_ICY_NAME) - 1 + - (*(this->buf + sizeof(TAG_ICY_NAME) - 1) == ' '))); + (buf + sizeof(TAG_ICY_NAME) - 1 + + (*(buf + sizeof(TAG_ICY_NAME) - 1) == ' '))); _x_meta_info_set(this->stream, XINE_META_INFO_TITLE, - (this->buf + sizeof(TAG_ICY_NAME) - 1 + - (*(this->buf + sizeof(TAG_ICY_NAME) - 1) == ' '))); + (buf + sizeof(TAG_ICY_NAME) - 1 + + (*(buf + sizeof(TAG_ICY_NAME) - 1) == ' '))); } - if (!strncasecmp(this->buf, TAG_ICY_GENRE, sizeof(TAG_ICY_GENRE) - 1)) { + if (!strncasecmp(buf, TAG_ICY_GENRE, sizeof(TAG_ICY_GENRE) - 1)) { _x_meta_info_set(this->stream, XINE_META_INFO_GENRE, - (this->buf + sizeof(TAG_ICY_GENRE) - 1 + - (*(this->buf + sizeof(TAG_ICY_GENRE) - 1) == ' '))); + (buf + sizeof(TAG_ICY_GENRE) - 1 + + (*(buf + sizeof(TAG_ICY_GENRE) - 1) == ' '))); } /* icy-notice1 is always the same */ - if (!strncasecmp(this->buf, TAG_ICY_NOTICE2, sizeof(TAG_ICY_NOTICE2) - 1)) { + if (!strncasecmp(buf, TAG_ICY_NOTICE2, sizeof(TAG_ICY_NOTICE2) - 1)) { char *end; - if((end = strstr(this->buf, "<BR>"))) + if((end = strstr(buf, "<BR>"))) *end = '\0'; _x_meta_info_set(this->stream, XINE_META_INFO_COMMENT, - (this->buf + sizeof(TAG_ICY_NOTICE2) - 1 + - (*(this->buf + sizeof(TAG_ICY_NOTICE2) - 1) == ' '))); + (buf + sizeof(TAG_ICY_NOTICE2) - 1 + + (*(buf + sizeof(TAG_ICY_NOTICE2) - 1) == ' '))); } /* metadata interval (in byte) */ - if (sscanf(this->buf, TAG_ICY_METAINT"%d", &this->shoutcast_metaint) == 1) { + if (sscanf(buf, TAG_ICY_METAINT"%d", &this->shoutcast_metaint) == 1) { lprintf("shoutcast_metaint: %d\n", this->shoutcast_metaint); this->shoutcast_mode = 1; this->shoutcast_pos = 0; } /* content type */ - if (!strncasecmp(this->buf, TAG_CONTENT_TYPE, sizeof(TAG_CONTENT_TYPE) - 1)) { - const char *type = this->buf + sizeof (TAG_CONTENT_TYPE) - 1; + if (!strncasecmp(buf, TAG_CONTENT_TYPE, sizeof(TAG_CONTENT_TYPE) - 1)) { + const char *type = buf + sizeof (TAG_CONTENT_TYPE) - 1; while (isspace (*type)) ++type; sprintf (mime_type, "%.255s", type); @@ -844,7 +843,7 @@ this->is_nsv = 1; } } - if ( !strncasecmp(this->buf, TAG_LASTFM_SERVER, sizeof(TAG_LASTFM_SERVER)-1) ) { + if ( !strncasecmp(buf, TAG_LASTFM_SERVER, sizeof(TAG_LASTFM_SERVER)-1) ) { lprintf("last.fm streaming server detected\n"); this->is_lastfm = 1; } @@ -856,10 +855,10 @@ len = 0; } else len ++; - if ( len >= BUFSIZE ) { + if ( len >= sizeof(buf) ) { _x_message(this->stream, XINE_MSG_PERMISSION_ERROR, this->mrl, NULL); xine_log (this->stream->xine, XINE_LOG_MSG, - _("input_http: buffer exhausted after %d bytes."), BUFSIZE); + _("input_http: buffer exhausted after %zu bytes."), sizeof(buf)); return -10; } } @@ -871,11 +870,11 @@ this->mrl, *this->preview ? this->preview : NULL, NULL); if ( mpegurl_redirect ) { - char buf[4096] = { 0, }; + char urlbuf[4096] = { 0, }; char *newline = NULL; - http_plugin_read_int(this, buf, 4095); - newline = strstr(buf, "\r\n"); + http_plugin_read_int(this, urlbuf, sizeof(urlbuf) - 1); + newline = strstr(urlbuf, "\r\n"); /* If the newline can't be found, either the 4K buffer is too small, or * more likely something is fuzzy. @@ -885,9 +884,9 @@ *newline = '\0'; - lprintf("mpegurl pointing to %s\n", buf); + lprintf("mpegurl pointing to %s\n", urlbuf); - href = _x_canonicalise_url (this->mrl, buf); + href = _x_canonicalise_url (this->mrl, urlbuf); free(this->mrl); this->mrl = href; return http_plugin_open(this_gen); |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:58
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523365686 -10800 # Node ID bf05dc8edc95bf300e3bed091f9436c1d8113eca # Branch default # Parent a610d9223a6e8e1657060e2372b5ec4a36523563 demux_qt: fix segfaults diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -1761,7 +1761,9 @@ n = trak->chunk_offset_count; if (!n) return QT_OK; - for (i = 0; i < trak->sample_to_chunk_count - 1; i++) { + if (!trak->sample_to_chunk_count) + return QT_OK; + for (i = 0; i < (int)trak->sample_to_chunk_count - 1; i++) { int s = trak->sample_to_chunk_table[i].samples_per_chunk; if ((samples_per_frame != 1) && (s % samples_per_frame)) return QT_OK; /* unaligned chunk, should not happen */ @@ -1827,7 +1829,7 @@ /* iterate from the first chunk of the current table entry to * the first chunk of the next table entry */ chunk_start = trak->sample_to_chunk_table[i].first_chunk; - if (i < trak->sample_to_chunk_count - 1) + if (i < (int)trak->sample_to_chunk_count - 1) chunk_end = trak->sample_to_chunk_table[i + 1].first_chunk; else @@ -2026,7 +2028,7 @@ /* iterate from the first chunk of the current table entry to * the first chunk of the next table entry */ chunk_start = trak->sample_to_chunk_table[i].first_chunk; - if (i < trak->sample_to_chunk_count - 1) + if (i < (int)trak->sample_to_chunk_count - 1) chunk_end = trak->sample_to_chunk_table[i + 1].first_chunk; else @@ -3321,6 +3323,9 @@ int left, middle, right; int found; + if (!trak->frame_count) + return QT_OK; + /* perform a binary search on the trak, testing the offset * boundaries first; offset request has precedent over time request */ if (start_pos) { |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:57
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523358718 -10800 # Node ID a610d9223a6e8e1657060e2372b5ec4a36523563 # Branch default # Parent 3c83640cf4371a97a15f586271df346c99fa528d demux_qt: simplify open() diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -3520,6 +3520,17 @@ return NULL; } + switch (stream->content_detection_method) { + case METHOD_BY_CONTENT: + case METHOD_BY_MRL: + case METHOD_EXPLICIT: + if (!is_qt_file(input)) + return NULL; + break; + default: + return NULL; + } + this = calloc(1, sizeof(demux_qt_t)); this->stream = stream; this->input = input; @@ -3544,18 +3555,15 @@ this->status = DEMUX_FINISHED; + if ((this->qt = create_qt_info (this)) == NULL) { + free (this); + return NULL; + } + switch (stream->content_detection_method) { case METHOD_BY_CONTENT: - if (!is_qt_file(this->input)) { - free (this); - return NULL; - } - if ((this->qt = create_qt_info (this)) == NULL) { - free (this); - return NULL; - } last_error = open_qt_file(this->qt, this->input, this->bandwidth); if (last_error == QT_DRM_NOT_SUPPORTED) { @@ -3573,28 +3581,14 @@ break; - case METHOD_BY_MRL: - case METHOD_EXPLICIT: { - - if (!is_qt_file(this->input)) { - free (this); - return NULL; - } - if ((this->qt = create_qt_info (this)) == NULL) { - free (this); - return NULL; - } + default: if (open_qt_file(this->qt, this->input, this->bandwidth) != QT_OK) { free_qt_info (this->qt); free (this); return NULL; } - } + break; - - default: - free (this); - return NULL; } if (this->qt->fragment_count > 0) |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:56
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523358515 -10800 # Node ID 3c83640cf4371a97a15f586271df346c99fa528d # Branch default # Parent 43274c42abda059e8c70002365108246cb16f6ef Drop useless variable diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -3510,9 +3510,8 @@ } static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *stream, - input_plugin_t *input_gen) { - - input_plugin_t *input = (input_plugin_t *) input_gen; + input_plugin_t *input) { + demux_qt_t *this; xine_cfg_entry_t entry; qt_error last_error; |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:54
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523356262 -10800 # Node ID 43274c42abda059e8c70002365108246cb16f6ef # Branch default # Parent 43fcbff8764e6c41be9cd5c60223f38765f12fcb qt: bail out on seek error diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -593,7 +593,8 @@ } /* rewind the stream so we can keep looking */ - input->seek(input, -ATOM_PREAMBLE_SIZE, SEEK_CUR); + if (input->seek(input, -ATOM_PREAMBLE_SIZE, SEEK_CUR) < 0) + return; } /* if the moov atom is found, log the position and break from the loop */ @@ -637,16 +638,18 @@ } else atom_size -= ATOM_PREAMBLE_SIZE; - input->seek(input, atom_size, SEEK_CUR); + if (input->seek(input, atom_size, SEEK_CUR) < 0) + return; } + /* reset to the start of the stream on the way out */ + if (input->seek(input, 0, SEEK_SET) != 0) + return; + if ((*moov_offset == -1) && (free_moov_offset != -1)) { *moov_offset = free_moov_offset; *moov_size = free_moov_size; } - - /* reset to the start of the stream on the way out */ - input->seek(input, 0, SEEK_SET); } /* create a qt_info structure or return NULL if no memory */ @@ -774,7 +777,8 @@ /* check that the next atom in the chunk contains alphanumeric * characters in the atom type field; if not, disqualify the file * as a QT file */ - qt_file->seek(qt_file, moov_atom_offset + ATOM_PREAMBLE_SIZE, SEEK_SET); + if (qt_file->seek(qt_file, moov_atom_offset + ATOM_PREAMBLE_SIZE, SEEK_SET) < 0) + return 0; if (qt_file->read(qt_file, atom_preamble, ATOM_PREAMBLE_SIZE) != ATOM_PREAMBLE_SIZE) return 0; @@ -2348,7 +2352,8 @@ return 0; for (pos = 0; pos < fsize; pos += atomsize) { - input->seek (input, pos, SEEK_SET); + if (input->seek (input, pos, SEEK_SET) != pos) + break; if (input->read (input, buf, 16) != 16) break; atomsize = _X_BE_32 (buf); @@ -2846,8 +2851,12 @@ } remaining_sample_bytes = trak->frames[i].size; - if (trak->frames[i].offset != current_pos) - this->input->seek (this->input, trak->frames[i].offset, SEEK_SET); + if (trak->frames[i].offset != current_pos) { + if (this->input->seek (this->input, trak->frames[i].offset, SEEK_SET) < 0) { + /* Do not stop demuxing. Maybe corrupt file or broken track. */ + return this->status; + } + } if (i + 1 < trak->frame_count) { /* frame duration is the pts diff between this video frame and @@ -2933,8 +2942,12 @@ remaining_sample_bytes = trak->frames[i].size; - if (trak->frames[i].offset != current_pos) - this->input->seek (this->input, trak->frames[i].offset, SEEK_SET); + if (trak->frames[i].offset != current_pos) { + if (this->input->seek (this->input, trak->frames[i].offset, SEEK_SET) < 0) { + /* Do not stop demuxing. Maybe corrupt file or broken track. */ + return this->status; + } + } debug_audio_demux(" qt: sending off audio frame %d from offset 0x%"PRIX64", %d bytes, media id %d, %"PRId64" pts\n", i, |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:53
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523351675 -10800 # Node ID 43fcbff8764e6c41be9cd5c60223f38765f12fcb # Branch default # Parent 042f01118d5cee81bbe19152f7023088ce6fa659 demux_mng: simplify init diff --git a/src/demuxers/demux_mng.c b/src/demuxers/demux_mng.c --- a/src/demuxers/demux_mng.c +++ b/src/demuxers/demux_mng.c @@ -275,7 +275,23 @@ demux_mng_t *this; + switch (stream->content_detection_method) { + case METHOD_BY_CONTENT: + case METHOD_EXPLICIT: + if (!INPUT_IS_SEEKABLE(input)) + return NULL; + break; + + case METHOD_BY_MRL: + break; + default: + return NULL; + } + this = calloc(1, sizeof(demux_mng_t)); + if (!this) + return NULL; + this->stream = stream; this->input = input; @@ -291,24 +307,6 @@ this->status = DEMUX_FINISHED; - switch (stream->content_detection_method) { - case METHOD_BY_CONTENT: - case METHOD_EXPLICIT: - if (!INPUT_IS_SEEKABLE(this->input)) { - free(this); - return NULL; - } - break; - - case METHOD_BY_MRL: - break; - - default: - free(this); - return NULL; - break; - } - if ((this->mngh = mng_initialize(this, mymng_alloc, mymng_free, MNG_NULL)) == MNG_NULL) { free(this); return NULL; |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:52
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523351030 -10800 # Node ID 042f01118d5cee81bbe19152f7023088ce6fa659 # Branch default # Parent 1447c7b78c55d92da1eedb869f209b6ebbbb0ffe demux_mod: improve probing and cleanup probe logic broken in 9638 diff --git a/src/demuxers/demux_mod.c b/src/demuxers/demux_mod.c --- a/src/demuxers/demux_mod.c +++ b/src/demuxers/demux_mod.c @@ -92,14 +92,14 @@ * @retval 1 The file has been identified as a valid modplug file * @todo Just Protracker files are detected right now. */ -static int probe_mod_file(demux_mod_t *this) { +static int probe_mod_file(input_plugin_t *input) { /* We need the value present at offset 1080, of size 4 */ union { uint8_t buffer[1080+4]; /* The raw buffer */ uint32_t values[(1080+4)/sizeof(uint32_t)]; } header; - if (_x_demux_read_header(this->input, header.buffer, 1080+4) != 1080+4) + if (_x_demux_read_header(input, header.buffer, 1080+4) != 1080+4) return 0; /* Magic numbers taken from GNU file's magic description */ @@ -156,7 +156,6 @@ if(total_read != this->filesize) { xine_log(this->stream->xine, XINE_LOG_PLUGIN, "modplug - filesize error\n"); - free(this->buffer); return 0; } @@ -171,7 +170,6 @@ this->mpfile = ModPlug_Load(this->buffer, this->filesize); if (this->mpfile==NULL) { xine_log(this->stream->xine, XINE_LOG_PLUGIN, "modplug - load error\n"); - free(this->buffer); return 0; } @@ -282,11 +280,12 @@ static void demux_mod_dispose (demux_plugin_t *this_gen) { demux_mod_t *this = (demux_mod_t *) this_gen; - ModPlug_Unload(this->mpfile); - free(this->buffer); - free(this->title); - free(this->artist); - free(this->copyright); + if (this->mpfile) + ModPlug_Unload(this->mpfile); + _x_freep(&this->buffer); + _x_freep(&this->title); + _x_freep(&this->artist); + _x_freep(&this->copyright); free(this); } @@ -320,7 +319,20 @@ return NULL; } + switch (stream->content_detection_method) { + case METHOD_EXPLICIT: + case METHOD_BY_MRL: + case METHOD_BY_CONTENT: + if (!probe_mod_file(input)) + return NULL; + default: + return NULL; + } + this = calloc(1, sizeof(demux_mod_t)); + if (!this) + return NULL; + this->stream = stream; this->input = input; @@ -338,18 +350,8 @@ xprintf(stream->xine, XINE_VERBOSITY_DEBUG, "TEST mod decode\n"); - switch (stream->content_detection_method) { - - case METHOD_EXPLICIT: - case METHOD_BY_MRL: - break; - - case METHOD_BY_CONTENT: - if (probe_mod_file(this) && open_mod_file(this)) - break; - /* fall through */ - default: - free (this); + if (!open_mod_file(this)) { + demux_mod_dispose(&this->demux_plugin); return NULL; } |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:51
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523347802 -10800 # Node ID 1447c7b78c55d92da1eedb869f209b6ebbbb0ffe # Branch default # Parent 10a9e360b6668a351e8c58fcc63c22640c039259 Fix possible division by zero diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c --- a/src/demuxers/demux_avi.c +++ b/src/demuxers/demux_avi.c @@ -413,6 +413,9 @@ lprintf("get_audio_pts: track=%d, posc=%d, postot=%" PRIdMAX ", posb=%d\n", track, posc, (intmax_t)postot, posb); + if (at->dwRate == 0) + return 0; + if ((at->dwSampleSize == 0) && (at->dwScale > 1)) { /* variable bitrate */ lprintf("get_audio_pts: VBR: nBlockAlign=%d, dwSampleSize=%d, dwScale=%d, dwRate=%d\n", |
From: Petri H. <phi...@us...> - 2018-04-11 15:55:50
|
# HG changeset patch # User Petri Hintukainen <phi...@us...> # Date 1523461681 -10800 # Node ID 10a9e360b6668a351e8c58fcc63c22640c039259 # Branch default # Parent 648ab0f9adfd4bcf4e7de462136152351834c746 Fix NULL deref diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c --- a/src/demuxers/demux_avi.c +++ b/src/demuxers/demux_avi.c @@ -416,13 +416,15 @@ if ((at->dwSampleSize == 0) && (at->dwScale > 1)) { /* variable bitrate */ lprintf("get_audio_pts: VBR: nBlockAlign=%d, dwSampleSize=%d, dwScale=%d, dwRate=%d\n", - at->wavex->nBlockAlign, at->dwSampleSize, at->dwScale, at->dwRate); + at->wavex ? at->wavex->nBlockAlign : 0, + at->dwSampleSize, at->dwScale, at->dwRate); return (int64_t)(90000.0 * (double)(posc + at->dwStart) * (double)at->dwScale / (double)at->dwRate); } else { /* constant bitrate */ lprintf("get_audio_pts: CBR: nBlockAlign=%d, dwSampleSize=%d, dwScale=%d, dwRate=%d\n", - at->wavex->nBlockAlign, at->dwSampleSize, at->dwScale, at->dwRate); + at->wavex ? at->wavex->nBlockAlign : 0, + at->dwSampleSize, at->dwScale, at->dwRate); if( at->wavex && at->wavex->nBlockAlign ) { return (int64_t)((double)((postot + posb) / (double)at->wavex->nBlockAlign + at->dwStart) * (double)at->dwScale / (double)at->dwRate * 90000.0); |