[Mesa-dev] [PATCH 1/2] st/omx/enc: allocate input buffer private on demand

Christian König deathsimple at vodafone.de
Tue Apr 8 08:52:35 PDT 2014


Am 08.04.2014 16:57, schrieb Leo Liu:
> From: Christian König <christian.koenig at amd.com>
>
> v2: move allocation to a function as first step
>      to clean vid_enc_EncodeFrame
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> Signed-off-by: Leo Liu <leo.liu at 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 *port, OMX_U32 idx, OMX_BUFFERHEADERTYPE *buf)
>   {
>      struct input_buf_private *inp = buf->pInputPortPrivate;
> @@ -685,18 +607,52 @@ static OMX_ERRORTYPE vid_enc_FreeOutBuffer(omx_base_PortType *port, OMX_U32 idx,
>      return base_port_FreeBuffer(port, idx, buf);
>   }
>   
> +static OMX_ERRORTYPE enc_NeedInputPortPrivate(omx_base_PortType *port, OMX_BUFFERHEADERTYPE *buf)
> +{
> +   OMX_COMPONENTTYPE* comp = port->standCompContainer;
> +   vid_enc_PrivateType *priv = comp->pComponentPrivate;
> +   OMX_VIDEO_PORTDEFINITIONTYPE *def = &port->sPortParam.format.video;
> +   struct input_buf_private **inp = (struct input_buf_private **)&buf->pInputPortPrivate;
> +   struct pipe_video_buffer templat = {};
> +
> +   if (*inp) {
> +      pipe_resource_reference(&(*inp)->bitstream, NULL);
> +      return OMX_ErrorNone;
> +   }
> +
> +   if (!(*inp = CALLOC(1, sizeof(struct input_buf_private)))) {
> +      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;
> +
> +   if (!((*inp)->buf = priv->s_pipe->create_video_buffer(priv->s_pipe, &templat))) {
> +      FREE(*inp);
> +      return OMX_ErrorInsufficientResources;
> +   }
> +
> +   return OMX_ErrorNone;
> +}
> +
>   static OMX_ERRORTYPE vid_enc_EncodeFrame(omx_base_PortType *port, OMX_BUFFERHEADERTYPE *buf)
>   {
>      OMX_COMPONENTTYPE* comp = port->standCompContainer;
>      vid_enc_PrivateType *priv = comp->pComponentPrivate;
> -   struct input_buf_private *inp = buf->pInputPortPrivate;
>      unsigned size = priv->ports[OMX_BASE_FILTER_OUTPUTPORT_INDEX]->sPortParam.nBufferSize;
>      OMX_VIDEO_PORTDEFINITIONTYPE *def = &port->sPortParam.format.video;
>      struct pipe_h264_enc_picture_desc picture;
>      struct pipe_h264_enc_rate_control *rate_ctrl = &picture.rate_ctrl;
> -   struct pipe_video_buffer *vbuf = inp->buf;
> +   struct input_buf_private *inp;
> +   struct pipe_video_buffer *vbuf;
> +   OMX_ERRORTYPE err;
>   
> -   pipe_resource_reference(&inp->bitstream, NULL);
> +   err = enc_NeedInputPortPrivate(port, buf);
> +   if (err != OMX_ErrorNone)
> +      return err;
>   
>      if (buf->nFilledLen == 0) {
>         if (buf->nFlags & OMX_BUFFERFLAG_EOS)
> @@ -704,15 +660,18 @@ static OMX_ERRORTYPE vid_enc_EncodeFrame(omx_base_PortType *port, OMX_BUFFERHEAD
>         return base_port_SendBufferFunction(port, buf);
>      }
>   
> +   inp = buf->pInputPortPrivate;
>      if (buf->pOutputPortPrivate) {
>         vbuf = buf->pOutputPortPrivate;
> +      buf->pOutputPortPrivate = inp->buf;
> +      inp->buf = vbuf;
>      } else {
>         /* ------- load input image into video buffer ---- */
>         struct pipe_sampler_view **views;
>         struct pipe_box box = {};
>         void *ptr;
>   
> -      views = inp->buf->get_sampler_view_planes(vbuf);
> +      views = inp->buf->get_sampler_view_planes(inp->buf);
>         if (!views)
>            return OMX_ErrorInsufficientResources;
>   
> @@ -736,6 +695,7 @@ static OMX_ERRORTYPE vid_enc_EncodeFrame(omx_base_PortType *port, OMX_BUFFERHEAD
>         priv->s_pipe->transfer_inline_write(priv->s_pipe, views[1]->texture, 0,
>                                             PIPE_TRANSFER_WRITE, &box,
>                                             ptr, def->nStride, 0);
> +      vbuf = inp->buf;
>      }
>   
>      /* -------------- scale input image --------- */



More information about the mesa-dev mailing list