[Mesa-dev] [PATCH 1/2] st/omx/enc: allocate input buffer private on demand
From: Christian König christian.koe...@amd.com v2: move allocation to a function as first step to clean vid_enc_EncodeFrame Signed-off-by: Christian König christian.koe...@amd.com Signed-off-by: Leo Liu leo@amd.com --- src/gallium/state_trackers/omx/vid_enc.c | 124 +++ 1 file changed, 42 insertions(+), 82 deletions(-) diff --git a/src/gallium/state_trackers/omx/vid_enc.c b/src/gallium/state_trackers/omx/vid_enc.c index cd4a25b..2874451 100644 --- a/src/gallium/state_trackers/omx/vid_enc.c +++ b/src/gallium/state_trackers/omx/vid_enc.c @@ -72,10 +72,6 @@ static OMX_ERRORTYPE vid_enc_GetParameter(OMX_HANDLETYPE handle, OMX_INDEXTYPE i static OMX_ERRORTYPE vid_enc_SetConfig(OMX_HANDLETYPE handle, OMX_INDEXTYPE idx, OMX_PTR config); static OMX_ERRORTYPE vid_enc_GetConfig(OMX_HANDLETYPE handle, OMX_INDEXTYPE idx, OMX_PTR config); static OMX_ERRORTYPE vid_enc_MessageHandler(OMX_COMPONENTTYPE *comp, internalRequestMessageType *msg); -static OMX_ERRORTYPE vid_enc_AllocateInBuffer(omx_base_PortType *port, OMX_INOUT OMX_BUFFERHEADERTYPE **buf, - OMX_IN OMX_U32 idx, OMX_IN OMX_PTR private, OMX_IN OMX_U32 size); -static OMX_ERRORTYPE vid_enc_UseInBuffer(omx_base_PortType *port, OMX_BUFFERHEADERTYPE **buf, OMX_U32 idx, - OMX_PTR private, OMX_U32 size, OMX_U8 *mem); static OMX_ERRORTYPE vid_enc_FreeInBuffer(omx_base_PortType *port, OMX_U32 idx, OMX_BUFFERHEADERTYPE *buf); static OMX_ERRORTYPE vid_enc_EncodeFrame(omx_base_PortType *port, OMX_BUFFERHEADERTYPE *buf); static OMX_ERRORTYPE vid_enc_AllocateOutBuffer(omx_base_PortType *comp, OMX_INOUT OMX_BUFFERHEADERTYPE **buf, @@ -222,8 +218,6 @@ static OMX_ERRORTYPE vid_enc_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam port-sPortParam.nBufferCountMin = 4; port-Port_SendBufferFunction = vid_enc_EncodeFrame; - port-Port_AllocateBuffer = vid_enc_AllocateInBuffer; - port-Port_UseBuffer = vid_enc_UseInBuffer; port-Port_FreeBuffer = vid_enc_FreeInBuffer; port = (omx_base_video_PortType *)priv-ports[OMX_BASE_FILTER_OUTPUTPORT_INDEX]; @@ -566,78 +560,6 @@ static OMX_ERRORTYPE vid_enc_MessageHandler(OMX_COMPONENTTYPE* comp, internalReq return omx_base_component_MessageHandler(comp, msg); } -static OMX_ERRORTYPE vid_enc_AllocateInBuffer(omx_base_PortType *port, OMX_INOUT OMX_BUFFERHEADERTYPE **buf, - OMX_IN OMX_U32 idx, OMX_IN OMX_PTR private, OMX_IN OMX_U32 size) -{ - OMX_VIDEO_PORTDEFINITIONTYPE *def = port-sPortParam.format.video; - OMX_COMPONENTTYPE* comp = port-standCompContainer; - vid_enc_PrivateType *priv = comp-pComponentPrivate; - struct pipe_video_buffer templat = {}; - struct input_buf_private *inp; - OMX_ERRORTYPE r; - - r = base_port_AllocateBuffer(port, buf, idx, private, size); - if (r) - return r; - - inp = (*buf)-pInputPortPrivate = CALLOC(1, sizeof(struct input_buf_private)); - if (!inp) { - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - templat.buffer_format = PIPE_FORMAT_NV12; - templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; - templat.width = def-nFrameWidth; - templat.height = def-nFrameHeight; - templat.interlaced = false; - - inp-buf = priv-s_pipe-create_video_buffer(priv-s_pipe, templat); - if (!inp-buf) { - FREE(inp); - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - return OMX_ErrorNone; -} - -static OMX_ERRORTYPE vid_enc_UseInBuffer(omx_base_PortType *port, OMX_BUFFERHEADERTYPE **buf, OMX_U32 idx, - OMX_PTR private, OMX_U32 size, OMX_U8 *mem) -{ - OMX_VIDEO_PORTDEFINITIONTYPE *def = port-sPortParam.format.video; - OMX_COMPONENTTYPE* comp = port-standCompContainer; - vid_enc_PrivateType *priv = comp-pComponentPrivate; - struct pipe_video_buffer templat = {}; - struct input_buf_private *inp; - OMX_ERRORTYPE r; - - r = base_port_UseBuffer(port, buf, idx, private, size, mem); - if (r) - return r; - - inp = (*buf)-pInputPortPrivate = CALLOC(1, sizeof(struct input_buf_private)); - if (!inp) { - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - templat.buffer_format = PIPE_FORMAT_NV12; - templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; - templat.width = def-nFrameWidth; - templat.height = def-nFrameHeight; - templat.interlaced = false; - - inp-buf = priv-s_pipe-create_video_buffer(priv-s_pipe, templat); - if (!inp-buf) { - FREE(inp); - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - return OMX_ErrorNone; -} - static OMX_ERRORTYPE vid_enc_FreeInBuffer(omx_base_PortType *port, OMX_U32 idx, OMX_BUFFERHEADERTYPE *buf) { struct input_buf_private *inp = buf-pInputPortPrivate; @@ -685,18
Re: [Mesa-dev] [PATCH 1/2] st/omx/enc: allocate input buffer private on demand
Am 08.04.2014 16:57, schrieb Leo Liu: From: Christian König christian.koe...@amd.com v2: move allocation to a function as first step to clean vid_enc_EncodeFrame Signed-off-by: Christian König christian.koe...@amd.com Signed-off-by: Leo Liu leo@amd.com Reviewed and pushed both patches. Thanks, Christian. --- src/gallium/state_trackers/omx/vid_enc.c | 124 +++ 1 file changed, 42 insertions(+), 82 deletions(-) diff --git a/src/gallium/state_trackers/omx/vid_enc.c b/src/gallium/state_trackers/omx/vid_enc.c index cd4a25b..2874451 100644 --- a/src/gallium/state_trackers/omx/vid_enc.c +++ b/src/gallium/state_trackers/omx/vid_enc.c @@ -72,10 +72,6 @@ static OMX_ERRORTYPE vid_enc_GetParameter(OMX_HANDLETYPE handle, OMX_INDEXTYPE i static OMX_ERRORTYPE vid_enc_SetConfig(OMX_HANDLETYPE handle, OMX_INDEXTYPE idx, OMX_PTR config); static OMX_ERRORTYPE vid_enc_GetConfig(OMX_HANDLETYPE handle, OMX_INDEXTYPE idx, OMX_PTR config); static OMX_ERRORTYPE vid_enc_MessageHandler(OMX_COMPONENTTYPE *comp, internalRequestMessageType *msg); -static OMX_ERRORTYPE vid_enc_AllocateInBuffer(omx_base_PortType *port, OMX_INOUT OMX_BUFFERHEADERTYPE **buf, - OMX_IN OMX_U32 idx, OMX_IN OMX_PTR private, OMX_IN OMX_U32 size); -static OMX_ERRORTYPE vid_enc_UseInBuffer(omx_base_PortType *port, OMX_BUFFERHEADERTYPE **buf, OMX_U32 idx, - OMX_PTR private, OMX_U32 size, OMX_U8 *mem); static OMX_ERRORTYPE vid_enc_FreeInBuffer(omx_base_PortType *port, OMX_U32 idx, OMX_BUFFERHEADERTYPE *buf); static OMX_ERRORTYPE vid_enc_EncodeFrame(omx_base_PortType *port, OMX_BUFFERHEADERTYPE *buf); static OMX_ERRORTYPE vid_enc_AllocateOutBuffer(omx_base_PortType *comp, OMX_INOUT OMX_BUFFERHEADERTYPE **buf, @@ -222,8 +218,6 @@ static OMX_ERRORTYPE vid_enc_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam port-sPortParam.nBufferCountMin = 4; port-Port_SendBufferFunction = vid_enc_EncodeFrame; - port-Port_AllocateBuffer = vid_enc_AllocateInBuffer; - port-Port_UseBuffer = vid_enc_UseInBuffer; port-Port_FreeBuffer = vid_enc_FreeInBuffer; port = (omx_base_video_PortType *)priv-ports[OMX_BASE_FILTER_OUTPUTPORT_INDEX]; @@ -566,78 +560,6 @@ static OMX_ERRORTYPE vid_enc_MessageHandler(OMX_COMPONENTTYPE* comp, internalReq return omx_base_component_MessageHandler(comp, msg); } -static OMX_ERRORTYPE vid_enc_AllocateInBuffer(omx_base_PortType *port, OMX_INOUT OMX_BUFFERHEADERTYPE **buf, - OMX_IN OMX_U32 idx, OMX_IN OMX_PTR private, OMX_IN OMX_U32 size) -{ - OMX_VIDEO_PORTDEFINITIONTYPE *def = port-sPortParam.format.video; - OMX_COMPONENTTYPE* comp = port-standCompContainer; - vid_enc_PrivateType *priv = comp-pComponentPrivate; - struct pipe_video_buffer templat = {}; - struct input_buf_private *inp; - OMX_ERRORTYPE r; - - r = base_port_AllocateBuffer(port, buf, idx, private, size); - if (r) - return r; - - inp = (*buf)-pInputPortPrivate = CALLOC(1, sizeof(struct input_buf_private)); - if (!inp) { - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - templat.buffer_format = PIPE_FORMAT_NV12; - templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; - templat.width = def-nFrameWidth; - templat.height = def-nFrameHeight; - templat.interlaced = false; - - inp-buf = priv-s_pipe-create_video_buffer(priv-s_pipe, templat); - if (!inp-buf) { - FREE(inp); - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - return OMX_ErrorNone; -} - -static OMX_ERRORTYPE vid_enc_UseInBuffer(omx_base_PortType *port, OMX_BUFFERHEADERTYPE **buf, OMX_U32 idx, - OMX_PTR private, OMX_U32 size, OMX_U8 *mem) -{ - OMX_VIDEO_PORTDEFINITIONTYPE *def = port-sPortParam.format.video; - OMX_COMPONENTTYPE* comp = port-standCompContainer; - vid_enc_PrivateType *priv = comp-pComponentPrivate; - struct pipe_video_buffer templat = {}; - struct input_buf_private *inp; - OMX_ERRORTYPE r; - - r = base_port_UseBuffer(port, buf, idx, private, size, mem); - if (r) - return r; - - inp = (*buf)-pInputPortPrivate = CALLOC(1, sizeof(struct input_buf_private)); - if (!inp) { - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - templat.buffer_format = PIPE_FORMAT_NV12; - templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; - templat.width = def-nFrameWidth; - templat.height = def-nFrameHeight; - templat.interlaced = false; - - inp-buf = priv-s_pipe-create_video_buffer(priv-s_pipe, templat); - if (!inp-buf) { - FREE(inp); - base_port_FreeBuffer(port, idx, *buf); - return OMX_ErrorInsufficientResources; - } - - return OMX_ErrorNone; -} - static OMX_ERRORTYPE vid_enc_FreeInBuffer(omx_base_PortType