Пример #1
0
	IntraReferenceSamples IntraPred::calcReference( MatrixRef<Sample> source, TB &tb, Picture &pic )
	{
		IntraReferenceAvailability avail( tb.size( ) );
		IntraReferenceSamples samples( tb.size( ) );

		bool atLeasOneAvailable = false;

		Position tbLumaPos = pic.scalePositionToLuma( tb.pos, tb.plane );
		Position targetLumaPos = pic.scalePositionToLuma( tb.pos.move( -1, -1 ), tb.plane );

		//corner
		avail.Corner = checkSampleAvailability( tbLumaPos, targetLumaPos, pic );
		if( avail.Corner )
		{
			samples.Corner = source( tb.pos.x - 1, tb.pos.y - 1 );
			atLeasOneAvailable = true;
		}

		int offsetLimit = 2 * tb.size( );

		for( int offset = 0; offset < offsetLimit; ++offset )
		{
			//left
			targetLumaPos = pic.scalePositionToLuma( tb.pos.move( -1, offset ), tb.plane );
			avail.Left[ offset ] = checkSampleAvailability( tbLumaPos, targetLumaPos, pic );
			if( avail.Left[ offset ] )
			{
				samples.Left[ offset ] = source( tb.pos.x - 1, tb.pos.y + offset );
				atLeasOneAvailable = true;
			}

			//top
			targetLumaPos = pic.scalePositionToLuma( tb.pos.move( offset, -1 ), tb.plane );
			avail.Top[ offset ] = checkSampleAvailability( tbLumaPos, targetLumaPos, pic );
			if( avail.Top[ offset ] )
			{
				samples.Top[ offset ] = source( tb.pos.x + offset, tb.pos.y - 1 );
				atLeasOneAvailable = true;
			}
		}

		if( !atLeasOneAvailable )
		{
			Sample defaultSample = pic.pps->sps->getDefaultSampleValue( tb.plane );
			samples.Corner = defaultSample;
			for( int offset = 0; offset < offsetLimit; ++offset )
			{
				samples.Left[ offset ] = defaultSample;
				samples.Top[ offset ] = defaultSample;
			}
		}
		else
		{
			fillMissingReferences( samples, avail );
		}

		return samples;
	}