|
|
|
@@ -4006,13 +4006,13 @@ static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){ |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int decode_ref_pic_marking(H264Context *h){ |
|
|
|
static int decode_ref_pic_marking(H264Context *h, GetBitContext *gb){ |
|
|
|
MpegEncContext * const s = &h->s; |
|
|
|
int i; |
|
|
|
|
|
|
|
if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields |
|
|
|
s->broken_link= get_bits1(&s->gb) -1; |
|
|
|
h->mmco[0].long_index= get_bits1(&s->gb) - 1; // current_long_term_idx |
|
|
|
s->broken_link= get_bits1(gb) -1; |
|
|
|
h->mmco[0].long_index= get_bits1(gb) - 1; // current_long_term_idx |
|
|
|
if(h->mmco[0].long_index == -1) |
|
|
|
h->mmco_index= 0; |
|
|
|
else{ |
|
|
|
@@ -4020,20 +4020,20 @@ static int decode_ref_pic_marking(H264Context *h){ |
|
|
|
h->mmco_index= 1; |
|
|
|
} |
|
|
|
}else{ |
|
|
|
if(get_bits1(&s->gb)){ // adaptive_ref_pic_marking_mode_flag |
|
|
|
if(get_bits1(gb)){ // adaptive_ref_pic_marking_mode_flag |
|
|
|
for(i= 0; i<MAX_MMCO_COUNT; i++) { |
|
|
|
MMCOOpcode opcode= get_ue_golomb(&s->gb);; |
|
|
|
MMCOOpcode opcode= get_ue_golomb(gb); |
|
|
|
|
|
|
|
h->mmco[i].opcode= opcode; |
|
|
|
if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){ |
|
|
|
h->mmco[i].short_frame_num= (h->frame_num - get_ue_golomb(&s->gb) - 1) & ((1<<h->sps.log2_max_frame_num)-1); //FIXME fields |
|
|
|
h->mmco[i].short_frame_num= (h->frame_num - get_ue_golomb(gb) - 1) & ((1<<h->sps.log2_max_frame_num)-1); //FIXME fields |
|
|
|
/* if(h->mmco[i].short_frame_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_frame_num ] == NULL){ |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "illegal short ref in memory management control operation %d\n", mmco); |
|
|
|
return -1; |
|
|
|
}*/ |
|
|
|
} |
|
|
|
if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){ |
|
|
|
unsigned int long_index= get_ue_golomb(&s->gb); |
|
|
|
unsigned int long_index= get_ue_golomb(gb); |
|
|
|
if(/*h->mmco[i].long_index >= h->long_ref_count || h->long_ref[ h->mmco[i].long_index ] == NULL*/ long_index >= 16){ |
|
|
|
av_log(h->s.avctx, AV_LOG_ERROR, "illegal long ref in memory management control operation %d\n", opcode); |
|
|
|
return -1; |
|
|
|
@@ -4416,7 +4416,7 @@ static int decode_slice_header(H264Context *h){ |
|
|
|
h->use_weight = 0; |
|
|
|
|
|
|
|
if(s->current_picture.reference) |
|
|
|
decode_ref_pic_marking(h); |
|
|
|
decode_ref_pic_marking(h, &s->gb); |
|
|
|
|
|
|
|
if(FRAME_MBAFF) |
|
|
|
fill_mbaff_ref_list(h); |
|
|
|
|