Ejemplo n.º 1
0
void ParseAdaptationField::input_bitstream(Bitstream &bitstream)
{
	adaptation_field_length = bitstream.read_bits(8);
	log4c_category_log(mycat, LOG4C_PRIORITY_INFO, "adaptation_field_length %d", adaptation_field_length);

	if(adaptation_field_length > 0)
	{
		discontinuity_indicator = (bool)bitstream.read_bits(1);
		random_access_indicator = (bool)bitstream.read_bits(1);
		elementary_stream_priority_indicator = (bool)bitstream.read_bits(1);
		PCR_flag = (bool)bitstream.read_bits(1);
		OPCR_flag = (bool)bitstream.read_bits(1);
		splicing_point_flag = (bool)bitstream.read_bits(1);
		transport_private_data_flag = (bool)bitstream.read_bits(1);
		adaptation_field_extension_flag = (bool)bitstream.read_bits(1);
		//log4c_category_log(mycat, LOG4C_PRIORITY_TRACE, "adaptation_field_extension_flag %d", adaptation_field_extension_flag);

		if(PCR_flag)
		{
			log4c_category_log(mycat, LOG4C_PRIORITY_TRACE, "pcr flag related parsing");
			program_clock_reference_base = bitstream.read_bits(32) << 1;
			program_clock_reference_base |= (bitstream.read_bits(1));
			bitstream.skip_bits(6);
			program_clock_refrence_extension = bitstream.read_bits(9);
		}

		if(OPCR_flag)
		{
			log4c_category_log(mycat, LOG4C_PRIORITY_TRACE, "opcr flag related parsing");
			original_program_clock_reference_base = bitstream.read_bits(32) << 1;
			original_program_clock_reference_base |= (bitstream.read_bits(1));
			bitstream.skip_bits(6);
			original_program_clock_refrence_extension = bitstream.read_bits(9);
		}

		if(splicing_point_flag)
		{
			log4c_category_log(mycat, LOG4C_PRIORITY_TRACE, "splice flag related parsing");
			splice_countdown = bitstream.read_bits(8);
		}

		if(transport_private_data_flag)
		{
			log4c_category_log(mycat, LOG4C_PRIORITY_TRACE, "transport private flag related parsing");

			transport_private_data_length = bitstream.read_bits(8);
			for(int i = 0; i < transport_private_data_length; i++)
			{
				private_data_byte.push_back((char)bitstream.read_bits(8));
			}
		}

		if(adaptation_field_extension_flag)
		{
			log4c_category_log(mycat, LOG4C_PRIORITY_TRACE, "extension flag related parsing");

			adaptation_field_extension_length = bitstream.read_bits(8);
			ltw_flag = bitstream.read_bits(1);
			piecewise_rate_flag = bitstream.read_bits(1);
			seamless_splice_flag = bitstream.read_bits(1);
			bitstream.skip_bits(5);

			if(ltw_flag)
			{
				ltw_valid_flag = bitstream.read_bits(1);
				ltw_offset = bitstream.read_bits(15);
			}

			if(piecewise_rate_flag)
			{
				bitstream.skip_bits(2);
				piecewise_rate = bitstream.read_bits(22);
			}

			if(seamless_splice_flag)
			{
				splice_type = bitstream.read_bits(4);
				DTS_next_AU = bitstream.read_bits(3) << 30;
				bitstream.skip_bits(1);
				DTS_next_AU |= (bitstream.read_bits(15) << 15);
				bitstream.skip_bits(1);
				DTS_next_AU |= bitstream.read_bits(15);
				bitstream.skip_bits(1);
			}
		}
		//int bits_remaining = adaptation_field_length - start_offset;
		//log4c_category_log(mycat, LOG4C_PRIORITY_INFO, "skip_bits %d", bits_remaining);
		//bitstream.skip_bits(bits_remaining);
	}
}