| 1 | /* | 
|---|
| 2 | Copyright (c) 2012, Broadcom Europe Ltd | 
|---|
| 3 | All rights reserved. | 
|---|
| 4 |  | 
|---|
| 5 | Redistribution and use in source and binary forms, with or without | 
|---|
| 6 | modification, are permitted provided that the following conditions are met: | 
|---|
| 7 | * Redistributions of source code must retain the above copyright | 
|---|
| 8 | notice, this list of conditions and the following disclaimer. | 
|---|
| 9 | * Redistributions in binary form must reproduce the above copyright | 
|---|
| 10 | notice, this list of conditions and the following disclaimer in the | 
|---|
| 11 | documentation and/or other materials provided with the distribution. | 
|---|
| 12 | * Neither the name of the copyright holder nor the | 
|---|
| 13 | names of its contributors may be used to endorse or promote products | 
|---|
| 14 | derived from this software without specific prior written permission. | 
|---|
| 15 |  | 
|---|
| 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | 
|---|
| 17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 
|---|
| 18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
|---|
| 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY | 
|---|
| 20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 
|---|
| 21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
|---|
| 22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
|---|
| 23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|---|
| 24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
|---|
| 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|---|
| 26 | */ | 
|---|
| 27 |  | 
|---|
| 28 | #include "mmalomx.h" | 
|---|
| 29 | #include "mmalomx_roles.h" | 
|---|
| 30 | #include "mmalomx_registry.h" | 
|---|
| 31 | #include "mmalomx_logging.h" | 
|---|
| 32 |  | 
|---|
| 33 | static const struct { | 
|---|
| 34 | const char *name; | 
|---|
| 35 | MMALOMX_ROLE_T role; | 
|---|
| 36 | } mmalomx_roles[] = | 
|---|
| 37 | { | 
|---|
| 38 | { "video_decoder.h263",     MMALOMX_ROLE_VIDEO_DECODER_H263}, | 
|---|
| 39 | { "video_decoder.mpeg4",    MMALOMX_ROLE_VIDEO_DECODER_MPEG4}, | 
|---|
| 40 | { "video_decoder.avc",      MMALOMX_ROLE_VIDEO_DECODER_AVC}, | 
|---|
| 41 | { "video_decoder.mpeg2",    MMALOMX_ROLE_VIDEO_DECODER_MPEG2}, | 
|---|
| 42 | { "video_decoder.wmv",      MMALOMX_ROLE_VIDEO_DECODER_WMV}, | 
|---|
| 43 | { "video_decoder.vpx",      MMALOMX_ROLE_VIDEO_DECODER_VPX}, | 
|---|
| 44 |  | 
|---|
| 45 | { "video_encoder.h263",     MMALOMX_ROLE_VIDEO_ENCODER_H263}, | 
|---|
| 46 | { "video_encoder.mpeg4",    MMALOMX_ROLE_VIDEO_ENCODER_MPEG4}, | 
|---|
| 47 | { "video_encoder.avc",      MMALOMX_ROLE_VIDEO_ENCODER_AVC}, | 
|---|
| 48 |  | 
|---|
| 49 | { "audio_decoder.aac",      MMALOMX_ROLE_AUDIO_DECODER_AAC}, | 
|---|
| 50 | { "audio_decoder.mp1",      MMALOMX_ROLE_AUDIO_DECODER_MPGA_L1}, | 
|---|
| 51 | { "audio_decoder.mp2",      MMALOMX_ROLE_AUDIO_DECODER_MPGA_L2}, | 
|---|
| 52 | { "audio_decoder.mp3",      MMALOMX_ROLE_AUDIO_DECODER_MPGA_L3}, | 
|---|
| 53 | { "audio_decoder.ddp",      MMALOMX_ROLE_AUDIO_DECODER_DDP}, | 
|---|
| 54 |  | 
|---|
| 55 | { "AIV.play.101",           MMALOMX_ROLE_AIV_PLAY_101}, | 
|---|
| 56 | { "play.avcddp",            MMALOMX_ROLE_AIV_PLAY_AVCDDP}, | 
|---|
| 57 |  | 
|---|
| 58 | {0, 0} | 
|---|
| 59 | }; | 
|---|
| 60 |  | 
|---|
| 61 | const char *mmalomx_role_to_name(MMALOMX_ROLE_T role) | 
|---|
| 62 | { | 
|---|
| 63 | unsigned int i; | 
|---|
| 64 | for (i = 0; mmalomx_roles[i].name; i++) | 
|---|
| 65 | if (mmalomx_roles[i].role == role) | 
|---|
| 66 | break; | 
|---|
| 67 | return mmalomx_roles[i].name; | 
|---|
| 68 | } | 
|---|
| 69 |  | 
|---|
| 70 | MMALOMX_ROLE_T mmalomx_role_from_name(const char *name) | 
|---|
| 71 | { | 
|---|
| 72 | unsigned int i; | 
|---|
| 73 | for (i = 0; mmalomx_roles[i].name; i++) | 
|---|
| 74 | if (!strcmp(mmalomx_roles[i].name, name)) | 
|---|
| 75 | break; | 
|---|
| 76 | return mmalomx_roles[i].role; | 
|---|
| 77 | } | 
|---|
| 78 |  | 
|---|
| 79 | static void mmalomx_format_encoding_from_role(MMALOMX_ROLE_T role, | 
|---|
| 80 | MMAL_FOURCC_T *encoding, MMAL_ES_TYPE_T *es_type, unsigned int *port) | 
|---|
| 81 | { | 
|---|
| 82 | switch (role) | 
|---|
| 83 | { | 
|---|
| 84 | case MMALOMX_ROLE_VIDEO_DECODER_MPEG4: | 
|---|
| 85 | case MMALOMX_ROLE_VIDEO_ENCODER_MPEG4: | 
|---|
| 86 | *encoding = MMAL_ENCODING_MP4V; | 
|---|
| 87 | *es_type = MMAL_ES_TYPE_VIDEO; | 
|---|
| 88 | break; | 
|---|
| 89 | case MMALOMX_ROLE_VIDEO_DECODER_AVC: | 
|---|
| 90 | case MMALOMX_ROLE_VIDEO_ENCODER_AVC: | 
|---|
| 91 | *encoding = MMAL_ENCODING_H264; | 
|---|
| 92 | *es_type = MMAL_ES_TYPE_VIDEO; | 
|---|
| 93 | break; | 
|---|
| 94 | case MMALOMX_ROLE_VIDEO_DECODER_MPEG2: | 
|---|
| 95 | *encoding = MMAL_ENCODING_MP2V; | 
|---|
| 96 | *es_type = MMAL_ES_TYPE_VIDEO; | 
|---|
| 97 | break; | 
|---|
| 98 | case MMALOMX_ROLE_VIDEO_DECODER_WMV: | 
|---|
| 99 | *encoding = MMAL_ENCODING_WMV3; | 
|---|
| 100 | *es_type = MMAL_ES_TYPE_VIDEO; | 
|---|
| 101 | break; | 
|---|
| 102 | case MMALOMX_ROLE_VIDEO_DECODER_VPX: | 
|---|
| 103 | *encoding = MMAL_ENCODING_VP8; | 
|---|
| 104 | *es_type = MMAL_ES_TYPE_VIDEO; | 
|---|
| 105 | break; | 
|---|
| 106 | case MMALOMX_ROLE_VIDEO_DECODER_H263: | 
|---|
| 107 | case MMALOMX_ROLE_VIDEO_ENCODER_H263: | 
|---|
| 108 | *encoding = MMAL_ENCODING_H263; | 
|---|
| 109 | *es_type = MMAL_ES_TYPE_VIDEO; | 
|---|
| 110 | break; | 
|---|
| 111 | case MMALOMX_ROLE_AUDIO_DECODER_AAC: | 
|---|
| 112 | *encoding = MMAL_ENCODING_MP4A; | 
|---|
| 113 | *es_type = MMAL_ES_TYPE_AUDIO; | 
|---|
| 114 | break; | 
|---|
| 115 | case MMALOMX_ROLE_AUDIO_DECODER_MPGA_L1: | 
|---|
| 116 | case MMALOMX_ROLE_AUDIO_DECODER_MPGA_L2: | 
|---|
| 117 | case MMALOMX_ROLE_AUDIO_DECODER_MPGA_L3: | 
|---|
| 118 | *encoding = MMAL_ENCODING_MPGA; | 
|---|
| 119 | *es_type = MMAL_ES_TYPE_AUDIO; | 
|---|
| 120 | break; | 
|---|
| 121 |  | 
|---|
| 122 | case MMALOMX_ROLE_AUDIO_DECODER_DDP: | 
|---|
| 123 | *encoding = MMAL_ENCODING_AC3; | 
|---|
| 124 | *es_type = MMAL_ES_TYPE_AUDIO; | 
|---|
| 125 | break; | 
|---|
| 126 |  | 
|---|
| 127 | default: | 
|---|
| 128 | *encoding = MMAL_ENCODING_UNKNOWN; | 
|---|
| 129 | *es_type = MMAL_ES_TYPE_UNKNOWN; | 
|---|
| 130 | break; | 
|---|
| 131 | } | 
|---|
| 132 |  | 
|---|
| 133 | switch (role) | 
|---|
| 134 | { | 
|---|
| 135 | case MMALOMX_ROLE_VIDEO_ENCODER_H263: | 
|---|
| 136 | case MMALOMX_ROLE_VIDEO_ENCODER_MPEG4: | 
|---|
| 137 | case MMALOMX_ROLE_VIDEO_ENCODER_AVC: | 
|---|
| 138 | *port = 1; | 
|---|
| 139 | break; | 
|---|
| 140 | default: | 
|---|
| 141 | *port = 0; | 
|---|
| 142 | break; | 
|---|
| 143 | } | 
|---|
| 144 | } | 
|---|
| 145 |  | 
|---|
| 146 | OMX_ERRORTYPE mmalomx_role_set(MMALOMX_COMPONENT_T *component, const char *name) | 
|---|
| 147 | { | 
|---|
| 148 | const MMALOMX_ROLE_T role = mmalomx_role_from_name(name); | 
|---|
| 149 | MMAL_FOURCC_T encoding = MMAL_ENCODING_UNKNOWN; | 
|---|
| 150 | MMAL_ES_TYPE_T es_type = MMAL_ES_TYPE_UNKNOWN; | 
|---|
| 151 | unsigned int port; | 
|---|
| 152 | MMAL_ES_FORMAT_T *format; | 
|---|
| 153 |  | 
|---|
| 154 | if (!role || !mmalomx_registry_component_supports_role(component->registry_id, role)) | 
|---|
| 155 | return OMX_ErrorUnsupportedSetting; | 
|---|
| 156 |  | 
|---|
| 157 | component->role = role; | 
|---|
| 158 |  | 
|---|
| 159 | mmalomx_format_encoding_from_role(role, &encoding, &es_type, &port); | 
|---|
| 160 | if (encoding == MMAL_ENCODING_UNKNOWN) | 
|---|
| 161 | return OMX_ErrorNone; | 
|---|
| 162 |  | 
|---|
| 163 | format = component->ports[port].mmal->format; | 
|---|
| 164 | format->type = es_type; | 
|---|
| 165 | format->encoding = encoding; | 
|---|
| 166 | format->bitrate = 64000; | 
|---|
| 167 | switch (es_type) | 
|---|
| 168 | { | 
|---|
| 169 | case MMAL_ES_TYPE_VIDEO: | 
|---|
| 170 | format->es->video.width = 176; | 
|---|
| 171 | format->es->video.height = 144; | 
|---|
| 172 | format->es->video.frame_rate.num = 15; | 
|---|
| 173 | format->es->video.frame_rate.den = 1; | 
|---|
| 174 | break; | 
|---|
| 175 | default: | 
|---|
| 176 | break; | 
|---|
| 177 | } | 
|---|
| 178 |  | 
|---|
| 179 | switch (role) | 
|---|
| 180 | { | 
|---|
| 181 | case MMALOMX_ROLE_VIDEO_DECODER_H263: | 
|---|
| 182 | case MMALOMX_ROLE_VIDEO_ENCODER_H263: | 
|---|
| 183 | component->ports[port].format_param.h263.eProfile = OMX_VIDEO_H263ProfileBaseline; | 
|---|
| 184 | component->ports[port].format_param.h263.eLevel = OMX_VIDEO_H263Level10; | 
|---|
| 185 | component->ports[port].format_param.h263.bPLUSPTYPEAllowed = OMX_FALSE; | 
|---|
| 186 | component->ports[port].format_param.h263.bForceRoundingTypeToZero = OMX_TRUE; | 
|---|
| 187 | break; | 
|---|
| 188 | case MMALOMX_ROLE_VIDEO_DECODER_MPEG4: | 
|---|
| 189 | case MMALOMX_ROLE_VIDEO_ENCODER_MPEG4: | 
|---|
| 190 | component->ports[port].format_param.mpeg4.eProfile = OMX_VIDEO_MPEG4ProfileSimple; | 
|---|
| 191 | component->ports[port].format_param.mpeg4.eLevel = OMX_VIDEO_MPEG4Level1; | 
|---|
| 192 | break; | 
|---|
| 193 | case MMALOMX_ROLE_VIDEO_DECODER_AVC: | 
|---|
| 194 | case MMALOMX_ROLE_VIDEO_ENCODER_AVC: | 
|---|
| 195 | component->ports[port].format_param.avc.eProfile = OMX_VIDEO_AVCProfileBaseline; | 
|---|
| 196 | component->ports[port].format_param.avc.eLevel = OMX_VIDEO_AVCLevel1; | 
|---|
| 197 | break; | 
|---|
| 198 | case MMALOMX_ROLE_VIDEO_DECODER_WMV: | 
|---|
| 199 | component->ports[port].format_param.wmv.eFormat = OMX_VIDEO_WMVFormat9; | 
|---|
| 200 | break; | 
|---|
| 201 | default: | 
|---|
| 202 | break; | 
|---|
| 203 | } | 
|---|
| 204 |  | 
|---|
| 205 | if (mmal_port_format_commit(component->ports[port].mmal) != MMAL_SUCCESS) | 
|---|
| 206 | LOG_ERROR( "failed to commit format to %s for role %s", | 
|---|
| 207 | component->ports[port].mmal->name, name); | 
|---|
| 208 |  | 
|---|
| 209 | return OMX_ErrorNone; | 
|---|
| 210 | } | 
|---|
| 211 |  | 
|---|