From 381824d14fcda979838468c4bb095f850e8347e4 Mon Sep 17 00:00:00 2001 From: Leo Liu Date: Sat, 24 Oct 2020 20:00:18 -0400 Subject: [PATCH] frontends/omx/av1: enable AV1 OMX Bellagio support By adding name, role and profile to OMX decoder Signed-off-by: Leo Liu Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/frontends/omx/bellagio/vid_dec.c | 52 +++++++++++++++++++++++++--- src/gallium/frontends/omx/bellagio/vid_dec.h | 3 ++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/gallium/frontends/omx/bellagio/vid_dec.c b/src/gallium/frontends/omx/bellagio/vid_dec.c index 2eedf93..8c7ca57 100644 --- a/src/gallium/frontends/omx/bellagio/vid_dec.c +++ b/src/gallium/frontends/omx/bellagio/vid_dec.c @@ -71,7 +71,7 @@ OMX_ERRORTYPE vid_dec_LoaderComponent(stLoaderComponentType *comp) comp->componentVersion.s.nVersionMinor = 0; comp->componentVersion.s.nRevision = 0; comp->componentVersion.s.nStep = 1; - comp->name_specific_length = 3; + comp->name_specific_length = 4; comp->name = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); if (comp->name == NULL) @@ -97,6 +97,10 @@ OMX_ERRORTYPE vid_dec_LoaderComponent(stLoaderComponentType *comp) if (comp->name_specific[2] == NULL) goto error_specific; + comp->name_specific[3] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); + if (comp->name_specific[3] == NULL) + goto error_specific; + comp->role_specific[0] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); if (comp->role_specific[0] == NULL) goto error_specific; @@ -109,23 +113,31 @@ OMX_ERRORTYPE vid_dec_LoaderComponent(stLoaderComponentType *comp) if (comp->role_specific[2] == NULL) goto error_specific; + comp->role_specific[3] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); + if (comp->role_specific[3] == NULL) + goto error_specific; + strcpy(comp->name, OMX_VID_DEC_BASE_NAME); strcpy(comp->name_specific[0], OMX_VID_DEC_MPEG2_NAME); strcpy(comp->name_specific[1], OMX_VID_DEC_AVC_NAME); strcpy(comp->name_specific[2], OMX_VID_DEC_HEVC_NAME); + strcpy(comp->name_specific[3], OMX_VID_DEC_AV1_NAME); strcpy(comp->role_specific[0], OMX_VID_DEC_MPEG2_ROLE); strcpy(comp->role_specific[1], OMX_VID_DEC_AVC_ROLE); strcpy(comp->role_specific[2], OMX_VID_DEC_HEVC_ROLE); + strcpy(comp->role_specific[3], OMX_VID_DEC_AV1_ROLE); comp->constructor = vid_dec_Constructor; return OMX_ErrorNone; error_specific: + FREE(comp->role_specific[3]); FREE(comp->role_specific[2]); FREE(comp->role_specific[1]); FREE(comp->role_specific[0]); + FREE(comp->name_specific[3]); FREE(comp->name_specific[2]); FREE(comp->name_specific[1]); FREE(comp->name_specific[0]); @@ -168,7 +180,13 @@ static OMX_ERRORTYPE vid_dec_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam if (!strcmp(name, OMX_VID_DEC_HEVC_NAME)) priv->profile = PIPE_VIDEO_PROFILE_HEVC_MAIN; - priv->BufferMgmtCallback = vid_dec_FrameDecoded; + if (!strcmp(name, OMX_VID_DEC_AV1_NAME)) + priv->profile = PIPE_VIDEO_PROFILE_AV1_MAIN; + + if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) + priv->BufferMgmtCallback = vid_dec_av1_FrameDecoded; + else + priv->BufferMgmtCallback = vid_dec_FrameDecoded; priv->messageHandler = vid_dec_MessageHandler; priv->destructor = vid_dec_Destructor; @@ -221,8 +239,12 @@ static OMX_ERRORTYPE vid_dec_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam port->sPortParam.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2; port->sVideoParam.eCompressionFormat = OMX_VIDEO_CodingMPEG2; port->Port_SendBufferFunction = vid_dec_DecodeBuffer; - port->Port_FreeBuffer = vid_dec_FreeDecBuffer; + if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) { + port->Port_AllocateBuffer = vid_dec_av1_AllocateInBuffer; + port->Port_UseBuffer = vid_dec_av1_UseInBuffer; + } + port->Port_FreeBuffer = vid_dec_FreeDecBuffer; port = (omx_base_video_PortType *)priv->ports[OMX_BASE_FILTER_OUTPUTPORT_INDEX]; port->sPortParam.nBufferCountActual = 8; port->sPortParam.nBufferCountMin = 4; @@ -239,6 +261,9 @@ static OMX_ERRORTYPE vid_dec_Destructor(OMX_COMPONENTTYPE *comp) vid_dec_PrivateType* priv = comp->pComponentPrivate; int i; + if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) + vid_dec_av1_ReleaseTasks(priv); + if (priv->ports) { for (i = 0; i < priv->sPortTypesParam[OMX_PortDomainVideo].nPorts; ++i) { if(priv->ports[i]) @@ -309,6 +334,8 @@ static OMX_ERRORTYPE vid_dec_SetParameter(OMX_HANDLETYPE handle, OMX_INDEXTYPE i priv->profile = PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH; } else if (!strcmp((char *)role->cRole, OMX_VID_DEC_HEVC_ROLE)) { priv->profile = PIPE_VIDEO_PROFILE_HEVC_MAIN; + } else if (!strcmp((char *)role->cRole, OMX_VID_DEC_AV1_ROLE)) { + priv->profile = PIPE_VIDEO_PROFILE_AV1_MAIN; } else { return OMX_ErrorBadParameter; } @@ -359,6 +386,8 @@ static OMX_ERRORTYPE vid_dec_GetParameter(OMX_HANDLETYPE handle, OMX_INDEXTYPE i strcpy((char *)role->cRole, OMX_VID_DEC_AVC_ROLE); else if (priv->profile == PIPE_VIDEO_PROFILE_HEVC_MAIN) strcpy((char *)role->cRole, OMX_VID_DEC_HEVC_ROLE); + else if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) + strcpy((char *)role->cRole, OMX_VID_DEC_AV1_ROLE); break; } @@ -406,6 +435,9 @@ static OMX_ERRORTYPE vid_dec_MessageHandler(OMX_COMPONENTTYPE* comp, internalReq vid_dec_h264_Init(priv); else if (priv->profile == PIPE_VIDEO_PROFILE_HEVC_MAIN) vid_dec_h265_Init(priv); + else if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) { + vid_dec_av1_Init(priv); + } } else if ((msg->messageParam == OMX_StateLoaded) && (priv->state == OMX_StateIdle)) { if (priv->shadow) { @@ -469,7 +501,10 @@ static OMX_ERRORTYPE vid_dec_DecodeBuffer(omx_base_PortType *port, OMX_BUFFERHEA priv->in_buffers[0]->nFilledLen = priv->in_buffers[0]->nAllocLen; r = base_port_SendBufferFunction(port, priv->in_buffers[0]); } else if (eos) { - vid_dec_FreeInputPortPrivate(priv->in_buffers[0]); + if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) + vid_dec_av1_FreeInputPortPrivate(priv, priv->in_buffers[0]); + else + vid_dec_FreeInputPortPrivate(priv->in_buffers[0]); priv->in_buffers[0]->nFilledLen = priv->in_buffers[0]->nAllocLen; r = base_port_SendBufferFunction(port, priv->in_buffers[0]); } else { @@ -495,7 +530,14 @@ static OMX_ERRORTYPE vid_dec_DecodeBuffer(omx_base_PortType *port, OMX_BUFFERHEA static OMX_ERRORTYPE vid_dec_FreeDecBuffer(omx_base_PortType *port, OMX_U32 idx, OMX_BUFFERHEADERTYPE *buf) { - vid_dec_FreeInputPortPrivate(buf); + OMX_COMPONENTTYPE* comp = port->standCompContainer; + vid_dec_PrivateType *priv = comp->pComponentPrivate; + + if (priv->profile == PIPE_VIDEO_PROFILE_AV1_MAIN) + vid_dec_av1_FreeInputPortPrivate(priv, buf); + else + vid_dec_FreeInputPortPrivate(buf); + return base_port_FreeBuffer(port, idx, buf); } diff --git a/src/gallium/frontends/omx/bellagio/vid_dec.h b/src/gallium/frontends/omx/bellagio/vid_dec.h index fa16cb8..753a8ee 100644 --- a/src/gallium/frontends/omx/bellagio/vid_dec.h +++ b/src/gallium/frontends/omx/bellagio/vid_dec.h @@ -54,6 +54,9 @@ #define OMX_VID_DEC_HEVC_NAME "OMX.mesa.video_decoder.hevc" #define OMX_VID_DEC_HEVC_ROLE "video_decoder.hevc" +#define OMX_VID_DEC_AV1_NAME "OMX.mesa.video_decoder.av1" +#define OMX_VID_DEC_AV1_ROLE "video_decoder.av1" + #define OMX_VID_DEC_TIMESTAMP_INVALID ((OMX_TICKS) -1) OMX_ERRORTYPE vid_dec_LoaderComponent(stLoaderComponentType *comp); -- 2.7.4