* Interplay MVE Video Decoder
* Copyright (C) 2003 the ffmpeg project
*
- * This library is free software; you can redistribute it and/or
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
*
- * This library is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
*/
/**
- * @file interplayvideo.c
+ * @file libavcodec/interplayvideo.c
* Interplay MVE Video Decoder by Mike Melanson (melanson@pcisys.net)
* For more information about the Interplay MVE format, visit:
* http://www.pcisys.net/~melanson/codecs/interplay-mve.txt
#include <string.h>
#include <unistd.h>
-#include "common.h"
#include "avcodec.h"
+#include "bytestream.h"
#include "dsputil.h"
#define PALETTE_COUNT 256
AVFrame second_last_frame;
AVFrame last_frame;
AVFrame current_frame;
- unsigned char *decoding_map;
+ const unsigned char *decoding_map;
int decoding_map_size;
- unsigned char *buf;
+ const unsigned char *buf;
int size;
- unsigned char *stream_ptr;
- unsigned char *stream_end;
+ const unsigned char *stream_ptr;
+ const unsigned char *stream_end;
unsigned char *pixel_ptr;
int line_inc;
int stride;
motion_offset, s->upper_motion_limit_offset); \
return -1; \
} \
- s->dsp.put_pixels_tab[0][0](s->pixel_ptr, \
+ s->dsp.put_pixels_tab[1][0](s->pixel_ptr, \
s->current_frame.data[0] + motion_offset, s->stride, 8);
#define COPY_FROM_PREVIOUS() \
motion_offset, s->upper_motion_limit_offset); \
return -1; \
} \
- s->dsp.put_pixels_tab[0][0](s->pixel_ptr, \
+ s->dsp.put_pixels_tab[1][0](s->pixel_ptr, \
s->last_frame.data[0] + motion_offset, s->stride, 8);
#define COPY_FROM_SECOND_LAST() \
motion_offset, s->upper_motion_limit_offset); \
return -1; \
} \
- s->dsp.put_pixels_tab[0][0](s->pixel_ptr, \
+ s->dsp.put_pixels_tab[1][0](s->pixel_ptr, \
s->second_last_frame.data[0] + motion_offset, s->stride, 8);
static int ipvideo_decode_block_opcode_0x0(IpvideoContext *s)
/* need 2 more bytes from the stream */
CHECK_STREAM_PTR(2);
- B[0] = *s->stream_ptr++;
- B[1] = *s->stream_ptr++;
- flags = (B[1] << 8) | B[0];
+ flags = bytestream_get_le16(&s->stream_ptr);
bitmask = 0x0001;
for (y = 0; y < 8; y += 2) {
for (x = 0; x < 8; x += 2, bitmask <<= 1) {
{
int x, y;
unsigned char P[4];
- unsigned char B[4];
unsigned int flags = 0;
int shifter = 0;
unsigned char pix;
for (y = 0; y < 8; y++) {
/* get the next set of 8 2-bit flags */
- flags = (s->stream_ptr[1] << 8) | s->stream_ptr[0];
- s->stream_ptr += 2;
+ flags = bytestream_get_le16(&s->stream_ptr);
for (x = 0, shifter = 0; x < 8; x++, shifter += 2) {
*s->pixel_ptr++ = P[(flags >> shifter) & 0x03];
}
/* 1 of 4 colors for each 2x2 block, need 4 more bytes */
CHECK_STREAM_PTR(4);
- B[0] = *s->stream_ptr++;
- B[1] = *s->stream_ptr++;
- B[2] = *s->stream_ptr++;
- B[3] = *s->stream_ptr++;
- flags = (B[3] << 24) | (B[2] << 16) | (B[1] << 8) | B[0];
+ flags = bytestream_get_le32(&s->stream_ptr);
shifter = 0;
for (y = 0; y < 8; y += 2) {
for (y = 0; y < 8; y++) {
/* time to reload flags? */
if ((y == 0) || (y == 4)) {
- B[0] = *s->stream_ptr++;
- B[1] = *s->stream_ptr++;
- B[2] = *s->stream_ptr++;
- B[3] = *s->stream_ptr++;
- flags = (B[3] << 24) | (B[2] << 16) | (B[1] << 8) | B[0];
+ flags = bytestream_get_le32(&s->stream_ptr);
shifter = 0;
}
for (x = 0; x < 8; x += 2, shifter += 2) {
for (y = 0; y < 8; y += 2) {
/* time to reload flags? */
if ((y == 0) || (y == 4)) {
- B[0] = *s->stream_ptr++;
- B[1] = *s->stream_ptr++;
- B[2] = *s->stream_ptr++;
- B[3] = *s->stream_ptr++;
- flags = (B[3] << 24) | (B[2] << 16) | (B[1] << 8) | B[0];
+ flags = bytestream_get_le32(&s->stream_ptr);
shifter = 0;
}
for (x = 0; x < 8; x++, shifter += 2) {
s->line_inc = s->stride - 8;
s->upper_motion_limit_offset = (s->avctx->height - 8) * s->stride
+ s->avctx->width - 8;
- s->dsp = s->dsp;
for (y = 0; y < (s->stride * s->avctx->height); y += s->stride * 8) {
for (x = y; x < y + s->avctx->width; x += 8) {
}
}
-static int ipvideo_decode_init(AVCodecContext *avctx)
+static av_cold int ipvideo_decode_init(AVCodecContext *avctx)
{
IpvideoContext *s = avctx->priv_data;
}
avctx->pix_fmt = PIX_FMT_PAL8;
- avctx->has_b_frames = 0;
dsputil_init(&s->dsp, avctx);
/* decoding map contains 4 bits of information per 8x8 block */
static int ipvideo_decode_frame(AVCodecContext *avctx,
void *data, int *data_size,
- uint8_t *buf, int buf_size)
+ const uint8_t *buf, int buf_size)
{
IpvideoContext *s = avctx->priv_data;
AVPaletteControl *palette_control = avctx->palctrl;
return buf_size;
}
-static int ipvideo_decode_end(AVCodecContext *avctx)
+static av_cold int ipvideo_decode_end(AVCodecContext *avctx)
{
IpvideoContext *s = avctx->priv_data;
ipvideo_decode_end,
ipvideo_decode_frame,
CODEC_CAP_DR1,
+ .long_name = NULL_IF_CONFIG_SMALL("Interplay MVE video"),
};