Commit 4ffed61b authored by Michael Niedermayer's avatar Michael Niedermayer

h264_parser: fully parse first_mb_in_slice to more reliably detect AU boundaries.

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 23040e2e
...@@ -591,6 +591,10 @@ typedef struct H264Context{ ...@@ -591,6 +591,10 @@ typedef struct H264Context{
int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low
int sync; ///< did we had a keyframe or recovery point int sync; ///< did we had a keyframe or recovery point
uint8_t parse_history[4];
int parse_history_count;
int parse_last_mb;
}H264Context; }H264Context;
......
...@@ -93,17 +93,28 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si ...@@ -93,17 +93,28 @@ static int ff_h264_find_frame_end(H264Context *h, const uint8_t *buf, int buf_si
goto found; goto found;
} }
}else if(v==1 || v==2 || v==5){ }else if(v==1 || v==2 || v==5){
state+=8;
continue;
}
state= 7;
}else{
h->parse_history[h->parse_history_count++]= buf[i];
if(h->parse_history_count>3){
unsigned int mb, last_mb= h->parse_last_mb;
GetBitContext gb;
init_get_bits(&gb, h->parse_history, 8*h->parse_history_count);
h->parse_history_count=0;
mb= get_ue_golomb_long(&gb);
last_mb= h->parse_last_mb;
h->parse_last_mb= mb;
if(pc->frame_start_found){ if(pc->frame_start_found){
state+=8; if(mb <= last_mb)
continue; goto found;
}else }else
pc->frame_start_found = 1; pc->frame_start_found = 1;
state= 7;
} }
state= 7;
}else{
if(buf[i] & 0x80)
goto found;
state= 7;
} }
} }
pc->state= state; pc->state= state;
...@@ -116,7 +127,7 @@ found: ...@@ -116,7 +127,7 @@ found:
pc->frame_start_found= 0; pc->frame_start_found= 0;
if(h->is_avc) if(h->is_avc)
return next_avc; return next_avc;
return i-(state&5); return i-(state&5) - 3*(state>7);
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment