- Only report a component if there is a mpeg12/h264 decoder. - Advertise only the available formats.
v2: - Return the number of truely available components. - Set name/role specific only for supported formats. - Cleanup vid_dec_LoaderComponent error path. Signed-off-by: Emil Velikov <emil.l.veli...@gmail.com> --- src/gallium/state_trackers/omx/entrypoint.c | 12 +++- src/gallium/state_trackers/omx/vid_dec.c | 85 ++++++++++++++--------------- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/gallium/state_trackers/omx/entrypoint.c b/src/gallium/state_trackers/omx/entrypoint.c index 9187f13..bff6507 100644 --- a/src/gallium/state_trackers/omx/entrypoint.c +++ b/src/gallium/state_trackers/omx/entrypoint.c @@ -53,7 +53,17 @@ int omx_component_library_Setup(stLoaderComponentType **stComponents) struct vl_screen *vscreen = omx_get_screen(); struct pipe_screen *screen = vscreen ? vscreen->pscreen : NULL; OMX_ERRORTYPE r; - int num_components = 1; + int num_components = 0; + + /* Provide a component only if the driver supports mpeg12/h264 decoding. */ + if (screen->get_video_param(screen, PIPE_VIDEO_PROFILE_MPEG2_MAIN, + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_CAP_SUPPORTED) || + screen->get_video_param(screen, PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH, + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_CAP_SUPPORTED)) { + num_components++; + } /* Provide a component only when the driver supports h264 encoding. */ if (screen->get_video_param(screen, PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH, diff --git a/src/gallium/state_trackers/omx/vid_dec.c b/src/gallium/state_trackers/omx/vid_dec.c index e2a2891..d049228 100644 --- a/src/gallium/state_trackers/omx/vid_dec.c +++ b/src/gallium/state_trackers/omx/vid_dec.c @@ -81,67 +81,66 @@ static void vid_dec_name_avc(char str[OMX_MAX_STRINGNAME_SIZE]) OMX_ERRORTYPE vid_dec_LoaderComponent(stLoaderComponentType *comp) { + const int has_h264 = screen->get_video_param(screen, + PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH, + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_CAP_SUPPORTED); + const int has_mpeg12 = screen->get_video_param(screen, + PIPE_VIDEO_PROFILE_MPEG2_MAIN, + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_CAP_SUPPORTED); + int i; + comp->componentVersion.s.nVersionMajor = 0; comp->componentVersion.s.nVersionMinor = 0; comp->componentVersion.s.nRevision = 0; comp->componentVersion.s.nStep = 1; - comp->name_specific_length = 2; + + comp->name_specific_length = has_h264 + has_mpeg12; comp->name = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); - if (comp->name == NULL) - goto error; + if (!comp->name) + goto error_arrays; comp->name_specific = CALLOC(comp->name_specific_length, sizeof(char *)); - if (comp->name_specific == NULL) - goto error; - - comp->name_specific[0] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); - if (comp->name_specific[0] == NULL) - goto error; - - comp->name_specific[1] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); - if (comp->name_specific[1] == NULL) - goto error; - comp->role_specific = CALLOC(comp->name_specific_length, sizeof(char *)); - if (comp->role_specific == NULL) - goto error; - - comp->role_specific[0] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); - if (comp->role_specific[0] == NULL) - goto error; - - comp->role_specific[1] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); - if (comp->role_specific[1] == NULL) - goto error; + if (!comp->name_specific || !comp->role_specific) + goto error_arrays; + + for (i = 0; i < comp->name_specific_length; ++i) { + comp->name_specific[i] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); + comp->role_specific[i] = CALLOC(1, OMX_MAX_STRINGNAME_SIZE); + if (!comp->name_specific[i] || !comp->role_specific[i]) + goto error_specific; + } vid_dec_name(comp->name); - vid_dec_name_mpeg2(comp->name_specific[0]); - vid_dec_name_avc(comp->name_specific[1]); - strcpy(comp->role_specific[0], OMX_VID_DEC_MPEG2_ROLE); - strcpy(comp->role_specific[1], OMX_VID_DEC_AVC_ROLE); + if (has_mpeg12) { + vid_dec_name_mpeg2(comp->name_specific[--i]); + strcpy(comp->role_specific[i], OMX_VID_DEC_MPEG2_ROLE); + } + + if (has_h264) { + vid_dec_name_avc(comp->name_specific[--i]); + strcpy(comp->role_specific[i], OMX_VID_DEC_AVC_ROLE); + } comp->constructor = vid_dec_Constructor; - + return OMX_ErrorNone; -error: +error_specific: + FREE(comp->name_specific[1]); + FREE(comp->name_specific[0]); + FREE(comp->role_specific[1]); + FREE(comp->role_specific[0]); +error_arrays: + FREE(comp->role_specific); + FREE(comp->name_specific); FREE(comp->name); - if (comp->name_specific) { - FREE(comp->name_specific[0]); - FREE(comp->name_specific[1]); - FREE(comp->name_specific); - } - - if (comp->role_specific) { - FREE(comp->role_specific[0]); - FREE(comp->role_specific[1]); - FREE(comp->role_specific); - } - return OMX_ErrorInsufficientResources; } @@ -162,7 +161,7 @@ static OMX_ERRORTYPE vid_dec_Constructor(OMX_COMPONENTTYPE *comp, OMX_STRING nam r = omx_base_filter_Constructor(comp, name); if (r) - return r; + return r; priv->profile = PIPE_VIDEO_PROFILE_UNKNOWN; -- 1.9.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev