ffmpeg 中 h264 解码器 slice层 以上 解码框架

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


 

发布了15 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/mountain_high/article/details/8986400