-
- p_outpic->date = p_pic->date;
- vout_LinkPicture( p_entry->p_vout, p_outpic );
-
- for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )
- {
- uint8_t *p_in, *p_in_end, *p_out;
- int i_in_pitch = p_pic->p[i_plane].i_pitch;
- int i_out_pitch = p_outpic->p[i_plane].i_pitch;
- int i_copy_pitch = p_outpic->p[i_plane].i_visible_pitch;
- int i_lines = p_outpic->p[i_plane].i_visible_lines;
- const int i_div = p_entry->i_width / i_copy_pitch;
-
- const bool b_row_first = i_row == 0;
- const bool b_row_last = i_row + 1 == p_vout->p_sys->i_row;
- const bool b_col_first = i_col == 0;
- const bool b_col_last = i_col + 1 == p_vout->p_sys->i_col;
-
-#ifdef OVERLAP
- if( !b_col_first )
- pi_left_skip[i_plane] -= (2 * p_vout->p_sys->i_halfLength ) / i_div;
-
- if( p_vout->p_sys->i_row >= 2 )
- {
- if( !b_row_first && b_col_first )
- pi_top_skip[i_plane] -= (2 * p_vout->p_sys->i_halfHeight * p_pic->p[i_plane].i_pitch) / i_div;
- if( p_vout->p_sys->i_row > 2 && i_row == 1 && b_col_first )
- pi_top_skip[i_plane] -= (2 * p_vout->p_sys->i_halfHeight * p_pic->p[i_plane].i_pitch) / i_div;
- if( !p_vout->p_sys->pp_vout[p_vout->p_sys->i_col-1].b_active )
- pi_top_skip[i_plane] -= (2 * p_vout->p_sys->i_halfHeight * i_row * p_pic->p[i_plane].i_pitch) / i_div;
- }
-// i_n : previous inactive pp_vout
- int i_n=0;
- while( (i_col - i_n > 1) && (!p_vout->p_sys->pp_vout[i_row * p_vout->p_sys->i_col + i_col - 1 - i_n].b_active) ) i_n++;
- if( i_col > 1 && i_n )
- pi_left_skip[i_plane] -= i_n * (2 * p_vout->p_sys->i_halfLength ) / i_div;
-
-
- if( p_vout->p_sys->i_row > 2 && ( b_row_first || b_row_last ) )
- i_lines -= (2 * p_vout->p_sys->i_halfHeight) / i_div;
-
-// 1088 lines bug in a mpeg2 stream of 1080 lines
- if( b_row_last && p_pic->p[i_plane].i_lines == 1088 )
- i_lines -= 8 / i_div;
-#endif
- /* */
- p_in = &p_pic->p[i_plane].p_pixels[ pi_top_skip[i_plane] + pi_left_skip[i_plane] ]; /* Wall proprities */
- p_in_end = &p_in[i_lines * p_pic->p[i_plane].i_pitch];
-
- p_out = p_outpic->p[i_plane].p_pixels;
-#ifdef OVERLAP
- if( p_vout->p_sys->i_row > 2 && b_row_first )
- p_out += p_outpic->p[i_plane].i_pitch * (2 * p_vout->p_sys->i_halfHeight) / i_div;
-
- int i_col_mod;
- int length = 2 * p_vout->p_sys->i_halfLength / i_div;
-
- if( p_vout->p_sys->b_has_changed )
- {
- Denom = F2(length);
- a_2 = p_vout->p_sys->a_2 * (ACCURACY / 100);
- a_1 = p_vout->p_sys->a_1 * length * (ACCURACY / 100);
- a_0 = p_vout->p_sys->a_0 * Denom * (ACCURACY / 100);
- for( i_col_mod = 0; i_col_mod < 2; i_col_mod++ )
- {
- for( i_index = 0; i_index < length; i_index++ )
- {
- p_vout->p_sys->lambda[i_col_mod][i_plane][i_index] = CLIP_0A(!i_col_mod ? ACCURACY - (F4(a_2, a_1, i_index) + a_0) / Denom : ACCURACY - (F4(a_2, a_1,length - i_index) + a_0) / Denom);
- p_vout->p_sys->cstYUV[i_col_mod][i_plane][i_index] = ((ACCURACY - p_vout->p_sys->lambda[i_col_mod][i_plane][i_index]) * constantYUV[i_plane]) / ACCURACY;
- }
- }
- }
-#endif
- while( p_in < p_in_end )
- {
-#ifndef OVERLAP
- vlc_memcpy( p_out, p_in, i_copy_pitch);
-#else
- if( p_vout->p_sys->i_col > 2 )
- {
- const int halfl = length / 2;
- if( b_col_first)
- vlc_memcpy( &p_out[halfl], &p_in[0], i_copy_pitch - halfl );
- else if( b_col_last )
- vlc_memcpy( &p_out[ 0], &p_in[-halfl], i_copy_pitch - halfl );
- else
- vlc_memcpy( &p_out[ 0], &p_in[-halfl], i_copy_pitch);
-
- // black bar
- if( b_col_first )
- memset( &p_out[0], constantYUV[i_plane], halfl);
- else if( b_col_last )
- memset( &p_out[i_copy_pitch - halfl], constantYUV[i_plane], halfl );
- }
- else
- {
- vlc_memcpy( p_out , p_in, i_copy_pitch );
- }
-
- if( p_vout->p_sys->b_attenuate )
- {
- // vertical blend
- // first blended zone
- if( !b_col_first )
- {
- uint8_t *p_dst = &p_out[0];
- for (i_index = 0; i_index < length; i_index++)
- {
-#ifndef GAMMA
- p_dst[i_index] = (p_vout->p_sys->lambda[1][i_plane][i_index] * p_dst[i_index]) / ACCURACY +
- p_vout->p_sys->cstYUV[1][i_plane][i_index];
-#else
- p_dst[i_index] = p_vout->p_sys->LUT[i_plane][p_vout->p_sys->lambda[1][i_plane][i_index]][p_dst[i_index]];
-#endif
- }
- }
- // second blended zone
- if( !b_col_last )
- {
- uint8_t *p_dst = &p_out[i_copy_pitch - length];
- for (i_index = 0; i_index < length; i_index++)
- {
-#ifndef GAMMA
- p_dst[i_index] = (p_vout->p_sys->lambda[0][i_plane][i_index] * p_dst[i_index]) / ACCURACY +
- p_vout->p_sys->cstYUV[0][i_plane][i_index];
-#else
- p_dst[i_index] = p_vout->p_sys->LUT[i_plane][p_vout->p_sys->lambda[0][i_plane][i_index]][p_dst[i_index]];
-#endif
- }
- }
- // end blended zone
- }
-#endif
- p_in += i_in_pitch;
- p_out += i_out_pitch;
- }
-#ifdef OVERLAP
- // horizontal blend
- if ( p_vout->p_sys->i_row >= 2 )
- {
- // black bar
- if (( p_vout->p_sys->i_row > 2 ) && (( b_row_first ) || ( b_row_last )))
- {
-
- int height = 2 * p_vout->p_sys->i_halfHeight / i_div;
- if ( b_row_first )
- {
- TopOffset = i_lines + (2 * p_vout->p_sys->i_halfHeight) / i_div;
- }
- else
- {
- TopOffset = height - (2 * p_vout->p_sys->i_halfHeight) / i_div;
- }
- uint8_t *p_dst = p_out - TopOffset * i_out_pitch;
- for (i_index = 0; i_index < height; i_index++)
- for (i_index2 = 0; i_index2 < i_copy_pitch; i_index2++)
- p_dst[i_index * i_out_pitch + i_index2] = constantYUV[i_plane];
- }
- if( p_vout->p_sys->b_attenuate )
- {
- length = 2 * p_vout->p_sys->i_halfHeight / (p_vout->p_sys->pp_vout[i_vout].i_width / i_copy_pitch);
- if (p_vout->p_sys->b_has_changed)
- {
- Denom = F2(length);
- a_2 = p_vout->p_sys->a_2 * (ACCURACY / 100);
- a_1 = p_vout->p_sys->a_1 * length * (ACCURACY / 100);
- a_0 = p_vout->p_sys->a_0 * Denom * (ACCURACY / 100);
- for(i_col_mod = 0; i_col_mod < 2; i_col_mod++)
- for (i_index = 0; i_index < length; i_index++)
- {
- p_vout->p_sys->lambda2[i_col_mod][i_plane][i_index] = CLIP_0A(!i_col_mod ? ACCURACY - (F4(a_2, a_1, i_index) + a_0) / Denom : ACCURACY - (F4(a_2, a_1,length - i_index) + a_0) / Denom);
- p_vout->p_sys->cstYUV2[i_col_mod][i_plane][i_index] = ((ACCURACY - p_vout->p_sys->lambda2[i_col_mod][i_plane][i_index]) * constantYUV[i_plane]) / ACCURACY;
- }
- }
- // first blended zone
- if ( !b_row_first )
- {
- TopOffset = i_lines;
- uint8_t *p_dst = p_out - TopOffset * i_out_pitch;
-
- for (i_index = 0; i_index < length; i_index++)
- {
- for (i_index2 = 0; i_index2 < i_copy_pitch; i_index2++)
- {
-#ifndef GAMMA
- p_dst[i_index * i_out_pitch + i_index2] = ( p_vout->p_sys->lambda2[1][i_plane][i_index] *
- p_dst[i_index * i_out_pitch + i_index2] ) / ACCURACY +
- p_vout->p_sys->cstYUV2[1][i_plane][i_index];
-#else
- p_dst[i_index * i_out_pitch + i_index2] = p_vout->p_sys->LUT[i_plane][p_vout->p_sys->lambda2[1][i_plane][i_index]][p_dst[i_index * i_out_pitch + i_index2]];
-#endif
- }
- }
- }
- // second blended zone
- if ( !b_row_last )
- {
- TopOffset = length;
- uint8_t *p_dst = p_out - TopOffset * p_outpic->p[i_plane].i_pitch;
-
- for (i_index = 0; i_index < length; i_index++)
- {
- for (i_index2 = 0; i_index2 < i_copy_pitch; i_index2++)
- {
-#ifndef GAMMA
- p_dst[i_index * i_out_pitch + i_index2] = (p_vout->p_sys->lambda2[0][i_plane][i_index] *
- p_dst[i_index * i_out_pitch + i_index2]) / ACCURACY +
- p_vout->p_sys->cstYUV2[0][i_plane][i_index];
-#else
-
- p_dst[i_index * i_out_pitch + i_index2] = p_vout->p_sys->LUT[i_plane][p_vout->p_sys->lambda2[0][i_plane][i_index]][p_dst[i_index * i_out_pitch + i_index2]];
-#endif
- }
- }
- }
- }