Go to the documentation of this file.
38 #define PALETTE_COUNT 256
39 #define CHECK_STREAM_PTR(n) \
40 if ((stream_ptr + n) > s->size ) { \
41 av_log(s->avctx, AV_LOG_ERROR, " MS Video-1 warning: stream_ptr out of bounds (%d >= %d)\n", \
42 stream_ptr + n, s->size); \
51 const unsigned char *
buf;
69 if (
s->avctx->bits_per_coded_sample == 8) {
88 int block_ptr, pixel_ptr;
92 int blocks_wide, blocks_high;
98 unsigned char byte_a, byte_b;
101 unsigned char colors[8];
102 unsigned char *
pixels =
s->frame->data[0];
103 int stride =
s->frame->linesize[0];
107 blocks_wide =
s->avctx->width / 4;
108 blocks_high =
s->avctx->height / 4;
109 total_blocks = blocks_wide * blocks_high;
113 for (block_y = blocks_high; block_y > 0; block_y--) {
114 block_ptr = ((block_y * 4) - 1) *
stride;
115 for (block_x = blocks_wide; block_x > 0; block_x--) {
118 block_ptr += block_inc;
124 pixel_ptr = block_ptr;
128 byte_a =
s->buf[stream_ptr++];
129 byte_b =
s->buf[stream_ptr++];
132 if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0))
134 else if ((byte_b & 0xFC) == 0x84) {
136 skip_blocks = ((byte_b - 0x84) << 8) + byte_a - 1;
137 }
else if (byte_b < 0x80) {
139 flags = (byte_b << 8) | byte_a;
142 colors[0] =
s->buf[stream_ptr++];
143 colors[1] =
s->buf[stream_ptr++];
145 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
146 for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
148 pixel_ptr -= row_dec;
150 }
else if (byte_b >= 0x90) {
152 flags = (byte_b << 8) | byte_a;
155 memcpy(colors, &
s->buf[stream_ptr], 8);
158 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
159 for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
161 colors[((pixel_y & 0x2) << 1) +
162 (pixel_x & 0x2) + ((
flags & 0x1) ^ 1)];
163 pixel_ptr -= row_dec;
169 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
170 for (pixel_x = 0; pixel_x < 4; pixel_x++)
171 pixels[pixel_ptr++] = colors[0];
172 pixel_ptr -= row_dec;
176 block_ptr += block_inc;
188 int block_ptr, pixel_ptr;
190 int pixel_x, pixel_y;
191 int block_x, block_y;
192 int blocks_wide, blocks_high;
198 unsigned char byte_a, byte_b;
199 unsigned short flags;
201 unsigned short colors[8];
202 unsigned short *
pixels = (
unsigned short *)
s->frame->data[0];
203 int stride =
s->frame->linesize[0] / 2;
207 blocks_wide =
s->avctx->width / 4;
208 blocks_high =
s->avctx->height / 4;
209 total_blocks = blocks_wide * blocks_high;
213 for (block_y = blocks_high; block_y > 0; block_y--) {
214 block_ptr = ((block_y * 4) - 1) *
stride;
215 for (block_x = blocks_wide; block_x > 0; block_x--) {
218 block_ptr += block_inc;
224 pixel_ptr = block_ptr;
228 byte_a =
s->buf[stream_ptr++];
229 byte_b =
s->buf[stream_ptr++];
232 if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0)) {
234 }
else if ((byte_b & 0xFC) == 0x84) {
236 skip_blocks = ((byte_b - 0x84) << 8) + byte_a - 1;
237 }
else if (byte_b < 0x80) {
239 flags = (byte_b << 8) | byte_a;
242 colors[0] =
AV_RL16(&
s->buf[stream_ptr]);
244 colors[1] =
AV_RL16(&
s->buf[stream_ptr]);
247 if (colors[0] & 0x8000) {
250 colors[2] =
AV_RL16(&
s->buf[stream_ptr]);
252 colors[3] =
AV_RL16(&
s->buf[stream_ptr]);
254 colors[4] =
AV_RL16(&
s->buf[stream_ptr]);
256 colors[5] =
AV_RL16(&
s->buf[stream_ptr]);
258 colors[6] =
AV_RL16(&
s->buf[stream_ptr]);
260 colors[7] =
AV_RL16(&
s->buf[stream_ptr]);
263 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
264 for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
266 colors[((pixel_y & 0x2) << 1) +
267 (pixel_x & 0x2) + ((
flags & 0x1) ^ 1)];
268 pixel_ptr -= row_dec;
272 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
273 for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
275 pixel_ptr -= row_dec;
280 colors[0] = (byte_b << 8) | byte_a;
282 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
283 for (pixel_x = 0; pixel_x < 4; pixel_x++)
284 pixels[pixel_ptr++] = colors[0];
285 pixel_ptr -= row_dec;
289 block_ptr += block_inc;
296 void *
data,
int *got_frame,
300 int buf_size = avpkt->
size;
308 if (buf_size < (avctx->
width/4) * (avctx->
height/4) / 512) {
322 s->frame->palette_has_changed = 1;
static av_cold int init(AVCodecContext *avctx)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
#define CHECK_STREAM_PTR(n)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static av_cold int msvideo1_decode_init(AVCodecContext *avctx)
This structure describes decoded (raw) audio or video data.
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
Identical in function to av_frame_make_writable(), except it uses ff_get_buffer() to allocate the buf...
static av_cold int msvideo1_decode_end(AVCodecContext *avctx)
static void msvideo1_decode_16bit(Msvideo1Context *s)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static void msvideo1_decode_8bit(Msvideo1Context *s)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size)
Get side information from packet.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
#define AV_PIX_FMT_RGB555
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
main external API structure.
AVCodec ff_msvideo1_decoder
const unsigned char * buf
This structure stores compressed data.
int width
picture width / height.
#define flags(name, subs,...)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int msvideo1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)