25 #define BITSTREAM_READER_LE 
   42     if (src_size < avctx->
width * avctx->
height * (int64_t)bpp) {
 
   52     for (h = 0; h < avctx->
height; h++) {
 
   53         memcpy(dst, src, avctx->
width * bpp);
 
   54         src += avctx->
width * bpp;
 
   83     for (h = 0; h < avctx->
height; h += 4) {
 
   84         for (w = 0; w < avctx->
width; w += 4) {
 
   89             U[w >> 2] = src[16] + 0x80;
 
   90             V[w >> 2] = src[17] + 0x80;
 
  124     for (h = 0; h < avctx->
height; h += 2) {
 
  125         for (w = 0; w < avctx->
width; w += 2) {
 
  128             U[w >> 1] = src[4] + 0x80;
 
  129             V[w >> 1] = src[5] + 0x80;
 
  160     for (h = 0; h < avctx->
height; h++) {
 
  161         for (w = 0; w < avctx->
width; w++) {
 
  163             U[w] = *src++ ^ 0x80;
 
  164             V[w] = *src++ ^ 0x80;
 
  174 static const uint8_t def_lru[8] = { 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xFF };
 
  185         memmove(lru + 1, lru, 
sizeof(*lru) * (8 - 1));
 
  188         memmove(lru + 1, lru, 
sizeof(*lru) * (c - 1));
 
  203         memmove(lru + 1, lru, 
sizeof(*lru) * (6 - 1));
 
  206         memmove(lru + 1, lru, 
sizeof(*lru) * (c - 1));
 
  222     memcpy(lru[2], def_lru_555, 8 * 
sizeof(*
def_lru));
 
  224     for (y = 0; y < 
height; y++) {
 
  225         for (x = 0; x < 
width; x++) {
 
  229             dst[x * 3 + 0] = (r << 3) | (r >> 2);
 
  230             dst[x * 3 + 1] = is_565 ? (g << 2) | (g >> 4) : (g << 3) | (g >> 2);
 
  231             dst[x * 3 + 2] = (b << 3) | (b >> 2);
 
  245     int nslices, slice, slice_height;
 
  246     uint32_t off, slice_size;
 
  251     nslices = bytestream2_get_le16(&gb);
 
  252     off = 
FFALIGN(nslices * 4 + 2, 16);
 
  253     if (src_size < off) {
 
  258     if (!nslices || avctx->
height % nslices) {
 
  264     slice_height = avctx->
height / nslices;
 
  270     for (slice = 0; slice < nslices; slice++) {
 
  271         slice_size = bytestream2_get_le32(&gb);
 
  272         if (slice_size > src_size - off) {
 
  274                    "invalid slice size %"PRIu32
" (only %"PRIu32
" bytes left)\n",
 
  275                    slice_size, src_size - off);
 
  278         if (slice_size <= 16) {
 
  283         if (
AV_RL32(src + off) != slice_size - 16) {
 
  285                    "Slice sizes mismatch: got %"PRIu32
" instead of %"PRIu32
"\n",
 
  286                    AV_RL32(src + off), slice_size - 16);
 
  292         dst += pic->
linesize[0] * slice_height;
 
  305     for (i = 0; i < 3; i++)
 
  308     for (y = 0; y < 
height; y++) {
 
  309         for (x = 0; x < 
width; x++) {
 
  326     int nslices, slice, slice_height;
 
  327     uint32_t off, slice_size;
 
  332     nslices = bytestream2_get_le16(&gb);
 
  333     off = 
FFALIGN(nslices * 4 + 2, 16);
 
  334     if (src_size < off) {
 
  339     if (!nslices || avctx->
height % nslices) {
 
  345     slice_height = avctx->
height / nslices;
 
  351     for (slice = 0; slice < nslices; slice++) {
 
  352         slice_size = bytestream2_get_le32(&gb);
 
  353         if (slice_size > src_size - off) {
 
  355                    "invalid slice size %"PRIu32
" (only %"PRIu32
" bytes left)\n",
 
  356                    slice_size, src_size - off);
 
  359         if (slice_size <= 16) {
 
  365         if (
AV_RL32(src + off) != slice_size - 16) {
 
  367                    "Slice sizes mismatch: got %"PRIu32
" instead of %"PRIu32
"\n",
 
  368                    AV_RL32(src + off), slice_size - 16);
 
  374         dst += pic->
linesize[0] * slice_height;
 
  383                                 int ystride, 
int ustride, 
int vstride)
 
  388     for (i = 0; i < 3; i++)
 
  391     for (y = 0; y < 
height; y += 4) {
 
  392         for (x = 0; x < 
width; x += 4) {
 
  393             for (j = 0; j < 4; j++)
 
  394                 for (i = 0; i < 4; i++)
 
  395                     Y[x + i + j * ystride] = 
decode_sym(gb, lru[0]);
 
  413     int nslices, slice, slice_height, ref_slice_height;
 
  415     uint32_t off, slice_size;
 
  420     nslices = bytestream2_get_le16(&gb);
 
  421     off = 
FFALIGN(nslices * 4 + 2, 16);
 
  422     if (src_size < off) {
 
  427     if (!nslices || avctx->
height % nslices) {
 
  433     ref_slice_height = avctx->
height / nslices;
 
  448     next_y = ref_slice_height;
 
  449     for (slice = 0; slice < nslices; slice++) {
 
  450         slice_size   = bytestream2_get_le32(&gb);
 
  451         slice_height = (next_y & ~3) - (cur_y & ~3);
 
  452         if (slice_size > src_size - off) {
 
  454                    "invalid slice size %"PRIu32
" (only %"PRIu32
" bytes left)\n",
 
  455                    slice_size, src_size - off);
 
  458         if (slice_size <= 16) {
 
  463         if (
AV_RL32(src + off) != slice_size - 16) {
 
  465                    "Slice sizes mismatch: got %"PRIu32
" instead of %"PRIu32
"\n",
 
  466                    AV_RL32(src + off), slice_size - 16);
 
  473         Y += pic->
linesize[0] *  slice_height;
 
  474         U += pic->
linesize[1] * (slice_height >> 2);
 
  475         V += pic->
linesize[2] * (slice_height >> 2);
 
  478         next_y += ref_slice_height;
 
  486                                 int ystride, 
int ustride, 
int vstride)
 
  491     for (i = 0; i < 3; i++)
 
  494     for (y = 0; y < 
height; y+=2) {
 
  495         for (x = 0; x < 
width; x += 2) {
 
  496             Y[x + 0 + 0 * ystride] = 
decode_sym(gb, lru[0]);
 
  497             Y[x + 1 + 0 * ystride] = 
decode_sym(gb, lru[0]);
 
  498             Y[x + 0 + 1 * ystride] = 
decode_sym(gb, lru[0]);
 
  499             Y[x + 1 + 1 * ystride] = 
decode_sym(gb, lru[0]);
 
  517     int nslices, slice, slice_height, ref_slice_height;
 
  519     uint32_t off, slice_size;
 
  524     nslices = bytestream2_get_le16(&gb);
 
  525     off = 
FFALIGN(nslices * 4 + 2, 16);
 
  526     if (src_size < off) {
 
  531     if (!nslices || avctx->
height % nslices) {
 
  537     ref_slice_height = avctx->
height / nslices;
 
  552     next_y = ref_slice_height;
 
  553     for (slice = 0; slice < nslices; slice++) {
 
  554         slice_size   = bytestream2_get_le32(&gb);
 
  555         slice_height = (next_y & ~1) - (cur_y & ~1);
 
  556         if (slice_size > src_size - off) {
 
  558                    "invalid slice size %"PRIu32
" (only %"PRIu32
" bytes left)\n",
 
  559                    slice_size, src_size - off);
 
  562         if (slice_size <= 16) {
 
  567         if (
AV_RL32(src + off) != slice_size - 16) {
 
  569                    "Slice sizes mismatch: got %"PRIu32
" instead of %"PRIu32
"\n",
 
  570                    AV_RL32(src + off), slice_size - 16);
 
  577         Y += pic->
linesize[0] *  slice_height;
 
  578         U += pic->
linesize[1] * (slice_height >> 1);
 
  579         V += pic->
linesize[2] * (slice_height >> 1);
 
  582         next_y += ref_slice_height;
 
  590                                 int ystride, 
int ustride, 
int vstride)
 
  595     for (i = 0; i < 3; i++)
 
  598     for (y = 0; y < 
height; y++) {
 
  599         for (x = 0; x < 
width; x++) {
 
  618     int nslices, slice, slice_height;
 
  619     uint32_t off, slice_size;
 
  624     nslices = bytestream2_get_le16(&gb);
 
  625     off = 
FFALIGN(nslices * 4 + 2, 16);
 
  626     if (src_size < off) {
 
  631     if (!nslices || avctx->
height % nslices) {
 
  637     slice_height = avctx->
height / nslices;
 
  647     for (slice = 0; slice < nslices; slice++) {
 
  648         slice_size = bytestream2_get_le32(&gb);
 
  649         if (slice_size > src_size - off) {
 
  651                    "invalid slice size %"PRIu32
" (only %"PRIu32
" bytes left)\n",
 
  652                    slice_size, src_size - off);
 
  655         if (slice_size <= 16) {
 
  660         if (
AV_RL32(src + off) != slice_size - 16) {
 
  662                    "Slice sizes mismatch: got %"PRIu32
" instead of %"PRIu32
"\n",
 
  663                    AV_RL32(src + off), slice_size - 16);
 
  670         Y += pic->
linesize[0] * slice_height;
 
  671         U += pic->
linesize[1] * slice_height;
 
  672         V += pic->
linesize[2] * slice_height;
 
  686     if (avpkt->
size < 16) {