diff options
author | Xiang, Haihao <haihao.xiang@intel.com> | 2013-08-23 13:39:07 +0800 |
---|---|---|
committer | Xiang, Haihao <haihao.xiang@intel.com> | 2013-09-09 15:02:55 +0800 |
commit | f54dbcaa7e3d9cdf9a16e7d078e35c7334142d00 (patch) | |
tree | 9bb6a9539f4b2bc36155ae390842ca5cccbf1c12 /src | |
parent | 33cb20b36983dfb4407ff855f537b929cff45f8d (diff) | |
download | libva-intel-driver-f54dbcaa7e3d9cdf9a16e7d078e35c7334142d00.tar.gz libva-intel-driver-f54dbcaa7e3d9cdf9a16e7d078e35c7334142d00.tar.bz2 libva-intel-driver-f54dbcaa7e3d9cdf9a16e7d078e35c7334142d00.zip |
More conversions between two images with different pixel formsts
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
Diffstat (limited to 'src')
-rwxr-xr-x | src/i965_post_processing.c | 122 |
1 files changed, 78 insertions, 44 deletions
diff --git a/src/i965_post_processing.c b/src/i965_post_processing.c index 23865bf..0124072 100755 --- a/src/i965_post_processing.c +++ b/src/i965_post_processing.c @@ -4800,6 +4800,63 @@ i965_image_pl2_processing(VADriverContextP ctx, const VARectangle *dst_rect); static VAStatus +i965_image_plx_nv12_plx_processing(VADriverContextP ctx, + VAStatus (*i965_image_plx_nv12_processing)( + VADriverContextP, + const struct i965_surface *, + const VARectangle *, + struct i965_surface *, + const VARectangle *), + const struct i965_surface *src_surface, + const VARectangle *src_rect, + struct i965_surface *dst_surface, + const VARectangle *dst_rect) +{ + struct i965_driver_data *i965 = i965_driver_data(ctx); + VAStatus status; + VASurfaceID tmp_surface_id = VA_INVALID_SURFACE; + struct object_surface *obj_surface = NULL; + struct i965_surface tmp_surface; + int width, height; + + pp_get_surface_size(ctx, dst_surface, &width, &height); + status = i965_CreateSurfaces(ctx, + width, + height, + VA_RT_FORMAT_YUV420, + 1, + &tmp_surface_id); + assert(status == VA_STATUS_SUCCESS); + obj_surface = SURFACE(tmp_surface_id); + assert(obj_surface); + i965_check_alloc_surface_bo(ctx, obj_surface, 0, VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420); + + tmp_surface.base = (struct object_base *)obj_surface; + tmp_surface.type = I965_SURFACE_TYPE_SURFACE; + tmp_surface.flags = I965_SURFACE_FLAG_FRAME; + + status = i965_image_plx_nv12_processing(ctx, + src_surface, + src_rect, + &tmp_surface, + dst_rect); + + if (status == VA_STATUS_SUCCESS) + status = i965_image_pl2_processing(ctx, + &tmp_surface, + dst_rect, + dst_surface, + dst_rect); + + i965_DestroySurfaces(ctx, + &tmp_surface_id, + 1); + + return status; +} + + +static VAStatus i965_image_pl1_rgbx_processing(VADriverContextP ctx, const struct i965_surface *src_surface, const VARectangle *src_rect, @@ -4822,46 +4879,12 @@ i965_image_pl1_rgbx_processing(VADriverContextP ctx, return VA_STATUS_SUCCESS; } else { - VAStatus status; - VASurfaceID out_surface_id = VA_INVALID_SURFACE; - struct object_surface *obj_surface = NULL; - struct i965_surface tmp_surface; - int width, height; - - pp_get_surface_size(ctx, dst_surface, &width, &height); - status = i965_CreateSurfaces(ctx, - width, - height, - VA_RT_FORMAT_YUV420, - 1, - &out_surface_id); - assert(status == VA_STATUS_SUCCESS); - obj_surface = SURFACE(out_surface_id); - assert(obj_surface); - i965_check_alloc_surface_bo(ctx, obj_surface, 0, VA_FOURCC('N', 'V', '1', '2'), SUBSAMPLE_YUV420); - - tmp_surface.base = (struct object_base *)obj_surface; - tmp_surface.type = I965_SURFACE_TYPE_SURFACE; - tmp_surface.flags = I965_SURFACE_FLAG_FRAME; - - status = i965_image_pl1_rgbx_processing(ctx, - src_surface, - src_rect, - &tmp_surface, - dst_rect); - - if (status == VA_STATUS_SUCCESS) - status = i965_image_pl2_processing(ctx, - &tmp_surface, - dst_rect, - dst_surface, - dst_rect); - - i965_DestroySurfaces(ctx, - &out_surface_id, - 1); - - return status; + return i965_image_plx_nv12_plx_processing(ctx, + i965_image_pl1_rgbx_processing, + src_surface, + src_rect, + dst_surface, + dst_rect); } } @@ -4885,6 +4908,7 @@ i965_image_pl3_processing(VADriverContextP ctx, dst_rect, PP_PL3_LOAD_SAVE_N12, NULL); + intel_batchbuffer_flush(pp_context->batch); } else if (fourcc == VA_FOURCC('I', 'M', 'C', '1') || fourcc == VA_FOURCC('I', 'M', 'C', '3') || fourcc == VA_FOURCC('Y', 'V', '1', '2') || @@ -4896,6 +4920,7 @@ i965_image_pl3_processing(VADriverContextP ctx, dst_rect, PP_PL3_LOAD_SAVE_PL3, NULL); + intel_batchbuffer_flush(pp_context->batch); } else if (fourcc == VA_FOURCC('Y', 'U', 'Y', '2') || fourcc == VA_FOURCC('U', 'Y', 'V', 'Y')) { vaStatus = i965_post_processing_internal(ctx, i965->pp_context, @@ -4905,13 +4930,17 @@ i965_image_pl3_processing(VADriverContextP ctx, dst_rect, PP_PL3_LOAD_SAVE_PA, NULL); + intel_batchbuffer_flush(pp_context->batch); } else { - assert(0); + vaStatus = i965_image_plx_nv12_plx_processing(ctx, + i965_image_pl3_processing, + src_surface, + src_rect, + dst_surface, + dst_rect); } - intel_batchbuffer_flush(pp_context->batch); - return vaStatus; } @@ -5004,7 +5033,12 @@ i965_image_pl1_processing(VADriverContextP ctx, NULL); } else { - return VA_STATUS_ERROR_UNKNOWN; + return i965_image_plx_nv12_plx_processing(ctx, + i965_image_pl1_processing, + src_surface, + src_rect, + dst_surface, + dst_rect); } intel_batchbuffer_flush(pp_context->batch); |