123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- Copyright (c) 2012, Broadcom Europe Ltd
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the copyright holder nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
- #include "mmalomx.h"
- #include "mmalomx_roles.h"
- #include "mmalomx_registry.h"
- #include "mmalomx_logging.h"
-
- static const struct {
- const char *name;
- MMALOMX_ROLE_T role;
- } mmalomx_roles[] =
- {
- {"video_decoder.h263", MMALOMX_ROLE_VIDEO_DECODER_H263},
- {"video_decoder.mpeg4", MMALOMX_ROLE_VIDEO_DECODER_MPEG4},
- {"video_decoder.avc", MMALOMX_ROLE_VIDEO_DECODER_AVC},
- {"video_decoder.mpeg2", MMALOMX_ROLE_VIDEO_DECODER_MPEG2},
- {"video_decoder.wmv", MMALOMX_ROLE_VIDEO_DECODER_WMV},
- {"video_decoder.vpx", MMALOMX_ROLE_VIDEO_DECODER_VPX},
-
- {"video_encoder.h263", MMALOMX_ROLE_VIDEO_ENCODER_H263},
- {"video_encoder.mpeg4", MMALOMX_ROLE_VIDEO_ENCODER_MPEG4},
- {"video_encoder.avc", MMALOMX_ROLE_VIDEO_ENCODER_AVC},
-
- {"audio_decoder.aac", MMALOMX_ROLE_AUDIO_DECODER_AAC},
- {"audio_decoder.mp1", MMALOMX_ROLE_AUDIO_DECODER_MPGA_L1},
- {"audio_decoder.mp2", MMALOMX_ROLE_AUDIO_DECODER_MPGA_L2},
- {"audio_decoder.mp3", MMALOMX_ROLE_AUDIO_DECODER_MPGA_L3},
- {"audio_decoder.ddp", MMALOMX_ROLE_AUDIO_DECODER_DDP},
-
- {"AIV.play.101", MMALOMX_ROLE_AIV_PLAY_101},
- {"play.avcddp", MMALOMX_ROLE_AIV_PLAY_AVCDDP},
-
- {0, 0}
- };
-
- const char *mmalomx_role_to_name(MMALOMX_ROLE_T role)
- {
- unsigned int i;
- for (i = 0; mmalomx_roles[i].name; i++)
- if (mmalomx_roles[i].role == role)
- break;
- return mmalomx_roles[i].name;
- }
-
- MMALOMX_ROLE_T mmalomx_role_from_name(const char *name)
- {
- unsigned int i;
- for (i = 0; mmalomx_roles[i].name; i++)
- if (!strcmp(mmalomx_roles[i].name, name))
- break;
- return mmalomx_roles[i].role;
- }
-
- static void mmalomx_format_encoding_from_role(MMALOMX_ROLE_T role,
- MMAL_FOURCC_T *encoding, MMAL_ES_TYPE_T *es_type, unsigned int *port)
- {
- switch (role)
- {
- case MMALOMX_ROLE_VIDEO_DECODER_MPEG4:
- case MMALOMX_ROLE_VIDEO_ENCODER_MPEG4:
- *encoding = MMAL_ENCODING_MP4V;
- *es_type = MMAL_ES_TYPE_VIDEO;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_AVC:
- case MMALOMX_ROLE_VIDEO_ENCODER_AVC:
- *encoding = MMAL_ENCODING_H264;
- *es_type = MMAL_ES_TYPE_VIDEO;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_MPEG2:
- *encoding = MMAL_ENCODING_MP2V;
- *es_type = MMAL_ES_TYPE_VIDEO;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_WMV:
- *encoding = MMAL_ENCODING_WMV3;
- *es_type = MMAL_ES_TYPE_VIDEO;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_VPX:
- *encoding = MMAL_ENCODING_VP8;
- *es_type = MMAL_ES_TYPE_VIDEO;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_H263:
- case MMALOMX_ROLE_VIDEO_ENCODER_H263:
- *encoding = MMAL_ENCODING_H263;
- *es_type = MMAL_ES_TYPE_VIDEO;
- break;
- case MMALOMX_ROLE_AUDIO_DECODER_AAC:
- *encoding = MMAL_ENCODING_MP4A;
- *es_type = MMAL_ES_TYPE_AUDIO;
- break;
- case MMALOMX_ROLE_AUDIO_DECODER_MPGA_L1:
- case MMALOMX_ROLE_AUDIO_DECODER_MPGA_L2:
- case MMALOMX_ROLE_AUDIO_DECODER_MPGA_L3:
- *encoding = MMAL_ENCODING_MPGA;
- *es_type = MMAL_ES_TYPE_AUDIO;
- break;
-
- case MMALOMX_ROLE_AUDIO_DECODER_DDP:
- *encoding = MMAL_ENCODING_AC3;
- *es_type = MMAL_ES_TYPE_AUDIO;
- break;
-
- default:
- *encoding = MMAL_ENCODING_UNKNOWN;
- *es_type = MMAL_ES_TYPE_UNKNOWN;
- break;
- }
-
- switch (role)
- {
- case MMALOMX_ROLE_VIDEO_ENCODER_H263:
- case MMALOMX_ROLE_VIDEO_ENCODER_MPEG4:
- case MMALOMX_ROLE_VIDEO_ENCODER_AVC:
- *port = 1;
- break;
- default:
- *port = 0;
- break;
- }
- }
-
- OMX_ERRORTYPE mmalomx_role_set(MMALOMX_COMPONENT_T *component, const char *name)
- {
- const MMALOMX_ROLE_T role = mmalomx_role_from_name(name);
- MMAL_FOURCC_T encoding = MMAL_ENCODING_UNKNOWN;
- MMAL_ES_TYPE_T es_type = MMAL_ES_TYPE_UNKNOWN;
- unsigned int port;
- MMAL_ES_FORMAT_T *format;
-
- if (!role || !mmalomx_registry_component_supports_role(component->registry_id, role))
- return OMX_ErrorUnsupportedSetting;
-
- component->role = role;
-
- mmalomx_format_encoding_from_role(role, &encoding, &es_type, &port);
- if (encoding == MMAL_ENCODING_UNKNOWN)
- return OMX_ErrorNone;
-
- format = component->ports[port].mmal->format;
- format->type = es_type;
- format->encoding = encoding;
- format->bitrate = 64000;
- switch (es_type)
- {
- case MMAL_ES_TYPE_VIDEO:
- format->es->video.width = 176;
- format->es->video.height = 144;
- format->es->video.frame_rate.num = 15;
- format->es->video.frame_rate.den = 1;
- break;
- default:
- break;
- }
-
- switch (role)
- {
- case MMALOMX_ROLE_VIDEO_DECODER_H263:
- case MMALOMX_ROLE_VIDEO_ENCODER_H263:
- component->ports[port].format_param.h263.eProfile = OMX_VIDEO_H263ProfileBaseline;
- component->ports[port].format_param.h263.eLevel = OMX_VIDEO_H263Level10;
- component->ports[port].format_param.h263.bPLUSPTYPEAllowed = OMX_FALSE;
- component->ports[port].format_param.h263.bForceRoundingTypeToZero = OMX_TRUE;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_MPEG4:
- case MMALOMX_ROLE_VIDEO_ENCODER_MPEG4:
- component->ports[port].format_param.mpeg4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
- component->ports[port].format_param.mpeg4.eLevel = OMX_VIDEO_MPEG4Level1;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_AVC:
- case MMALOMX_ROLE_VIDEO_ENCODER_AVC:
- component->ports[port].format_param.avc.eProfile = OMX_VIDEO_AVCProfileBaseline;
- component->ports[port].format_param.avc.eLevel = OMX_VIDEO_AVCLevel1;
- break;
- case MMALOMX_ROLE_VIDEO_DECODER_WMV:
- component->ports[port].format_param.wmv.eFormat = OMX_VIDEO_WMVFormat9;
- break;
- default:
- break;
- }
-
- if (mmal_port_format_commit(component->ports[port].mmal) != MMAL_SUCCESS)
- LOG_ERROR("failed to commit format to %s for role %s",
- component->ports[port].mmal->name, name);
-
- return OMX_ErrorNone;
- }
|