void decode_nal_units( H264Context *h, const uint8_t *buf, int buf_size )
{
int buf_index = 0;
int context_count = 0;
int next_avc = buf_size;
while ( 1 )
{
if( buf_index >= next_avc )
break;
// start code prefix search
for( ; buf_index + 3 < next_avc; buf_index++)
{
if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1)
break;
}
buf_index += 3;
ff_h264_decode_nal( h );
switch ( h->nal_unit_type )
{
case NAL_IDR_SLICE:
idr( h );
case NAL_SLICE:
decode_slice_header( h );
context_count++;
break;
case NAL_DPA:
decode_slice_header( h );
break;
case NAL_DPB:
//.....
break;
case NAL_DPC:
context_count++;
break;
case NAL_SEI:
h264_decode_sei(h);
break;
case NAL_SPS:
h264_decode_seq_parameter_set( h );
break;
case NAL_PPS:
h264_decode_picture_parameter_set( h );
break;
default: av_log("Unknown NAL code");
}
if(context_count == h->max_contexts)
{
execute_decode_slices(h, context_count);context_count = 0;
}
}
if( context_count )
execute_decode_slices( h, context_count );
}