summaryrefslogtreecommitdiff
path: root/src/combined
diff options
context:
space:
mode:
Diffstat (limited to 'src/combined')
-rw-r--r--src/combined/ffmpeg/ff_audio_decoder.c36
-rw-r--r--src/combined/ffmpeg/ff_video_decoder.c6
-rw-r--r--src/combined/ffmpeg/xine_video.list3
3 files changed, 41 insertions, 4 deletions
diff --git a/src/combined/ffmpeg/ff_audio_decoder.c b/src/combined/ffmpeg/ff_audio_decoder.c
index 0367d0e50..db2dc8fa2 100644
--- a/src/combined/ffmpeg/ff_audio_decoder.c
+++ b/src/combined/ffmpeg/ff_audio_decoder.c
@@ -80,13 +80,41 @@ typedef struct ff_audio_decoder_s {
#include "ff_audio_list.h"
+#define malloc16(s) realloc16(NULL,s)
+#define free16(p) realloc16(p,0)
+
+static void *realloc16 (void *m, size_t s) {
+ unsigned int diff, diff2;
+ unsigned char *p = m, *q;
+ if (p) {
+ diff = p[-1];
+ if (s == 0) {
+ free (p - diff);
+ return (NULL);
+ }
+ q = realloc (p - diff, s + 16);
+ if (!q) return (q);
+ diff2 = 16 - ((unsigned int)q & 15);
+ if (diff2 != diff) memmove (q + diff2, q + diff, s);
+ } else {
+ if (s == 0) return (NULL);
+ q = malloc (s + 16);
+ if (!q) return (q);
+ diff2 = 16 - ((unsigned int)q & 15);
+ }
+ q += diff2;
+ q[-1] = diff2;
+ return (q);
+}
+
+
static void ff_audio_ensure_buffer_size(ff_audio_decoder_t *this, int size) {
if (size > this->bufsize) {
this->bufsize = size + size / 2;
xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
_("ffmpeg_audio_dec: increasing buffer to %d to avoid overflow.\n"),
this->bufsize);
- this->buf = realloc( this->buf, this->bufsize );
+ this->buf = realloc16 (this->buf, this->bufsize);
}
}
@@ -246,7 +274,7 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
this->size = 0;
- this->decode_buffer = calloc(1, AVCODEC_MAX_AUDIO_FRAME_SIZE);
+ this->decode_buffer = malloc16 (AVCODEC_MAX_AUDIO_FRAME_SIZE);
return;
}
@@ -454,8 +482,8 @@ static void ff_audio_dispose (audio_decoder_t *this_gen) {
this->stream->audio_out->close (this->stream->audio_out, this->stream);
this->output_open = 0;
- free(this->buf);
- free(this->decode_buffer);
+ free16 (this->buf);
+ free16 (this->decode_buffer);
if(this->context && this->context->extradata)
free(this->context->extradata);
diff --git a/src/combined/ffmpeg/ff_video_decoder.c b/src/combined/ffmpeg/ff_video_decoder.c
index b20ccad70..5e4967f6c 100644
--- a/src/combined/ffmpeg/ff_video_decoder.c
+++ b/src/combined/ffmpeg/ff_video_decoder.c
@@ -318,6 +318,10 @@ static void init_video_codec (ff_video_decoder_t *this, unsigned int codec_type)
this->context->flags |= CODEC_FLAG_EMU_EDGE;
}
+ /* TJ. without this, it wont work at all on my machine */
+ this->context->codec_id = this->codec->id;
+ this->context->codec_type = this->codec->type;
+
if (this->class->choose_speed_over_accuracy)
this->context->flags2 |= CODEC_FLAG2_FAST;
@@ -898,6 +902,8 @@ static void ff_handle_header_buffer (ff_video_decoder_t *this, buf_element_t *bu
switch (codec_type) {
case BUF_VIDEO_RV10:
case BUF_VIDEO_RV20:
+ case BUF_VIDEO_RV30:
+ case BUF_VIDEO_RV40:
this->bih.biWidth = _X_BE_16(&this->buf[12]);
this->bih.biHeight = _X_BE_16(&this->buf[14]);
diff --git a/src/combined/ffmpeg/xine_video.list b/src/combined/ffmpeg/xine_video.list
index 144bbe1c2..009f4dafd 100644
--- a/src/combined/ffmpeg/xine_video.list
+++ b/src/combined/ffmpeg/xine_video.list
@@ -21,6 +21,8 @@ I263 H263I ITU H.263
H263 H263 H.263
RV10 RV10 Real Video 1.0
RV20 RV20 Real Video 2.0
+RV30 RV30 Real Video 3.0
+RV40 RV40 Real Video 4.0
IV31 INDEO3 Indeo Video 3.1
IV32 INDEO3 Indeo Video 3.2
SORENSON_V1 SVQ1 Sorenson Video 1
@@ -31,6 +33,7 @@ VP31 VP3 On2 VP3.1
VP5 VP5 On2 VP5
VP6 VP6 On2 VP6
VP6F VP6F On2 VP6
+VP8 VP8 On2 VP8
4XM 4XM 4X Video
CINEPAK CINEPAK Cinepak
MSVC MSVIDEO1 Microsoft Video 1