96 const uint8_t *syms,
int mod_three_bits_offset,
int *
offset)
98 int counts[17] = {0}, codes[17];
108 codes[0] = counts[0] = 0;
109 for (
int i = 0;
i < 16;
i++) {
110 codes[
i+1] = (codes[
i] + counts[
i]) << 1;
117 const void *symp = syms;
120 if (mod_three_bits_offset > 0) {
124 for (
int i = 0,
mask = (1 << mod_three_bits_offset) - 1;
i <
size; ++
i) {
129 if (!mod_three_bits_offset)
132 symbol_size = !!symp;
147 int mod_three_bits_offset,
int *
offset)
162 for(j = 0; j < 2; j++){
169 for(k = 0; k < 4; k++){
174 for(j = 0; j < 4; j++){
185 for(j = 0; j < 4; j++){
189 for(j = 0; j < 2; j++){
214 int pattern,
code, cbp=0;
216 static const int cbp_masks[3] = {0x100000, 0x010000, 0x110000};
217 static const int shifts[4] = { 0, 2, 8, 10 };
218 const int *curshift =
shifts;
222 pattern =
code & 0xF;
232 for(
i = 0;
i < 4;
i++){
233 t = (
code >> (6 - 2*
i)) & 3;
237 cbp |= cbp_masks[2] <<
i;
253 coef = 22 + ((1 << coef) |
get_bits(gb, coef));
259 *
dst = (coef*q + 8) >> 4;
292 int q_dc,
int q_ac1,
int q_ac2)
312 int fc,
int sc,
int q_dc,
int q_ac1,
int q_ac2)
316 int pattern =
flags & 0x7;
355 for(
i = 0;
i < 5;
i++)
380 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
388 fill_rectangle(intra_types, 4, 4,
r->intra_types_stride, t,
sizeof(intra_types[0]));
397 if(
r->decode_intra_types(
r, gb, intra_types) < 0)
415 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
418 r->block_type =
r->decode_mb_info(
r);
419 if(
r->block_type == -1)
422 r->mb_type[mb_pos] =
r->block_type;
433 fill_rectangle(intra_types, 4, 4,
r->intra_types_stride, 0,
sizeof(intra_types[0]));
439 if (
IS_INTRA(
s->cur_pic.mb_type[mb_pos])) {
442 fill_rectangle(intra_types, 4, 4,
r->intra_types_stride, t,
sizeof(intra_types[0]));
445 if(
r->decode_intra_types(
r, gb, intra_types) < 0)
452 for(
i = 0;
i < 16;
i++)
453 intra_types[(
i & 3) + (
i>>2) *
r->intra_types_stride] = 0;
474static const uint8_t
part_sizes_w[
RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2 };
477static const uint8_t
part_sizes_h[
RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2 };
492 int mv_pos =
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride;
493 int A[2] = {0},
B[2],
C[2];
498 int16_t (*motion_val)[2] =
s->cur_pic.motion_val[0];
500 mv_pos += (subblock_no & 1) + (subblock_no >> 1)*
s->b8_stride;
505 A[0] = motion_val[mv_pos-1][0];
506 A[1] = motion_val[mv_pos-1][1];
509 B[0] = motion_val[mv_pos-
s->b8_stride][0];
510 B[1] = motion_val[mv_pos-
s->b8_stride][1];
516 if(avail[-4] && (avail[-1] ||
r->rv30)){
517 C[0] = motion_val[mv_pos-
s->b8_stride-1][0];
518 C[1] = motion_val[mv_pos-
s->b8_stride-1][1];
524 C[0] = motion_val[mv_pos-
s->b8_stride+c_off][0];
525 C[1] = motion_val[mv_pos-
s->b8_stride+c_off][1];
529 mx +=
r->dmv[dmv_no][0];
530 my +=
r->dmv[dmv_no][1];
533 motion_val[mv_pos +
i + j*
s->b8_stride][0] =
mx;
534 motion_val[mv_pos +
i + j*
s->b8_stride][1] =
my;
539#define GET_PTS_DIFF(a, b) (((a) - (b) + 8192) & 0x1FFF)
546 int mul = dir ? -
r->mv_weight2 :
r->mv_weight1;
548 return (
int)(
val * (
SUINT)mul + 0x2000) >> 14;
555 int A_avail,
int B_avail,
int C_avail,
558 if(A_avail + B_avail + C_avail != 3){
559 *
mx =
A[0] +
B[0] +
C[0];
560 *
my =
A[1] +
B[1] +
C[1];
561 if(A_avail + B_avail + C_avail == 2){
577 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
578 int mv_pos =
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride;
579 int A[2] = { 0 },
B[2] = { 0 },
C[2] = { 0 };
580 int has_A = 0, has_B = 0, has_C = 0;
593 B[0] = cur_pic->
motion_val[dir][mv_pos -
s->b8_stride][0];
594 B[1] = cur_pic->
motion_val[dir][mv_pos -
s->b8_stride][1];
597 if(
r->avail_cache[6-4] && (
r->avail_cache[6-2] &
type) &
mask){
598 C[0] = cur_pic->
motion_val[dir][mv_pos -
s->b8_stride + 2][0];
599 C[1] = cur_pic->
motion_val[dir][mv_pos -
s->b8_stride + 2][1];
601 }
else if((
s->mb_x+1) ==
s->mb_width && (
r->avail_cache[6-5] &
type) &
mask){
602 C[0] = cur_pic->
motion_val[dir][mv_pos -
s->b8_stride - 1][0];
603 C[1] = cur_pic->
motion_val[dir][mv_pos -
s->b8_stride - 1][1];
609 mx +=
r->dmv[dir][0];
610 my +=
r->dmv[dir][1];
612 for(j = 0; j < 2; j++){
613 for(
i = 0;
i < 2;
i++){
629 int mv_pos =
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride;
630 int A[2] = {0},
B[2],
C[2];
636 A[0] =
s->cur_pic.motion_val[0][mv_pos - 1][0];
637 A[1] =
s->cur_pic.motion_val[0][mv_pos - 1][1];
640 B[0] =
s->cur_pic.motion_val[0][mv_pos -
s->b8_stride][0];
641 B[1] =
s->cur_pic.motion_val[0][mv_pos -
s->b8_stride][1];
647 if(avail[-4] && (avail[-1])){
648 C[0] =
s->cur_pic.motion_val[0][mv_pos -
s->b8_stride - 1][0];
649 C[1] =
s->cur_pic.motion_val[0][mv_pos -
s->b8_stride - 1][1];
655 C[0] =
s->cur_pic.motion_val[0][mv_pos -
s->b8_stride + 2][0];
656 C[1] =
s->cur_pic.motion_val[0][mv_pos -
s->b8_stride + 2][1];
662 for(j = 0; j < 2; j++){
663 for(
i = 0;
i < 2;
i++){
664 for(k = 0; k < 2; k++){
665 s->cur_pic.motion_val[k][mv_pos +
i + j*
s->b8_stride][0] =
mx;
666 s->cur_pic.motion_val[k][mv_pos +
i + j*
s->b8_stride][1] =
my;
690 const int xoff,
const int yoff,
int mv_off,
692 const int thirdpel,
int weighted,
698 const uint8_t *srcY, *srcU, *srcV;
699 int dxy,
mx,
my, umx, umy, lx, ly, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
700 int mv_pos =
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride + mv_off;
703 int16_t *motion_val =
s->cur_pic.motion_val[dir][mv_pos];
706 int chroma_mx, chroma_my;
707 mx = (motion_val[0] + (3 << 24)) / 3 - (1 << 24);
708 my = (motion_val[1] + (3 << 24)) / 3 - (1 << 24);
709 lx = (motion_val[0] + (3 << 24)) % 3;
710 ly = (motion_val[1] + (3 << 24)) % 3;
711 chroma_mx = motion_val[0] / 2;
712 chroma_my = motion_val[1] / 2;
713 umx = (chroma_mx + (3 << 24)) / 3 - (1 << 24);
714 umy = (chroma_my + (3 << 24)) / 3 - (1 << 24);
719 mx = motion_val[0] >> 2;
720 my = motion_val[1] >> 2;
721 lx = motion_val[0] & 3;
722 ly = motion_val[1] & 3;
723 cx = motion_val[0] / 2;
724 cy = motion_val[1] / 2;
727 uvmx = (cx & 3) << 1;
728 uvmy = (cy & 3) << 1;
730 if(uvmx == 6 && uvmy == 6)
736 int mb_row =
s->mb_y + ((yoff +
my + 5 + 8 *
height) >> 4);
737 const ThreadProgress *p = dir ? &
s->next_pic.ptr->progress : &
s->last_pic.ptr->progress;
742 srcY = dir ?
s->next_pic.data[0] :
s->last_pic.data[0];
743 srcU = dir ?
s->next_pic.data[1] :
s->last_pic.data[1];
744 srcV = dir ?
s->next_pic.data[2] :
s->last_pic.data[2];
745 src_x =
s->mb_x * 16 + xoff +
mx;
746 src_y =
s->mb_y * 16 + yoff +
my;
747 uvsrc_x =
s->mb_x * 8 + (xoff >> 1) + umx;
748 uvsrc_y =
s->mb_y * 8 + (yoff >> 1) + umy;
749 srcY += src_y *
s->linesize + src_x;
750 srcU += uvsrc_y *
s->uvlinesize + uvsrc_x;
751 srcV += uvsrc_y *
s->uvlinesize + uvsrc_x;
752 if(
s->h_edge_pos - (
width << 3) < 6 ||
s->v_edge_pos - (
height << 3) < 6 ||
753 (
unsigned)(src_x - !!lx*2) >
s->h_edge_pos - !!lx*2 - (
width <<3) - 4 ||
754 (
unsigned)(src_y - !!ly*2) >
s->v_edge_pos - !!ly*2 - (
height<<3) - 4) {
755 srcY -= 2 + 2*
s->linesize;
756 s->vdsp.emulated_edge_mc(
s->sc.edge_emu_buffer, srcY,
757 s->linesize,
s->linesize,
759 src_x - 2, src_y - 2,
760 s->h_edge_pos,
s->v_edge_pos);
761 srcY =
s->sc.edge_emu_buffer + 2 + 2*
s->linesize;
765 Y =
s->dest[0] + xoff + yoff *
s->linesize;
766 U =
s->dest[1] + (xoff>>1) + (yoff>>1)*
s->uvlinesize;
767 V =
s->dest[2] + (xoff>>1) + (yoff>>1)*
s->uvlinesize;
769 Y =
r->tmp_b_block_y [dir] + xoff + yoff *
s->linesize;
770 U =
r->tmp_b_block_uv[dir*2] + (xoff>>1) + (yoff>>1)*
s->uvlinesize;
771 V =
r->tmp_b_block_uv[dir*2+1] + (xoff>>1) + (yoff>>1)*
s->uvlinesize;
775 qpel_mc[1][dxy](
Y, srcY,
s->linesize);
779 qpel_mc[1][dxy](
Y, srcY,
s->linesize);
780 Y += 8 *
s->linesize;
781 srcY += 8 *
s->linesize;
784 qpel_mc[!is16x16][dxy](
Y, srcY,
s->linesize);
786 uint8_t *uvbuf =
s->sc.edge_emu_buffer;
788 s->vdsp.emulated_edge_mc(uvbuf, srcU,
789 s->uvlinesize,
s->uvlinesize,
792 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
794 uvbuf += 9*
s->uvlinesize;
796 s->vdsp.emulated_edge_mc(uvbuf, srcV,
797 s->uvlinesize,
s->uvlinesize,
800 s->h_edge_pos >> 1,
s->v_edge_pos >> 1);
808 const int xoff,
const int yoff,
int mv_off,
811 rv34_mc(
r, block_type, xoff, yoff, mv_off,
width,
height, dir,
r->rv30, 0,
812 r->rdsp.put_pixels_tab,
813 r->rdsp.put_chroma_pixels_tab);
818 r->rdsp.rv40_weight_pixels_tab[
r->scaled_weight][0](
r->s.dest[0],
824 r->rdsp.rv40_weight_pixels_tab[
r->scaled_weight][1](
r->s.dest[1],
825 r->tmp_b_block_uv[0],
826 r->tmp_b_block_uv[2],
830 r->rdsp.rv40_weight_pixels_tab[
r->scaled_weight][1](
r->s.dest[2],
831 r->tmp_b_block_uv[1],
832 r->tmp_b_block_uv[3],
842 rv34_mc(
r, block_type, 0, 0, 0, 2, 2, 0,
r->rv30, weighted,
843 r->rdsp.put_pixels_tab,
844 r->rdsp.put_chroma_pixels_tab);
846 rv34_mc(
r, block_type, 0, 0, 0, 2, 2, 1,
r->rv30, 0,
847 r->rdsp.avg_pixels_tab,
848 r->rdsp.avg_chroma_pixels_tab);
850 rv34_mc(
r, block_type, 0, 0, 0, 2, 2, 1,
r->rv30, 1,
851 r->rdsp.put_pixels_tab,
852 r->rdsp.put_chroma_pixels_tab);
860 int weighted = !
r->rv30 &&
r->weight1 != 8192;
862 for(j = 0; j < 2; j++)
863 for(
i = 0;
i < 2;
i++){
866 r->rdsp.put_pixels_tab,
867 r->rdsp.put_chroma_pixels_tab);
870 weighted ?
r->rdsp.put_pixels_tab :
r->rdsp.avg_pixels_tab,
871 weighted ?
r->rdsp.put_chroma_pixels_tab :
r->rdsp.avg_chroma_pixels_tab);
878static const int num_mvs[
RV34_MB_TYPES] = { 0, 0, 1, 4, 1, 1, 0, 0, 2, 2, 2, 1 };
889 int mv_pos =
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride;
892 memset(
r->dmv, 0,
sizeof(
r->dmv));
898 r->dmv[
i][0] =
r->dmv[
i][1] = 0;
905 ZERO8x2(
s->cur_pic.motion_val[0][
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride],
s->b8_stride);
909 ZERO8x2(
s->cur_pic.motion_val[0][
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride],
s->b8_stride);
920 next_bt =
s->next_pic.mb_type[
s->mb_x +
s->mb_y *
s->mb_stride];
922 ZERO8x2(
s->cur_pic.motion_val[0][
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride],
s->b8_stride);
923 ZERO8x2(
s->cur_pic.motion_val[1][
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride],
s->b8_stride);
925 for(j = 0; j < 2; j++)
926 for(
i = 0;
i < 2;
i++)
927 for(k = 0; k < 2; k++)
928 for(l = 0; l < 2; l++)
929 s->cur_pic.motion_val[l][mv_pos +
i + j*
s->b8_stride][k] =
calc_add_mv(
r, l,
s->next_pic.motion_val[0][mv_pos +
i + j*
s->b8_stride][k]);
934 ZERO8x2(
s->cur_pic.motion_val[0][
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride],
s->b8_stride);
943 r->dmv[1][0] =
r->dmv[0][0];
944 r->dmv[1][1] =
r->dmv[0][1];
972 rv34_mc_1mv (
r, block_type, (
i&1)<<3, (
i&2)<<2, (
i&1)+(
i>>1)*
s->b8_stride, 1, 1, 0);
1020 topleft =
dst[-
stride + 3] * 0x01010101u;
1021 prev = (uint8_t*)&topleft;
1043 uint8_t *pdst,
int stride,
1044 int fc,
int sc,
int q_dc,
int q_ac)
1046 int16_t *
const ptr =
r->block;
1048 fc, sc, q_dc, q_ac, q_ac);
1050 r->rdsp.rv34_idct_add(pdst,
stride, ptr);
1052 r->rdsp.rv34_idct_dc_add(pdst,
stride, ptr[0]);
1064 uint8_t *
dst =
s->dest[0];
1065 int16_t *
const ptr =
r->block;
1066 int i, j, itype, has_ac;
1068 memset(block16, 0, 16 *
sizeof(*block16));
1072 r->rdsp.rv34_inv_transform(block16);
1074 r->rdsp.rv34_inv_transform_dc(block16);
1077 itype =
adjust_pred16(itype,
r->avail_cache[6-4],
r->avail_cache[6-1]);
1078 r->h.pred16x16[itype](
dst,
s->linesize);
1080 for(j = 0; j < 4; j++){
1082 int dc = block16[
i + j*4];
1091 r->rdsp.rv34_idct_add(
dst+4*
i,
s->linesize, ptr);
1093 r->rdsp.rv34_idct_dc_add(
dst+4*
i,
s->linesize, dc);
1096 dst += 4*
s->linesize;
1101 itype =
adjust_pred16(itype,
r->avail_cache[6-4],
r->avail_cache[6-1]);
1106 for(j = 1; j < 3; j++){
1108 r->h.pred8x8[itype](
dst,
s->uvlinesize);
1111 if(!(cbp & 1))
continue;
1112 pdst =
dst + (
i&1)*4 + (
i&2)*2*
s->uvlinesize;
1115 r->chroma_vlc, 1, q_dc, q_ac);
1123 uint8_t *
dst =
s->dest[0];
1124 int avail[6*8] = {0};
1126 int idx, q_ac, q_dc;
1129 if(
r->avail_cache[1])
1131 if(
r->avail_cache[2])
1132 avail[1] = avail[2] = 1;
1133 if(
r->avail_cache[3])
1134 avail[3] = avail[4] = 1;
1135 if(
r->avail_cache[4])
1137 if(
r->avail_cache[5])
1138 avail[8] = avail[16] = 1;
1139 if(
r->avail_cache[9])
1140 avail[24] = avail[32] = 1;
1143 for(j = 0; j < 4; j++){
1148 if(!(cbp & 1))
continue;
1151 r->luma_vlc, 0, q_ac, q_ac);
1153 dst +=
s->linesize * 4 - 4*4;
1154 intra_types +=
r->intra_types_stride;
1157 intra_types -=
r->intra_types_stride * 4;
1162 for(k = 0; k < 2; k++){
1166 for(j = 0; j < 2; j++){
1167 int* acache =
r->avail_cache + 6 + j*4;
1169 int itype =
ittrans[intra_types[
i*2+j*2*
r->intra_types_stride]];
1173 if(!(cbp&1))
continue;
1176 r->chroma_vlc, 1, q_dc, q_ac);
1179 dst += 4*
s->uvlinesize;
1187 d = motion_val[0][0] - motion_val[-step][0];
1190 d = motion_val[0][1] - motion_val[-step][1];
1199 int hmvmask = 0, vmvmask = 0,
i, j;
1200 int midx =
s->mb_x * 2 +
s->mb_y * 2 *
s->b8_stride;
1201 int16_t (*motion_val)[2] = &
s->cur_pic.motion_val[0][midx];
1202 for(j = 0; j < 16; j += 8){
1203 for(
i = 0;
i < 2;
i++){
1205 vmvmask |= 0x11 << (j +
i*2);
1207 hmvmask |= 0x03 << (j +
i*2);
1209 motion_val +=
s->b8_stride;
1211 if(
s->first_slice_line)
1216 vmvmask |= (vmvmask & 0x4444) >> 1;
1217 hmvmask |= (hmvmask & 0x0F00) >> 4;
1219 r->deblock_coefs[
s->mb_x - 1 +
s->mb_y*
s->mb_stride] |= (vmvmask & 0x1111) << 3;
1220 if(!
s->first_slice_line)
1221 r->deblock_coefs[
s->mb_x + (
s->mb_y - 1)*
s->mb_stride] |= (hmvmask & 0xF) << 12;
1223 return hmvmask | vmvmask;
1230 uint8_t *
dst =
s->dest[0];
1231 int16_t *
const ptr =
r->block;
1232 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
1234 int q_dc, q_ac, has_ac;
1239 memset(
r->avail_cache, 0,
sizeof(
r->avail_cache));
1241 dist = (
s->mb_x -
s->resync_mb_x) + (
s->mb_y -
s->resync_mb_y) *
s->mb_width;
1244 r->avail_cache[9] =
s->cur_pic.mb_type[mb_pos - 1];
1245 if(dist >=
s->mb_width)
1247 r->avail_cache[3] =
s->cur_pic.mb_type[mb_pos -
s->mb_stride];
1248 if(((
s->mb_x+1) <
s->mb_width) && dist >=
s->mb_width - 1)
1249 r->avail_cache[4] =
s->cur_pic.mb_type[mb_pos -
s->mb_stride + 1];
1250 if(
s->mb_x && dist >
s->mb_width)
1251 r->avail_cache[1] =
s->cur_pic.mb_type[mb_pos -
s->mb_stride - 1];
1253 s->qscale =
r->si.quant;
1255 r->cbp_luma [mb_pos] = cbp;
1256 r->cbp_chroma[mb_pos] = cbp >> 16;
1258 s->cur_pic.qscale_table[mb_pos] =
s->qscale;
1263 if (
IS_INTRA(
s->cur_pic.mb_type[mb_pos])) {
1272 memset(block16, 0, 16 *
sizeof(*block16));
1276 r->rdsp.rv34_inv_transform(block16);
1278 r->rdsp.rv34_inv_transform_dc(block16);
1282 for(j = 0; j < 4; j++){
1284 int dc = block16[
i + j*4];
1293 r->rdsp.rv34_idct_add(
dst+4*
i,
s->linesize, ptr);
1295 r->rdsp.rv34_idct_dc_add(
dst+4*
i,
s->linesize, dc);
1298 dst += 4*
s->linesize;
1305 for(j = 0; j < 4; j++){
1307 if(!(cbp & 1))
continue;
1310 r->luma_vlc, 0, q_ac, q_ac);
1312 dst += 4*
s->linesize;
1319 for(j = 1; j < 3; j++){
1323 if(!(cbp & 1))
continue;
1324 pdst =
dst + (
i&1)*4 + (
i&2)*2*
s->uvlinesize;
1327 r->chroma_vlc, 1, q_dc, q_ac);
1338 int mb_pos =
s->mb_x +
s->mb_y *
s->mb_stride;
1341 memset(
r->avail_cache, 0,
sizeof(
r->avail_cache));
1343 dist = (
s->mb_x -
s->resync_mb_x) + (
s->mb_y -
s->resync_mb_y) *
s->mb_width;
1346 r->avail_cache[9] =
s->cur_pic.mb_type[mb_pos - 1];
1347 if(dist >=
s->mb_width)
1349 r->avail_cache[3] =
s->cur_pic.mb_type[mb_pos -
s->mb_stride];
1350 if(((
s->mb_x+1) <
s->mb_width) && dist >=
s->mb_width - 1)
1351 r->avail_cache[4] =
s->cur_pic.mb_type[mb_pos -
s->mb_stride + 1];
1352 if(
s->mb_x && dist >
s->mb_width)
1353 r->avail_cache[1] =
s->cur_pic.mb_type[mb_pos -
s->mb_stride - 1];
1355 s->qscale =
r->si.quant;
1357 r->cbp_luma [mb_pos] = cbp;
1358 r->cbp_chroma[mb_pos] = cbp >> 16;
1359 r->deblock_coefs[mb_pos] = 0xFFFF;
1360 s->cur_pic.qscale_table[mb_pos] =
s->qscale;
1377 if(
s->mb_y >=
s->mb_height)
1379 if (!
r->mb_num_left)
1381 if (
r->mb_skip_run > 1)
1393 r->intra_types =
NULL;
1404 r->intra_types_stride =
r->s.mb_width * 4 + 4;
1406 r->cbp_chroma =
av_mallocz(
r->s.mb_stride *
r->s.mb_height *
1407 sizeof(*
r->cbp_chroma));
1409 sizeof(*
r->cbp_luma));
1410 r->deblock_coefs =
av_mallocz(
r->s.mb_stride *
r->s.mb_height *
1411 sizeof(*
r->deblock_coefs));
1412 r->intra_types_hist =
av_malloc(
r->intra_types_stride * 4 * 2 *
1413 sizeof(*
r->intra_types_hist));
1415 sizeof(*
r->mb_type));
1417 if (!(
r->cbp_chroma &&
r->cbp_luma &&
r->deblock_coefs &&
1418 r->intra_types_hist &&
r->mb_type)) {
1419 r->s.context_reinit = 1;
1424 r->intra_types =
r->intra_types_hist +
r->intra_types_stride * 4;
1441 int mb_pos, slice_type;
1447 res =
r->parse_slice_header(
r, gb, &
r->si);
1454 if (slice_type !=
s->pict_type) {
1458 if (
s->width !=
r->si.width ||
s->height !=
r->si.height) {
1464 s->qscale =
r->si.quant;
1465 r->mb_num_left =
r->si.end -
r->si.start;
1468 mb_pos =
s->mb_x +
s->mb_y *
s->mb_width;
1469 if(
r->si.start != mb_pos){
1471 s->mb_x =
r->si.start %
s->mb_width;
1472 s->mb_y =
r->si.start /
s->mb_width;
1474 memset(
r->intra_types_hist, -1,
r->intra_types_stride * 4 * 2 *
sizeof(*
r->intra_types_hist));
1475 s->first_slice_line = 1;
1476 s->resync_mb_x =
s->mb_x;
1477 s->resync_mb_y =
s->mb_y;
1493 if (++
s->mb_x ==
s->mb_width) {
1498 memmove(
r->intra_types_hist,
r->intra_types,
r->intra_types_stride * 4 *
sizeof(*
r->intra_types_hist));
1499 memset(
r->intra_types, -1,
r->intra_types_stride * 4 *
sizeof(*
r->intra_types_hist));
1501 if(
r->loop_filter &&
s->mb_y >= 2)
1502 r->loop_filter(
r,
s->mb_y - 2);
1509 if(
s->mb_x ==
s->resync_mb_x)
1510 s->first_slice_line=0;
1515 return s->mb_y ==
s->mb_height;
1573 r->cur_pts = r1->cur_pts;
1574 r->last_pts = r1->last_pts;
1575 r->next_pts = r1->next_pts;
1577 memset(&
r->si, 0,
sizeof(
r->si));
1584 if (n < slice_count) {
1594 int got_picture = 0, ret;
1606 }
else if (
s->last_pic.ptr) {
1628 int *got_picture_ptr,
AVPacket *avpkt)
1630 const uint8_t *buf = avpkt->
data;
1631 int buf_size = avpkt->
size;
1637 const uint8_t *slices_hdr =
NULL;
1643 if (buf_size == 0) {
1645 if (
s->next_pic.ptr) {
1650 *got_picture_ptr = 1;
1655 slice_count = (*buf++) + 1;
1656 slices_hdr = buf + 4;
1657 buf += 8 * slice_count;
1658 buf_size -= 1 + 8 * slice_count;
1668 if (
r->parse_slice_header(
r, &
r->gb, &si) < 0 || si.
start) {
1674 "reference data.\n");
1683 if (si.
start == 0) {
1684 if (
r->mb_num_left > 0 &&
s->cur_pic.ptr) {
1687 if (!
s->context_reinit)
1692 if (
s->width != si.
width ||
s->height != si.
height ||
s->context_reinit) {
1702 s->width,
s->height,
s->avctx->sample_aspect_ratio,
1721 if (!
r->tmp_b_block_base) {
1724 r->tmp_b_block_base =
av_malloc(
s->linesize * 48);
1725 if (!
r->tmp_b_block_base)
1727 for (
i = 0;
i < 2;
i++)
1728 r->tmp_b_block_y[
i] =
r->tmp_b_block_base
1729 +
i * 16 *
s->linesize;
1730 for (
i = 0;
i < 4;
i++)
1731 r->tmp_b_block_uv[
i] =
r->tmp_b_block_base + 32 *
s->linesize
1732 + (
i >> 1) * 8 *
s->uvlinesize
1735 r->cur_pts = si.
pts;
1737 r->last_pts =
r->next_pts;
1738 r->next_pts =
r->cur_pts;
1745 r->mv_weight1 =
r->mv_weight2 =
r->weight1 =
r->weight2 = 8192;
1746 r->scaled_weight = 0;
1748 if (
FFMAX(dist0, dist1) > refdist)
1751 r->mv_weight1 = (dist0 << 14) / refdist;
1752 r->mv_weight2 = (dist1 << 14) / refdist;
1753 if((
r->mv_weight1|
r->mv_weight2) & 511){
1754 r->weight1 =
r->mv_weight1;
1755 r->weight2 =
r->mv_weight2;
1756 r->scaled_weight = 0;
1758 r->weight1 =
r->mv_weight1 >> 9;
1759 r->weight2 =
r->mv_weight2 >> 9;
1760 r->scaled_weight = 1;
1764 s->mb_x =
s->mb_y = 0;
1766 }
else if (
s->context_reinit) {
1768 "reinitialize (start MB is %d).\n", si.
start);
1770 }
else if (HAVE_THREADS &&
1773 "multithreading mode (start MB is %d).\n", si.
start);
1777 for(
i = 0;
i < slice_count;
i++){
1788 r->si.end =
s->mb_width *
s->mb_height;
1789 r->mb_num_left =
r->s.mb_x +
r->s.mb_y*
r->s.mb_width -
r->si.start;
1791 if(
i+1 < slice_count){
1793 if (offset2 < offset1 || offset2 > buf_size) {
1800 if (
r->parse_slice_header(
r, &
r->gb, &si) < 0) {
1811 if (
s->cur_pic.ptr) {
1814 r->loop_filter(
r,
s->mb_height - 1);
1819 *got_picture_ptr = ret;
1820 }
else if (HAVE_THREADS &&
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static double val(void *priv, double ch)
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
#define FF_THREAD_FRAME
Decode more than one frame at once.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static const uint8_t shifts[2][12]
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static const uint16_t fc[]
int ff_set_dimensions(AVCodecContext *s, int width, int height)
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
void ff_er_frame_end(ERContext *s, int *decode_error_flags)
Indicate that a frame has finished decoding and perform error concealment in case it has been enabled...
static const uint8_t bits[8]
static void fill_rectangle(int x, int y, int w, int h)
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static int get_bits_left(GetBitContext *gb)
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
static int get_interleaved_se_golomb(GetBitContext *gb)
@ AVDISCARD_ALL
discard all
@ AVDISCARD_NONKEY
discard all frames except keyframes
@ AVDISCARD_NONREF
discard all non reference
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
void(* h264_chroma_mc_func)(uint8_t *dst, const uint8_t *src, ptrdiff_t srcStride, int h, int x, int y)
#define DIAG_DOWN_LEFT_PRED_RV40_NODOWN
#define HOR_UP_PRED_RV40_NODOWN
#define VERT_PRED
Prediction types.
#define DIAG_DOWN_LEFT_PRED
#define VERT_LEFT_PRED_RV40_NODOWN
#define DIAG_DOWN_RIGHT_PRED
av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth, int chroma_format_idc)
Set the intra prediction function pointers.
Multithreading API for decoders.
Macro definitions for various function/variable attributes.
common internal API header
static int ff_thread_once(char *control, void(*routine)(void))
static const uint16_t mask[17]
Memory handling functions.
#define LOCAL_ALIGNED_16(t, v,...)
void ff_mpeg_er_frame_start(MpegEncContext *s)
void ff_mpv_unref_picture(MPVWorkPicture *pic)
#define MB_TYPE_BACKWARD_MV
#define MB_TYPE_INTRA16x16
#define MB_TYPE_FORWARD_MV
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
void ff_init_block_index(MpegEncContext *s)
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
void ff_mpv_frame_end(MpegEncContext *s)
int ff_mpv_export_qp_table(const MpegEncContext *s, AVFrame *f, const MPVPicture *p, int qp_type)
void ff_print_debug_info(const MpegEncContext *s, const MPVPicture *p, AVFrame *pict)
av_cold int ff_mpv_decode_close(AVCodecContext *avctx)
av_cold int ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx)
Initialize the given MpegEncContext for decoding.
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
update_thread_context for mpegvideo-based decoders.
av_cold int ff_mpv_common_frame_size_change(MpegEncContext *s)
mpegvideo decoder header.
#define FF_MPV_QSCALE_TYPE_MPEG1
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static const uint16_t table[]
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
void(* qpel_mc_func)(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
useful rectangle filling function
static av_cold void rv34_init_tables(void)
Initialize all tables.
static const int rv34_mb_type_to_lavc[12]
translation of RV30/40 macroblock types to lavc ones
static int rv34_decode_intra_mb_header(RV34DecContext *r, int8_t *intra_types)
Decode intra macroblock header and return CBP in case of success, -1 otherwise.
static int adjust_pred16(int itype, int up, int left)
static void rv34_decoder_free(RV34DecContext *r)
static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t *buf, int buf_size)
static int rv34_decode_cbp(GetBitContext *gb, const RV34VLC *vlc, int table)
Decode coded block pattern.
static void decode_subblock1(int16_t *dst, int flags, GetBitContext *gb, const VLCElem *vlc, int q)
Decode a single coefficient.
static AVRational update_sar(int old_w, int old_h, AVRational sar, int new_w, int new_h)
static int rv34_decode_block(int16_t *dst, GetBitContext *gb, const RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2)
Decode coefficients for 4x4 block.
static void rv34_mc_2mv(RV34DecContext *r, const int block_type)
static const int chroma_coeffs[3]
static void rv4_weight(RV34DecContext *r)
static void rv34_pred_b_vector(int A[2], int B[2], int C[2], int A_avail, int B_avail, int C_avail, int *mx, int *my)
Predict motion vector for B-frame macroblock.
static av_cold void rv34_gen_vlc_ext(const uint8_t *bits, int size, VLC *vlc, const uint8_t *syms, int mod_three_bits_offset, int *offset)
Generate VLC from codeword lengths.
static void rv34_output_i16x16(RV34DecContext *r, int8_t *intra_types, int cbp)
static int rv34_decoder_realloc(RV34DecContext *r)
static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n, int slice_count, int buf_size)
static int rv34_decode_mv(RV34DecContext *r, int block_type)
Decode motion vector differences and perform motion vector reconstruction and motion compensation.
static void rv34_pred_4x4_block(RV34DecContext *r, uint8_t *dst, int stride, int itype, int up, int left, int down, int right)
Perform 4x4 intra prediction.
static int rv34_set_deblock_coef(RV34DecContext *r)
static VLCElem table_data[117592]
static void decode_coeff(int16_t *dst, int coef, int esc, GetBitContext *gb, const VLCElem *vlc, int q)
Get one coefficient value from the bitstream and store it.
static av_cold void rv34_gen_vlc(const uint8_t *bits, int size, const VLCElem **vlcp, int mod_three_bits_offset, int *offset)
static int rv34_decode_intra_macroblock(RV34DecContext *r, int8_t *intra_types)
static int calc_add_mv(RV34DecContext *r, int dir, int val)
Calculate motion vector component that should be added for direct blocks.
static void decode_subblock3(int16_t *dst, int flags, GetBitContext *gb, const VLCElem *vlc, int q_dc, int q_ac1, int q_ac2)
av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
static void decode_subblock(int16_t *dst, int flags, const int is_block2, GetBitContext *gb, const VLCElem *vlc, int q)
Decode 2x2 subblock of coefficients.
int ff_rv34_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_picture_ptr, AVPacket *avpkt)
static void rv34_mc(RV34DecContext *r, const int block_type, const int xoff, const int yoff, int mv_off, const int width, const int height, int dir, const int thirdpel, int weighted, qpel_mc_func(*qpel_mc)[16], h264_chroma_mc_func(*chroma_mc))
generic motion compensation function
static RV34VLC inter_vlcs[NUM_INTER_TABLES]
int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
Decode starting slice position.
static void rv34_mc_1mv(RV34DecContext *r, const int block_type, const int xoff, const int yoff, int mv_off, const int width, const int height, int dir)
static void ZERO8x2(void *dst, int stride)
static void rv34_output_intra(RV34DecContext *r, int8_t *intra_types, int cbp)
static const uint8_t avail_indexes[4]
availability index for subblocks
static const int ittrans16[4]
mapping of RV30/40 intra 16x16 prediction types to standard H.264 types
static int check_slice_end(RV34DecContext *r, MpegEncContext *s)
#define GET_PTS_DIFF(a, b)
static const uint8_t part_sizes_w[RV34_MB_TYPES]
macroblock partition width in 8x8 blocks
static int finish_frame(AVCodecContext *avctx, AVFrame *pict)
static const uint8_t part_sizes_h[RV34_MB_TYPES]
macroblock partition height in 8x8 blocks
static const int num_mvs[RV34_MB_TYPES]
number of motion vectors in each macroblock type
static int rv34_decoder_alloc(RV34DecContext *r)
static int rv34_decode_inter_mb_header(RV34DecContext *r, int8_t *intra_types)
Decode inter macroblock header and return CBP in case of success, -1 otherwise.
static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir)
motion vector prediction - RV3 version
static RV34VLC * choose_vlc_set(int quant, int mod, int type)
Select VLC set for decoding from current quantizer, modifier and frame type.
static RV34VLC intra_vlcs[NUM_INTRA_TABLES]
static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir)
motion vector prediction for B-frames
static void rv34_mc_2mv_skip(RV34DecContext *r)
av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
Initialize decoder.
int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
static int rv34_decode_inter_macroblock(RV34DecContext *r, int8_t *intra_types)
static int is_mv_diff_gt_3(int16_t(*motion_val)[2], int step)
static void rv34_process_block(RV34DecContext *r, uint8_t *pdst, int stride, int fc, int sc, int q_dc, int q_ac)
static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int dmv_no)
motion vector prediction
static const int ittrans[9]
mapping of RV30/40 intra prediction types to standard H.264 types
RV30 and RV40 decoder common data declarations.
@ RV34_MB_TYPE_INTRA
Intra macroblock.
@ RV34_MB_P_MIX16x16
P-frame macroblock with DCs in a separate 4x4 block, one motion vector.
@ RV34_MB_P_16x8
P-frame macroblock, 16x8 motion compensation partitions.
@ RV34_MB_B_BIDIR
Bidirectionally predicted B-frame macroblock, two motion vectors.
@ RV34_MB_B_BACKWARD
B-frame macroblock, backward prediction.
@ RV34_MB_B_DIRECT
Bidirectionally predicted B-frame macroblock, no motion vectors.
@ RV34_MB_P_16x16
P-frame macroblock, one motion frame.
@ RV34_MB_P_8x16
P-frame macroblock, 8x16 motion compensation partitions.
@ RV34_MB_P_8x8
P-frame macroblock, 8x8 motion compensation partitions.
@ RV34_MB_B_FORWARD
B-frame macroblock, forward prediction.
@ RV34_MB_TYPE_INTRA16x16
Intra macroblock with DCs in a separate 4x4 block.
@ RV34_MB_SKIP
Skipped block.
#define MB_TYPE_SEPARATE_DC
miscellaneous RV30/40 tables
static const uint8_t modulo_three_table[108]
precalculated results of division by three and modulo three for values 0-107
static const uint8_t rv34_chroma_quant[2][32]
quantizer values used for AC and DC coefficients in chroma blocks
static const uint8_t rv34_quant_to_vlc_set[2][32]
tables used to translate a quantizer value into a VLC set for decoding The first table is used for in...
static const uint16_t rv34_qscale_tab[32]
This table is used for dequantizing.
static const uint8_t rv34_cbp_code[16]
values used to reconstruct coded block pattern
static const uint8_t rv34_count_ones[16]
number of ones in nibble minus one
static const uint8_t rv34_mb_bits_sizes[6]
bits needed to code the slice offset for the given size
static const uint16_t rv34_mb_max_sizes[6]
maximum number of macroblocks for each of the possible slice offset sizes
static const uint8_t rv34_intra_coeff[NUM_INTRA_TABLES][COEFF_VLC_SIZE]
static const uint8_t rv34_inter_cbppat[NUM_INTER_TABLES][CBPPAT_VLC_SIZE]
static const uint8_t rv34_table_intra_thirdpat[NUM_INTRA_TABLES][2][OTHERBLK_VLC_SIZE]
#define OTHERBLK_VLC_SIZE
#define FIRSTBLK_VLC_SIZE
static const uint8_t rv34_inter_cbp[NUM_INTER_TABLES][4][CBP_VLC_SIZE]
static const uint8_t rv34_table_inter_secondpat[NUM_INTER_TABLES][2][OTHERBLK_VLC_SIZE]
static const uint8_t rv34_table_intra_cbp[NUM_INTRA_TABLES][8][CBP_VLC_SIZE]
static const uint8_t rv34_table_intra_secondpat[NUM_INTRA_TABLES][2][OTHERBLK_VLC_SIZE]
static const uint8_t rv34_table_intra_firstpat[NUM_INTRA_TABLES][4][FIRSTBLK_VLC_SIZE]
static const uint8_t rv34_table_inter_firstpat[NUM_INTER_TABLES][2][FIRSTBLK_VLC_SIZE]
static const uint8_t rv34_inter_coeff[NUM_INTER_TABLES][COEFF_VLC_SIZE]
static const uint8_t rv34_table_intra_cbppat[NUM_INTRA_TABLES][2][CBPPAT_VLC_SIZE]
static const uint8_t rv34_table_inter_thirdpat[NUM_INTER_TABLES][2][OTHERBLK_VLC_SIZE]
#define FF_ARRAY_ELEMS(a)
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int has_b_frames
Size of the frame reordering buffer in the decoder.
enum AVDiscard skip_frame
Skip decoding for selected frames.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
Rational number (pair of numerator and denominator).
uint32_t * mb_type
types and macros are defined in mpegutils.h
int16_t(*[2] motion_val)[2]
VLC tables used by the decoder.
VLC cbp[2][4]
VLCs used for coded block patterns decoding.
const VLCElem * coefficient
VLCs used for decoding big coefficients.
const VLCElem * first_pattern[4]
VLCs used for decoding coefficients in the first subblock.
const VLCElem * second_pattern[2]
VLCs used for decoding coefficients in the subblocks 2 and 3.
const VLCElem * cbppattern[2]
VLCs used for pattern of coded block patterns decoding.
const VLCElem * third_pattern[2]
VLCs used for decoding coefficients in the last subblock.
essential slice information
int type
slice type (intra, inter)
ThreadProgress is an API to easily notify other threads about progress of any kind as long as it can ...
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...
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 const double coeff[2][5]
static int mod(int a, int b)
Modulo operation with only positive remainders.
int ff_vlc_init_sparse(VLC *vlc, 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)
Build VLC decoding tables suitable for use with get_vlc2().
#define VLC_INIT_STATIC_OVERLONG
static const uint8_t quant[64]