Go to the documentation of this file.
44 #define EPIC_PIX_STACK_SIZE 1024
45 #define EPIC_PIX_STACK_MAX (EPIC_PIX_STACK_SIZE - 1)
62 8, 6, 5, 8, 12, 20, 26, 31,
63 6, 6, 7, 10, 13, 29, 30, 28,
64 7, 7, 8, 12, 20, 29, 35, 28,
65 7, 9, 11, 15, 26, 44, 40, 31,
66 9, 11, 19, 28, 34, 55, 52, 39,
67 12, 18, 28, 32, 41, 52, 57, 46,
68 25, 32, 39, 44, 52, 61, 60, 51,
69 36, 46, 48, 49, 56, 50, 52, 50
73 9, 9, 12, 24, 50, 50, 50, 50,
74 9, 11, 13, 33, 50, 50, 50, 50,
75 12, 13, 28, 50, 50, 50, 50, 50,
76 24, 33, 50, 50, 50, 50, 50, 50,
77 50, 50, 50, 50, 50, 50, 50, 50,
78 50, 50, 50, 50, 50, 50, 50, 50,
79 50, 50, 50, 50, 50, 50, 50, 50,
80 50, 50, 50, 50, 50, 50, 50, 50,
94 #define EPIC_HASH_SIZE 256
162 const uint8_t *val_table,
int nb_codes,
165 uint8_t huff_size[256] = { 0 };
166 uint16_t huff_code[256];
167 uint16_t huff_sym[256];
172 for (
i = 0;
i < 256;
i++)
173 huff_sym[
i] =
i + 16 * is_ac;
176 huff_sym[0] = 16 * 256;
179 huff_code, 2, 2, huff_sym, 2, 2, 0);
215 for (
i = 0;
i < 2;
i++) {
229 while (
src < src_end) {
234 if (x == 0xFF && !*
src)
237 *dst_size = dst - dst_start;
244 const int is_chroma = !!
plane;
250 c->bdsp.clear_block(
block);
251 dc =
get_vlc2(gb,
c->dc_vlc[is_chroma].table, 9, 3);
274 block[
c->scantable.permutated[pos]] =
val;
282 out[ridx] = av_clip_uint8(
Y + (91881 *
V + 32768 >> 16));
283 out[1] = av_clip_uint8(
Y + (-22554 *
U - 46802 *
V + 32768 >> 16));
284 out[2 - ridx] = av_clip_uint8(
Y + (116130 *
U + 32768 >> 16));
294 int mb_w, mb_h, mb_x, mb_y,
i, j;
298 const int ridx = swapuv ? 2 : 0;
310 mb_h = (
height + 15) >> 4;
313 num_mbs = mb_w * mb_h * 4;
315 for (
i = 0;
i < 3;
i++)
316 c->prev_dc[
i] = 1024;
319 c->bdsp.clear_blocks(
c->block[0]);
320 for (mb_y = 0; mb_y < mb_h; mb_y++) {
321 for (mb_x = 0; mb_x < mb_w; mb_x++) {
323 !
mask[mb_x * 2 + mask_stride] &&
324 !
mask[mb_x * 2 + 1 + mask_stride]) {
328 for (j = 0; j < 2; j++) {
329 for (
i = 0;
i < 2;
i++) {
330 if (
mask && !
mask[mb_x * 2 +
i + j * mask_stride])
334 c->block[
i + j * 2])) != 0)
336 c->idsp.idct(
c->block[
i + j * 2]);
339 for (
i = 1;
i < 3;
i++) {
342 c->idsp.idct(
c->block[
i + 3]);
345 for (j = 0; j < 16; j++) {
346 uint8_t *
out = dst + bx * 3 + (by + j) * dst_stride;
347 for (
i = 0;
i < 16;
i++) {
350 Y =
c->block[(j >> 3) * 2 + (
i >> 3)][(
i & 7) + (j & 7) * 8];
351 U =
c->block[4][(
i >> 1) + (j >> 1) * 8] - 128;
352 V =
c->block[5][(
i >> 1) + (j >> 1) * 8] - 128;
364 mask += mask_stride * 2;
370 #define LOAD_NEIGHBOURS(x) \
371 W = curr_row[(x) - 1]; \
372 N = above_row[(x)]; \
373 WW = curr_row[(x) - 2]; \
374 NW = above_row[(x) - 1]; \
375 NE = above_row[(x) + 1]; \
376 NN = above2_row[(x)]; \
377 NNW = above2_row[(x) - 1]; \
378 NWW = above_row[(x) - 2]; \
379 NNE = above2_row[(x) + 1]
381 #define UPDATE_NEIGHBOURS(x) \
387 NE = above_row[(x) + 1]; \
388 NNE = above2_row[(x) + 1]
399 h = (
h * 33) ^ ((
key >> 24) & 0xFF);
400 h = (
h * 33) ^ ((
key >> 16) & 0xFF);
401 h = (
h * 33) ^ ((
key >> 8) & 0xFF);
402 h = (
h * 33) ^ (
key & 0xFF);
417 for (
i = 0;
i <
hash->bucket_fill[idx];
i++)
429 if (
hash->bucket_size[idx] > INT_MAX /
sizeof(**
hash->bucket))
432 if (!(
hash->bucket_fill[idx] <
hash->bucket_size[idx])) {
433 int new_size =
hash->bucket_size[idx] + 16;
438 hash->bucket_size[idx] = new_size;
441 ret = &
hash->bucket[idx][
hash->bucket_fill[idx]++];
442 memset(
ret, 0,
sizeof(*
ret));
461 new_elem->
pixel = pix;
463 hash_elem->
list = new_elem;
484 for (j = 0; j <
hash->bucket_fill[
i]; j++) {
493 hash->bucket_size[
i] =
494 hash->bucket_fill[
i] = 0;
502 for (
i = 0;
i <
dc->stack_pos;
i++)
503 if (
dc->stack[
i] == pix)
506 return i !=
dc->stack_pos;
509 #define TOSIGNED(val) (((val) >> 1) ^ -((val) & 1))
512 int N,
int W,
int NW)
519 const uint32_t *curr_row,
520 const uint32_t *above_row)
524 int GN, GW, GNW,
R,
G,
B;
529 NW = above_row[x - 1];
540 ((NW >>
R_shift) & 0xFF) - GNW);
545 ((NW >>
B_shift) & 0xFF) - GNW);
548 pred = curr_row[x - 1];
562 if (
R<0 ||
G<0 || B<0 || R > 255 ||
G > 255 ||
B > 255) {
571 uint32_t *pPix, uint32_t pix)
582 const uint32_t *curr_row,
583 const uint32_t *above_row, uint32_t *pPix)
596 pix = curr_row[x - 1];
603 if (!
dc->stack_pos ||
dc->stack[0] != pix) {
613 const uint32_t *curr_row,
614 const uint32_t *above_row,
615 const uint32_t *above2_row,
616 uint32_t *pPix,
int *pRun)
618 int idx, got_pixel = 0, WWneW, old_WWneW = 0;
619 uint32_t
W, WW,
N, NN, NW, NE, NWW, NNW, NNE;
625 if (
dc->next_run_pos == x) {
629 idx = (WW !=
W) << 7 |
654 NWneW = *pRun ? NWneW : NW !=
W;
657 switch (((NW !=
N) << 2) | (NWneW << 1) | WWneW) {
666 (*pRun ? old_WWneW : WW !=
W) << 7 |
691 if (x + *pRun >= tile_width - 1)
696 if (!NWneW && NW ==
N &&
N == NE) {
698 int start_pos = x + *pRun;
701 uint32_t pix = above_row[start_pos + 1];
702 for (pos = start_pos + 2; pos < tile_width; pos++)
703 if (!(above_row[pos] == pix))
705 run = pos - start_pos - 1;
706 idx = av_ceil_log2(
run);
712 for (pos = idx - 1, rle = 0,
flag = 0; pos >= 0; pos--) {
713 if ((1 << pos) + rle <
run &&
716 : &
dc->runlen_zeroes[pos])) {
724 if (x + *pRun >= tile_width - 1)
743 dc->next_run_pos = x + *pRun;
748 uint32_t *pPix, uint32_t pix)
759 int tile_width,
const uint32_t *curr_row,
760 const uint32_t *above_row, uint32_t *pPix)
766 uint32_t NW = above_row[x - 1];
775 if (pos < tile_width - 1 && y) {
776 uint32_t NE = above_row[pos + 1];
791 if (!hash_elem || !hash_elem->
list)
816 int tile_width,
int stride)
820 uint32_t *curr_row =
NULL, *above_row =
NULL, *above2_row;
822 for (y = 0; y < tile_height; y++,
out +=
stride) {
823 above2_row = above_row;
824 above_row = curr_row;
825 curr_row = (uint32_t *)
out;
827 for (x = 0,
dc->next_run_pos = 0; x < tile_width;) {
831 pix = curr_row[x - 1];
833 if (y >= 1 && x >= 2 &&
834 pix != curr_row[x - 2] && pix != above_row[x - 1] &&
835 pix != above_row[x - 2] && pix != above_row[x] &&
843 if (y < 2 || x < 2 || x == tile_width - 1) {
849 above2_row, &pix, &
run);
855 tile_width, curr_row,
857 uint32_t ref_pix = curr_row[x - 1];
872 for (;
run > 0; x++,
run--)
886 int extrabytes, tile_width, tile_height, awidth, aheight;
896 for (extrabytes = 0; (prefix &
mask) && (extrabytes < 7); extrabytes++)
898 if (extrabytes > 3 || src_size < extrabytes) {
903 els_dsize = prefix & ((0x80 >> extrabytes) - 1);
904 while (extrabytes-- > 0) {
905 els_dsize = (els_dsize << 8) | *
src++;
909 if (src_size < els_dsize) {
911 els_dsize, src_size);
915 tile_width =
FFMIN(
c->width - tile_x *
c->tile_width,
c->tile_width);
916 tile_height =
FFMIN(
c->height - tile_y *
c->tile_height,
c->tile_height);
917 awidth =
FFALIGN(tile_width, 16);
918 aheight =
FFALIGN(tile_height, 16);
930 memset(&
c->ec, 0,
sizeof(
c->ec));
938 if (
c->ec.els_ctx.err != 0) {
940 "ePIC: couldn't decode transparency pixel!\n");
953 "ePIC: tile decoding failed, frame=%d, tile_x=%d, tile_y=%d\n",
959 dst =
c->framebuf + tile_x *
c->tile_width * 3 +
960 tile_y *
c->tile_height *
c->framebuf_stride;
962 for (j = 0; j < tile_height; j++) {
964 in = (uint32_t *)
buf;
965 for (
i = 0;
i < tile_width;
i++) {
971 buf +=
c->epic_buf_stride;
972 dst +=
c->framebuf_stride;
975 if (src_size > els_dsize) {
978 int bstride =
FFALIGN(tile_width, 16) >> 3;
980 int estride =
c->epic_buf_stride >> 2;
983 src_size -= els_dsize;
985 in = (uint32_t *)
c->epic_buf;
988 memset(
c->kempf_flags, 0,
989 (aheight >> 3) * bstride *
sizeof(*
c->kempf_flags));
990 for (j = 0; j < tile_height; j += 8) {
991 for (
i = 0;
i < tile_width;
i += 8) {
992 c->kempf_flags[(
i >> 3) + (j >> 3) * bstride] = 0;
993 for (k = 0; k < 8 * 8; k++) {
994 if (
in[
i + (k & 7) + (k >> 3) * estride] == tr) {
995 c->kempf_flags[(
i >> 3) + (j >> 3) * bstride] = 1;
1004 memset(
c->jpeg_tile, 0,
c->tile_stride * aheight);
1006 c->jpeg_tile,
c->tile_stride,
1007 c->kempf_flags, bstride, nblocks,
c->swapuv);
1009 in = (uint32_t *)
c->epic_buf;
1010 dst =
c->framebuf + tile_x *
c->tile_width * 3 +
1011 tile_y *
c->tile_height *
c->framebuf_stride;
1013 for (j = 0; j < tile_height; j++) {
1014 for (
i = 0;
i < tile_width;
i++)
1016 memcpy(dst +
i * 3, jpg +
i * 3, 3);
1017 in +=
c->epic_buf_stride >> 2;
1018 dst +=
c->framebuf_stride;
1019 jpg +=
c->tile_stride;
1023 dst =
c->framebuf + tile_x *
c->tile_width * 3 +
1024 tile_y *
c->tile_height *
c->framebuf_stride;
1026 dst,
c->framebuf_stride,
NULL, 0, 0,
c->swapuv);
1034 const uint8_t *jpeg_tile,
int tile_stride,
1036 const uint8_t *pal,
int npal,
int tidx)
1046 if (npal <= 2) nb = 1;
1047 else if (npal <= 4) nb = 2;
1048 else if (npal <= 16) nb = 4;
1051 for (j = 0; j <
height; j++, dst +=
stride, jpeg_tile += tile_stride) {
1057 memcpy(dst +
i * 3, pal + col * 3, 3);
1059 memcpy(dst +
i * 3, jpeg_tile +
i * 3, 3);
1071 int hdr, zsize, npal, tidx = -1,
ret;
1075 uLongf dlen = (
c->tile_width + 1) *
c->tile_height;
1077 int nblocks, cblocks, bstride;
1078 int bits, bitbuf, coded;
1079 uint8_t *dst =
c->framebuf + tile_x *
c->tile_width * 3 +
1080 tile_y *
c->tile_height *
c->framebuf_stride;
1085 width =
FFMIN(
c->width - tile_x *
c->tile_width,
c->tile_width);
1086 height =
FFMIN(
c->height - tile_y *
c->tile_height,
c->tile_height);
1089 sub_type = hdr >> 5;
1090 if (sub_type == 0) {
1092 memcpy(transp,
src, 3);
1094 for (j = 0; j <
height; j++, dst +=
c->framebuf_stride)
1096 memcpy(dst +
i * 3, transp, 3);
1098 }
else if (sub_type == 1) {
1100 dst,
c->framebuf_stride,
NULL, 0, 0, 0);
1103 if (sub_type != 2) {
1104 memcpy(transp,
src, 3);
1108 if (src_end -
src < npal * 3)
1110 memcpy(pal,
src, npal * 3);
1112 if (sub_type != 2) {
1113 for (
i = 0;
i < npal;
i++) {
1114 if (!memcmp(pal +
i * 3, transp, 3)) {
1121 if (src_end -
src < 2)
1123 zsize = (
src[0] << 8) |
src[1];
1126 if (src_end -
src < zsize + (sub_type != 2))
1129 ret = uncompress(
c->kempf_buf, &dlen,
src, zsize);
1134 if (sub_type == 2) {
1140 nblocks = *
src++ + 1;
1157 if (cblocks > nblocks)
1159 c->kempf_flags[j * 2 +
i * 2 * bstride] =
1160 c->kempf_flags[j * 2 + 1 +
i * 2 * bstride] =
1161 c->kempf_flags[j * 2 + (
i * 2 + 1) * bstride] =
1162 c->kempf_flags[j * 2 + 1 + (
i * 2 + 1) * bstride] = coded;
1166 memset(
c->jpeg_tile, 0,
c->tile_stride *
height);
1168 c->jpeg_tile,
c->tile_stride,
1169 c->kempf_flags, bstride, nblocks * 4, 0);
1172 c->jpeg_tile,
c->tile_stride,
1182 if (!
c->framebuf ||
c->old_width <
c->width ||
c->old_height <
c->height) {
1183 c->framebuf_stride =
FFALIGN(
c->width + 15, 16) * 3;
1184 aligned_height =
c->height + 15;
1190 if (!
c->synth_tile || !
c->jpeg_tile ||
1191 (
c->compression == 2 && !
c->epic_buf_base) ||
1192 c->old_tile_w <
c->tile_width ||
1193 c->old_tile_h <
c->tile_height) {
1194 c->tile_stride =
FFALIGN(
c->tile_width, 16) * 3;
1195 c->epic_buf_stride =
FFALIGN(
c->tile_width * 4, 16);
1196 aligned_height =
FFALIGN(
c->tile_height, 16);
1203 c->synth_tile =
av_mallocz(
c->tile_stride * aligned_height);
1204 c->jpeg_tile =
av_mallocz(
c->tile_stride * aligned_height);
1205 c->kempf_buf =
av_mallocz((
c->tile_width + 1) * aligned_height +
1207 c->kempf_flags =
av_mallocz(
c->tile_width * aligned_height);
1208 if (!
c->synth_tile || !
c->jpeg_tile ||
1209 !
c->kempf_buf || !
c->kempf_flags)
1211 if (
c->compression == 2) {
1212 c->epic_buf_base =
av_mallocz(
c->epic_buf_stride * aligned_height + 4);
1213 if (!
c->epic_buf_base)
1215 c->epic_buf =
c->epic_buf_base + 4;
1228 uint32_t cur_size, cursor_w, cursor_h, cursor_stride;
1229 uint32_t cursor_hot_x, cursor_hot_y;
1230 int cursor_fmt, err;
1232 cur_size = bytestream2_get_be32(gb);
1233 cursor_w = bytestream2_get_byte(gb);
1234 cursor_h = bytestream2_get_byte(gb);
1235 cursor_hot_x = bytestream2_get_byte(gb);
1236 cursor_hot_y = bytestream2_get_byte(gb);
1237 cursor_fmt = bytestream2_get_byte(gb);
1239 cursor_stride =
FFALIGN(cursor_w, cursor_fmt==1 ? 32 : 1) * 4;
1241 if (cursor_w < 1 || cursor_w > 256 ||
1242 cursor_h < 1 || cursor_h > 256) {
1244 cursor_w, cursor_h);
1247 if (cursor_hot_x > cursor_w || cursor_hot_y > cursor_h) {
1249 cursor_hot_x, cursor_hot_y);
1250 cursor_hot_x =
FFMIN(cursor_hot_x, cursor_w - 1);
1251 cursor_hot_y =
FFMIN(cursor_hot_y, cursor_h - 1);
1254 c->cursor_w *
c->cursor_h / 4 > cur_size) {
1259 if (cursor_fmt != 1 && cursor_fmt != 32) {
1265 if ((err =
av_reallocp(&
c->cursor, cursor_stride * cursor_h)) < 0) {
1270 c->cursor_w = cursor_w;
1271 c->cursor_h = cursor_h;
1272 c->cursor_hot_x = cursor_hot_x;
1273 c->cursor_hot_y = cursor_hot_y;
1274 c->cursor_fmt = cursor_fmt;
1275 c->cursor_stride = cursor_stride;
1278 switch (
c->cursor_fmt) {
1280 for (j = 0; j <
c->cursor_h; j++) {
1281 for (
i = 0;
i <
c->cursor_w;
i += 32) {
1282 bits = bytestream2_get_be32(gb);
1283 for (k = 0; k < 32; k++) {
1284 dst[0] = !!(
bits & 0x80000000);
1292 for (j = 0; j <
c->cursor_h; j++) {
1293 for (
i = 0;
i <
c->cursor_w;
i += 32) {
1294 bits = bytestream2_get_be32(gb);
1295 for (k = 0; k < 32; k++) {
1296 int mask_bit = !!(
bits & 0x80000000);
1297 switch (dst[0] * 2 + mask_bit) {
1325 for (j = 0; j <
c->cursor_h; j++) {
1326 for (
i = 0;
i <
c->cursor_w;
i++) {
1327 int val = bytestream2_get_be32(gb);
1341 #define APPLY_ALPHA(src, new, alpha) \
1342 src = (src * (256 - alpha) + new * alpha) >> 8
1353 x =
c->cursor_x -
c->cursor_hot_x;
1354 y =
c->cursor_y -
c->cursor_hot_y;
1360 if (x +
w >
c->width)
1362 if (y +
h >
c->height)
1376 cursor += -y *
c->cursor_stride;
1381 for (j = 0; j <
h; j++) {
1382 for (
i = 0;
i <
w;
i++) {
1389 cursor +=
c->cursor_stride;
1394 int *got_picture_ptr,
AVPacket *avpkt)
1397 int buf_size = avpkt->
size;
1403 uint32_t chunk_size, r_mask, g_mask, b_mask;
1408 if (buf_size < 12) {
1410 "Frame should have at least 12 bytes, got %d instead\n",
1417 magic = bytestream2_get_be32(&bc);
1418 if ((magic & ~0xF) !=
MKBETAG(
'G',
'2',
'M',
'0') ||
1419 (magic & 0xF) < 2 || (magic & 0xF) > 5) {
1424 c->swapuv = magic ==
MKBETAG(
'G',
'2',
'M',
'2');
1427 chunk_size = bytestream2_get_le32(&bc) - 1;
1428 chunk_type = bytestream2_get_byte(&bc);
1432 chunk_size, chunk_type);
1435 switch (chunk_type) {
1439 if (chunk_size < 21) {
1444 c->width = bytestream2_get_be32(&bc);
1445 c->height = bytestream2_get_be32(&bc);
1446 if (
c->width < 16 ||
c->height < 16) {
1448 "Invalid frame dimensions %dx%d\n",
1449 c->width,
c->height);
1453 if (
c->width != avctx->
width ||
c->height != avctx->
height) {
1458 c->compression = bytestream2_get_be32(&bc);
1459 if (
c->compression != 2 &&
c->compression != 3) {
1465 c->tile_width = bytestream2_get_be32(&bc);
1466 c->tile_height = bytestream2_get_be32(&bc);
1467 if (
c->tile_width <= 0 ||
c->tile_height <= 0 ||
1468 ((
c->tile_width |
c->tile_height) & 0xF) ||
1469 c->tile_width * (uint64_t)
c->tile_height >= INT_MAX / 4 ||
1473 "Invalid tile dimensions %dx%d\n",
1474 c->tile_width,
c->tile_height);
1478 c->tiles_x = (
c->width +
c->tile_width - 1) /
c->tile_width;
1479 c->tiles_y = (
c->height +
c->tile_height - 1) /
c->tile_height;
1480 c->bpp = bytestream2_get_byte(&bc);
1483 (chunk_size - 21) < 16) {
1485 "Display info: missing bitmasks!\n");
1489 r_mask = bytestream2_get_be32(&bc);
1490 g_mask = bytestream2_get_be32(&bc);
1491 b_mask = bytestream2_get_be32(&bc);
1492 if (r_mask != 0xFF0000 || g_mask != 0xFF00 || b_mask != 0xFF) {
1494 "Bitmasks: R=%"PRIX32
", G=%"PRIX32
", B=%"PRIX32,
1495 r_mask, g_mask, b_mask);
1511 if (!
c->tiles_x || !
c->tiles_y) {
1513 "No display info - skipping tile\n");
1516 if (chunk_size < 2) {
1521 c->tile_x = bytestream2_get_byte(&bc);
1522 c->tile_y = bytestream2_get_byte(&bc);
1523 if (
c->tile_x >=
c->tiles_x ||
c->tile_y >=
c->tiles_y) {
1525 "Invalid tile pos %d,%d (in %dx%d grid)\n",
1526 c->tile_x,
c->tile_y,
c->tiles_x,
c->tiles_y);
1530 switch (
c->compression) {
1534 chunk_size - 2, avctx);
1542 if (
ret &&
c->framebuf)
1544 c->tile_x,
c->tile_y);
1547 if (chunk_size < 5) {
1552 c->cursor_x = bytestream2_get_be16(&bc);
1553 c->cursor_y = bytestream2_get_be16(&bc);
1556 if (chunk_size < 8) {
1579 if (
c->width &&
c->height &&
c->framebuf) {
1588 c->framebuf +
i *
c->framebuf_stride,
1592 *got_picture_ptr = 1;
1621 c->orig_width = avctx->
width;
1622 c->orig_height = avctx->
height;
#define EPIC_PIX_STACK_SIZE
unsigned ff_els_decode_unsigned(ElsDecCtx *ctx, ElsUnsignedRung *ur)
static int epic_add_pixel_to_cache(ePICPixHash *hash, uint32_t key, uint32_t pix)
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
static av_cold int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table, int nb_codes, int is_ac)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
struct ePICPixListElem * list
int ff_els_decode_bit(ElsDecCtx *ctx, uint8_t *rung)
static av_cold int init(AVCodecContext *avctx)
static int chunk_start(AVFormatContext *s)
void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code, const uint8_t *bits_table, const uint8_t *val_table)
static int get_bits_left(GetBitContext *gb)
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
void ff_els_decoder_init(ElsDecCtx *ctx, const uint8_t *in, size_t data_size)
const uint8_t avpriv_mjpeg_bits_ac_luminance[17]
static int jpg_decode_block(JPGContext *c, GetBitContext *gb, int plane, int16_t *block)
This structure describes decoded (raw) audio or video data.
const uint8_t avpriv_mjpeg_val_ac_luminance[]
static int epic_predict_from_NW_NE(ePICContext *dc, int x, int y, int run, int tile_width, const uint32_t *curr_row, const uint32_t *above_row, uint32_t *pPix)
void * av_mallocz_array(size_t nmemb, size_t size)
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
const uint8_t avpriv_mjpeg_bits_dc_luminance[17]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
static void jpg_unescape(const uint8_t *src, int src_size, uint8_t *dst, int *dst_size)
static av_cold int g2m_decode_init(AVCodecContext *avctx)
int bucket_size[EPIC_HASH_SIZE]
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static ePICPixHashElem * epic_hash_find(const ePICPixHash *hash, uint32_t key)
static int epic_decode_tile(ePICContext *dc, uint8_t *out, int tile_height, int tile_width, int stride)
uint8_t prev_row_rung[14]
int key_frame
1 -> keyframe, 0-> not
static int epic_handle_edges(ePICContext *dc, int x, int y, const uint32_t *curr_row, const uint32_t *above_row, uint32_t *pPix)
static void g2m_paint_cursor(G2MContext *c, uint8_t *dst, int stride)
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
const uint8_t avpriv_mjpeg_bits_dc_chrominance[17]
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static const uint16_t mask[17]
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
const uint8_t avpriv_mjpeg_val_dc[12]
uint8_t nw_pred_rung[256]
static FFFrameBucket * bucket(FFFrameQueue *fq, size_t idx)
#define APPLY_ALPHA(src, new, alpha)
void ff_free_vlc(VLC *vlc)
int64_t max_pixels
The number of pixels per image to maximally accept.
static int epic_decode_from_cache(ePICContext *dc, uint32_t W, uint32_t *pPix)
static av_cold int g2m_decode_end(AVCodecContext *avctx)
static int epic_jb_decode_tile(G2MContext *c, int tile_x, int tile_y, const uint8_t *src, size_t src_size, AVCodecContext *avctx)
ePICPixHashElem * bucket[EPIC_HASH_SIZE]
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
ElsUnsignedRung unsigned_rung
static ePICPixHashElem * epic_hash_add(ePICPixHash *hash, uint32_t key)
static av_cold int jpg_init(AVCodecContext *avctx, JPGContext *c)
@ AV_PICTURE_TYPE_I
Intra.
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 list
#define EPIC_PIX_STACK_MAX
static int g2m_load_cursor(AVCodecContext *avctx, G2MContext *c, GetByteContext *gb)
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
const uint8_t avpriv_mjpeg_val_ac_chrominance[]
static int epic_predict_pixel2(ePICContext *dc, uint8_t *rung, uint32_t *pPix, uint32_t pix)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static av_always_inline int bytestream2_tell(GetByteContext *g)
enum AVPictureType pict_type
Picture type of the frame.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
struct ePICPixListElem * next
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define MKBETAG(a, b, c, d)
const char const char void * val
static int get_xbits(GetBitContext *s, int n)
Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
void ff_els_decoder_uninit(ElsUnsignedRung *rung)
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
#define DECLARE_ALIGNED(n, t, v)
int bucket_fill[EPIC_HASH_SIZE]
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
static int kempf_decode_tile(G2MContext *c, int tile_x, int tile_y, const uint8_t *src, int src_size)
#define i(width, name, range_min, range_max)
static int djb2_hash(uint32_t key)
static av_cold void jpg_free_context(JPGContext *ctx)
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
static const uint8_t luma_quant[64]
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const uint8_t ff_zigzag_direct[64]
static int kempf_restore_buf(const uint8_t *src, int len, uint8_t *dst, int stride, const uint8_t *jpeg_tile, int tile_stride, int width, int height, const uint8_t *pal, int npal, int tidx)
static const float pred[4]
#define AV_INPUT_BUFFER_PADDING_SIZE
uint8_t ne_pred_rung[256]
#define FF_ARRAY_ELEMS(a)
main external API structure.
static void epic_hash_init(ePICPixHash *hash)
static int g2m_init_buffers(G2MContext *c)
uint8_t runlen_zeroes[14]
static int epic_predict_pixel(ePICContext *dc, uint8_t *rung, uint32_t *pPix, uint32_t pix)
static int g2m_decode_frame(AVCodecContext *avctx, void *data, int *got_picture_ptr, AVPacket *avpkt)
#define UPDATE_NEIGHBOURS(x)
static int jpg_decode_data(JPGContext *c, int width, int height, const uint8_t *src, int src_size, uint8_t *dst, int dst_stride, const uint8_t *mask, int mask_stride, int num_mbs, int swapuv)
#define LOAD_NEIGHBOURS(x)
@ AV_PICTURE_TYPE_P
Predicted.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static const uint8_t chroma_quant[64]
int frame_number
Frame counter, set by libavcodec.
#define avpriv_request_sample(...)
static int epic_cache_entries_for_pixel(const ePICPixHash *hash, uint32_t pix)
static const int16_t alpha[]
This structure stores compressed data.
static int epic_decode_component_pred(ePICContext *dc, int N, int W, int NW)
static int epic_decode_run_length(ePICContext *dc, int x, int y, int tile_width, const uint32_t *curr_row, const uint32_t *above_row, const uint32_t *above2_row, uint32_t *pPix, int *pRun)
int width
picture width / height.
uint32_t stack[EPIC_PIX_STACK_SIZE]
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
const uint8_t avpriv_mjpeg_bits_ac_chrominance[17]
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
static void epic_free_pixel_cache(ePICPixHash *hash)
static uint32_t epic_decode_pixel_pred(ePICContext *dc, int x, int y, const uint32_t *curr_row, const uint32_t *above_row)
static void yuv2rgb(uint8_t *out, int ridx, int Y, int U, int V)
static int is_pixel_on_stack(const ePICContext *dc, uint32_t pix)