@ -38,6 +38,12 @@
//#undef NDEBUG
# include <assert.h>
/**
* Value of Picture . reference when Picture is not a reference picture , but
* is held for delayed output .
*/
# define DELAYED_PIC_REF 4
static VLC coeff_token_vlc [ 4 ] ;
static VLC chroma_dc_coeff_token_vlc ;
@ -3091,11 +3097,11 @@ static inline void unreference_pic(H264Context *h, Picture *pic){
int i ;
pic - > reference = 0 ;
if ( pic = = h - > delayed_output_pic )
pic - > reference = 1 ;
pic - > reference = DELAYED_PIC_REF ;
else {
for ( i = 0 ; h - > delayed_pic [ i ] ; i + + )
if ( pic = = h - > delayed_pic [ i ] ) {
pic - > reference = 1 ;
pic - > reference = DELAYED_PIC_REF ;
break ;
}
}
@ -3542,7 +3548,6 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
unsigned int slice_type , tmp , i ;
int default_ref_list_done = 0 ;
s - > current_picture . reference = h - > nal_ref_idc ! = 0 ;
s - > dropable = h - > nal_ref_idc = = 0 ;
first_mb_in_slice = get_ue_golomb ( & s - > gb ) ;
@ -3652,14 +3657,6 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
}
}
if ( h0 - > current_slice = = 0 ) {
if ( frame_start ( h ) < 0 )
return - 1 ;
}
if ( h ! = h0 )
clone_slice ( h , h0 ) ;
s - > current_picture_ptr - > frame_num = //FIXME frame_num cleanup
h - > frame_num = get_bits ( & s - > gb , h - > sps . log2_max_frame_num ) ;
h - > mb_mbaff = 0 ;
@ -3675,6 +3672,16 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
h - > mb_aff_frame = h - > sps . mb_aff ;
}
}
if ( h0 - > current_slice = = 0 ) {
if ( frame_start ( h ) < 0 )
return - 1 ;
}
if ( h ! = h0 )
clone_slice ( h , h0 ) ;
s - > current_picture_ptr - > frame_num = h - > frame_num ; //FIXME frame_num cleanup
assert ( s - > mb_num = = s - > mb_width * s - > mb_height ) ;
if ( first_mb_in_slice < < h - > mb_aff_frame > = s - > mb_num | |
first_mb_in_slice > = s - > mb_num ) {
@ -3763,7 +3770,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
else
h - > use_weight = 0 ;
if ( s - > current_picture . reference )
if ( h - > nal_ref_idc )
decode_ref_pic_marking ( h0 , & s - > gb ) ;
if ( FRAME_MBAFF )
@ -3863,7 +3870,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
) ;
}
if ( ( s - > avctx - > flags2 & CODEC_FLAG2_FAST ) & & ! s - > current_picture . reference ) {
if ( ( s - > avctx - > flags2 & CODEC_FLAG2_FAST ) & & ! h - > nal_ref_idc ) {
s - > me . qpel_put = s - > dsp . put_2tap_qpel_pixels_tab ;
s - > me . qpel_avg = s - > dsp . avg_2tap_qpel_pixels_tab ;
} else {
@ -7361,12 +7368,11 @@ static int decode_frame(AVCodecContext *avctx,
h - > prev_frame_num_offset = h - > frame_num_offset ;
h - > prev_frame_num = h - > frame_num ;
if ( s - > current_picture_ptr - > reference ) {
if ( s - > current_picture_ptr - > reference & s - > picture_structure ) {
h - > prev_poc_msb = h - > poc_msb ;
h - > prev_poc_lsb = h - > poc_lsb ;
}
if ( s - > current_picture_ptr - > reference )
execute_ref_pic_marking ( h , h - > mmco , h - > mmco_index ) ;
}
ff_er_frame_end ( s ) ;
@ -7392,7 +7398,7 @@ static int decode_frame(AVCodecContext *avctx,
h - > delayed_pic [ pics + + ] = cur ;
if ( cur - > reference = = 0 )
cur - > reference = 1 ;
cur - > reference = DELAYED_PIC_REF ;
cross_idr = 0 ;
for ( i = 0 ; h - > delayed_pic [ i ] ; i + + )
@ -7433,7 +7439,7 @@ static int decode_frame(AVCodecContext *avctx,
* data_size = 0 ;
else
* data_size = sizeof ( AVFrame ) ;
if ( prev & & prev ! = out & & prev - > reference = = 1 )
if ( prev & & prev ! = out & & prev - > reference = = DELAYED_PIC_REF )
prev - > reference = 0 ;
h - > delayed_output_pic = out ;
# endif