Commit 1092e4b5 authored by jiguoliang's avatar jiguoliang Committed by Austin Yuan

va_tpi: vaCreateSurfaceFromKBuf for streaming the video playback to remote monitor

For such use case, the pipeline is: decode->encode->send to network.
The local decode/playback and the encode process are seperated, thus it
needs the buffer sharing b/w the decode and encode in seperate process.
This API creates/wraps the decoded surface into an encode surface. Its
input parameter is the kernel buffer handle of decoded surface which is
only understandable by driver implementation.

Change-Id: I7953ecf3b7333c1cdb6af5a0f45b054c8840f8e2
Signed-off-by: default avatarjiguoliang <guoliangx.ji@intel.com>
Signed-off-by: default avatarAustin Yuan <shengquan.yuan@gmail.com>
parent 860c1278
...@@ -66,26 +66,42 @@ struct VADriverVTableTPI ...@@ -66,26 +66,42 @@ struct VADriverVTableTPI
unsigned int luma_offset, /* could be 0 */ unsigned int luma_offset, /* could be 0 */
unsigned int chroma_u_offset, /* UV offset from the beginning of the memory */ unsigned int chroma_u_offset, /* UV offset from the beginning of the memory */
unsigned int chroma_v_offset unsigned int chroma_v_offset
); );
VAStatus (*vaCreateSurfaceFromKBuf)(
VADisplay dpy,
int width,
int height,
int format,
VASurfaceID *surface, /* out */
unsigned int kbuf_handle, /* kernel buffer handle*/
unsigned size, /* kernel buffer size */
unsigned int kBuf_fourcc, /* expected fourcc */
unsigned int luma_stride, /* luma stride, could be width aligned with a special value */
unsigned int chroma_u_stride, /* chroma stride */
unsigned int chroma_v_stride,
unsigned int luma_offset, /* could be 0 */
unsigned int chroma_u_offset, /* UV offset from the beginning of the memory */
unsigned int chroma_v_offset
);
VAStatus (*vaPutSurfaceBuf) ( VAStatus (*vaPutSurfaceBuf) (
VADriverContextP ctx, VADriverContextP ctx,
VASurfaceID surface, VASurfaceID surface,
unsigned char* data, unsigned char* data,
int* data_len, int* data_len,
short srcx, short srcx,
short srcy, short srcy,
unsigned short srcw, unsigned short srcw,
unsigned short srch, unsigned short srch,
short destx, short destx,
short desty, short desty,
unsigned short destw, unsigned short destw,
unsigned short desth, unsigned short desth,
VARectangle *cliprects, /* client supplied clip list */ VARectangle *cliprects, /* client supplied clip list */
unsigned int number_cliprects, /* number of clip rects in the clip list */ unsigned int number_cliprects, /* number of clip rects in the clip list */
unsigned int flags /* de-interlacing flags */ unsigned int flags /* de-interlacing flags */
); );
}; };
......
...@@ -137,7 +137,39 @@ VAStatus vaCreateSurfacesForUserPtr( ...@@ -137,7 +137,39 @@ VAStatus vaCreateSurfacesForUserPtr(
return VA_STATUS_ERROR_UNIMPLEMENTED; return VA_STATUS_ERROR_UNIMPLEMENTED;
} }
/*
* Create surface from the Kernel buffer
*/
VAStatus vaCreateSurfaceFromKBuf(
VADisplay dpy,
int width,
int height,
int format,
VASurfaceID *surface, /* out */
unsigned int kbuf_handle, /* kernel buffer handle*/
unsigned size, /* kernel buffer size */
unsigned int kBuf_fourcc, /* expected fourcc */
unsigned int luma_stride, /* luma stride, could be width aligned with a special value */
unsigned int chroma_u_stride, /* chroma stride */
unsigned int chroma_v_stride,
unsigned int luma_offset, /* could be 0 */
unsigned int chroma_u_offset, /* UV offset from the beginning of the memory */
unsigned int chroma_v_offset
)
{
VADriverContextP ctx;
struct VADriverVTableTPI *tpi;
CHECK_DISPLAY(dpy);
ctx = CTX(dpy);
tpi = (struct VADriverVTableTPI *)ctx->vtable_tpi;
if (tpi && tpi->vaCreateSurfaceFromKBuf) {
return tpi->vaCreateSurfaceFromKBuf( ctx, width, height, format, surface, kbuf_handle,
size, kBuf_fourcc, luma_stride, chroma_u_stride,
chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset );
} else
return VA_STATUS_ERROR_UNIMPLEMENTED;
}
VAStatus vaPutSurfaceBuf ( VAStatus vaPutSurfaceBuf (
......
...@@ -93,6 +93,27 @@ VAStatus vaCreateSurfacesForUserPtr( ...@@ -93,6 +93,27 @@ VAStatus vaCreateSurfacesForUserPtr(
unsigned int chroma_v_offset unsigned int chroma_v_offset
); );
/*
* Create surface from the Kernel buffer
*/
VAStatus vaCreateSurfaceFromKbuf(
VADisplay dpy,
int width,
int height,
int format,
VASurfaceID *surface, /* out */
unsigned int kbuf_handle, /* kernel buffer handle*/
unsigned size, /* kernel buffer size */
unsigned int kBuf_fourcc, /* expected fourcc */
unsigned int luma_stride, /* luma stride, could be width aligned with a special value */
unsigned int chroma_u_stride, /* chroma stride */
unsigned int chroma_v_stride,
unsigned int luma_offset, /* could be 0 */
unsigned int chroma_u_offset, /* UV offset from the beginning of the memory */
unsigned int chroma_v_offset
);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment