37 #define PALETTE_COUNT 256 
   38 #define CHECK_STREAM_PTR(n) \ 
   39   if ((stream_ptr + n) > s->size ) { \ 
   40     av_log(s->avctx, AV_LOG_ERROR, " MS Video-1 warning: stream_ptr out of bounds (%d >= %d)\n", \ 
   41       stream_ptr + n, s->size); \ 
   50     const unsigned char *
buf;
 
   68     if (
s->avctx->bits_per_coded_sample == 8) {
 
   87     int block_ptr, pixel_ptr;
 
   91     int blocks_wide, blocks_high;  
 
   97     unsigned char byte_a, byte_b;
 
  100     unsigned char colors[8];
 
  101     unsigned char *pixels = 
s->frame->data[0];
 
  102     int stride = 
s->frame->linesize[0];
 
  106     blocks_wide = 
s->avctx->width / 4;
 
  107     blocks_high = 
s->avctx->height / 4;
 
  108     total_blocks = blocks_wide * blocks_high;
 
  112     for (block_y = blocks_high; block_y > 0; block_y--) {
 
  113         block_ptr = ((block_y * 4) - 1) * 
stride;
 
  114         for (block_x = blocks_wide; block_x > 0; block_x--) {
 
  117                 block_ptr += block_inc;
 
  123             pixel_ptr = block_ptr;
 
  127             byte_a = 
s->buf[stream_ptr++];
 
  128             byte_b = 
s->buf[stream_ptr++];
 
  131             if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0))
 
  133             else if ((byte_b & 0xFC) == 0x84) {
 
  135                 skip_blocks = ((byte_b - 0x84) << 8) + byte_a - 1;
 
  136             } 
else if (byte_b < 0x80) {
 
  138                 flags = (byte_b << 8) | byte_a;
 
  141                 colors[0] = 
s->buf[stream_ptr++];
 
  142                 colors[1] = 
s->buf[stream_ptr++];
 
  144                 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
 
  145                     for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
 
  146                         pixels[pixel_ptr++] = colors[(
flags & 0x1) ^ 1];
 
  147                     pixel_ptr -= row_dec;
 
  149             } 
else if (byte_b >= 0x90) {
 
  151                 flags = (byte_b << 8) | byte_a;
 
  154                 memcpy(colors, &
s->buf[stream_ptr], 8);
 
  157                 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
 
  158                     for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
 
  159                         pixels[pixel_ptr++] =
 
  160                             colors[((pixel_y & 0x2) << 1) +
 
  161                                 (pixel_x & 0x2) + ((
flags & 0x1) ^ 1)];
 
  162                     pixel_ptr -= row_dec;
 
  168                 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
 
  169                     for (pixel_x = 0; pixel_x < 4; pixel_x++)
 
  170                         pixels[pixel_ptr++] = colors[0];
 
  171                     pixel_ptr -= row_dec;
 
  175             block_ptr += block_inc;
 
  187     int block_ptr, pixel_ptr;
 
  189     int pixel_x, pixel_y;  
 
  190     int block_x, block_y;  
 
  191     int blocks_wide, blocks_high;  
 
  197     unsigned char byte_a, byte_b;
 
  198     unsigned short flags;
 
  200     unsigned short colors[8];
 
  201     unsigned short *pixels = (
unsigned short *)
s->frame->data[0];
 
  202     int stride = 
s->frame->linesize[0] / 2;
 
  206     blocks_wide = 
s->avctx->width / 4;
 
  207     blocks_high = 
s->avctx->height / 4;
 
  208     total_blocks = blocks_wide * blocks_high;
 
  212     for (block_y = blocks_high; block_y > 0; block_y--) {
 
  213         block_ptr = ((block_y * 4) - 1) * 
stride;
 
  214         for (block_x = blocks_wide; block_x > 0; block_x--) {
 
  217                 block_ptr += block_inc;
 
  223             pixel_ptr = block_ptr;
 
  227             byte_a = 
s->buf[stream_ptr++];
 
  228             byte_b = 
s->buf[stream_ptr++];
 
  231             if ((byte_a == 0) && (byte_b == 0) && (total_blocks == 0)) {
 
  233             } 
else if ((byte_b & 0xFC) == 0x84) {
 
  235                 skip_blocks = ((byte_b - 0x84) << 8) + byte_a - 1;
 
  236             } 
else if (byte_b < 0x80) {
 
  238                 flags = (byte_b << 8) | byte_a;
 
  241                 colors[0] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  243                 colors[1] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  246                 if (colors[0] & 0x8000) {
 
  249                     colors[2] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  251                     colors[3] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  253                     colors[4] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  255                     colors[5] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  257                     colors[6] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  259                     colors[7] = 
AV_RL16(&
s->buf[stream_ptr]);
 
  262                     for (pixel_y = 0; pixel_y < 4; pixel_y++) {
 
  263                         for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
 
  264                             pixels[pixel_ptr++] =
 
  265                                 colors[((pixel_y & 0x2) << 1) +
 
  266                                     (pixel_x & 0x2) + ((
flags & 0x1) ^ 1)];
 
  267                         pixel_ptr -= row_dec;
 
  271                     for (pixel_y = 0; pixel_y < 4; pixel_y++) {
 
  272                         for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1)
 
  273                             pixels[pixel_ptr++] = colors[(
flags & 0x1) ^ 1];
 
  274                         pixel_ptr -= row_dec;
 
  279                 colors[0] = (byte_b << 8) | byte_a;
 
  281                 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
 
  282                     for (pixel_x = 0; pixel_x < 4; pixel_x++)
 
  283                         pixels[pixel_ptr++] = colors[0];
 
  284                     pixel_ptr -= row_dec;
 
  288             block_ptr += block_inc;
 
  297     const uint8_t *buf = avpkt->
data;
 
  298     int buf_size = avpkt->
size;
 
  306     if (buf_size < (avctx->
width/4) * (avctx->
height/4) / 512) {
 
  342     .
p.
name         = 
"msvideo1",