diff options
Diffstat (limited to 'contrib/ffmpeg/libavcodec/vmdav.c')
-rw-r--r-- | contrib/ffmpeg/libavcodec/vmdav.c | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/contrib/ffmpeg/libavcodec/vmdav.c b/contrib/ffmpeg/libavcodec/vmdav.c index 69e8a44d3..d39ae91e3 100644 --- a/contrib/ffmpeg/libavcodec/vmdav.c +++ b/contrib/ffmpeg/libavcodec/vmdav.c @@ -17,7 +17,6 @@ * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * */ /** @@ -45,7 +44,6 @@ #include <string.h> #include <unistd.h> -#include "common.h" #include "avcodec.h" #include "dsputil.h" @@ -63,21 +61,22 @@ typedef struct VmdVideoContext { AVFrame frame; AVFrame prev_frame; - unsigned char *buf; + const unsigned char *buf; int size; unsigned char palette[PALETTE_COUNT * 4]; unsigned char *unpack_buffer; int unpack_buffer_size; + int x_off, y_off; } VmdVideoContext; #define QUEUE_SIZE 0x1000 #define QUEUE_MASK 0x0FFF -static void lz_unpack(unsigned char *src, unsigned char *dest, int dest_len) +static void lz_unpack(const unsigned char *src, unsigned char *dest, int dest_len) { - unsigned char *s; + const unsigned char *s; unsigned char *d; unsigned char *d_end; unsigned char queue[QUEUE_SIZE]; @@ -145,10 +144,10 @@ static void lz_unpack(unsigned char *src, unsigned char *dest, int dest_len) } } -static int rle_unpack(unsigned char *src, unsigned char *dest, +static int rle_unpack(const unsigned char *src, unsigned char *dest, int src_len, int dest_len) { - unsigned char *ps; + const unsigned char *ps; unsigned char *pd; int i, l; unsigned char *dest_end = dest + dest_len; @@ -191,9 +190,9 @@ static void vmd_decode(VmdVideoContext *s) unsigned char r, g, b; /* point to the start of the encoded data */ - unsigned char *p = s->buf + 16; + const unsigned char *p = s->buf + 16; - unsigned char *pb; + const unsigned char *pb; unsigned char meth; unsigned char *dp; /* pointer to current frame */ unsigned char *pp; /* pointer to previous frame */ @@ -209,6 +208,15 @@ static void vmd_decode(VmdVideoContext *s) frame_width = AV_RL16(&s->buf[10]) - frame_x + 1; frame_height = AV_RL16(&s->buf[12]) - frame_y + 1; + if ((frame_width == s->avctx->width && frame_height == s->avctx->height) && + (frame_x || frame_y)) { + + s->x_off = frame_x; + s->y_off = frame_y; + } + frame_x -= s->x_off; + frame_y -= s->y_off; + /* if only a certain region will be updated, copy the entire previous * frame before the decode */ if (frame_x || frame_y || (frame_width != s->avctx->width) || @@ -318,7 +326,7 @@ static void vmd_decode(VmdVideoContext *s) static int vmdvideo_decode_init(AVCodecContext *avctx) { - VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data; + VmdVideoContext *s = avctx->priv_data; int i; unsigned int *palette32; int palette_index = 0; @@ -328,7 +336,6 @@ static int vmdvideo_decode_init(AVCodecContext *avctx) s->avctx = avctx; avctx->pix_fmt = PIX_FMT_PAL8; - avctx->has_b_frames = 0; dsputil_init(&s->dsp, avctx); /* make sure the VMD header made it */ @@ -361,9 +368,9 @@ static int vmdvideo_decode_init(AVCodecContext *avctx) static int vmdvideo_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size) + const uint8_t *buf, int buf_size) { - VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data; + VmdVideoContext *s = avctx->priv_data; s->buf = buf; s->size = buf_size; @@ -382,14 +389,13 @@ static int vmdvideo_decode_frame(AVCodecContext *avctx, /* make the palette available on the way out */ memcpy(s->frame.data[1], s->palette, PALETTE_COUNT * 4); - if (s->prev_frame.data[0]) - avctx->release_buffer(avctx, &s->prev_frame); - /* shuffle frames */ - s->prev_frame = s->frame; + FFSWAP(AVFrame, s->frame, s->prev_frame); + if (s->frame.data[0]) + avctx->release_buffer(avctx, &s->frame); *data_size = sizeof(AVFrame); - *(AVFrame*)data = s->frame; + *(AVFrame*)data = s->prev_frame; /* report that the buffer was completely consumed */ return buf_size; @@ -397,7 +403,7 @@ static int vmdvideo_decode_frame(AVCodecContext *avctx, static int vmdvideo_decode_end(AVCodecContext *avctx) { - VmdVideoContext *s = (VmdVideoContext *)avctx->priv_data; + VmdVideoContext *s = avctx->priv_data; if (s->prev_frame.data[0]) avctx->release_buffer(avctx, &s->prev_frame); @@ -437,7 +443,7 @@ static uint16_t vmdaudio_table[128] = { static int vmdaudio_decode_init(AVCodecContext *avctx) { - VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data; + VmdAudioContext *s = avctx->priv_data; s->avctx = avctx; s->channels = avctx->channels; @@ -451,7 +457,7 @@ static int vmdaudio_decode_init(AVCodecContext *avctx) } static void vmdaudio_decode_audio(VmdAudioContext *s, unsigned char *data, - uint8_t *buf, int stereo) + const uint8_t *buf, int stereo) { int i; int chan = 0; @@ -462,14 +468,14 @@ static void vmdaudio_decode_audio(VmdAudioContext *s, unsigned char *data, s->predictors[chan] -= vmdaudio_table[buf[i] & 0x7F]; else s->predictors[chan] += vmdaudio_table[buf[i]]; - s->predictors[chan] = av_clip(s->predictors[chan], -32768, 32767); + s->predictors[chan] = av_clip_int16(s->predictors[chan]); out[i] = s->predictors[chan]; chan ^= stereo; } } static int vmdaudio_loadsound(VmdAudioContext *s, unsigned char *data, - uint8_t *buf, int silence) + const uint8_t *buf, int silence) { int bytes_decoded = 0; int i; @@ -516,13 +522,13 @@ static int vmdaudio_loadsound(VmdAudioContext *s, unsigned char *data, static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size) + const uint8_t *buf, int buf_size) { - VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data; + VmdAudioContext *s = avctx->priv_data; unsigned char *output_samples = (unsigned char *)data; /* point to the start of the encoded data */ - unsigned char *p = buf + 16; + const unsigned char *p = buf + 16; if (buf_size < 16) return buf_size; |