Esempio n. 1
0
static void check_stream_type(APEG_LAYER *layer)
{
	// Assume a non-system stream
	layer->system_stream_flag = NO_SYSTEM;

	// Initialize the buffer
	_apeg_initialize_buffer(layer);

	// Transport streams (what'r those?) aren't supported
	if(show_bits(layer, 8) == 0x47)
		apeg_error_jump("Transport streams not supported");

	/* Get the first start code */
recheck:
	switch(show_bits32(layer))
	{
		case VIDEO_ELEMENTARY_STREAM:
			/* Found video, system stream */
			layer->system_stream_flag = MPEG_SYSTEM;
			/* fall-through; set flag and break */
		case SEQUENCE_HEADER_CODE:
			/* Found video */
			if(!_apeg_ignore_video)
				layer->stream.flags |= APEG_MPG_VIDEO;
			break;

		case AUDIO_ELEMENTARY_STREAM:
			/* apeg_start_audio will set APEG_MPG_AUDIO later */
			layer->system_stream_flag = MPEG_SYSTEM;
			apeg_start_code(layer);
			goto recheck;

		default:
			if(layer->system_stream_flag == NO_SYSTEM)
			{
				if(show_bits32(layer) == (('O'<<24)|('g'<<16)|('g'<<8)|('S')))
				{
					layer->system_stream_flag = OGG_SYSTEM;
					_apeg_initialize_buffer(layer);
					if(alogg_open(layer) != APEG_OK)
						apeg_error_jump("Error opening Ogg stream");
					return;
				}
#ifndef DISABLE_MPEG_AUDIO
				if(almpa_head_backcheck(show_bits32(layer)))
					break;
#endif
			}

			/* no positive stream identified; recheck */
			apeg_flush_bits8(layer, 8);
			goto recheck;
	}

	_apeg_initialize_buffer(layer);
}
Esempio n. 2
0
static int Get_Chroma_DC_dct_diff(APEG_LAYER *layer)
{
	int code, size;

	/* decode length */
	code = show_bits(layer, 5);

	if (code<31)
	{
		/* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
		static const VLCtab DCchromtab0[32] = {
			{0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
			{1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
			{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
			{3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {0, 0}
		};

		size = DCchromtab0[code].val;
		apeg_flush_bits8(layer, DCchromtab0[code].len);

		if(size == 0)
			return 0;
	}
	else
	{
		/* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
		static const VLCtab DCchromtab1[32] = {
			{6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, { 6, 6}, { 6, 6},
			{6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, { 6, 6}, { 6, 6},
			{7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, { 7, 7}, { 7, 7},
			{8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
		};

		code = show_bits(layer, 10) - 992;
		size = DCchromtab1[code].val;
		apeg_flush_bits(layer, DCchromtab1[code].len);
	}

	{
		const int dct_diff = apeg_get_bits(layer, size);
		const int f = ((dct_diff >> (size-1))&1)^1;
		return dct_diff - ((f<<size) - f);
/*		int dct_diff = apeg_get_bits(layer, size);
		if (( dct_diff & (1 << (size-1)) ) == 0)
			return dct_diff - ((1<<size) - 1);
		return dct_diff;*/
	}
}
Esempio n. 3
0
static void p_picture(APEG_LAYER *layer)
{
	const int MBAmax = layer->mb_cols*layer->mb_rows;
	int macroblock_type;
	int coded_block_pattern;
	int MBA, MBAinc;
	int dc_dct_pred[3];
	int PMV[2];
	int bx, by;
	unsigned int code;

slice_start:
	dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0;
	PMV[0] = PMV[1] = 0;

	code = apeg_start_code(layer);
	if(code < SLICE_START_CODE_MIN || code > SLICE_START_CODE_MAX)
		return;
	apeg_flush_bits32(layer);

	slice_header(layer);

	bx = get_mba_inc(layer);
	by = (code&255) - 1;

	MBA = by*layer->mb_cols + bx;

	bx <<= 4;
	by <<= 4;

block_start:
	code = show_bits(layer, 6);

	if(code >= 8)
	{
		code >>= 3;

		apeg_flush_bits8(layer, PMBtab0[code].len);
		macroblock_type = PMBtab0[code].val;

		dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0;

		switch(macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN))
		{
			case MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN:
				apeg_motion_vector(layer,PMV,forward_code,full_forward_vector);
				apeg_form_f_pred(layer, bx, by, PMV);

				break;

			case MACROBLOCK_PATTERN:
				PMV[0] = PMV[1] = 0;
				apeg_empty_pred(layer->forward_frame, layer->current_frame, bx, by, layer->coded_width);

				break;

			default:
				apeg_motion_vector(layer,PMV,forward_code,full_forward_vector);
				apeg_form_f_pred(layer, bx, by, PMV);

				goto next;
		}
	}