Exemplo n.º 1
0
static void Picture( mpeg_decode* dec )
{
	static const int16_t aspect[16] = 
	{
		    0,10000, 6735, 7031,
		 7615, 8055, 8437, 8935,
		 9157, 9815,10255,10695,
		10950,11575,12015,    0,
	};

	if (!dec->Codec.In.Format.Format.Video.Aspect && aspect[dec->aspect])
		dec->Codec.In.Format.Format.Video.Aspect = Scale(ASPECT_ONE,10000,aspect[dec->aspect]);

	CodecIDCTSetFormat(&dec->Codec,PF_YUV420,dec->width,dec->height,dec->width,dec->height,dec->Codec.In.Format.Format.Video.Aspect);

    flushbits(dec,10); // temporal ref

    loadbits(dec);
	dec->prediction_type = getbits(dec,3);

    flushbits(dec,16); // non constant bit rate

	loadbits(dec);
    if (dec->prediction_type == P_VOP || dec->prediction_type == B_VOP)
	{
        dec->full_pixel[0] = getbits(dec,1);
        dec->fcode[0] = getbits(dec,3)-1;
    }

    if (dec->prediction_type == B_VOP) 
	{
        dec->full_pixel[1] = getbits(dec,1);
        dec->fcode[1] = getbits(dec,3)-1;
    }

    dec->frame_state = 1;

	DEBUG_MSG1(DEBUG_VCODEC,T("MPEG Picture:%d"),dec->prediction_type);
}
Exemplo n.º 2
0
static void Sequence( mpeg_decode* dec )
{
	int i;

	loadbits(dec);
	dec->width = getbits(dec,12);
	dec->height = getbits(dec,12);

	loadbits(dec);
    dec->aspect = getbits(dec,4);

	dec->Codec.In.Format.PacketRate.Den = 1001;
	dec->Codec.In.Format.PacketRate.Num = FrameRate[getbits(dec,4)];
	dec->Codec.FrameTime = Scale(TICKSPERSEC,dec->Codec.In.Format.PacketRate.Den,dec->Codec.In.Format.PacketRate.Num);

	loadbits(dec);
    dec->Codec.In.Format.ByteRate = getbits(dec,18) * 50;
	if (dec->Codec.In.Format.ByteRate > 8*1024*1024)
		dec->Codec.In.Format.ByteRate = 0;

    flushbits(dec,1); // marker
    flushbits(dec,10); // vbv_buffer_size
    flushbits(dec,1);

	loadbits(dec);
    if (getbits1(dec)) 
	{
        for (i=0;i<64;i++) 
		{
			loadbits(dec);
            dec->IntraMatrix[i] = (uint8_t)getbits(dec,8);
        }
    } 
	else 
	{
        for (i=0;i<64;i++) 
            dec->IntraMatrix[i] = MPEG1_IntraMatrix[dec->zigzag[i]];
    }

    if (getbits1(dec)) 
	{
        for (i=0;i<64;i++) 
		{
			loadbits(dec);
            dec->InterMatrix[i] = (uint8_t)getbits(dec, 8);
        }
    } 
	else 
	{
        for (i=0;i<64;i++) 
            dec->InterMatrix[i] = 16;
    }

	dec->ValidSeq = 1;
}
Exemplo n.º 3
0
int gethdr_h263( mp4_decode *dec )
{
	int code;

	bytealign(dec);
	loadbits(dec);

    code = getbits(dec,22-8);
	while (!eofbits(dec))
	{
		loadbits(dec);
		code = ((code << 8) + getbits(dec,8)) & 0x3FFFFF;
		if (code == 32)
			break;
	}

	if (code != 32)
		return 0;

    flushbits(dec,8); // picture timestamp

	loadbits(dec);
	if (!getbits1(dec)) // marker
		return 0;
	if (getbits1(dec)) // h263 id
		return 0;

	flushbits(dec,3);

	code = getbits(dec,3); // format

	if (code == 6 || code == 7)
	{
		if (dec->showerror)
		{
			dec->showerror = 0;
			ShowError(dec->Codec.Node.Class,MPEG4_ID,MPEG4_ERROR_H263);
		}
		//todo: finish
		return 0;
	}
	else
	{
		static const int size[8][2] = {
			{ 0,0 },
			{ 128,96 },
			{ 176,144 },
			{ 352,288 },
			{ 704,576 },
			{ 1408,1152 }};

		int width = size[code][0];
        int height = size[code][1];
		if (!dec->ignoresize && (!width || CodecIDCTSetFormat(&dec->Codec,PF_YUV420,
			dec->Codec.In.Format.Video.Width,dec->Codec.In.Format.Video.Height,width,height) != ERR_NONE))
		{
			dec->validvol = 0;
			return 0;
		}
       
		loadbits(dec);
        dec->prediction_type = getbits(dec,1);
		dec->long_vectors = (char)getbits(dec,1);

		if (getbits1(dec)) // sac not supported
			return 0;

		getbits(dec,1); // obmc
        
		if (getbits1(dec)) // pb frame not supported
			return 0;

		dec->quantizer = getbits(dec,5);
		flushbits(dec,1);

		dec->rounding = 0;
	}

    while (getbits1(dec)) // pei
	{
        flushbits(dec,8);
		loadbits(dec);
    }

	dec->fcode_for = 1;
	dec->validvol = 1;
	dec->Codec.IDCT.Ptr->Set(dec->Codec.IDCT.Ptr,IDCT_ROUNDING,&dec->rounding,sizeof(bool_t));
	return 1;
}
Exemplo n.º 4
0
static void blockIntra( mpeg_decode* dec, int pos )
{
	int j;
	idct_block_t *block;
	const uint16_t *table = vld_mpeg1;
	int qscale;

	dec->Codec.IDCT.Ptr->Process(dec->Codec.IDCT.Ptr,POSX(pos),POSY(pos));

	block = dec->blockptr;
	qscale = dec->qscale;

	for (j=0;j<6;++j)
	{
		int bitpos;
		int len;

		ClearBlock(block);	
		loadbits(dec);

		{
			int dct_dc_size, dct_dc_diff;

			dct_dc_diff = 0;
			dct_dc_size = j<4 ? getDCsizeLum(dec) : getDCsizeChr(dec); //max11bit

			if (dct_dc_size)
				dct_dc_diff = getDCdiff(dct_dc_size,dec);

			dct_dc_size = j<4 ? 0 : j-4+1;
			DEBUG_MSG2(DEBUG_VCODEC2,T("dc=%d diff=%d"), dec->last_dc[dct_dc_size]+dct_dc_diff, dct_dc_diff );
			dct_dc_diff += dec->last_dc[dct_dc_size];
			dec->last_dc[dct_dc_size] = dct_dc_diff;

			*block = (idct_block_t)(dct_dc_diff << 3);
			len = 1;
		}

		bitpos = dec->bitpos;
		
		for (;;) // event vld
		{
			int code,level;

			loadbits_pos(dec,bitpos);
			code = showbits_pos(dec,bitpos,16);	

			vld_code;
			level = code & 63;
			if (level < 62) 
			{
				level *= qscale;
				code >>= 6;
				code &= 63;
				len += code; // run
				if (len >= 64)
					break;

				code = dec->zigzag[len];
				level *= dec->IntraMatrix[len];
				level >>= 3;
				level = (level-1)|1;

				if (getbits1_pos(dec,bitpos)) 
					level = -level;

				block[code] = (idct_block_t)level;
				++len;
			} 
			else 
			{
				if (level==63)
					break;

				// this value is escaped
				loadbits_pos(dec,bitpos);

				len += showbits_pos(dec,bitpos,6); flushbits_pos(dec,bitpos,6);
				if (len >= 64)
					break;

				code = showbits_pos(dec,bitpos,8); flushbits_pos(dec,bitpos,8);
				level = (code << 24) >> 24; //sign extend the lower 8 bits
				code = dec->zigzag[len];

				if (level == -128)
				{
					level = showbits_pos(dec,bitpos,8)-256; flushbits_pos(dec,bitpos,8);
				}
				else 
				if (level == 0)
				{
					level = showbits_pos(dec,bitpos,8); flushbits_pos(dec,bitpos,8);
				}

				if (level<0)
				{
					level= -level;
					level *= qscale * dec->IntraMatrix[len];
					level >>= 3;
					level= (level-1)|1;
					level= -level;

					block[code] = (idct_block_t)level;
					++len;
				}
				else
				{