[Mesa-dev] [PATCH 1/2] st/va: move YUV content to deinterlaced buffer when reallocated for encoder

Leo Liu leo.liu at amd.com
Thu Aug 24 13:15:18 UTC 2017



On 08/24/2017 02:52 AM, Christian König wrote:
> Am 23.08.2017 um 23:41 schrieb Leo Liu:
>> Signed-off-by: Leo Liu <leo.liu at amd.com>
>> ---
>>   src/gallium/state_trackers/va/picture.c | 40 
>> +++++++++++++++++++++++++++++----
>>   1 file changed, 36 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/va/picture.c 
>> b/src/gallium/state_trackers/va/picture.c
>> index 47e63d3b30..3c5eb5de97 100644
>> --- a/src/gallium/state_trackers/va/picture.c
>> +++ b/src/gallium/state_trackers/va/picture.c
>> @@ -626,9 +626,12 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID 
>> context_id)
>> PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
>>        if (surf->buffer->interlaced != interlaced) {
>> -      surf->templat.interlaced = screen->get_video_param(screen, 
>> context->decoder->profile,
>> - PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
>> - PIPE_VIDEO_CAP_PREFERS_INTERLACED);
>> +      surf->templat.interlaced =
>> +         (context->decoder->entrypoint == 
>> PIPE_VIDEO_ENTRYPOINT_ENCODE) ?
>> +         interlaced :
>> +         screen->get_video_param(screen, context->decoder->profile,
>> + PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
>> + PIPE_VIDEO_CAP_PREFERS_INTERLACED);
>
> Why not just:
>> screen->get_video_param(screen, context->decoder->profile,
>>     context->decoder->entrypoint,
>>     PIPE_VIDEO_CAP_PREFERS_INTERLACED);
> ?
>
Right.
I checked "PIPE_VIDEO_CAP_PREFERS_INTERLACED" from encoder parameter 
under get_video_parameter()
I think I overlooked it yesterday. I will in fix it in V2.

Thanks,
Leo



>>         realloc = true;
>>      }
>>   @@ -657,13 +660,42 @@ vlVaEndPicture(VADriverContextP ctx, 
>> VAContextID context_id)
>>      }
>>        if (realloc) {
>> -      surf->buffer->destroy(surf->buffer);
>> +      struct pipe_video_buffer *old_buf = surf->buffer;
>>           if (vlVaHandleSurfaceAllocate(ctx, surf, &surf->templat) != 
>> VA_STATUS_SUCCESS) {
>>            mtx_unlock(&drv->mutex);
>>            return VA_STATUS_ERROR_ALLOCATION_FAILED;
>>         }
>>   +      if (context->decoder->entrypoint == 
>> PIPE_VIDEO_ENTRYPOINT_ENCODE) {
>> +         struct vl_compositor *compositor = &drv->compositor;
>> +         struct vl_compositor_state *s = &drv->cstate;
>> +         struct pipe_surface **dst_surface;
>> +         struct u_rect dst_rect;
>> +
>> +         dst_surface = surf->buffer->get_surfaces(surf->buffer);
>> +         vl_compositor_clear_layers(s);
>> +
>> +         dst_rect.x0 = 0;
>> +         dst_rect.x1 = old_buf->width;
>> +         dst_rect.y0 = 0;
>> +         dst_rect.y1 = old_buf->height;
>> +
>> +         vl_compositor_set_yuv_layer(s, compositor, 0, old_buf, 
>> NULL, NULL, true);
>> +         vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
>> +         vl_compositor_render(s, compositor, dst_surface[0], NULL, 
>> false);
>> +
>> +         dst_rect.x1 /= 2;
>> +         dst_rect.y1 /= 2;
>> +
>> +         vl_compositor_set_yuv_layer(s, compositor, 0, old_buf, 
>> NULL, NULL, false);
>> +         vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
>> +         vl_compositor_render(s, compositor, dst_surface[1], NULL, 
>> false);
>> +
>> + context->decoder->context->flush(context->decoder->context, NULL, 0);
>
> Looks like we have mostly the same in the OMX state tracker, would it 
> make sense to have a helper for this?
>
> Apart from that looks good to me,
> Christian.
>
>> +      }
>> +
>> +      old_buf->destroy(old_buf);
>>         context->target = surf->buffer;
>>      }
>
>



More information about the mesa-dev mailing list