/*******************************************************************
                         slice layer interface
 *******************************************************************/

#define SLICE_HEADER_C
#include "slice_header.h"

int read_slice_header(VIDEO_STREAM *in, SLICE_HEADER *out, READ_SLICE_HEADER_OPTION *opt);
int slice_header_to_read_block_option(SLICE_HEADER *in, READ_BLOCK_OPTION *out);

int read_slice_header(VIDEO_STREAM *in, SLICE_HEADER *out, READ_SLICE_HEADER_OPTION *opt)
{
	int code;

	code = get_bits(in, 32);
	code -= 0x100;
	if(code > 0 && code < 0xB0){
		out->slice_vertical_position = code;
	}else{
		return 0;
	}

	if(opt->v_size > 2800){
		out->slice_vertical_position += get_bits(in, 3) << 7;
	}
	
	if(opt->scalable_mode == 0){
		out->priority_break_point = get_bits(in, 7);
	}

	out->quantizer_scale_code = get_bits(in, 5);

	out->intra_slice_flag = get_bits(in, 1);
	if(out->intra_slice_flag){
		
		out->intra_slice = get_bits(in, 1);
		
		out->slice_picture_id_enable = get_bits(in, 1);
		out->slice_picture_id = get_bits(in, 6);

		while(get_bits(in, 1)){
			get_bits(in, 8);
		}
	}else{
		out->intra_slice = 0;
	}

	return 1;
}

int slice_header_to_read_block_option(SLICE_HEADER *in, READ_BLOCK_OPTION *out)
{
	out->quantizer_scale_code = in->quantizer_scale_code;

	out->reset_dc_dct_predictor = 1;
	
	return 1;
}
