128
133
const int top_pair_xy = pair_xy - s->mb_stride;
129
134
const int topleft_pair_xy = top_pair_xy - 1;
130
135
const int topright_pair_xy = top_pair_xy + 1;
131
const int topleft_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topleft_pair_xy]);
132
const int top_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
133
const int topright_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topright_pair_xy]);
134
const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
135
const int curr_mb_frame_flag = !IS_INTERLACED(mb_type);
136
const int topleft_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[topleft_pair_xy]);
137
const int top_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
138
const int topright_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[topright_pair_xy]);
139
const int left_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
140
const int curr_mb_field_flag = IS_INTERLACED(mb_type);
136
141
const int bottom = (s->mb_y & 1);
137
tprintf(s->avctx, "fill_caches: curr_mb_frame_flag:%d, left_mb_frame_flag:%d, topleft_mb_frame_flag:%d, top_mb_frame_flag:%d, topright_mb_frame_flag:%d\n", curr_mb_frame_flag, left_mb_frame_flag, topleft_mb_frame_flag, top_mb_frame_flag, topright_mb_frame_flag);
139
? !curr_mb_frame_flag // bottom macroblock
140
: (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock
142
tprintf(s->avctx, "fill_caches: curr_mb_field_flag:%d, left_mb_field_flag:%d, topleft_mb_field_flag:%d, top_mb_field_flag:%d, topright_mb_field_flag:%d\n", curr_mb_field_flag, left_mb_field_flag, topleft_mb_field_flag, top_mb_field_flag, topright_mb_field_flag);
144
if (curr_mb_field_flag && (bottom || top_mb_field_flag)){
142
145
top_xy -= s->mb_stride;
145
? !curr_mb_frame_flag // bottom macroblock
146
: (!curr_mb_frame_flag && !topleft_mb_frame_flag) // top macroblock
147
if (curr_mb_field_flag && (bottom || topleft_mb_field_flag)){
148
148
topleft_xy -= s->mb_stride;
149
} else if(bottom && curr_mb_frame_flag && !left_mb_frame_flag) {
149
} else if(bottom && !curr_mb_field_flag && left_mb_field_flag) {
150
150
topleft_xy += s->mb_stride;
151
151
// take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
152
152
topleft_partition = 0;
155
? !curr_mb_frame_flag // bottom macroblock
156
: (!curr_mb_frame_flag && !topright_mb_frame_flag) // top macroblock
154
if (curr_mb_field_flag && (bottom || topright_mb_field_flag)){
158
155
topright_xy -= s->mb_stride;
160
if (left_mb_frame_flag != curr_mb_frame_flag) {
157
if (left_mb_field_flag != curr_mb_field_flag) {
161
158
left_xy[1] = left_xy[0] = pair_xy - 1;
162
if (curr_mb_frame_flag) {
164
left_block = left_block_options[1];
166
left_block= left_block_options[2];
159
if (curr_mb_field_flag) {
169
160
left_xy[1] += s->mb_stride;
170
161
left_block = left_block_options[3];
163
left_block= left_block_options[2 - bottom];
1587
1607
return h->pps.chroma_qp_table[t][qscale];
1590
//FIXME need to check that this does not overflow signed 32 bit for low qp, I am not sure, it's very close
1591
//FIXME check that gcc inlines this (and optimizes intra & separate_dc stuff away)
1592
static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int separate_dc){
1594
const int * const quant_table= quant_coeff[qscale];
1595
const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6;
1596
const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1;
1597
const unsigned int threshold2= (threshold1<<1);
1603
const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6;
1604
const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1;
1605
const unsigned int dc_threshold2= (dc_threshold1<<1);
1607
int level= block[0]*quant_coeff[qscale+18][0];
1608
if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1610
level= (dc_bias + level)>>(QUANT_SHIFT-2);
1613
level= (dc_bias - level)>>(QUANT_SHIFT-2);
1616
// last_non_zero = i;
1621
const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6;
1622
const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1;
1623
const unsigned int dc_threshold2= (dc_threshold1<<1);
1625
int level= block[0]*quant_table[0];
1626
if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1628
level= (dc_bias + level)>>(QUANT_SHIFT+1);
1631
level= (dc_bias - level)>>(QUANT_SHIFT+1);
1634
// last_non_zero = i;
1647
const int j= scantable[i];
1648
int level= block[j]*quant_table[j];
1650
// if( bias+level >= (1<<(QMAT_SHIFT - 3))
1651
// || bias-level >= (1<<(QMAT_SHIFT - 3))){
1652
if(((unsigned)(level+threshold1))>threshold2){
1654
level= (bias + level)>>QUANT_SHIFT;
1657
level= (bias - level)>>QUANT_SHIFT;
1666
return last_non_zero;
1669
1610
static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list,
1670
1611
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1671
1612
int src_x_offset, int src_y_offset,
2520
2480
if(IS_INTRA4x4(mb_type)){
2521
2481
if(simple || !s->encoding){
2522
2482
if(IS_8x8DCT(mb_type)){
2483
if(transform_bypass){
2485
idct_add = s->dsp.add_pixels8;
2487
idct_dc_add = s->dsp.h264_idct8_dc_add;
2488
idct_add = s->dsp.h264_idct8_add;
2523
2490
for(i=0; i<16; i+=4){
2524
2491
uint8_t * const ptr= dest_y + block_offset[i];
2525
2492
const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2526
const int nnz = h->non_zero_count_cache[ scan8[i] ];
2527
h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000,
2528
(h->topright_samples_available<<i)&0x4000, linesize);
2530
if(nnz == 1 && h->mb[i*16])
2531
idct_dc_add(ptr, h->mb + i*16, linesize);
2533
idct_add(ptr, h->mb + i*16, linesize);
2537
for(i=0; i<16; i++){
2538
uint8_t * const ptr= dest_y + block_offset[i];
2540
const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2543
if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){
2544
const int topright_avail= (h->topright_samples_available<<i)&0x8000;
2545
assert(mb_y || linesize <= block_offset[i]);
2546
if(!topright_avail){
2547
tr= ptr[3 - linesize]*0x01010101;
2548
topright= (uint8_t*) &tr;
2550
topright= ptr + 4 - linesize;
2554
h->hpc.pred4x4[ dir ](ptr, topright, linesize);
2555
nnz = h->non_zero_count_cache[ scan8[i] ];
2558
if(nnz == 1 && h->mb[i*16])
2559
idct_dc_add(ptr, h->mb + i*16, linesize);
2561
idct_add(ptr, h->mb + i*16, linesize);
2563
svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0);
2493
if(transform_bypass && h->sps.profile_idc==244 && dir<=1){
2494
h->hpc.pred8x8l_add[dir](ptr, h->mb + i*16, linesize);
2496
const int nnz = h->non_zero_count_cache[ scan8[i] ];
2497
h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000,
2498
(h->topright_samples_available<<i)&0x4000, linesize);
2500
if(nnz == 1 && h->mb[i*16])
2501
idct_dc_add(ptr, h->mb + i*16, linesize);
2503
idct_add (ptr, h->mb + i*16, linesize);
2508
if(transform_bypass){
2510
idct_add = s->dsp.add_pixels4;
2512
idct_dc_add = s->dsp.h264_idct_dc_add;
2513
idct_add = s->dsp.h264_idct_add;
2515
for(i=0; i<16; i++){
2516
uint8_t * const ptr= dest_y + block_offset[i];
2517
const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2519
if(transform_bypass && h->sps.profile_idc==244 && dir<=1){
2520
h->hpc.pred4x4_add[dir](ptr, h->mb + i*16, linesize);
2524
if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){
2525
const int topright_avail= (h->topright_samples_available<<i)&0x8000;
2526
assert(mb_y || linesize <= block_offset[i]);
2527
if(!topright_avail){
2528
tr= ptr[3 - linesize]*0x01010101;
2529
topright= (uint8_t*) &tr;
2531
topright= ptr + 4 - linesize;
2535
h->hpc.pred4x4[ dir ](ptr, topright, linesize);
2536
nnz = h->non_zero_count_cache[ scan8[i] ];
2539
if(nnz == 1 && h->mb[i*16])
2540
idct_dc_add(ptr, h->mb + i*16, linesize);
2542
idct_add (ptr, h->mb + i*16, linesize);
2544
svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0);
2585
2568
if(!IS_INTRA4x4(mb_type)){
2587
2570
if(IS_INTRA16x16(mb_type)){
2588
for(i=0; i<16; i++){
2589
if(h->non_zero_count_cache[ scan8[i] ])
2590
idct_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2591
else if(h->mb[i*16])
2592
idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2571
if(transform_bypass){
2572
if(h->sps.profile_idc==244 && (h->intra16x16_pred_mode==VERT_PRED8x8 || h->intra16x16_pred_mode==HOR_PRED8x8)){
2573
h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset, h->mb, linesize);
2575
for(i=0; i<16; i++){
2576
if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16])
2577
s->dsp.add_pixels4(dest_y + block_offset[i], h->mb + i*16, linesize);
2581
s->dsp.h264_idct_add16intra(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache);
2595
const int di = IS_8x8DCT(mb_type) ? 4 : 1;
2596
for(i=0; i<16; i+=di){
2597
int nnz = h->non_zero_count_cache[ scan8[i] ];
2599
if(nnz==1 && h->mb[i*16])
2600
idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2583
}else if(h->cbp&15){
2584
if(transform_bypass){
2585
const int di = IS_8x8DCT(mb_type) ? 4 : 1;
2586
idct_add= IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 : s->dsp.add_pixels4;
2587
for(i=0; i<16; i+=di){
2588
if(h->non_zero_count_cache[ scan8[i] ]){
2602
2589
idct_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2593
if(IS_8x8DCT(mb_type)){
2594
s->dsp.h264_idct8_add4(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache);
2596
s->dsp.h264_idct_add16(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache);
2616
if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2610
if((simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)) && (h->cbp&0x30)){
2617
2611
uint8_t *dest[2] = {dest_cb, dest_cr};
2618
2612
if(transform_bypass){
2619
idct_add = idct_dc_add = s->dsp.add_pixels4;
2613
if(IS_INTRA(mb_type) && h->sps.profile_idc==244 && (h->chroma_pred_mode==VERT_PRED8x8 || h->chroma_pred_mode==HOR_PRED8x8)){
2614
h->hpc.pred8x8_add[h->chroma_pred_mode](dest[0], block_offset + 16, h->mb + 16*16, uvlinesize);
2615
h->hpc.pred8x8_add[h->chroma_pred_mode](dest[1], block_offset + 20, h->mb + 20*16, uvlinesize);
2617
idct_add = s->dsp.add_pixels4;
2618
for(i=16; i<16+8; i++){
2619
if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16])
2620
idct_add (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2621
idct_add = s->dsp.h264_idct_add;
2622
idct_dc_add = s->dsp.h264_idct_dc_add;
2623
2624
chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp[0], h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
2624
2625
chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
2627
for(i=16; i<16+8; i++){
2628
if(h->non_zero_count_cache[ scan8[i] ])
2629
idct_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2630
else if(h->mb[i*16])
2631
idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2634
for(i=16; i<16+8; i++){
2635
if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2636
uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i];
2637
svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
2627
idct_add = s->dsp.h264_idct_add;
2628
idct_dc_add = s->dsp.h264_idct_dc_add;
2629
for(i=16; i<16+8; i++){
2630
if(h->non_zero_count_cache[ scan8[i] ])
2631
idct_add (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2632
else if(h->mb[i*16])
2633
idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2636
for(i=16; i<16+8; i++){
2637
if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2638
uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i];
2639
svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
2646
if(h->cbp || IS_INTRA(mb_type))
2647
s->dsp.clear_blocks(h->mb);
2643
2649
if(h->deblocking_filter) {
2644
2650
backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, simple);
2645
2651
fill_caches(h, mb_type, 1); //FIXME don't fill stuff which isn't used by filter_mb
4138
4142
tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
4139
4143
assert(total_coeff<=16);
4141
for(i=0; i<trailing_ones; i++){
4142
level[i]= 1 - 2*get_bits1(gb);
4145
i = show_bits(gb, 3);
4146
skip_bits(gb, trailing_ones);
4147
level[0] = 1-((i&4)>>1);
4148
level[1] = 1-((i&2) );
4149
level[2] = 1-((i&1)<<1);
4146
int level_code, mask;
4151
if(trailing_ones<total_coeff) {
4147
4153
int suffix_length = total_coeff > 10 && trailing_ones < 3;
4148
int prefix= get_level_prefix(gb);
4150
//first coefficient has suffix_length equal to 0 or 1
4151
if(prefix<14){ //FIXME try to build a large unified VLC table for all this
4153
level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
4155
level_code= (prefix<<suffix_length); //part
4156
}else if(prefix==14){
4158
level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
4160
level_code= prefix + get_bits(gb, 4); //part
4162
level_code= (15<<suffix_length) + get_bits(gb, prefix-3); //part
4163
if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense
4165
level_code += (1<<(prefix-3))-4096;
4168
if(trailing_ones < 3) level_code += 2;
4173
mask= -(level_code&1);
4174
level[i]= (((2+level_code)>>1) ^ mask) - mask;
4177
//remaining coefficients have suffix_length > 0
4178
for(;i<total_coeff;i++) {
4179
static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX };
4180
prefix = get_level_prefix(gb);
4182
level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
4154
int bitsi= show_bits(gb, LEVEL_TAB_BITS);
4155
int level_code= cavlc_level_tab[suffix_length][bitsi][0];
4157
skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
4158
if(level_code >= 100){
4159
prefix= level_code - 100;
4160
if(prefix == LEVEL_TAB_BITS)
4161
prefix += get_level_prefix(gb);
4163
//first coefficient has suffix_length equal to 0 or 1
4164
if(prefix<14){ //FIXME try to build a large unified VLC table for all this
4166
level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
4168
level_code= (prefix<<suffix_length); //part
4169
}else if(prefix==14){
4171
level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
4173
level_code= prefix + get_bits(gb, 4); //part
4184
level_code = (15<<suffix_length) + get_bits(gb, prefix-3);
4175
level_code= (15<<suffix_length) + get_bits(gb, prefix-3); //part
4176
if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense
4186
4178
level_code += (1<<(prefix-3))-4096;
4181
if(trailing_ones < 3) level_code += 2;
4188
4184
mask= -(level_code&1);
4189
level[i]= (((2+level_code)>>1) ^ mask) - mask;
4190
if(level_code > suffix_limit[suffix_length])
4185
level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
4187
if(trailing_ones < 3) level_code += (level_code>>31)|1;
4190
if(level_code + 3U > 6U)
4192
level[trailing_ones]= level_code;
4195
//remaining coefficients have suffix_length > 0
4196
for(i=trailing_ones+1;i<total_coeff;i++) {
4197
static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX };
4198
int bitsi= show_bits(gb, LEVEL_TAB_BITS);
4199
level_code= cavlc_level_tab[suffix_length][bitsi][0];
4201
skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
4202
if(level_code >= 100){
4203
prefix= level_code - 100;
4204
if(prefix == LEVEL_TAB_BITS){
4205
prefix += get_level_prefix(gb);
4208
level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
4210
level_code = (15<<suffix_length) + get_bits(gb, prefix-3);
4212
level_code += (1<<(prefix-3))-4096;
4214
mask= -(level_code&1);
4215
level_code= (((2+level_code)>>1) ^ mask) - mask;
4217
level[i]= level_code;
4219
if(suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length])
4191
4220
suffix_length++;
5888
5922
static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
5890
5923
const int index_a = qp + h->slice_alpha_c0_offset;
5891
5924
const int alpha = (alpha_table+52)[index_a];
5892
5925
const int beta = (beta_table+52)[qp + h->slice_beta_offset];
5894
5927
if( bS[0] < 4 ) {
5897
tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
5929
tc[0] = (tc0_table+52)[index_a][bS[0]];
5930
tc[1] = (tc0_table+52)[index_a][bS[1]];
5931
tc[2] = (tc0_table+52)[index_a][bS[2]];
5932
tc[3] = (tc0_table+52)[index_a][bS[3]];
5898
5933
h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc);
5900
/* 16px edge length, because bS=4 is triggered by being at
5901
* the edge of an intra MB, so all 4 bS are the same */
5902
for( d = 0; d < 16; d++ ) {
5903
const int p0 = pix[-1];
5904
const int p1 = pix[-2];
5905
const int p2 = pix[-3];
5907
const int q0 = pix[0];
5908
const int q1 = pix[1];
5909
const int q2 = pix[2];
5911
if( FFABS( p0 - q0 ) < alpha &&
5912
FFABS( p1 - p0 ) < beta &&
5913
FFABS( q1 - q0 ) < beta ) {
5915
if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
5916
if( FFABS( p2 - p0 ) < beta)
5918
const int p3 = pix[-4];
5920
pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
5921
pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
5922
pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
5925
pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5927
if( FFABS( q2 - q0 ) < beta)
5929
const int q3 = pix[3];
5931
pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
5932
pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
5933
pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
5936
pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5940
pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5941
pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5943
tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, p2, p1, p0, q0, q1, q2, pix[-2], pix[-1], pix[0], pix[1]);
5935
h->s.dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta);
5949
5938
static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
5951
5939
const int index_a = qp + h->slice_alpha_c0_offset;
5952
5940
const int alpha = (alpha_table+52)[index_a];
5953
5941
const int beta = (beta_table+52)[qp + h->slice_beta_offset];
5955
5943
if( bS[0] < 4 ) {
5958
tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0;
5945
tc[0] = (tc0_table+52)[index_a][bS[0]]+1;
5946
tc[1] = (tc0_table+52)[index_a][bS[1]]+1;
5947
tc[2] = (tc0_table+52)[index_a][bS[2]]+1;
5948
tc[3] = (tc0_table+52)[index_a][bS[3]]+1;
5959
5949
h->s.dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc);
5961
5951
h->s.dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta);
6116
6106
static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
6118
6107
const int index_a = qp + h->slice_alpha_c0_offset;
6119
6108
const int alpha = (alpha_table+52)[index_a];
6120
6109
const int beta = (beta_table+52)[qp + h->slice_beta_offset];
6121
const int pix_next = stride;
6123
6111
if( bS[0] < 4 ) {
6126
tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
6113
tc[0] = (tc0_table+52)[index_a][bS[0]];
6114
tc[1] = (tc0_table+52)[index_a][bS[1]];
6115
tc[2] = (tc0_table+52)[index_a][bS[2]];
6116
tc[3] = (tc0_table+52)[index_a][bS[3]];
6127
6117
h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc);
6129
/* 16px edge length, see filter_mb_edgev */
6130
for( d = 0; d < 16; d++ ) {
6131
const int p0 = pix[-1*pix_next];
6132
const int p1 = pix[-2*pix_next];
6133
const int p2 = pix[-3*pix_next];
6134
const int q0 = pix[0];
6135
const int q1 = pix[1*pix_next];
6136
const int q2 = pix[2*pix_next];
6138
if( FFABS( p0 - q0 ) < alpha &&
6139
FFABS( p1 - p0 ) < beta &&
6140
FFABS( q1 - q0 ) < beta ) {
6142
const int p3 = pix[-4*pix_next];
6143
const int q3 = pix[ 3*pix_next];
6145
if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
6146
if( FFABS( p2 - p0 ) < beta) {
6148
pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
6149
pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
6150
pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
6153
pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
6155
if( FFABS( q2 - q0 ) < beta) {
6157
pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
6158
pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
6159
pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
6162
pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
6166
pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
6167
pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
6169
tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, qp, index_a, alpha, beta, bS[i], p2, p1, p0, q0, q1, q2, pix[-2*pix_next], pix[-pix_next], pix[0], pix[pix_next]);
6119
h->s.dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta);
6176
6123
static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
6178
6124
const int index_a = qp + h->slice_alpha_c0_offset;
6179
6125
const int alpha = (alpha_table+52)[index_a];
6180
6126
const int beta = (beta_table+52)[qp + h->slice_beta_offset];
6182
6128
if( bS[0] < 4 ) {
6185
tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0;
6130
tc[0] = (tc0_table+52)[index_a][bS[0]]+1;
6131
tc[1] = (tc0_table+52)[index_a][bS[1]]+1;
6132
tc[2] = (tc0_table+52)[index_a][bS[2]]+1;
6133
tc[3] = (tc0_table+52)[index_a][bS[3]]+1;
6186
6134
h->s.dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc);
6188
6136
h->s.dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta);
6255
static void av_always_inline filter_mb_dir(H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize, int mb_xy, int mb_type, int mvy_limit, int first_vertical_edge_done, int dir) {
6256
MpegEncContext * const s = &h->s;
6258
const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy;
6259
const int mbm_type = s->current_picture.mb_type[mbm_xy];
6260
int (*ref2frm) [64] = h->ref2frm[ h->slice_num &(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2);
6261
int (*ref2frmm)[64] = h->ref2frm[ h->slice_table[mbm_xy]&(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2);
6262
int start = h->slice_table[mbm_xy] == 0xFFFF ? 1 : 0;
6264
const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP))
6265
== (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4;
6266
// how often to recheck mv-based bS when iterating between edges
6267
const int mask_edge = (mb_type & (MB_TYPE_16x16 | (MB_TYPE_16x8 << dir))) ? 3 :
6268
(mb_type & (MB_TYPE_8x16 >> dir)) ? 1 : 0;
6269
// how often to recheck mv-based bS when iterating along each edge
6270
const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir));
6272
if (first_vertical_edge_done) {
6276
if (h->deblocking_filter==2 && h->slice_table[mbm_xy] != h->slice_table[mb_xy])
6279
if (FRAME_MBAFF && (dir == 1) && ((mb_y&1) == 0) && start == 0
6280
&& !IS_INTERLACED(mb_type)
6281
&& IS_INTERLACED(mbm_type)
6283
// This is a special case in the norm where the filtering must
6284
// be done twice (one each of the field) even if we are in a
6285
// frame macroblock.
6287
static const int nnz_idx[4] = {4,5,6,3};
6288
unsigned int tmp_linesize = 2 * linesize;
6289
unsigned int tmp_uvlinesize = 2 * uvlinesize;
6290
int mbn_xy = mb_xy - 2 * s->mb_stride;
6295
for(j=0; j<2; j++, mbn_xy += s->mb_stride){
6296
if( IS_INTRA(mb_type) ||
6297
IS_INTRA(s->current_picture.mb_type[mbn_xy]) ) {
6298
bS[0] = bS[1] = bS[2] = bS[3] = 3;
6300
const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy];
6301
for( i = 0; i < 4; i++ ) {
6302
if( h->non_zero_count_cache[scan8[0]+i] != 0 ||
6303
mbn_nnz[nnz_idx[i]] != 0 )
6309
// Do not use s->qscale as luma quantizer because it has not the same
6310
// value in IPCM macroblocks.
6311
qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
6312
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize);
6313
{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6314
filter_mb_edgeh( h, &img_y[j*linesize], tmp_linesize, bS, qp );
6315
filter_mb_edgech( h, &img_cb[j*uvlinesize], tmp_uvlinesize, bS,
6316
( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6317
filter_mb_edgech( h, &img_cr[j*uvlinesize], tmp_uvlinesize, bS,
6318
( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6325
for( edge = start; edge < edges; edge++ ) {
6326
/* mbn_xy: neighbor macroblock */
6327
const int mbn_xy = edge > 0 ? mb_xy : mbm_xy;
6328
const int mbn_type = s->current_picture.mb_type[mbn_xy];
6329
int (*ref2frmn)[64] = edge > 0 ? ref2frm : ref2frmm;
6333
if( (edge&1) && IS_8x8DCT(mb_type) )
6336
if( IS_INTRA(mb_type) ||
6337
IS_INTRA(mbn_type) ) {
6340
if ( (!IS_INTERLACED(mb_type) && !IS_INTERLACED(mbm_type))
6341
|| ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0))
6350
bS[0] = bS[1] = bS[2] = bS[3] = value;
6355
if( edge & mask_edge ) {
6356
bS[0] = bS[1] = bS[2] = bS[3] = 0;
6359
else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) {
6360
bS[0] = bS[1] = bS[2] = bS[3] = 1;
6363
else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) {
6364
int b_idx= 8 + 4 + edge * (dir ? 8:1);
6365
int bn_idx= b_idx - (dir ? 8:1);
6368
for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6369
v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] ||
6370
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
6371
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit;
6374
if(h->slice_type_nos == FF_B_TYPE && v){
6376
for( l = 0; !v && l < 2; l++ ) {
6378
v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] ||
6379
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6380
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit;
6384
bS[0] = bS[1] = bS[2] = bS[3] = v;
6390
for( i = 0; i < 4; i++ ) {
6391
int x = dir == 0 ? edge : i;
6392
int y = dir == 0 ? i : edge;
6393
int b_idx= 8 + 4 + x + 8*y;
6394
int bn_idx= b_idx - (dir ? 8:1);
6396
if( h->non_zero_count_cache[b_idx] |
6397
h->non_zero_count_cache[bn_idx] ) {
6403
for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6404
if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] ||
6405
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
6406
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) {
6412
if(h->slice_type_nos == FF_B_TYPE && bS[i]){
6414
for( l = 0; l < 2; l++ ) {
6416
if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] ||
6417
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6418
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) {
6427
if(bS[0]+bS[1]+bS[2]+bS[3] == 0)
6432
// Do not use s->qscale as luma quantizer because it has not the same
6433
// value in IPCM macroblocks.
6434
qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
6435
//tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp, s->current_picture.qscale_table[mbn_xy]);
6436
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
6437
{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6439
filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp );
6440
if( (edge&1) == 0 ) {
6441
filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS,
6442
( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6443
filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS,
6444
( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6447
filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp );
6448
if( (edge&1) == 0 ) {
6449
filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS,
6450
( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6451
filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS,
6452
( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6306
6458
static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) {
6307
6459
MpegEncContext * const s = &h->s;
6308
6460
const int mb_xy= mb_x + mb_y*s->mb_stride;
6420
6572
filter_mb_mbaff_edgecv( h, &img_cb[0], uvlinesize, bS, bqp );
6421
6573
filter_mb_mbaff_edgecv( h, &img_cr[0], uvlinesize, bS, rqp );
6423
/* dir : 0 -> vertical edge, 1 -> horizontal edge */
6424
6577
for( dir = 0; dir < 2; dir++ )
6427
const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy;
6428
const int mbm_type = s->current_picture.mb_type[mbm_xy];
6429
int (*ref2frm) [64] = h->ref2frm[ h->slice_num &(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2);
6430
int (*ref2frmm)[64] = h->ref2frm[ h->slice_table[mbm_xy]&(MAX_SLICES-1) ][0] + (MB_MBAFF ? 20 : 2);
6431
int start = h->slice_table[mbm_xy] == 0xFFFF ? 1 : 0;
6433
const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP))
6434
== (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4;
6435
// how often to recheck mv-based bS when iterating between edges
6436
const int mask_edge = (mb_type & (MB_TYPE_16x16 | (MB_TYPE_16x8 << dir))) ? 3 :
6437
(mb_type & (MB_TYPE_8x16 >> dir)) ? 1 : 0;
6438
// how often to recheck mv-based bS when iterating along each edge
6439
const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir));
6441
if (first_vertical_edge_done) {
6443
first_vertical_edge_done = 0;
6446
if (h->deblocking_filter==2 && h->slice_table[mbm_xy] != h->slice_table[mb_xy])
6449
if (FRAME_MBAFF && (dir == 1) && ((mb_y&1) == 0) && start == 0
6450
&& !IS_INTERLACED(mb_type)
6451
&& IS_INTERLACED(mbm_type)
6453
// This is a special case in the norm where the filtering must
6454
// be done twice (one each of the field) even if we are in a
6455
// frame macroblock.
6457
static const int nnz_idx[4] = {4,5,6,3};
6458
unsigned int tmp_linesize = 2 * linesize;
6459
unsigned int tmp_uvlinesize = 2 * uvlinesize;
6460
int mbn_xy = mb_xy - 2 * s->mb_stride;
6465
for(j=0; j<2; j++, mbn_xy += s->mb_stride){
6466
if( IS_INTRA(mb_type) ||
6467
IS_INTRA(s->current_picture.mb_type[mbn_xy]) ) {
6468
bS[0] = bS[1] = bS[2] = bS[3] = 3;
6470
const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy];
6471
for( i = 0; i < 4; i++ ) {
6472
if( h->non_zero_count_cache[scan8[0]+i] != 0 ||
6473
mbn_nnz[nnz_idx[i]] != 0 )
6479
// Do not use s->qscale as luma quantizer because it has not the same
6480
// value in IPCM macroblocks.
6481
qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
6482
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize);
6483
{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6484
filter_mb_edgeh( h, &img_y[j*linesize], tmp_linesize, bS, qp );
6485
filter_mb_edgech( h, &img_cb[j*uvlinesize], tmp_uvlinesize, bS,
6486
( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6487
filter_mb_edgech( h, &img_cr[j*uvlinesize], tmp_uvlinesize, bS,
6488
( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6495
for( edge = start; edge < edges; edge++ ) {
6496
/* mbn_xy: neighbor macroblock */
6497
const int mbn_xy = edge > 0 ? mb_xy : mbm_xy;
6498
const int mbn_type = s->current_picture.mb_type[mbn_xy];
6499
int (*ref2frmn)[64] = edge > 0 ? ref2frm : ref2frmm;
6503
if( (edge&1) && IS_8x8DCT(mb_type) )
6506
if( IS_INTRA(mb_type) ||
6507
IS_INTRA(mbn_type) ) {
6510
if ( (!IS_INTERLACED(mb_type) && !IS_INTERLACED(mbm_type))
6511
|| ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0))
6520
bS[0] = bS[1] = bS[2] = bS[3] = value;
6525
if( edge & mask_edge ) {
6526
bS[0] = bS[1] = bS[2] = bS[3] = 0;
6529
else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) {
6530
bS[0] = bS[1] = bS[2] = bS[3] = 1;
6533
else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) {
6534
int b_idx= 8 + 4 + edge * (dir ? 8:1);
6535
int bn_idx= b_idx - (dir ? 8:1);
6538
for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6539
v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] ||
6540
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
6541
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit;
6544
if(h->slice_type_nos == FF_B_TYPE && v){
6546
for( l = 0; !v && l < 2; l++ ) {
6548
v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] ||
6549
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6550
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit;
6554
bS[0] = bS[1] = bS[2] = bS[3] = v;
6560
for( i = 0; i < 4; i++ ) {
6561
int x = dir == 0 ? edge : i;
6562
int y = dir == 0 ? i : edge;
6563
int b_idx= 8 + 4 + x + 8*y;
6564
int bn_idx= b_idx - (dir ? 8:1);
6566
if( h->non_zero_count_cache[b_idx] != 0 ||
6567
h->non_zero_count_cache[bn_idx] != 0 ) {
6573
for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6574
if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] ||
6575
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
6576
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) {
6582
if(h->slice_type_nos == FF_B_TYPE && bS[i]){
6584
for( l = 0; l < 2; l++ ) {
6586
if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] ||
6587
FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6588
FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) {
6597
if(bS[0]+bS[1]+bS[2]+bS[3] == 0)
6602
// Do not use s->qscale as luma quantizer because it has not the same
6603
// value in IPCM macroblocks.
6604
qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
6605
//tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp, s->current_picture.qscale_table[mbn_xy]);
6606
tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
6607
{ int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6609
filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp );
6610
if( (edge&1) == 0 ) {
6611
filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS,
6612
( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6613
filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS,
6614
( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6617
filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp );
6618
if( (edge&1) == 0 ) {
6619
filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS,
6620
( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6621
filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS,
6622
( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6578
filter_mb_dir(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, mb_xy, mb_type, mvy_limit, dir ? 0 : first_vertical_edge_done, dir);
6580
filter_mb_dir(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, mb_xy, mb_type, mvy_limit, first_vertical_edge_done, 0);
6581
filter_mb_dir(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize, mb_xy, mb_type, mvy_limit, 0, 1);
6629
6585
static int decode_slice(struct AVCodecContext *avctx, void *arg){
6983
6949
sps->nal_hrd_parameters_present_flag = get_bits1(&s->gb);
6984
6950
if(sps->nal_hrd_parameters_present_flag)
6985
decode_hrd_parameters(h, sps);
6951
if(decode_hrd_parameters(h, sps) < 0)
6986
6953
sps->vcl_hrd_parameters_present_flag = get_bits1(&s->gb);
6987
6954
if(sps->vcl_hrd_parameters_present_flag)
6988
decode_hrd_parameters(h, sps);
6955
if(decode_hrd_parameters(h, sps) < 0)
6989
6957
if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag)
6990
6958
get_bits1(&s->gb); /* low_delay_hrd_flag */
6991
6959
sps->pic_struct_present_flag = get_bits1(&s->gb);
6993
6961
sps->bitstream_restriction_flag = get_bits1(&s->gb);
6994
6962
if(sps->bitstream_restriction_flag){
6995
unsigned int num_reorder_frames;
6996
6963
get_bits1(&s->gb); /* motion_vectors_over_pic_boundaries_flag */
6997
6964
get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */
6998
6965
get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */
6999
6966
get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */
7000
6967
get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */
7001
num_reorder_frames= get_ue_golomb(&s->gb);
6968
sps->num_reorder_frames= get_ue_golomb(&s->gb);
7002
6969
get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/
7004
if(num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
7005
av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", num_reorder_frames);
6971
if(sps->num_reorder_frames > 16U /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
6972
av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames);
7009
sps->num_reorder_frames= num_reorder_frames;
7124
7073
sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
7125
7074
sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
7126
7075
sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
7127
tmp= get_ue_golomb(&s->gb);
7076
sps->poc_cycle_length = get_ue_golomb(&s->gb);
7129
if(tmp >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
7130
av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", tmp);
7078
if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
7079
av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length);
7133
sps->poc_cycle_length= tmp;
7135
7083
for(i=0; i<sps->poc_cycle_length; i++)
7136
7084
sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
7137
7085
}else if(sps->poc_type != 2){
7138
7086
av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
7142
tmp= get_ue_golomb(&s->gb);
7143
if(tmp > MAX_PICTURE_COUNT-2 || tmp >= 32){
7090
sps->ref_frame_count= get_ue_golomb_31(&s->gb);
7091
if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count >= 32U){
7144
7092
av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n");
7147
sps->ref_frame_count= tmp;
7148
7095
sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
7149
mb_width= get_ue_golomb(&s->gb) + 1;
7150
mb_height= get_ue_golomb(&s->gb) + 1;
7151
if(mb_width >= INT_MAX/16 || mb_height >= INT_MAX/16 ||
7152
avcodec_check_dimensions(NULL, 16*mb_width, 16*mb_height)){
7096
sps->mb_width = get_ue_golomb(&s->gb) + 1;
7097
sps->mb_height= get_ue_golomb(&s->gb) + 1;
7098
if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 ||
7099
avcodec_check_dimensions(NULL, 16*sps->mb_width, 16*sps->mb_height)){
7153
7100
av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
7156
sps->mb_width = mb_width;
7157
sps->mb_height= mb_height;
7159
7104
sps->frame_mbs_only_flag= get_bits1(&s->gb);
7160
7105
if(!sps->frame_mbs_only_flag)