|
|
|
@ -164,10 +164,10 @@ void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp) |
|
|
|
|
const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i]; |
|
|
|
|
const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i]; |
|
|
|
|
|
|
|
|
|
output[stride * 0 + offset] = ((z0 + z3) * qmul + 0x80000) >> 20; |
|
|
|
|
output[stride * 2 + offset] = ((z1 + z2) * qmul + 0x80000) >> 20; |
|
|
|
|
output[stride * 8 + offset] = ((z1 - z2) * qmul + 0x80000) >> 20; |
|
|
|
|
output[stride * 10 + offset] = ((z0 - z3) * qmul + 0x80000) >> 20; |
|
|
|
|
output[stride * 0 + offset] = (z0 + z3) * qmul + 0x80000 >> 20; |
|
|
|
|
output[stride * 2 + offset] = (z1 + z2) * qmul + 0x80000 >> 20; |
|
|
|
|
output[stride * 8 + offset] = (z1 - z2) * qmul + 0x80000 >> 20; |
|
|
|
|
output[stride * 10 + offset] = (z0 - z3) * qmul + 0x80000 >> 20; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#undef stride |
|
|
|
@ -179,8 +179,8 @@ void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
if (dc) { |
|
|
|
|
dc = 13 * 13 * ((dc == 1) ? 1538 * block[0] |
|
|
|
|
: ((qmul * (block[0] >> 3)) / 2)); |
|
|
|
|
dc = 13 * 13 * (dc == 1 ? 1538 * block[0] |
|
|
|
|
: qmul * (block[0] >> 3) / 2); |
|
|
|
|
block[0] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -203,10 +203,10 @@ void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, |
|
|
|
|
const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3]; |
|
|
|
|
const int rr = (dc + 0x80000); |
|
|
|
|
|
|
|
|
|
dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + (((z0 + z3) * qmul + rr) >> 20)); |
|
|
|
|
dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + (((z1 + z2) * qmul + rr) >> 20)); |
|
|
|
|
dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + (((z1 - z2) * qmul + rr) >> 20)); |
|
|
|
|
dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + (((z0 - z3) * qmul + rr) >> 20)); |
|
|
|
|
dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20)); |
|
|
|
|
dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20)); |
|
|
|
|
dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20)); |
|
|
|
|
dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -217,7 +217,7 @@ static inline int svq3_decode_block(GetBitContext *gb, DCTELEM *block, |
|
|
|
|
{ luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan }; |
|
|
|
|
|
|
|
|
|
int run, level, sign, vlc, limit; |
|
|
|
|
const int intra = (3 * type) >> 2; |
|
|
|
|
const int intra = 3 * type >> 2; |
|
|
|
|
const uint8_t *const scan = scan_patterns[type]; |
|
|
|
|
|
|
|
|
|
for (limit = (16 >> intra); index < 16; index = limit, limit += 8) { |
|
|
|
@ -226,7 +226,7 @@ static inline int svq3_decode_block(GetBitContext *gb, DCTELEM *block, |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
sign = (vlc & 0x1) - 1; |
|
|
|
|
vlc = (vlc + 1) >> 1; |
|
|
|
|
vlc = vlc + 1 >> 1; |
|
|
|
|
|
|
|
|
|
if (type == 3) { |
|
|
|
|
if (vlc < 3) { |
|
|
|
@ -236,19 +236,19 @@ static inline int svq3_decode_block(GetBitContext *gb, DCTELEM *block, |
|
|
|
|
run = 1; |
|
|
|
|
level = 1; |
|
|
|
|
} else { |
|
|
|
|
run = (vlc & 0x3); |
|
|
|
|
level = ((vlc + 9) >> 2) - run; |
|
|
|
|
run = vlc & 0x3; |
|
|
|
|
level = (vlc + 9 >> 2) - run; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (vlc < 16) { |
|
|
|
|
run = svq3_dct_tables[intra][vlc].run; |
|
|
|
|
level = svq3_dct_tables[intra][vlc].level; |
|
|
|
|
} else if (intra) { |
|
|
|
|
run = (vlc & 0x7); |
|
|
|
|
run = vlc & 0x7; |
|
|
|
|
level = (vlc >> 3) + |
|
|
|
|
((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1))); |
|
|
|
|
} else { |
|
|
|
|
run = (vlc & 0xF); |
|
|
|
|
run = vlc & 0xF; |
|
|
|
|
level = (vlc >> 4) + |
|
|
|
|
((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0))); |
|
|
|
|
} |
|
|
|
@ -281,13 +281,13 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, |
|
|
|
|
mx += x; |
|
|
|
|
my += y; |
|
|
|
|
|
|
|
|
|
if (mx < 0 || mx >= (s->h_edge_pos - width - 1) || |
|
|
|
|
my < 0 || my >= (s->v_edge_pos - height - 1)) { |
|
|
|
|
if (mx < 0 || mx >= s->h_edge_pos - width - 1 || |
|
|
|
|
my < 0 || my >= s->v_edge_pos - height - 1) { |
|
|
|
|
if ((s->flags & CODEC_FLAG_EMU_EDGE)) |
|
|
|
|
emu = 1; |
|
|
|
|
|
|
|
|
|
mx = av_clip(mx, -16, (s->h_edge_pos - width + 15)); |
|
|
|
|
my = av_clip(my, -16, (s->v_edge_pos - height + 15)); |
|
|
|
|
mx = av_clip(mx, -16, s->h_edge_pos - width + 15); |
|
|
|
|
my = av_clip(my, -16, s->v_edge_pos - height + 15); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* form component predictions */ |
|
|
|
@ -296,7 +296,7 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, |
|
|
|
|
|
|
|
|
|
if (emu) { |
|
|
|
|
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, |
|
|
|
|
(width + 1), (height + 1), |
|
|
|
|
width + 1, height + 1, |
|
|
|
|
mx, my, s->h_edge_pos, s->v_edge_pos); |
|
|
|
|
src = s->edge_emu_buffer; |
|
|
|
|
} |
|
|
|
@ -310,10 +310,10 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, |
|
|
|
|
height); |
|
|
|
|
|
|
|
|
|
if (!(s->flags & CODEC_FLAG_GRAY)) { |
|
|
|
|
mx = (mx + (mx < (int) x)) >> 1; |
|
|
|
|
my = (my + (my < (int) y)) >> 1; |
|
|
|
|
width = (width >> 1); |
|
|
|
|
height = (height >> 1); |
|
|
|
|
mx = mx + (mx < (int) x) >> 1; |
|
|
|
|
my = my + (my < (int) y) >> 1; |
|
|
|
|
width = width >> 1; |
|
|
|
|
height = height >> 1; |
|
|
|
|
blocksize++; |
|
|
|
|
|
|
|
|
|
for (i = 1; i < 3; i++) { |
|
|
|
@ -322,9 +322,9 @@ static inline void svq3_mc_dir_part(MpegEncContext *s, |
|
|
|
|
|
|
|
|
|
if (emu) { |
|
|
|
|
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, |
|
|
|
|
(width + 1), (height + 1), |
|
|
|
|
width + 1, height + 1, |
|
|
|
|
mx, my, (s->h_edge_pos >> 1), |
|
|
|
|
(s->v_edge_pos >> 1)); |
|
|
|
|
s->v_edge_pos >> 1); |
|
|
|
|
src = s->edge_emu_buffer; |
|
|
|
|
} |
|
|
|
|
if (thirdpel) |
|
|
|
@ -359,25 +359,25 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, |
|
|
|
|
int dxy; |
|
|
|
|
x = 16 * s->mb_x + j; |
|
|
|
|
y = 16 * s->mb_y + i; |
|
|
|
|
k = ((j >> 2) & 1) + ((i >> 1) & 2) + |
|
|
|
|
((j >> 1) & 4) + (i & 8); |
|
|
|
|
k = (j >> 2 & 1) + (i >> 1 & 2) + |
|
|
|
|
(j >> 1 & 4) + (i & 8); |
|
|
|
|
|
|
|
|
|
if (mode != PREDICT_MODE) { |
|
|
|
|
pred_motion(h, k, (part_width >> 2), dir, 1, &mx, &my); |
|
|
|
|
pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my); |
|
|
|
|
} else { |
|
|
|
|
mx = s->next_picture.f.motion_val[0][b_xy][0] << 1; |
|
|
|
|
my = s->next_picture.f.motion_val[0][b_xy][1] << 1; |
|
|
|
|
|
|
|
|
|
if (dir == 0) { |
|
|
|
|
mx = ((mx * h->frame_num_offset) / |
|
|
|
|
h->prev_frame_num_offset + 1) >> 1; |
|
|
|
|
my = ((my * h->frame_num_offset) / |
|
|
|
|
h->prev_frame_num_offset + 1) >> 1; |
|
|
|
|
mx = mx * h->frame_num_offset / |
|
|
|
|
h->prev_frame_num_offset + 1 >> 1; |
|
|
|
|
my = my * h->frame_num_offset / |
|
|
|
|
h->prev_frame_num_offset + 1 >> 1; |
|
|
|
|
} else { |
|
|
|
|
mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / |
|
|
|
|
h->prev_frame_num_offset + 1) >> 1; |
|
|
|
|
my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / |
|
|
|
|
h->prev_frame_num_offset + 1) >> 1; |
|
|
|
|
mx = mx * (h->frame_num_offset - h->prev_frame_num_offset) / |
|
|
|
|
h->prev_frame_num_offset + 1 >> 1; |
|
|
|
|
my = my * (h->frame_num_offset - h->prev_frame_num_offset) / |
|
|
|
|
h->prev_frame_num_offset + 1 >> 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -401,10 +401,10 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, |
|
|
|
|
/* compute motion vector */ |
|
|
|
|
if (mode == THIRDPEL_MODE) { |
|
|
|
|
int fx, fy; |
|
|
|
|
mx = ((mx + 1) >> 1) + dx; |
|
|
|
|
my = ((my + 1) >> 1) + dy; |
|
|
|
|
fx = ((unsigned)(mx + 0x3000)) / 3 - 0x1000; |
|
|
|
|
fy = ((unsigned)(my + 0x3000)) / 3 - 0x1000; |
|
|
|
|
mx = (mx + 1 >> 1) + dx; |
|
|
|
|
my = (my + 1 >> 1) + dy; |
|
|
|
|
fx = (unsigned)(mx + 0x3000) / 3 - 0x1000; |
|
|
|
|
fy = (unsigned)(my + 0x3000) / 3 - 0x1000; |
|
|
|
|
dxy = (mx - 3 * fx) + 4 * (my - 3 * fy); |
|
|
|
|
|
|
|
|
|
svq3_mc_dir_part(s, x, y, part_width, part_height, |
|
|
|
@ -412,8 +412,8 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, |
|
|
|
|
mx += mx; |
|
|
|
|
my += my; |
|
|
|
|
} else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) { |
|
|
|
|
mx = ((unsigned)(mx + 1 + 0x3000)) / 3 + dx - 0x1000; |
|
|
|
|
my = ((unsigned)(my + 1 + 0x3000)) / 3 + dy - 0x1000; |
|
|
|
|
mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000; |
|
|
|
|
my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000; |
|
|
|
|
dxy = (mx & 1) + 2 * (my & 1); |
|
|
|
|
|
|
|
|
|
svq3_mc_dir_part(s, x, y, part_width, part_height, |
|
|
|
@ -421,8 +421,8 @@ static inline int svq3_mc_dir(H264Context *h, int size, int mode, |
|
|
|
|
mx *= 3; |
|
|
|
|
my *= 3; |
|
|
|
|
} else { |
|
|
|
|
mx = ((unsigned)(mx + 3 + 0x6000)) / 6 + dx - 0x1000; |
|
|
|
|
my = ((unsigned)(my + 3 + 0x6000)) / 6 + dy - 0x1000; |
|
|
|
|
mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000; |
|
|
|
|
my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000; |
|
|
|
|
|
|
|
|
|
svq3_mc_dir_part(s, x, y, part_width, part_height, |
|
|
|
|
mx, my, 0, 0, dir, avg); |
|
|
|
@ -524,7 +524,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) |
|
|
|
|
memset(&h->ref_cache[m][scan8[0] - 1 * 8], |
|
|
|
|
(h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4); |
|
|
|
|
|
|
|
|
|
if (s->mb_x < (s->mb_width - 1)) { |
|
|
|
|
if (s->mb_x < s->mb_width - 1) { |
|
|
|
|
AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1 * 8], |
|
|
|
|
s->current_picture.f.motion_val[m][b_xy - h->b_stride + 4]); |
|
|
|
|
h->ref_cache[m][scan8[0] + 4 - 1 * 8] = |
|
|
|
@ -549,7 +549,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) |
|
|
|
|
|
|
|
|
|
/* decode motion vector(s) and form prediction(s) */ |
|
|
|
|
if (s->pict_type == AV_PICTURE_TYPE_P) { |
|
|
|
|
if (svq3_mc_dir(h, (mb_type - 1), mode, 0, 0) < 0) |
|
|
|
|
if (svq3_mc_dir(h, mb_type - 1, mode, 0, 0) < 0) |
|
|
|
|
return -1; |
|
|
|
|
} else { /* AV_PICTURE_TYPE_B */ |
|
|
|
|
if (mb_type != 2) |
|
|
|
@ -560,7 +560,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) |
|
|
|
|
memset(s->current_picture.f.motion_val[0][b_xy + i * h->b_stride], |
|
|
|
|
0, 4 * 2 * sizeof(int16_t)); |
|
|
|
|
if (mb_type != 1) |
|
|
|
|
if (svq3_mc_dir(h, 0, mode, 1, (mb_type == 3)) < 0) |
|
|
|
|
if (svq3_mc_dir(h, 0, mode, 1, mb_type == 3) < 0) |
|
|
|
|
return -1; |
|
|
|
|
else |
|
|
|
|
for (i = 0; i < 4; i++) |
|
|
|
@ -760,7 +760,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header); |
|
|
|
|
return -1; |
|
|
|
|
} else { |
|
|
|
|
int length = (header >> 5) & 3; |
|
|
|
|
int length = header >> 5 & 3; |
|
|
|
|
|
|
|
|
|
svq3->next_slice_index = get_bits_count(&s->gb) + |
|
|
|
|
8 * show_bits(&s->gb, 8 * length) + |
|
|
|
@ -781,7 +781,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) |
|
|
|
|
} |
|
|
|
|
if (length > 0) { |
|
|
|
|
memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3], |
|
|
|
|
&s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1)); |
|
|
|
|
&s->gb.buffer[s->gb.size_in_bits >> 3], length - 1); |
|
|
|
|
} |
|
|
|
|
skip_bits_long(&s->gb, 0); |
|
|
|
|
} |
|
|
|
@ -796,7 +796,7 @@ static int svq3_decode_slice_header(AVCodecContext *avctx) |
|
|
|
|
if ((header & 0x9F) == 2) { |
|
|
|
|
i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1)); |
|
|
|
|
s->mb_skip_run = get_bits(&s->gb, i) - |
|
|
|
|
(s->mb_x + (s->mb_y * s->mb_width)); |
|
|
|
|
(s->mb_y * s->mb_width + s->mb_x); |
|
|
|
|
} else { |
|
|
|
|
skip_bits1(&s->gb); |
|
|
|
|
s->mb_skip_run = 0; |
|
|
|
@ -952,7 +952,7 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx) |
|
|
|
|
int u4 = svq3_get_ue_golomb(&gb); |
|
|
|
|
unsigned long buf_len = watermark_width * |
|
|
|
|
watermark_height * 4; |
|
|
|
|
int offset = (get_bits_count(&gb) + 7) >> 3; |
|
|
|
|
int offset = get_bits_count(&gb) + 7 >> 3; |
|
|
|
|
uint8_t *buf; |
|
|
|
|
|
|
|
|
|
if ((uint64_t)watermark_width * 4 > UINT_MAX / watermark_height) |
|
|
|
@ -1046,9 +1046,9 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
/* Skip B-frames if we do not have reference frames. */ |
|
|
|
|
if (s->last_picture_ptr == NULL && s->pict_type == AV_PICTURE_TYPE_B) |
|
|
|
|
return 0; |
|
|
|
|
if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) || |
|
|
|
|
(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) || |
|
|
|
|
avctx->skip_frame >= AVDISCARD_ALL) |
|
|
|
|
if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B || |
|
|
|
|
avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I || |
|
|
|
|
avctx->skip_frame >= AVDISCARD_ALL) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
if (s->next_p_frame_damaged) { |
|
|
|
@ -1062,7 +1062,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
if (s->pict_type == AV_PICTURE_TYPE_B) { |
|
|
|
|
h->frame_num_offset = (h->slice_num - h->prev_frame_num); |
|
|
|
|
h->frame_num_offset = h->slice_num - h->prev_frame_num; |
|
|
|
|
|
|
|
|
|
if (h->frame_num_offset < 0) |
|
|
|
|
h->frame_num_offset += 256; |
|
|
|
@ -1074,7 +1074,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
} else { |
|
|
|
|
h->prev_frame_num = h->frame_num; |
|
|
|
|
h->frame_num = h->slice_num; |
|
|
|
|
h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num); |
|
|
|
|
h->prev_frame_num_offset = h->frame_num - h->prev_frame_num; |
|
|
|
|
|
|
|
|
|
if (h->prev_frame_num_offset < 0) |
|
|
|
|
h->prev_frame_num_offset += 256; |
|
|
|
@ -1097,7 +1097,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
|
|
|
|
|
if ((get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits && |
|
|
|
|
((get_bits_count(&s->gb) & 7) == 0 || |
|
|
|
|
show_bits(&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) { |
|
|
|
|
show_bits(&s->gb, -get_bits_count(&s->gb) & 7) == 0)) { |
|
|
|
|
skip_bits(&s->gb, svq3->next_slice_index - get_bits_count(&s->gb)); |
|
|
|
|
s->gb.size_in_bits = 8 * buf_size; |
|
|
|
|
|
|
|
|
|