Go to the documentation of this file.
97 #define MAX_VLC_SIZE 864
103 int counts[17] = {0};
110 codes[0] = counts[0] = 0;
111 for (
int i = 0;
i < 17;
i++)
112 codes[
i+1] = (codes[
i] + counts[
i]) << 1;
124 for (
int i = 0;
i < count;
i++) {
125 for (
int j = 0; j < 2; j++) {
138 for (
int i = 0;
i < 7;
i++)
139 for (
int j = 0; j < 4; j++)
142 for (
int i = 0;
i < 7;
i++)
143 for (
int j = 0; j < 3; j++)
144 for (
int k = 0; k < 4; k++)
160 uint8_t cu_split[1+4+16+64];
162 uint8_t coded_blk[64];
164 uint8_t avg_buffer[64*64 + 32*32*2];
165 uint8_t * avg_data[3];
233 if (
s->nb_progress < count) {
238 memset(
s->progress +
s->nb_progress, 0, (count -
s->nb_progress) *
sizeof(*
s->progress));
239 for (
int i =
s->nb_progress;
i < count;
i++) {
243 s->nb_progress =
i + 1;
247 for (
int i = 0;
i < count;
i++)
264 for (
int i = 0;
i < 3;
i++) {
266 if (!
s->last_frame[
i])
279 if (
width !=
s->avctx->width ||
height !=
s->avctx->height) {
283 for (
int i = 0;
i < 3;
i++)
289 if (
s->avctx->width <= 64 ||
s->avctx->height <= 64)
290 av_log(
s->avctx,
AV_LOG_WARNING,
"unable to faithfully reproduce emulated edges; expect visual artefacts\n");
296 s->cu_width = (
width + 63) >> 6;
297 s->cu_height = (
height + 63) >> 6;
299 s->pu_stride =
s->cu_width << 3;
300 s->blk_stride =
s->cu_width << 4;
311 memset(
s->pu_info, 0,
s->pu_stride * (
s->cu_height << 3) *
sizeof(
s->pu_info[0]));
313 for (
int j = 0; j <
s->cu_height << 4; j++)
314 for (
int i = 0;
i <
s->cu_width << 4;
i++)
320 s->dblk_stride =
s->awidth >> 2;
322 size =
s->dblk_stride * (
s->aheight >> 2);
330 memset(
s->top_str, 0,
size);
331 memset(
s->left_str, 0,
size);
383 for (
int i = 0;
i < count;
i++)
384 for (
int j = 0; j < 2 <<
i; j++)
397 for (
int i = 0;
i <
s->cu_height;
i++)
405 for (
int i = 1;
i <
s->cu_height;
i++) {
407 if (
s->slice[
i].sign)
413 s->slice[
i].size = last_size;
433 return ypos + dy && xpos + dx +
size <=
s->awidth;
438 return xpos + dx && ypos + dy +
size <=
s->aheight;
487 memset(
i->t, 0x80,
sizeof(
i->t));
488 memset(
i->l, 0x80,
sizeof(
i->l));
489 i->has_t =
i->has_tr =
i->has_l =
i->has_ld = 0;
501 if (cu->
ypos + yoff > 0) {
513 if (cu->
xpos + xoff > 0)
517 if (cu->
xpos + xoff > 0) {
520 for (
int y = 0; y <
size; y++)
526 for (
int y =
size; y <
size * 2; y++)
531 if (cu->
ypos + yoff > 0)
538 int lastl = p->
l[
size + 1];
539 int lastt = p->
t[
size + 1];
540 int tmp1[64], tmp2[64];
541 int top_ref[64], left_ref[64];
544 for (
int i = 0;
i <
size;
i++) {
545 tmp1[
i] = lastl - p->
t[
i + 1];
546 tmp2[
i] = lastt - p->
l[
i + 1];
550 for (
int i = 0;
i <
size;
i++) {
551 top_ref[
i] = p->
t[
i + 1] << (
shift - 1);
552 left_ref[
i] = p->
l[
i + 1] << (
shift - 1);
555 for (
int y = 0; y <
size; y++) {
557 int sum = left_ref[y] +
size;
558 for (
int x = 0; x <
size; x++) {
559 int v = tmp1[x] + top_ref[x];
576 for (
int x = 0; x <
size; x++)
579 for (
int y = 0; y <
size; y++)
587 for (
int y = 0; y <
size; y++)
591 dst[0] = (p->
t[1] + p->
l[1] + 2 *
dst[0] + 2) >> 2;
592 for (
int x = 1; x <
size; x++)
593 dst[x] = (p->
t[x + 1] + 3 *
dst[x] + 2) >> 2;
594 for (
int y = 1; y <
size; y++)
602 for (
int i = 1;
i <
size - 1;
i++)
610 int sum = (v0 << 5) + (1 << (5 - 1));
611 for (
int i = 0;
i <
size;
i++) {
620 for (
int x = 0; x <
size; x++) {
623 off = (sum >> 5) + 32;
626 for (
int y = 0; y <
size; y++)
629 for (
int y = 0; y <
size; y++) {
630 int a =
src[off + y];
631 int b =
src[off + y + 1];
632 dst[y*
stride + x] = ((32 - frac) *
a + frac *
b + 16) >> 5;
641 for (
int y = 0; y <
size; y++) {
644 off = (sum >> 5) + 32;
649 for (
int x = 0; x <
size; x++) {
650 int a =
src[off + x];
651 int b =
src[off + x + 1];
652 dst[y*
stride + x] = ((32 - frac) *
a + frac *
b + 16) >> 5;
660 uint8_t filtered1[96], filtered2[96];
664 }
else if (imode == 1) {
666 }
else if (imode <= 9) {
668 int add_size = (
size * ang_weight + 31) >> 5;
676 }
else if (imode == 10) {
681 for (
int y = 0; y <
size; y++)
682 for (
int x = 0; x <
size; x++)
686 for (
int x = 0; x <
size; x++)
689 }
else if (imode <= 17) {
692 int add_size = (
size * ang_weight + 31) >> 5;
694 memcpy(filtered1 + 32 - 1, p->
l,
size + 1);
695 memcpy(filtered2 + 32 - 1, p->
t,
size + 1);
697 filtered1[32 - 1] = p->
l[0];
699 filtered2[32 - 1] = p->
t[0];
704 for (
int i = 1;
i < add_size;
i++) {
706 filtered1[32 - 1 -
i] = filtered2[32 - 1 + (sum >> 8)];
710 }
else if (imode <= 25) {
713 int add_size = (
size * ang_weight + 31) >> 5;
715 memcpy(filtered1 + 32 - 1, p->
t,
size + 1);
716 memcpy(filtered2 + 32 - 1, p->
l,
size + 1);
718 filtered1[32 - 1] = p->
t[0];
720 filtered2[32 - 1] = p->
l[0];
725 for (
int i = 1;
i < add_size;
i++) {
727 filtered1[32 - 1 -
i] = filtered2[32 - 1 + (sum >> 8)];
731 }
else if (imode == 26) {
740 for (
int y = 0; y <
size; y++)
743 }
else if (imode <= 34) {
745 int add_size = (
size * ang_weight + 31) >> 5;
768 #define MK_UNIQUELIST(name, type, max_size) \
770 type list[max_size]; \
772 } unique_list_##name; \
774 static void unique_list_##name##_init(unique_list_##name * s) \
776 memset(s->list, 0, sizeof(s->list)); \
780 static void unique_list_##name##_add(unique_list_##name * s, type cand) \
782 if (s->size == max_size) \
785 for (int i = 0; i < s->size; i++) { \
786 if (!memcmp(&s->list[i], &cand, sizeof(type))) { \
790 s->list[s->size++] = cand; \
798 int blk_pos, tl_x, tl_y;
799 unique_list_intramode ipm_cand;
807 unique_list_intramode_init(&ipm_cand);
810 const PUInfo * pu = &
s->pu_info[cu->pu_pos -
s->pu_stride];
812 unique_list_intramode_add(&ipm_cand,
s->blk_info[cu->blk_pos -
s->blk_stride + (sub & 1)].imode);
815 blk_pos = cu->blk_pos + (sub >> 1) *
s->blk_stride + (sub & 1);
818 const PUInfo * pu = &
s->pu_info[cu->pu_pos - 1];
820 unique_list_intramode_add(&ipm_cand,
s->blk_info[blk_pos - 1 - (sub & 1)].imode);
823 tl_x = !(sub & 2) ? (cu->xpos + (sub & 1) * 4) : cu->xpos;
824 tl_y = cu->ypos + (sub & 2) * 4;
825 if (tl_x > 0 && tl_y > 0) {
828 case 0: pu = &
s->pu_info[cu->pu_pos -
s->pu_stride - 1];
break;
829 case 1: pu = &
s->pu_info[cu->pu_pos -
s->pu_stride];
break;
830 default: pu = &
s->pu_info[cu->pu_pos - 1];
834 unique_list_intramode_add(&ipm_cand,
s->blk_info[blk_pos -
s->blk_stride - 1].imode);
836 unique_list_intramode_add(&ipm_cand,
s->blk_info[blk_pos -
s->blk_stride - 2].imode);
844 return ipm_cand.list[cu->imode_param[sub]];
847 enum IntraMode imode = cu->imode_param[sub];
848 qsort(ipm_cand.list, 3,
sizeof(ipm_cand.list[0]),
ipm_compar);
849 for (
int i = 0;
i < 3;
i++)
850 if (imode >= ipm_cand.list[
i])
872 unique_list_mvinfo_add(skip_cand, *mvi);
877 int mv_size =
size >> 2;
883 if (cu->
ypos && cu->
xpos + size < s->awidth)
885 if (cu->
xpos && cu->
ypos + size < s->aheight)
894 for (
int i = skip_cand->size;
i < 4;
i++)
904 int mv_size =
size >> 2;
907 dim->w =
dim->h = mv_size;
911 dim->h = mv_size >> 1;
914 dim->w = mv_size >> 1;
918 dim->w =
dim->h = mv_size >> 1;
922 dim->h = !part_no ? (mv_size >> 2) : ((3 * mv_size) >> 2);
926 dim->h = !part_no ? ((3 * mv_size) >> 2) : (mv_size >> 2);
929 dim->w = !part_no ? (mv_size >> 2) : ((3 * mv_size) >> 2);
933 dim->w = !part_no ? ((3 * mv_size) >> 2) : (mv_size >> 2);
965 *mv_pos +=
dim->h*
s->blk_stride -
dim->w;
970 *mv_pos +=
dim->h *
s->blk_stride;
1007 if (
a->mvref !=
b->mvref)
1012 int dx =
a->f_mv.x -
b->f_mv.x;
1013 int dy =
a->f_mv.y -
b->f_mv.y;
1017 int dx =
a->b_mv.x -
b->b_mv.x;
1018 int dy =
a->b_mv.y -
b->b_mv.y;
1031 ret->x = a.x < c.x ? c.x : a.x; \
1034 ret->x = a.x < c.x ? a.x : c.x; \
1044 int mv_pos = mv_y *
s->blk_stride + mv_x;
1053 const MVInfo *
mv = &
s->blk_info[mv_pos - 1].mv;
1055 cand[cand_size++] =
mv->f_mv;
1058 const MVInfo *
mv = &
s->blk_info[mv_pos -
s->blk_stride].mv;
1060 cand[cand_size++] =
mv->f_mv;
1063 const MVInfo *
mv = &
s->blk_info[mv_pos -
s->blk_stride + mv_w].mv;
1065 cand[cand_size++] =
mv->f_mv;
1068 switch (cand_size) {
1074 f_mv.
x = (cand[0].
x + cand[1].
x) >> 1;
1075 f_mv.
y = (cand[0].
y + cand[1].
y) >> 1;
1078 mv_pred(&f_mv, cand[0], cand[1], cand[2]);
1088 dst->f_mv.x =
src->f_mv.x + f_mv.
x;
1089 dst->f_mv.y =
src->f_mv.y + f_mv.
y;
1095 const MVInfo *
mv = &
s->blk_info[mv_pos - 1].mv;
1097 cand[cand_size++] =
mv->b_mv;
1100 const MVInfo *
mv = &
s->blk_info[mv_pos -
s->blk_stride].mv;
1102 cand[cand_size++] =
mv->b_mv;
1105 const MVInfo *
mv = &
s->blk_info[mv_pos -
s->blk_stride + mv_w].mv;
1107 cand[cand_size++] =
mv->b_mv;
1110 switch (cand_size) {
1116 b_mv.
x = (cand[0].
x + cand[1].
x) >> 1;
1117 b_mv.
y = (cand[0].
y + cand[1].
y) >> 1;
1120 mv_pred(&b_mv, cand[0], cand[1], cand[2]);
1130 dst->b_mv.x =
src->b_mv.x + b_mv.
x;
1131 dst->b_mv.y =
src->b_mv.y + b_mv.
y;
1136 int pu_size =
size >> 3;
1138 int imode, mv_x, mv_y, mv_pos, count, mv_size;
1139 unique_list_mvinfo skip_cand;
1148 for (
int y = 0; y < 2; y++)
1149 for (
int x = 0; x < 2; x++)
1150 s->blk_info[cu->
blk_pos + y*
s->blk_stride + x].imode =
1158 for (
int y = 0; y < size >> 2; y++)
1159 for (
int x = 0; x < size >> 2; x++)
1160 s->blk_info[cu->
blk_pos + y*
s->blk_stride + x].imode = imode;
1163 mv_x = cu->
xpos >> 2;
1164 mv_y = cu->
ypos >> 2;
1167 for (
int part_no = 0; part_no < count; part_no++) {
1171 for (
int y = 0; y <
dim.h; y++)
1172 for (
int x = 0; x <
dim.w; x++)
1173 s->blk_info[mv_pos + y*
s->blk_stride + x].mv =
mv;
1178 unique_list_mvinfo_init(&skip_cand);
1181 mv_size =
size >> 2;
1182 for (
int y = 0; y < mv_size; y++)
1183 for (
int x = 0; x < mv_size; x++)
1184 s->blk_info[cu->
blk_pos + y*
s->blk_stride + x].mv =
mv;
1187 for (
int y = 0; y < pu_size; y++)
1188 for (
int x = 0; x < pu_size; x++)
1189 s->pu_info[cu->
pu_pos + y*
s->pu_stride + x] = pui;
1226 #define FILTER1(src, src_stride, src_y_ofs, step) \
1227 ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1228 - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1229 +52 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1230 +20 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1231 - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1232 + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 32) >> 6
1234 #define FILTER2(src, src_stride, src_y_ofs, step) \
1235 ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1236 - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1237 +20 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1238 +20 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1239 - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1240 + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 16) >> 5
1242 #define FILTER3(src, src_stride, src_y_ofs, step) \
1243 ( (src)[(y + src_y_ofs)*(src_stride) + x - 2*step] \
1244 - 5 * (src)[(y + src_y_ofs)*(src_stride) + x - 1*step] \
1245 +20 * (src)[(y + src_y_ofs)*(src_stride) + x ] \
1246 +52 * (src)[(y + src_y_ofs)*(src_stride) + x + 1*step] \
1247 - 5 * (src)[(y + src_y_ofs)*(src_stride) + x + 2*step] \
1248 + (src)[(y + src_y_ofs)*(src_stride) + x + 3*step] + 32) >> 6
1250 #define FILTER_CASE(idx, dst, dst_stride, filter, w, h) \
1252 for (int y = 0; y < h; y++) \
1253 for (int x = 0; x < w; x++) \
1254 (dst)[y*dst_stride + x] = av_clip_uint8(filter); \
1257 #define FILTER_BLOCK(dst, dst_stride, src, src_stride, src_y_ofs, w, h, cond, step) \
1259 FILTER_CASE(1, dst, dst_stride, FILTER1(src, src_stride, src_y_ofs, step), w, h) \
1260 FILTER_CASE(2, dst, dst_stride, FILTER2(src, src_stride, src_y_ofs, step), w, h) \
1261 FILTER_CASE(3, dst, dst_stride, FILTER3(src, src_stride, src_y_ofs, step), w, h) \
1264 static void luma_mc(uint8_t *
dst,
int dst_stride,
const uint8_t *
src,
int src_stride,
int w,
int h,
int cx,
int cy)
1267 for (
int y = 0; y <
h; y++)
1268 memcpy(
dst + y*dst_stride,
src + y*src_stride,
w);
1273 }
else if (cx != 3 || cy != 3) {
1274 uint8_t
tmp[70 * 64];
1278 for (
int j = 0; j <
h; j++)
1279 for (
int i = 0;
i <
w;
i++)
1280 dst[j*dst_stride +
i] = (
1281 src[j*src_stride +
i] +
1282 src[j*src_stride +
i + 1] +
1283 src[(j + 1)*src_stride +
i] +
1284 src[(j + 1)*src_stride +
i + 1] + 2) >> 2;
1288 static void chroma_mc(uint8_t *
dst,
int dst_stride,
const uint8_t *
src,
int src_stride,
int w,
int h,
int x,
int y)
1291 for (
int j = 0; j <
h; j++)
1292 memcpy(
dst + j*dst_stride,
src + j*src_stride,
w);
1293 }
else if (x > 0 && y > 0) {
1296 if (x == 3 && y == 3)
1299 a = (4 - x) * (4 - y);
1303 for (
int j = 0; j <
h; j++)
1304 for (
int i = 0;
i <
w;
i++)
1305 dst[j*dst_stride +
i] =
1306 (
a *
src[j*src_stride +
i] +
1307 b *
src[j*src_stride +
i + 1] +
1308 c *
src[(j + 1)*src_stride +
i] +
1309 d *
src[(j + 1)*src_stride +
i + 1] + 8) >> 4;
1311 int a = (4 - x) * (4 - y);
1312 int e = x * (4 - y) + (4 - x) * y;
1313 int step = y > 0 ? src_stride : 1;
1314 for (
int j = 0; j <
h; j++)
1315 for (
int i = 0;
i <
w;
i++)
1316 dst[j*dst_stride +
i] =
1317 (
a *
src[j*src_stride +
i] +
1318 e *
src[j*src_stride +
i +
step] + 8) >> 4;
1322 static int check_pos(
int x,
int y,
int cw,
int ch,
int w,
int h,
int dx,
int dy,
int e0,
int e1,
int e2,
int e3)
1326 return x2 - e0 >= 0 && x2 + cw + e1 <=
w && y2 - e2 >= 0 && y2 + ch + e3 <=
h;
1332 int off = !
avg ? y * frame_linesize[0] + x : 0;
1334 int fh =
s->aheight;
1340 if (
check_pos(x, y,
w,
h, fw, fh, dx, dy,
rv60_edge1[cx],
rv60_edge2[cx],
rv60_edge1[cy],
rv60_edge2[cy])) {
1344 ref->data[0] + (y + dy) *
ref->linesize[0] + x + dx,
1349 int xoff = x + dx - 2;
1350 int yoff = y + dy - 2;
1351 s->vdsp.emulated_edge_mc(buf,
1352 ref->data[0] + yoff *
ref->linesize[0] + xoff,
1353 70,
ref->linesize[0],
1359 buf + 70 * 2 + 2, 70,
w,
h, cx, cy);
1363 int fw =
s->awidth >> 1;
1364 int fh =
s->aheight >> 1;
1374 for (
int plane = 1; plane < 3; plane++) {
1375 int off = !
avg ? (y >> 1) * frame_linesize[plane] + (x >> 1) : 0;
1376 if (
check_pos(x >> 1, y >> 1, cw, ch, fw, fh, dx, dy, 0, 1, 0, 1)) {
1379 frame_linesize[plane],
1380 ref->data[plane] + ((y >> 1) + dy) *
ref->linesize[plane] + (x >> 1) + dx,
1381 ref->linesize[plane],
1385 s->vdsp.emulated_edge_mc(buf,
1386 ref->data[plane] + ((y >> 1) + dy) *
ref->linesize[plane] + (x >> 1) + dx,
1387 40,
ref->linesize[plane],
1389 (x >> 1) + dx, (y >> 1) + dy,
1397 static void avg_plane(uint8_t *
dst,
int dst_stride,
const uint8_t *
src,
int src_stride,
int w,
int h)
1399 for (
int j = 0; j <
h; j++)
1400 for (
int i = 0;
i <
w;
i++)
1401 dst[j*dst_stride +
i] = (
dst[j*dst_stride +
i] +
src[j*src_stride +
i]) >> 1;
1404 static void avg(
AVFrame *
frame, uint8_t * prev_frame_data[3],
int prev_frame_linesize[3],
int x,
int y,
int w,
int h)
1406 for (
int plane = 0; plane < 3; plane++) {
1407 int shift = !plane ? 0 : 1;
1409 prev_frame_data[plane], prev_frame_linesize[plane],
1424 return (v * q + 8) >> 4;
1432 return inval &&
get_bits1(gb) ? -inval : inval;
1436 int esc_bits = esc_sym - 23;
1437 val += (1 << esc_bits) +
get_bits(gb, esc_bits) + 22;
1484 int sym0 =
get_vlc2(gb, vlcs->
l0[!is_luma], 9, 2);
1485 int grp0 = sym0 >> 3;
1491 int grp =
get_vlc2(gb, vlcs->
l12[!is_luma], 9, 2);
1495 int grp =
get_vlc2(gb, vlcs->
l12[!is_luma], 9, 2);
1499 int grp =
get_vlc2(gb, vlcs->
l3[!is_luma], 9, 2);
1506 int sym0 =
get_vlc2(gb, vlcs->
l0[!is_luma], 9, 2);
1507 int grp0 = (sym0 >> 3);
1513 int grp =
get_vlc2(gb, vlcs->
l12[!is_luma], 9, 2);
1517 int grp =
get_vlc2(gb, vlcs->
l12[!is_luma], 9, 2);
1521 int grp =
get_vlc2(gb, vlcs->
l3[!is_luma], 9, 2);
1534 memset(y_coeffs, 0,
sizeof(y_coeffs[0])*256);
1535 for (
int i = 0;
i < 16;
i++)
1539 memset(u_coeffs, 0,
sizeof(u_coeffs[0])*64);
1540 for (
int i = 0;
i < 4;
i++)
1541 if ((cbp >> (16 +
i)) & 1)
1544 memset(v_coeffs, 0,
sizeof(v_coeffs[0])*64);
1545 for (
int i = 0;
i < 4;
i++)
1546 if ((cbp >> (20 +
i)) & 1)
1556 static void decode_cu_8x8(
GetBitContext * gb,
int is_intra,
int qp,
int sel_qp, int16_t * y_coeffs, int16_t * u_coeffs, int16_t * v_coeffs,
int ccbp,
int mode4x4)
1564 memset(y_coeffs, 0,
sizeof(y_coeffs[0])*64);
1565 for (
int i = 0;
i < 4;
i++) {
1566 if ((ccbp >>
i) & 1) {
1572 offset = (
i & 1) * 4 + (
i & 2) * 2 * 8;
1579 if ((ccbp >> 4) & 1) {
1580 memset(u_coeffs, 0,
sizeof(u_coeffs[0])*16);
1584 if ((ccbp >> 5) & 1) {
1585 memset(v_coeffs, 0,
sizeof(u_coeffs[0])*16);
1598 memset(y_coeffs, 0,
sizeof(y_coeffs[0])*256);
1599 for (
int i = 0;
i < 16;
i++)
1600 if ((ccbp >>
i) & 1) {
1601 int off = (
i & 3) * 4 + (
i >> 2) * 4 * 16;
1605 memset(u_coeffs, 0,
sizeof(u_coeffs[0])*64);
1606 for (
int i = 0;
i < 4;
i++)
1607 if ((ccbp >> (16 +
i)) & 1) {
1608 int off = (
i & 1) * 4 + (
i & 2) * 2 * 8;
1615 memset(v_coeffs, 0,
sizeof(v_coeffs[0])*64);
1616 for (
int i = 0;
i < 4;
i++)
1617 if ((ccbp >> (20 +
i)) & 1) {
1618 int off = (
i & 1) * 4 + (
i & 2) * 2 * 8;
1628 int sym0 =
get_vlc2(gb, vlc[0], 9, 2);
1629 int sym1 =
get_vlc2(gb, vlc[1], 9, 2);
1630 int sym2 =
get_vlc2(gb, vlc[2], 9, 2);
1631 int sym3 =
get_vlc2(gb, vlc[3], 9, 2);
1633 + ((sym0 & 0x03) << 0)
1634 + ((sym0 & 0x0C) << 2)
1635 + ((sym0 & 0x10) << 12)
1636 + ((sym0 & 0x20) << 15)
1637 + ((sym1 & 0x03) << 2)
1638 + ((sym1 & 0x0C) << 4)
1639 + ((sym1 & 0x10) << 13)
1640 + ((sym1 & 0x20) << 16)
1641 + ((sym2 & 0x03) << 8)
1642 + ((sym2 & 0x0C) << 10)
1643 + ((sym2 & 0x10) << 14)
1644 + ((sym2 & 0x20) << 17)
1645 + ((sym3 & 0x03) << 10)
1646 + ((sym3 & 0x0C) << 12)
1647 + ((sym3 & 0x10) << 15)
1648 + ((sym3 & 0x20) << 18);
1659 int size = 1 << log_size;
1660 int split,
ret, ttype, count, is_intra, cu_pos, subset, cbp8, imode, split_i4x4, num_clusters, cl_cbp, super_cbp, mv_x, mv_y, mv_pos;
1661 int16_t y_coeffs[16*16], u_coeffs[8*8], v_coeffs[8*8];
1664 if (xpos >=
s->awidth || ypos >=
s->aheight)
1682 cu.
pu_pos = (xpos >> 3) + (ypos >> 3) *
s->pu_stride;
1683 cu.
blk_pos = (xpos >> 2) + (ypos >> 2) *
s->blk_stride;
1690 for (
int i = 0;
i < 4;
i++)
1692 else if (
size <= 32)
1700 for (
int i = 0;
i < count;
i++)
1715 imode =
s->blk_info[cu.
blk_pos].imode;
1717 int off = ypos *
frame->linesize[0] + xpos;
1722 for (
int plane = 1; plane < 3; plane++) {
1723 int off = (ypos >> 1) *
frame->linesize[plane] + (xpos >> 1);
1732 mv_pos = mv_y *
s->blk_stride + mv_x;
1734 for (
int part_no = 0; part_no < count; part_no++) {
1739 mv =
s->blk_info[mv_pos].mv;
1746 if (!(
mv.mvref & 2)) {
1747 if (!
s->last_frame[
LAST_PIC]->data[0]) {
1753 if (!
s->last_frame[
NEXT_PIC]->data[0]) {
1784 else if (
size >= 32)
1786 else if (
size == 16)
1794 cu_pos = ((xpos & 63) >> 3) + ((ypos & 63) >> 3) * 8;
1798 subset = is_intra ? 0 : 2;
1803 for (
int y = 0; y < 4; y++)
1804 for (
int x = 0; x < 4; x++) {
1806 if ((cbp16 >>
i) & 1) {
1807 int off = (ypos + y * 4)*
frame->linesize[0] + xpos + x * 4;
1809 thread->
coded_blk[cu_pos + (y/2)*8 + (x/2)] = 1;
1812 for (
int y = 0; y < 2; y++)
1813 for (
int x = 0; x < 2; x++) {
1815 int xoff = (xpos >> 1) + x * 4;
1816 int yoff = (ypos >> 1) + y * 4;
1817 if ((cbp16 >> (16 +
i)) & 1) {
1818 int off = yoff *
frame->linesize[1] + xoff;
1820 thread->
coded_blk[cu_pos + y*8 + x] = 1;
1822 if ((cbp16 >> (20 +
i)) & 1) {
1823 int off = yoff *
frame->linesize[2] + xoff;
1825 thread->
coded_blk[cu_pos + y*8 + x] = 1;
1833 decode_cu_8x8(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp8, 1);
1835 for (
int i = 0;
i < 4;
i++) {
1836 int xoff = (
i & 1) << 2;
1837 int yoff = (
i & 2) << 1;
1839 int off = (ypos + yoff) *
frame->linesize[0] + xpos + xoff;
1840 int imode =
s->blk_info[cu.
blk_pos + (
i >> 1) *
s->blk_stride + (
i & 1)].imode;
1845 if ((cbp8 >>
i) & 1) {
1846 int off = (ypos + yoff) *
frame->linesize[0] + xpos + xoff;
1850 if ((cbp8 >> 4) & 1) {
1851 int off = (ypos >> 1) *
frame->linesize[1] + (xpos >> 1);
1854 if ((cbp8 >> 5) & 1) {
1855 int off = (ypos >> 1) *
frame->linesize[2] + (xpos >> 1);
1861 subset = is_intra ? 1 : 3;
1865 decode_cu_8x8(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, cbp8, 0);
1867 int off = ypos *
frame->linesize[0] + xpos;
1870 if ((cbp8 >> 4) & 1) {
1871 int off = (ypos >> 1) *
frame->linesize[1] + (xpos >> 1);
1874 if ((cbp8 >> 5) & 1) {
1875 int off = (ypos >> 1) *
frame->linesize[2] + (xpos >> 1);
1881 subset = is_intra ? 1 : 3;
1882 num_clusters =
size >> 4;
1883 cl_cbp =
get_bits(gb, num_clusters * num_clusters);
1884 for (
int y = 0; y < num_clusters; y++) {
1885 for (
int x = 0; x < num_clusters; x++) {
1886 if (!((cl_cbp >> (y*num_clusters + x)) & 1))
1888 thread->
coded_blk[cu_pos + y*2*8 + x*2 + 0] = 1;
1889 thread->
coded_blk[cu_pos + y*2*8 + x*2 + 1] = 1;
1890 thread->
coded_blk[cu_pos + y*2*8 + x*2 + 8] = 1;
1891 thread->
coded_blk[cu_pos + y*2*8 + x*2 + 9] = 1;
1894 decode_cu_16x16(gb, is_intra, qp, sel_qp, y_coeffs, u_coeffs, v_coeffs, super_cbp);
1895 if (super_cbp & 0xFFFF) {
1896 int off = (ypos + y * 16) *
frame->linesize[0] + xpos + x * 16;
1899 if ((super_cbp >> 16) & 0xF) {
1900 int off = ((ypos >> 1) + y * 8) *
frame->linesize[1] + (xpos >> 1) + x * 8;
1903 if ((super_cbp >> 20) & 0xF) {
1904 int off = ((ypos >> 1) + y * 8) *
frame->linesize[2] + (xpos >> 1) + x * 8;
1918 return (ypos >> 2) *
s->dblk_stride + (xpos >> 2);
1924 int dsize =
size >> 2;
1925 int dval = (q << 2) + strength;
1927 for (
int x = 0; x < dsize; x++) {
1928 s->top_str[
pos + x] = dval;
1929 s->top_str[
pos + (dsize - 1)*
s->dblk_stride + x] = dval;
1932 for (
int y = 0; y < dsize; y++) {
1933 s->left_str[
pos + y*
s->dblk_stride] = dval;
1934 s->left_str[
pos + y*
s->dblk_stride + dsize - 1] = dval;
1940 return s->top_str[
pos] & 3;
1945 return s->left_str[
pos] & 3;
1950 s->top_str[
pos] |= strength;
1955 s->left_str[
pos] |= strength;
1960 int blk_pos = (ypos >> 2) *
s->blk_stride + (xpos >> 2);
1963 for (
int i = 0;
i <
size;
i++)
1967 for (
int i = 0;
i <
size;
i++)
1972 #define STRENGTH(el, lim) (FFABS(el) < (lim) ? 3 : 1)
1973 #define CLIP_SYMM(a, b) av_clip(a, -(b), b)
1977 int16_t diff_q1q0[4];
1978 int16_t diff_p1p0[4];
1979 int str_p, str_q, msum, maxprod, weak;
1981 for (
int i = 0;
i < 4;
i++) {
1986 str_p =
STRENGTH(diff_q1q0[0] + diff_q1q0[1] + diff_q1q0[2] + diff_q1q0[3], lim2);
1987 str_q =
STRENGTH(diff_p1p0[0] + diff_p1p0[1] + diff_p1p0[2] + diff_p1p0[3], lim2);
1989 if (str_p + str_q <= 2)
1992 msum = (mode1 + mode2 + str_q + str_p) >> 1;
1993 if (str_q == 1 || str_p == 1) {
2001 for (
int y = 0; y < 4; y++) {
2004 if (diff_p0q0 &&
result <= maxprod) {
2011 int diff_strg = (
dst[-2*
step] -
dst[
step] + 4 * diff_p0q0 + 4) >> 3;
2016 if (str_p != 1 &&
FFABS(diff_q1q2) <= (lim2 >> 2)) {
2017 int diff = (diff_q1q0[y] + diff_q1q2 -
delta) >> 1;
2021 if (str_q != 1 &&
FFABS(diff_p1p2) <= (lim2 >> 2)) {
2022 int diff = (diff_p1p0[y] + diff_p1p2 +
delta) >> 1;
2035 int str_q =
STRENGTH(diff_q, lim2);
2036 int str_p =
STRENGTH(diff_p, lim2);
2037 int msum, maxprod, weak;
2039 if (str_p + str_q <= 2)
2042 msum = (mode1 + mode2 + str_q + str_p) >> 1;
2043 if (str_q == 1 || str_p == 1) {
2051 for (
int y = 0; y < 2; y++) {
2054 if (diff_pq &&
result <= maxprod) {
2059 int diff_strg = (
dst[-2*
step] -
dst[
step] + 4 * diff_pq + 4) >> 3;
2071 int qp_l = dblk_l >> 2;
2072 int str_l = dblk_l & 3;
2073 int qp_r = dblk_r >> 2;
2074 int str_r = dblk_r & 3;
2077 int mode_l = str_l ? dl_l[str_l - 1] : 0;
2078 int mode_r = str_r ? dl_r[str_r - 1] : 0;
2080 int lim2 = dl_r[3] * 4;
2083 if ((str_l | str_r) >= 2 && deblock_chroma)
2084 for (
int plane = 1; plane < 3; plane++)
2090 int qp_t = dblk_t >> 2;
2091 int str_t = dblk_t & 3;
2092 int qp_d = dblk_d >> 2;
2093 int str_d = dblk_d & 3;
2096 int mode_t = str_t ? dl_t[str_t - 1] : 0;
2097 int mode_d = str_d ? dl_d[str_d - 1] : 0;
2099 int lim2 = dl_d[3] * 4;
2102 if ((str_t | str_d) >= 2 && deblock_chroma)
2103 for (
int plane = 1; plane < 3; plane++)
2111 int str_l =
s->left_str[dblkpos -
s->dblk_stride - 1];
2112 int str_r =
s->left_str[dblkpos -
s->dblk_stride];
2113 if ((str_l | str_r) & 3)
2117 int str_l =
s->left_str[dblkpos - 1];
2118 int str_r =
s->left_str[dblkpos];
2119 if ((str_l | str_r) & 3)
2122 if (ypos + 8 >=
s->aheight) {
2123 int str_l =
s->left_str[dblkpos +
s->dblk_stride - 1];
2124 int str_r =
s->left_str[dblkpos +
s->dblk_stride];
2125 if ((str_l | str_r) & 3)
2131 int str_t =
s->top_str[dblkpos -
s->dblk_stride - 1];
2132 int str_d =
s->top_str[dblkpos - 1];
2133 if ((str_t | str_d) & 3)
2137 int str_t =
s->top_str[dblkpos -
s->dblk_stride];
2138 int str_d =
s->top_str[dblkpos];
2139 if ((str_t | str_d) & 3)
2142 if (xpos + 8 >=
s->awidth) {
2143 int str_t =
s->top_str[dblkpos -
s->dblk_stride + 1];
2144 int str_d =
s->top_str[dblkpos + 1];
2145 if ((str_t | str_d) & 3)
2153 for (
int x = 0; x < size >> 3; x++)
2156 for (
int y = 1; y < size >> 3; y++)
2162 int pu_pos, tsize, ntiles;
2165 if (xpos >=
s->awidth || ypos >=
s->aheight)
2169 int hsize = 1 << (log_size - 1);
2178 pu_pos = (ypos >> 3) *
s->pu_stride + (xpos >> 3);
2179 cu_type =
s->pu_info[pu_pos].cu_type;
2181 case 3: tsize = 3;
break;
2182 case 4: tsize = cu_type &&
s->pu_info[pu_pos].pu_type ? 3 : 4;
break;
2184 case 6: tsize = 4;
break;
2186 ntiles = 1 << (log_size - tsize);
2188 for (
int ty = 0; ty < ntiles; ty++)
2189 for (
int tx = 0; tx < ntiles; tx++) {
2190 int x = xpos + (tx << tsize);
2191 int y = ypos + (ty << tsize);
2192 int cu_pos = ((y & 63) >> 3) * 8 + ((x & 63) >> 3);
2211 switch (qp_off_type) {
2216 return val != 2 ?
val : -1;
2224 return -((
val & 1) + 1);
2232 case 1:
return qp <= 25 ? qp + 5 : qp;
2249 int qp, sel_qp,
ret;
2261 for (
int cu_x = 0; cu_x <
s->cu_width; cu_x++) {
2300 if (avpkt->
size == 0) {
2308 if (avpkt->
size < 9)
2311 header_size = avpkt->
data[0] * 8 + 9;
2312 if (avpkt->
size < header_size)
2335 s->last_frame[
CUR_PIC]->pict_type =
s->pict_type;
2342 if (!
s->last_frame[
CUR_PIC]->data[0])
2351 for (
int i = 0;
i <
s->cu_height;
i++) {
2352 if (ofs >= avpkt->
size - header_size)
2354 s->slice[
i].data = avpkt->
data + header_size + ofs;
2355 s->slice[
i].data_size =
FFMIN(
s->slice[
i].size, avpkt->
size - header_size - ofs);
2356 if (
s->slice[
i].size > INT32_MAX - ofs)
2358 ofs +=
s->slice[
i].size;
2370 else if (
s->last_frame[
LAST_PIC]->data[0])
2384 s->ref_pts[0] =
s->ref_pts[1];
2385 s->ref_pts[1] = avpkt->
pts;
2387 s->ref_ts[0] =
s->ref_ts[1];
2388 s->ref_ts[1] =
s->ts;
2390 if (
s->ref_pts[1] >
s->ref_pts[0] &&
s->ref_ts[1] >
s->ref_ts[0])
2391 s->ts_scale = (
s->ref_pts[1] -
s->ref_pts[0]) / (
s->ref_ts[1] -
s->ref_ts[0]);
2393 frame->pts =
s->ref_pts[0] + (
s->ts -
s->ref_ts[0]) *
s->ts_scale;
2403 for (
int i = 0;
i < 3;
i++)
2411 for (
int i = 0;
i < 3;
i++)
2420 for (
int i = 0;
i <
s->nb_progress;
i++)
static void fill_mv_skip_cand(RV60Context *s, const CUContext *cu, unique_list_mvinfo *skip_cand, int size)
static void filter_luma_edge(uint8_t *dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
static const uint8_t skip_mv_ref[4]
#define AV_LOG_WARNING
Something somehow does not look correct.
static void decode_2x2_dc(GetBitContext *gb, const CoeffVLCs *vlcs, int16_t *coeffs, int stride, int block2, int dsc, int q_dc, int q_ac)
void ff_thread_progress_report(ThreadProgress *pro, int n)
This function is a no-op in no-op mode; otherwise it notifies other threads that a certain level of p...
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
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
static void rv60_flush(AVCodecContext *avctx)
static int pu_is_intra(const PUInfo *pu)
ThreadProgress is an API to easily notify other threads about progress of any kind as long as it can ...
static int deblock_get_top_strength(const RV60Context *s, int pos)
static void deblock(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int size, int dpos)
static int pred_angle(const IntraPredContext *p, uint8_t *dst, int stride, int size, int imode, int filter)
void ff_rv60_idct8x8_add(const int16_t *block, uint8_t *dst, int dst_stride)
static void read_mv(GetBitContext *gb, MV *mv)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
static void decode_cu_16x16(GetBitContext *gb, int is_intra, int qp, int sel_qp, int16_t *y_coeffs, int16_t *u_coeffs, int16_t *v_coeffs, int ccbp)
static const int8_t mv[256][2]
#define FILTER_BLOCK(dst, dst_stride, src, src_stride, src_y_ofs, w, h, cond, step)
static int get_bits_count(const GetBitContext *s)
static void deblock_edge_ver(AVFrame *frame, int xpos, int ypos, int dblk_l, int dblk_r, int deblock_chroma)
static const VLCElem * cbp8_vlc[7][4]
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
This structure describes decoded (raw) audio or video data.
static av_cold void rv60_init_static_data(void)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
static int mvinfo_matches_forward(const MVInfo *a, const MVInfo *b)
static void mc(RV60Context *s, uint8_t *frame_data[3], int frame_linesize[3], const AVFrame *ref, int x, int y, int w, int h, MV mv, int avg)
static void filter_weak(uint8_t *dst, const uint8_t *src, int size)
const FFCodec ff_rv60_decoder
void(* filter)(uint8_t *src, int stride, int qscale)
static const uint8_t rv60_cbp8_lens[7][4][64]
static int update_dimensions_clear_info(RV60Context *s, int width, int height)
static void decode_4x4_block(GetBitContext *gb, const CoeffVLCs *vlcs, int is_luma, int16_t *coeffs, int stride, int q_ac)
static void decode_cu_4x4in16x16(GetBitContext *gb, int is_intra, int qp, int sel_qp, int16_t *y_coeffs, int16_t *u_coeffs, int16_t *v_coeffs, int cbp)
static int ipm_compar(const void *a, const void *b)
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 int deblock_get_pos(RV60Context *s, int xpos, int ypos)
static int deblock_get_left_strength(const RV60Context *s, int pos)
static void populate_ipred(const RV60Context *s, CUContext *cu, const uint8_t *src, int stride, int xoff, int yoff, int size, int is_luma)
uint8_t avg_buffer[64 *64+32 *32 *2]
static void skip_bits(GetBitContext *s, int n)
static av_cold void close(AVCodecParserContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int has_left_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
AVCodec p
The public AVCodec.
enum AVDiscard skip_frame
Skip decoding for selected frames.
static void deblock_set_top_strength(RV60Context *s, int pos, int strength)
static int get_skip_mv_index(enum MVRefEnum mvref)
static void deblock_edge_hor(AVFrame *frame, int xpos, int ypos, int dblk_t, int dblk_d, int deblock_chroma)
const h264_weight_func weight
static double val(void *priv, double ch)
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
static void get_mv_dimensions(Dimensions *dim, enum PUType pu_type, int part_no, int size)
static void pred_plane(const IntraPredContext *p, uint8_t *dst, int stride, int size)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static void derive_deblock_strength(RV60Context *s, int xpos, int ypos, int size)
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static int quant(int v, int q)
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
static int decode_slice(AVCodecContext *avctx, void *tdata, int cu_y, int threadnr)
#define FF_CODEC_DECODE_CB(func)
static const uint8_t rv60_deblock_limits[32][4]
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
static const uint8_t rv60_edge2[4]
uint8_t cu_split[1+4+16+64]
#define MK_UNIQUELIST(name, type, max_size)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static const uint8_t rv60_cbp16_lens[7][3][4][64]
static void predict_mv(const RV60Context *s, MVInfo *dst, int mv_x, int mv_y, int mv_w, const MVInfo *src)
static int mv_is_forward(enum MVRefEnum mvref)
static const uint8_t rv60_ipred_angle[9]
static int mv_is_ref0(enum MVRefEnum mvref)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static void mv_pred(MV *ret, MV a, MV b, MV c)
static void deblock8x8(const RV60Context *s, AVFrame *frame, int xpos, int ypos, int dblkpos)
#define CODEC_LONG_NAME(str)
static int read_frame_header(RV60Context *s, GetBitContext *gb, int *width, int *height)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
@ AVDISCARD_ALL
discard all
static void decode_4x4_block_dc(GetBitContext *gb, const CoeffVLCs *vlcs, int is_luma, int16_t *coeffs, int stride, int q_dc, int q_ac)
static void ipred_init(IntraPredContext *i)
void ff_thread_progress_await(const ThreadProgress *pro_c, int n)
This function is a no-op in no-op mode; otherwise it waits until other threads have reached a certain...
static int mvinfo_is_deblock_cand(const MVInfo *a, const MVInfo *b)
and forward the result(frame or status change) to the corresponding input. If nothing is possible
static int decode_cu_r(RV60Context *s, AVFrame *frame, ThreadContext *thread, GetBitContext *gb, int xpos, int ypos, int log_size, int qp, int sel_qp)
static const uint8_t rv60_chroma_quant_ac[32]
static int has_ver_split(enum PUType pu_type)
static VLCElem table_data[129148]
static unsigned int get_bits1(GetBitContext *s)
@ AV_PICTURE_TYPE_I
Intra.
static int read_slice_sizes(RV60Context *s, GetBitContext *gb)
static int has_hor_split(enum PUType pu_type)
static void decode_2x2(GetBitContext *gb, const CoeffVLCs *vlcs, int16_t *coeffs, int stride, int block2, int dsc, int q_ac)
static int has_top_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
static const uint8_t rv60_dsc_to_lx[][4]
static const VLCElem * cbp16_vlc[7][4][4]
static const VLCElem * gen_vlc(const uint8_t *bits, int size, VLCInitState *state)
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static const CoeffLens rv60_intra_lens[5]
static void luma_mc(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int w, int h, int cx, int cy)
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 void pred_dc(const IntraPredContext *p, uint8_t *dst, int stride, int size, int filter)
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
static void read_mv_info(RV60Context *s, GetBitContext *gb, MVInfo *mvinfo, int size, enum PUType pu_type)
@ AVDISCARD_NONKEY
discard all frames except keyframes
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
static const uint8_t rv60_avail_mask[64]
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]
static const uint16_t rv60_ipred_inv_angle[9]
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
static void filter_bilin32(uint8_t *dst, int v0, int v1, int size)
static void build_coeff_vlc(const CoeffLens *lens, CoeffVLCs *vlc, int count, VLCInitState *state)
static int shift(int a, int b)
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static int rv60_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
static int pu_type_num_parts(enum PUType pu_type)
static void add_if_valid(unique_list_mvinfo *skip_cand, const MVInfo *mvi)
static int get_interleaved_se_golomb(GetBitContext *gb)
static const CoeffLens rv60_inter_lens[7]
static void chroma_mc(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int w, int h, int x, int y)
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
static void filter_chroma_edge(uint8_t *dst, int step, int stride, int mode1, int mode2, int lim1, int lim2)
static av_cold int rv60_decode_end(AVCodecContext *avctx)
@ AV_PICTURE_TYPE_NONE
Undefined.
FrameData * frame_data(AVFrame *frame)
Get our axiliary frame data attached to the frame, allocating it if needed.
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static char * split(char *message, char delim)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
static CoeffVLCs intra_coeff_vlc[5]
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
static void pred_hor_angle(uint8_t *dst, int stride, int size, int weight, const uint8_t *src)
struct ThreadProgress * progress
static void skip_bits1(GetBitContext *s)
static void deblock_cu_r(RV60Context *s, AVFrame *frame, ThreadContext *thread, int xpos, int ypos, int log_size, int qp)
static int calc_sel_qp(int osvquant, int qp)
static int read_intra_mode(GetBitContext *gb, int *param)
#define AV_LOG_INFO
Standard information.
static int decode_super_cbp(GetBitContext *gb, const VLCElem *vlc[4])
#define STRENGTH(el, lim)
static const uint8_t rv60_candidate_intra_angles[6]
static int decode_cbp8(GetBitContext *gb, int subset, int qp)
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int has_left_down_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
av_cold int ff_thread_progress_init(ThreadProgress *pro, int init_mode)
Initialize a ThreadProgress.
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
static int has_top_right_block(const RV60Context *s, int xpos, int ypos, int dx, int dy, int size)
static void avg(AVFrame *frame, uint8_t *prev_frame_data[3], int prev_frame_linesize[3], int x, int y, int w, int h)
const char * name
Name of the codec implementation.
void ff_rv60_idct4x4_add(const int16_t *block, uint8_t *dst, int dst_stride)
static void pred_ver_angle(uint8_t *dst, int stride, int size, int weight, const uint8_t *src)
static av_cold int rv60_decode_init(AVCodecContext *avctx)
static int decode_coeff(GetBitContext *gb, const CoeffVLCs *vlcs, int inval, int val)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static int mv_is_backward(enum MVRefEnum mvref)
static int reconstruct_intra(const RV60Context *s, const CUContext *cu, int size, int sub)
static int mvinfo_matches_backward(const MVInfo *a, const MVInfo *b)
#define FFSWAP(type, a, b)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static int progress_init(RV60Context *s, unsigned count)
static const uint8_t * align_get_bits(GetBitContext *s)
static CoeffVLCs inter_coeff_vlc[7]
av_cold void ff_thread_progress_destroy(ThreadProgress *pro)
Destroy a ThreadProgress.
static int decode_cbp16(GetBitContext *gb, int subset, int qp)
main external API structure.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
static void get_next_mv(const RV60Context *s, const Dimensions *dim, enum PUType pu_type, int part_no, int *mv_pos, int *mv_x, int *mv_y)
static int ref[MAX_W *MAX_W]
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
static void ff_thread_progress_reset(ThreadProgress *pro)
Reset the ThreadProgress.progress counter; must only be called if the ThreadProgress is not in use in...
static void deblock_set_strength(RV60Context *s, int xpos, int ypos, int size, int q, int strength)
@ AV_PICTURE_TYPE_P
Predicted.
static const VLCElem * ff_vlc_init_tables(VLCInitState *state, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, int flags)
static void deblock_set_left_strength(RV60Context *s, int pos, int strength)
static const uint8_t rv60_chroma_quant_dc[32]
static int read_qp_offset(GetBitContext *gb, int qp_off_type)
static int read_code012(GetBitContext *gb)
static int check_pos(int x, int y, int cw, int ch, int w, int h, int dx, int dy, int e0, int e1, int e2, int e3)
static const uint8_t rv60_qp_to_idx[64]
#define VLC_INIT_STATE(_table)
static int get_c4x4_set(int qp, int is_intra)
This structure stores compressed data.
static void avg_plane(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int w, int h)
void ff_rv60_idct16x16_add(const int16_t *block, uint8_t *dst, int dst_stride)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static void decode_cu_8x8(GetBitContext *gb, int is_intra, int qp, int sel_qp, int16_t *y_coeffs, int16_t *u_coeffs, int16_t *v_coeffs, int ccbp, int mode4x4)
@ AVDISCARD_NONREF
discard all non reference
static const uint8_t rv60_edge1[4]
static void reconstruct(RV60Context *s, const CUContext *cu, int size)
static const int8_t frame_types[4]
static const uint16_t rv60_quants_b[32]