summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiguoliang <jiguoliang@localhost.ccr.corp.intel.com>2011-08-25 11:39:53 -0400
committerAustin Yuan <shengquan.yuan@gmail.com>2011-09-21 23:22:36 -0400
commit1092e4b54a476260e3c74d87ebb1a552e8fef71e (patch)
tree359db3fa2d54108f37985d489698d570007a7ecf
parent860c127895371b98132bcaf4e7e6fc3f5ea463ef (diff)
downloadlibva-1092e4b54a476260e3c74d87ebb1a552e8fef71e.tar.gz
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: jiguoliang <guoliangx.ji@intel.com> Signed-off-by: Austin Yuan <shengquan.yuan@gmail.com>
-rw-r--r--va/va_backend_tpi.h52
-rw-r--r--va/va_tpi.c32
-rw-r--r--va/va_tpi.h21
3 files changed, 87 insertions, 18 deletions
diff --git a/va/va_backend_tpi.h b/va/va_backend_tpi.h
index f67b30f..ecf5ac9 100644
--- a/va/va_backend_tpi.h
+++ b/va/va_backend_tpi.h
@@ -66,26 +66,42 @@ struct VADriverVTableTPI
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 (*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) (
- VADriverContextP ctx,
- VASurfaceID surface,
- unsigned char* data,
- int* data_len,
- short srcx,
- short srcy,
- unsigned short srcw,
- unsigned short srch,
- short destx,
- short desty,
- unsigned short destw,
- unsigned short desth,
- VARectangle *cliprects, /* client supplied clip list */
- unsigned int number_cliprects, /* number of clip rects in the clip list */
- unsigned int flags /* de-interlacing flags */
- );
+ VAStatus (*vaPutSurfaceBuf) (
+ VADriverContextP ctx,
+ VASurfaceID surface,
+ unsigned char* data,
+ int* data_len,
+ short srcx,
+ short srcy,
+ unsigned short srcw,
+ unsigned short srch,
+ short destx,
+ short desty,
+ unsigned short destw,
+ unsigned short desth,
+ VARectangle *cliprects, /* client supplied clip list */
+ unsigned int number_cliprects, /* number of clip rects in the clip list */
+ unsigned int flags /* de-interlacing flags */
+ );
};
diff --git a/va/va_tpi.c b/va/va_tpi.c
index 86385b0..e9169fc 100644
--- a/va/va_tpi.c
+++ b/va/va_tpi.c
@@ -137,7 +137,39 @@ VAStatus vaCreateSurfacesForUserPtr(
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 (
diff --git a/va/va_tpi.h b/va/va_tpi.h
index eb0b1d4..320a358 100644
--- a/va/va_tpi.h
+++ b/va/va_tpi.h
@@ -93,6 +93,27 @@ VAStatus vaCreateSurfacesForUserPtr(
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
}
#endif