1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-09-06 16:10:09 +02:00

Decouple bit context from h264 context in decode_ref_pic_marking()

(done in order to implement slice-level parallel decoding)
Patch by Andreas Öman % andreas olebyn nu %
Original thread:
Date: Jun 15, 2007 10:10 PM
Subject: [FFmpeg-devel] [PATCH] h264 parallelized, (was: Parallelized h264 proof-of-concept)

Originally committed as revision 9371 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Andreas Öman 2007-06-19 21:34:04 +00:00 committed by Guillaume Poirier
parent 8c71c5e454
commit 995a30c06b

View File

@ -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);