/*******************************************************************
   MPEG Video sequance header reading routine
 *******************************************************************/

#define SEQUENCE_HEADER_C
#include "sequence_header.h"

int read_sequence_header(MPEG_IO *in, SEQUENCE_HEADER *out);

int read_sequence_header(MPEG_IO *in, SEQUENCE_HEADER *out)
{
	int i;
	int code;
	
	out->h_size = get_bits(in, 12);
	out->v_size = get_bits(in, 12);
	out->aspect_ratio = get_bits(in, 4);
	out->frame_rate = get_bits(in, 4);
	out->bit_rate = get_bits(in, 18);
	get_bits(in, 1); /* marker bit */
	out->vbv_buffer_size = get_bits(in, 10);
	out->mpeg1 = get_bits(in, 1);
	out->has_intra_quantizer_matrix = get_bits(in, 1);
	if(out->has_intra_quantizer_matrix){
		for(i=0;i<64;i++){
			out->iqm[i] = get_bits(in, 8);
		}
	}
	out->has_nonintra_quantizer_matrix = get_bits(in, 1);
	if(out->has_nonintra_quantizer_matrix){
		for(i=0;i<64;i++){
			out->nqm[i] = get_bits(in, 8);
		}
	}

	while(next_marker(in)){
		code = read_bits(in, 32);
		if(code != 0x1b5){
			break;
		}
		erase_bits(in, 32);

		code = get_bits(in, 4);
		switch(code){
		case 1:
			out->se.profile_and_level = get_bits(in, 8);
			out->se.progressive = get_bits(in, 1);
			out->se.chroma_format = get_bits(in, 2);
			out->h_size += get_bits(in, 2) << 12;
			out->v_size += get_bits(in, 2) << 12;
			out->bit_rate += get_bits(in, 12) << 18;
			out->vbv_buffer_size += get_bits(in, 8) << 10;
			out->se.low_delay = get_bits(in, 1);
			out->se.frame_rate_ext_n = get_bits(in, 2);
			out->se.frame_rate_ext_d = get_bits(in, 2);
			break;
		case 2:
			out->sd.video_format = get_bits(in, 3);
			out->sd.has_color_description = get_bits(in, 1);
			if(out->sd.has_color_description){
				out->sd.color_primaries = get_bits(in, 8);
				out->sd.transfer_characteristics = get_bits(in, 8);
				out->sd.matrix_coeffients = get_bits(in, 8);
			}
			out->sd.display_h_size = get_bits(in, 14);
			out->sd.display_v_size = get_bits(in, 14);
			break;
		case 5:
			out->ss.scalable_mode = get_bits(in, 2);
			out->ss.layer = get_bits(in, 4);
			out->ss.lower_layer_prediction_h_size = get_bits(in, 14);
			out->ss.lower_layer_prediction_v_size = get_bits(in, 14);
			out->ss.h_subsampling_facter_m = get_bits(in, 5);
			out->ss.h_subsampling_facter_n = get_bits(in, 5);
			out->ss.v_subsampling_facter_m = get_bits(in, 5);	
			out->ss.v_subsampling_facter_n = get_bits(in, 5);
			out->ss.picture_mux_enable = get_bits(in, 1);
			out->ss.mux_to_progressive_sequence = get_bits(in, 1);
			out->ss.pixture_mux_order = get_bits(in, 3);
			out->ss.pixture_mux_facter = get_bits(in, 3);
			break;
		default:
			return 0;
		}
	}

	return 1;
}