/*******************************************************************
                         slice layer interface
 *******************************************************************/

#define SLICE_HEADER_C
#include "slice_header.h"

int read_slice_header(MPEG_IO *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(MPEG_IO *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);
		get_bits(in, 7);

		while(get_bits(in, 1)){
			get_bits(in, 8);
		}
	}

	return 1;
}

int slice_header_to_read_block_option(SLICE_HEADER *in, READ_BLOCK_OPTION *out)
{
	out->quantizer_scale_code = in->quantizer_scale_code;

	reset_dc_dct_predictor(out);
	
	return 1;
}
