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; }