43 #define BITSTREAM_READER_LE 
   53 #define VP8X_FLAG_ANIMATION             0x02 
   54 #define VP8X_FLAG_XMP_METADATA          0x04 
   55 #define VP8X_FLAG_EXIF_METADATA         0x08 
   56 #define VP8X_FLAG_ALPHA                 0x10 
   57 #define VP8X_FLAG_ICC                   0x20 
   59 #define MAX_PALETTE_SIZE                256 
   60 #define MAX_CACHE_BITS                  11 
   61 #define NUM_CODE_LENGTH_CODES           19 
   62 #define HUFFMAN_CODES_PER_META_CODE     5 
   63 #define NUM_LITERAL_CODES               256 
   64 #define NUM_LENGTH_CODES                24 
   65 #define NUM_DISTANCE_CODES              40 
   66 #define NUM_SHORT_DISTANCES             120 
   67 #define MAX_HUFFMAN_CODE_LENGTH         15 
   76     17, 18, 0, 1, 2, 3, 4, 5, 16, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
 
   80     {  0, 1 }, {  1, 0 }, {  1, 1 }, { -1, 1 }, {  0, 2 }, {  2, 0 }, {  1, 2 }, { -1, 2 },
 
   81     {  2, 1 }, { -2, 1 }, {  2, 2 }, { -2, 2 }, {  0, 3 }, {  3, 0 }, {  1, 3 }, { -1, 3 },
 
   82     {  3, 1 }, { -3, 1 }, {  2, 3 }, { -2, 3 }, {  3, 2 }, { -3, 2 }, {  0, 4 }, {  4, 0 },
 
   83     {  1, 4 }, { -1, 4 }, {  4, 1 }, { -4, 1 }, {  3, 3 }, { -3, 3 }, {  2, 4 }, { -2, 4 },
 
   84     {  4, 2 }, { -4, 2 }, {  0, 5 }, {  3, 4 }, { -3, 4 }, {  4, 3 }, { -4, 3 }, {  5, 0 },
 
   85     {  1, 5 }, { -1, 5 }, {  5, 1 }, { -5, 1 }, {  2, 5 }, { -2, 5 }, {  5, 2 }, { -5, 2 },
 
   86     {  4, 4 }, { -4, 4 }, {  3, 5 }, { -3, 5 }, {  5, 3 }, { -5, 3 }, {  0, 6 }, {  6, 0 },
 
   87     {  1, 6 }, { -1, 6 }, {  6, 1 }, { -6, 1 }, {  2, 6 }, { -2, 6 }, {  6, 2 }, { -6, 2 },
 
   88     {  4, 5 }, { -4, 5 }, {  5, 4 }, { -5, 4 }, {  3, 6 }, { -3, 6 }, {  6, 3 }, { -6, 3 },
 
   89     {  0, 7 }, {  7, 0 }, {  1, 7 }, { -1, 7 }, {  5, 5 }, { -5, 5 }, {  7, 1 }, { -7, 1 },
 
   90     {  4, 6 }, { -4, 6 }, {  6, 4 }, { -6, 4 }, {  2, 7 }, { -2, 7 }, {  7, 2 }, { -7, 2 },
 
   91     {  3, 7 }, { -3, 7 }, {  7, 3 }, { -7, 3 }, {  5, 6 }, { -5, 6 }, {  6, 5 }, { -6, 5 },
 
   92     {  8, 0 }, {  4, 7 }, { -4, 7 }, {  7, 4 }, { -7, 4 }, {  8, 1 }, {  8, 2 }, {  6, 6 },
 
   93     { -6, 6 }, {  8, 3 }, {  5, 7 }, { -5, 7 }, {  7, 5 }, { -7, 5 }, {  8, 4 }, {  6, 7 },
 
   94     { -6, 7 }, {  7, 6 }, { -7, 6 }, {  8, 5 }, {  7, 7 }, { -7, 7 }, {  8, 6 }, {  8, 7 }
 
  211 #define GET_PIXEL(frame, x, y) \ 
  212     ((frame)->data[0] + (y) * frame->linesize[0] + 4 * (x)) 
  214 #define GET_PIXEL_COMP(frame, x, y, c) \ 
  215     (*((frame)->data[0] + (y) * frame->linesize[0] + 4 * (x) + c)) 
  231     memset(img, 0, 
sizeof(*img));
 
  286     int len = 0, sym, code = 0, 
ret;
 
  287     int max_code_length = 0;
 
  291     for (sym = 0; sym < alphabet_size; sym++) {
 
  292         if (code_lengths[sym] > 0) {
 
  306     for (sym = 0; sym < alphabet_size; sym++)
 
  307         max_code_length = 
FFMAX(max_code_length, code_lengths[sym]);
 
  318     for (len = 1; len <= max_code_length; len++) {
 
  319         for (sym = 0; sym < alphabet_size; sym++) {
 
  320             if (code_lengths[sym] != len)
 
  333                    code_lengths, 
sizeof(*code_lengths), 
sizeof(*code_lengths),
 
  334                    codes, 
sizeof(*codes), 
sizeof(*codes), 0);
 
  363     HuffReader code_len_hc = { { 0 }, 0, 0, { 0 } };
 
  364     int *code_lengths = NULL;
 
  366     int i, symbol, max_symbol, prev_code_len, 
ret;
 
  372     for (i = 0; i < num_codes; i++)
 
  389         if (max_symbol > alphabet_size) {
 
  391                    max_symbol, alphabet_size);
 
  396         max_symbol = alphabet_size;
 
  401     while (symbol < alphabet_size) {
 
  409             code_lengths[symbol++] = code_len;
 
  411                 prev_code_len = code_len;
 
  413             int repeat = 0, 
length = 0;
 
  433             if (symbol + repeat > alphabet_size) {
 
  435                        "invalid symbol %d + repeat %d > alphabet size %d\n",
 
  436                        symbol, repeat, alphabet_size);
 
  441                 code_lengths[symbol++] = 
length;
 
  456 #define PARSE_BLOCK_SIZE(w, h) do {                                         \ 
  457     block_bits = get_bits(&s->gb, 3) + 2;                                   \ 
  458     blocks_w   = FFALIGN((w), 1 << block_bits) >> block_bits;               \ 
  459     blocks_h   = FFALIGN((h), 1 << block_bits) >> block_bits;               \ 
  465     int ret, block_bits, 
width, blocks_w, blocks_h, x, 
y, max;
 
  487             int p  = p0 << 8 | p1;
 
  498     int block_bits, blocks_w, blocks_h, 
ret;
 
  514     int block_bits, blocks_w, blocks_h, 
ret;
 
  531     int width_bits, index_size, 
ret, x;
 
  538     else if (index_size <= 4)
 
  540     else if (index_size <= 16)
 
  557     for (x = 4; x < img->
frame->
width * 4; x++, ct++)
 
  574         group       = g0 << 8 | g1;
 
  593     img       = &s->
image[role];
 
  689             if (prefix_code < 4) {
 
  690                 length = prefix_code + 1;
 
  693                 int offset     = 2 + (prefix_code & 1) << extra_bits;
 
  694                 length = offset + 
get_bits(&s->
gb, extra_bits) + 1;
 
  697             if (prefix_code < 4) {
 
  698                 distance = prefix_code + 1;
 
  701                 int offset     = 2 + (prefix_code & 1) << extra_bits;
 
  702                 distance = offset + 
get_bits(&s->
gb, extra_bits) + 1;
 
  709                 distance = 
FFMAX(1, xi + yi * width);
 
  722             while (distance >= width) {
 
  730             ref_x = 
FFMAX(0, ref_x);
 
  731             ref_y = 
FFMAX(0, ref_y);
 
  736             for (i = 0; i < 
length; i++) {
 
  749                 if (ref_x == width) {
 
  767                        "color cache index out-of-bounds\n");
 
  821     p[0] = p_t[0] + (p_l[0] + p_tr[0] >> 1) >> 1;
 
  822     p[1] = p_t[1] + (p_l[1] + p_tr[1] >> 1) >> 1;
 
  823     p[2] = p_t[2] + (p_l[2] + p_tr[2] >> 1) >> 1;
 
  824     p[3] = p_t[3] + (p_l[3] + p_tr[3] >> 1) >> 1;
 
  831     p[0] = p_l[0] + p_tl[0] >> 1;
 
  832     p[1] = p_l[1] + p_tl[1] >> 1;
 
  833     p[2] = p_l[2] + p_tl[2] >> 1;
 
  834     p[3] = p_l[3] + p_tl[3] >> 1;
 
  841     p[0] = p_l[0] + p_t[0] >> 1;
 
  842     p[1] = p_l[1] + p_t[1] >> 1;
 
  843     p[2] = p_l[2] + p_t[2] >> 1;
 
  844     p[3] = p_l[3] + p_t[3] >> 1;
 
  851     p[0] = p_tl[0] + p_t[0] >> 1;
 
  852     p[1] = p_tl[1] + p_t[1] >> 1;
 
  853     p[2] = p_tl[2] + p_t[2] >> 1;
 
  854     p[3] = p_tl[3] + p_t[3] >> 1;
 
  861     p[0] = p_t[0] + p_tr[0] >> 1;
 
  862     p[1] = p_t[1] + p_tr[1] >> 1;
 
  863     p[2] = p_t[2] + p_tr[2] >> 1;
 
  864     p[3] = p_t[3] + p_tr[3] >> 1;
 
  871     p[0] = (p_l[0] + p_tl[0] >> 1) + (p_t[0] + p_tr[0] >> 1) >> 1;
 
  872     p[1] = (p_l[1] + p_tl[1] >> 1) + (p_t[1] + p_tr[1] >> 1) >> 1;
 
  873     p[2] = (p_l[2] + p_tl[2] >> 1) + (p_t[2] + p_tr[2] >> 1) >> 1;
 
  874     p[3] = (p_l[3] + p_tl[3] >> 1) + (p_t[3] + p_tr[3] >> 1) >> 1;
 
  881     int diff = (
FFABS(p_l[0] - p_tl[0]) - 
FFABS(p_t[0] - p_tl[0])) +
 
  882                (
FFABS(p_l[1] - p_tl[1]) - 
FFABS(p_t[1] - p_tl[1])) +
 
  883                (
FFABS(p_l[2] - p_tl[2]) - 
FFABS(p_t[2] - p_tl[2])) +
 
  884                (
FFABS(p_l[3] - p_tl[3]) - 
FFABS(p_t[3] - p_tl[3]));
 
  895     p[0] = av_clip_uint8(p_l[0] + p_t[0] - p_tl[0]);
 
  896     p[1] = av_clip_uint8(p_l[1] + p_t[1] - p_tl[1]);
 
  897     p[2] = av_clip_uint8(p_l[2] + p_t[2] - p_tl[2]);
 
  898     p[3] = av_clip_uint8(p_l[3] + p_t[3] - p_tl[3]);
 
  904     return av_clip_uint8(d + (d - c) / 2);
 
  930     uint8_t *dec, *p_l, *p_tl, *p_t, *p_tr;
 
  937     if (x == frame->
width - 1)
 
  942     inverse_predict[
m](p, p_l, p_tl, p_t, p_tr);
 
  972                        "invalid predictor mode: %d\n", m);
 
 1053                 p[2] = 
get_bits(&gb_g, pixel_bits);
 
 1081                                      int *got_frame, 
uint8_t *data_start,
 
 1082                                      unsigned int data_size, 
int is_alpha_chunk)
 
 1087     if (!is_alpha_chunk) {
 
 1096     if (!is_alpha_chunk) {
 
 1138         switch (transform) {
 
 1150             goto free_and_return;
 
 1159         goto free_and_return;
 
 1178             goto free_and_return;
 
 1201     dec = frame->
data[3] + 1;
 
 1202     for (x = 1; x < frame->
width; x++, dec++)
 
 1206     dec = frame->
data[3] + ls;
 
 1207     for (y = 1; y < frame->
height; y++, dec += ls)
 
 1208         *dec += *(dec - ls);
 
 1213         for (y = 1; y < frame->
height; y++) {
 
 1214             dec = frame->
data[3] + y * ls + 1;
 
 1215             for (x = 1; x < frame->
width; x++, dec++)
 
 1220         for (y = 1; y < frame->
height; y++) {
 
 1221             dec = frame->
data[3] + y * ls + 1;
 
 1222             for (x = 1; x < frame->
width; x++, dec++)
 
 1223                 *dec += *(dec - ls);
 
 1227         for (y = 1; y < frame->
height; y++) {
 
 1228             dec = frame->
data[3] + y * ls + 1;
 
 1229             for (x = 1; x < frame->
width; x++, dec++)
 
 1230                 dec[0] += av_clip_uint8(*(dec - 1) + *(dec - ls) - *(dec - ls - 1));
 
 1238                                   unsigned int data_size)
 
 1247         for (y = 0; y < s->
height; y++)
 
 1252         int alpha_got_frame = 0;
 
 1259                                         data_start, data_size, 1);
 
 1264         if (!alpha_got_frame) {
 
 1270         for (y = 0; y < s->
height; y++) {
 
 1273             for (x = 0; x < s->
width; x++) {
 
 1290                                   int *got_frame, 
uint8_t *data_start,
 
 1291                                   unsigned int data_size)
 
 1305     if (data_size > INT_MAX) {
 
 1311     pkt.
data = data_start;
 
 1312     pkt.
size = data_size;
 
 1331     uint32_t chunk_type, chunk_size;
 
 1345     if (bytestream2_get_le32(&gb) != 
MKTAG(
'R', 
'I', 
'F', 
'F')) {
 
 1350     chunk_size = bytestream2_get_le32(&gb);
 
 1354     if (bytestream2_get_le32(&gb) != 
MKTAG(
'W', 
'E', 
'B', 
'P')) {
 
 1361         char chunk_str[5] = { 0 };
 
 1363         chunk_type = bytestream2_get_le32(&gb);
 
 1364         chunk_size = bytestream2_get_le32(&gb);
 
 1365         if (chunk_size == UINT32_MAX)
 
 1367         chunk_size += chunk_size & 1;
 
 1372         switch (chunk_type) {
 
 1373         case MKTAG(
'V', 
'P', 
'8', 
' '):
 
 1383         case MKTAG(
'V', 
'P', 
'8', 
'L'):
 
 1393         case MKTAG(
'V', 
'P', 
'8', 
'X'):
 
 1394             vp8x_flags = bytestream2_get_byte(&gb);
 
 1396             s->
width  = bytestream2_get_le24(&gb) + 1;
 
 1397             s->
height = bytestream2_get_le24(&gb) + 1;
 
 1402         case MKTAG(
'A', 
'L', 
'P', 
'H'): {
 
 1403             int alpha_header, filter_m, compression;
 
 1407                        "ALPHA chunk present, but alpha bit not set in the " 
 1410             if (chunk_size == 0) {
 
 1414             alpha_header       = bytestream2_get_byte(&gb);
 
 1419             filter_m    = (alpha_header >> 2) & 0x03;
 
 1420             compression =  alpha_header       & 0x03;
 
 1424                        "skipping unsupported ALPHA chunk\n");
 
 1433         case MKTAG(
'E', 
'X', 
'I', 
'F'): {
 
 1443                        "EXIF chunk present, but Exif bit not set in the " 
 1448                              avpkt->
size - exif_offset);
 
 1468         case MKTAG(
'I', 
'C', 
'C', 
'P'):
 
 1469         case MKTAG(
'A', 
'N', 
'I', 
'M'):
 
 1470         case MKTAG(
'A', 
'N', 
'M', 
'F'):
 
 1471         case MKTAG(
'X', 
'M', 
'P', 
' '):
 
 1472             AV_WL32(chunk_str, chunk_type);
 
 1478             AV_WL32(chunk_str, chunk_type);