@ -1598,9 +1598,8 @@ static void chroma_dc_dct_c(DCTELEM *block){
/**
* gets the chroma qp .
*/
static inline int get_chroma_qp ( int chroma_qp_index_offset , int qscale ) {
return chroma_qp [ av_clip ( qscale + chroma_qp_index_offset , 0 , 51 ) ] ;
static inline int get_chroma_qp ( H264Context * h , int qscale ) {
return h - > pps . chroma_qp_table [ qscale & 0xff ] ;
}
//FIXME need to check that this does not overflow signed 32 bit for low qp, i am not sure, it's very close
@ -3420,13 +3419,13 @@ static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple){
s - > mb_y - - ;
tprintf ( h - > s . avctx , " call mbaff filter_mb mb_x:%d mb_y:%d pair_dest_y = %p, dest_y = %p \n " , mb_x , mb_y , pair_dest_y , dest_y ) ;
fill_caches ( h , mb_type_top , 1 ) ; //FIXME don't fill stuff which isn't used by filter_mb
h - > chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > current_picture . qscale_table [ mb_xy ] ) ;
h - > chroma_qp = get_chroma_qp ( h , s - > current_picture . qscale_table [ mb_xy ] ) ;
filter_mb ( h , mb_x , mb_y , pair_dest_y , pair_dest_cb , pair_dest_cr , linesize , uvlinesize ) ;
// bottom
s - > mb_y + + ;
tprintf ( h - > s . avctx , " call mbaff filter_mb \n " ) ;
fill_caches ( h , mb_type_bottom , 1 ) ; //FIXME don't fill stuff which isn't used by filter_mb
h - > chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > current_picture . qscale_table [ mb_xy + s - > mb_stride ] ) ;
h - > chroma_qp = get_chroma_qp ( h , s - > current_picture . qscale_table [ mb_xy + s - > mb_stride ] ) ;
filter_mb ( h , mb_x , mb_y + 1 , dest_y , dest_cb , dest_cr , linesize , uvlinesize ) ;
} else {
tprintf ( h - > s . avctx , " call filter_mb \n " ) ;
@ -4448,7 +4447,7 @@ static int decode_slice_header(H264Context *h){
return - 1 ;
}
s - > qscale = tmp ;
h - > chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > qscale ) ;
h - > chroma_qp = get_chroma_qp ( h , s - > qscale ) ;
//FIXME qscale / qp ... stuff
if ( h - > slice_type = = SP_TYPE ) {
get_bits1 ( & s - > gb ) ; /* sp_for_switch_flag */
@ -4861,7 +4860,7 @@ decode_intra_mb:
// In deblocking, the quantizer is 0
s - > current_picture . qscale_table [ mb_xy ] = 0 ;
h - > chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , 0 ) ;
h - > chroma_qp = get_chroma_qp ( h , 0 ) ;
// All coeffs are present
memset ( h - > non_zero_count [ mb_xy ] , 16 , 16 ) ;
@ -5164,7 +5163,7 @@ decode_intra_mb:
else s - > qscale - = 52 ;
}
h - > chroma_qp = chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > qscale ) ;
h - > chroma_qp = chroma_qp = get_chroma_qp ( h , s - > qscale ) ;
if ( IS_INTRA16x16 ( mb_type ) ) {
if ( decode_residual ( h , h - > intra_gb_ptr , h - > mb , LUMA_DC_BLOCK_INDEX , dc_scan , h - > dequant4_coeff [ 0 ] [ s - > qscale ] , 16 ) < 0 ) {
return - 1 ; //FIXME continue if partitioned and other return -1 too
@ -6014,7 +6013,7 @@ decode_intra_mb:
h - > chroma_pred_mode_table [ mb_xy ] = 0 ;
// In deblocking, the quantizer is 0
s - > current_picture . qscale_table [ mb_xy ] = 0 ;
h - > chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , 0 ) ;
h - > chroma_qp = get_chroma_qp ( h , 0 ) ;
// All coeffs are present
memset ( h - > non_zero_count [ mb_xy ] , 16 , 16 ) ;
s - > current_picture . mb_type [ mb_xy ] = mb_type ;
@ -6290,7 +6289,7 @@ decode_intra_mb:
if ( s - > qscale < 0 ) s - > qscale + = 52 ;
else s - > qscale - = 52 ;
}
h - > chroma_qp = get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > qscale ) ;
h - > chroma_qp = get_chroma_qp ( h , s - > qscale ) ;
if ( IS_INTRA16x16 ( mb_type ) ) {
int i ;
@ -6698,9 +6697,9 @@ static void filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y,
qp = s - > current_picture . qscale_table [ mb_xy ] ;
qp0 = s - > current_picture . qscale_table [ mb_xy - 1 ] ;
qp1 = s - > current_picture . qscale_table [ h - > top_mb_xy ] ;
qpc = get_chroma_qp ( h - > pps . chroma_qp_index_offset , qp ) ;
qpc0 = get_chroma_qp ( h - > pps . chroma_qp_index_offset , qp0 ) ;
qpc1 = get_chroma_qp ( h - > pps . chroma_qp_index_offset , qp1 ) ;
qpc = get_chroma_qp ( h , qp ) ;
qpc0 = get_chroma_qp ( h , qp0 ) ;
qpc1 = get_chroma_qp ( h , qp1 ) ;
qp0 = ( qp + qp0 + 1 ) > > 1 ;
qp1 = ( qp + qp1 + 1 ) > > 1 ;
qpc0 = ( qpc + qpc0 + 1 ) > > 1 ;
@ -6855,11 +6854,11 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8
mbn0_qp = s - > current_picture . qscale_table [ left_mb_xy [ 0 ] ] ;
mbn1_qp = s - > current_picture . qscale_table [ left_mb_xy [ 1 ] ] ;
qp [ 0 ] = ( mb_qp + mbn0_qp + 1 ) > > 1 ;
chroma_qp [ 0 ] = ( get_chroma_qp ( h - > pps . chroma_qp_index_offset , mb_qp ) +
get_chroma_qp ( h - > pps . chroma_qp_index_offset , mbn0_qp ) + 1 ) > > 1 ;
chroma_qp [ 0 ] = ( get_chroma_qp ( h , mb_qp ) +
get_chroma_qp ( h , mbn0_qp ) + 1 ) > > 1 ;
qp [ 1 ] = ( mb_qp + mbn1_qp + 1 ) > > 1 ;
chroma_qp [ 1 ] = ( get_chroma_qp ( h - > pps . chroma_qp_index_offset , mb_qp ) +
get_chroma_qp ( h - > pps . chroma_qp_index_offset , mbn1_qp ) + 1 ) > > 1 ;
chroma_qp [ 1 ] = ( get_chroma_qp ( h , mb_qp ) +
get_chroma_qp ( h , mbn1_qp ) + 1 ) > > 1 ;
/* Filter edge */
tprintf ( s - > avctx , " filter mb:%d/%d MBAFF, QPy:%d/%d, QPc:%d/%d ls:%d uvls:%d " , mb_x , mb_y , qp [ 0 ] , qp [ 1 ] , chroma_qp [ 0 ] , chroma_qp [ 1 ] , linesize , uvlinesize ) ;
@ -6929,7 +6928,7 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8
{ int i ; for ( i = 0 ; i < 4 ; i + + ) tprintf ( s - > avctx , " bS[%d]:%d " , i , bS [ i ] ) ; tprintf ( s - > avctx , " \n " ) ; }
filter_mb_edgeh ( h , & img_y [ j * linesize ] , tmp_linesize , bS , qp ) ;
chroma_qp = ( h - > chroma_qp +
get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > current_picture . qscale_table [ mbn_xy ] ) + 1 ) > > 1 ;
get_chroma_qp ( h , s - > current_picture . qscale_table [ mbn_xy ] ) + 1 ) > > 1 ;
filter_mb_edgech ( h , & img_cb [ j * uvlinesize ] , tmp_uvlinesize , bS , chroma_qp ) ;
filter_mb_edgech ( h , & img_cr [ j * uvlinesize ] , tmp_uvlinesize , bS , chroma_qp ) ;
}
@ -7029,7 +7028,7 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8
filter_mb_edgev ( h , & img_y [ 4 * edge ] , linesize , bS , qp ) ;
if ( ( edge & 1 ) = = 0 ) {
int chroma_qp = ( h - > chroma_qp +
get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > current_picture . qscale_table [ mbn_xy ] ) + 1 ) > > 1 ;
get_chroma_qp ( h , s - > current_picture . qscale_table [ mbn_xy ] ) + 1 ) > > 1 ;
filter_mb_edgecv ( h , & img_cb [ 2 * edge ] , uvlinesize , bS , chroma_qp ) ;
filter_mb_edgecv ( h , & img_cr [ 2 * edge ] , uvlinesize , bS , chroma_qp ) ;
}
@ -7037,7 +7036,7 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8
filter_mb_edgeh ( h , & img_y [ 4 * edge * linesize ] , linesize , bS , qp ) ;
if ( ( edge & 1 ) = = 0 ) {
int chroma_qp = ( h - > chroma_qp +
get_chroma_qp ( h - > pps . chroma_qp_index_offset , s - > current_picture . qscale_table [ mbn_xy ] ) + 1 ) > > 1 ;
get_chroma_qp ( h , s - > current_picture . qscale_table [ mbn_xy ] ) + 1 ) > > 1 ;
filter_mb_edgech ( h , & img_cb [ 2 * edge * uvlinesize ] , uvlinesize , bS , chroma_qp ) ;
filter_mb_edgech ( h , & img_cr [ 2 * edge * uvlinesize ] , uvlinesize , bS , chroma_qp ) ;
}
@ -7572,6 +7571,15 @@ static inline int decode_seq_parameter_set(H264Context *h){
return 0 ;
}
static void
build_qp_table ( PPS * pps , int index )
{
int i ;
for ( i = 0 ; i < 255 ; i + + )
pps - > chroma_qp_table [ i & 0xff ] = chroma_qp [ av_clip ( i + index , 0 , 51 ) ] ;
pps - > chroma_qp_index_offset = index ;
}
static inline int decode_picture_parameter_set ( H264Context * h , int bit_length ) {
MpegEncContext * const s = & h - > s ;
unsigned int tmp , pps_id = get_ue_golomb ( & s - > gb ) ;
@ -7640,7 +7648,7 @@ static inline int decode_picture_parameter_set(H264Context *h, int bit_length){
pps - > weighted_bipred_idc = get_bits ( & s - > gb , 2 ) ;
pps - > init_qp = get_se_golomb ( & s - > gb ) + 26 ;
pps - > init_qs = get_se_golomb ( & s - > gb ) + 26 ;
pps - > chroma_qp_index_offset = get_se_golomb ( & s - > gb ) ;
build_qp_table ( pps , get_se_golomb ( & s - > gb ) ) ;
pps - > deblocking_filter_parameters_present = get_bits1 ( & s - > gb ) ;
pps - > constrained_intra_pred = get_bits1 ( & s - > gb ) ;
pps - > redundant_pic_cnt_present = get_bits1 ( & s - > gb ) ;