diff options
author | Vaibhav Deshu Venkatesh <vdeshuve@codeaurora.org> | 2017-07-27 18:19:13 -0700 |
---|---|---|
committer | Vaibhav Deshu Venkatesh <vdeshuve@codeaurora.org> | 2017-08-18 12:11:40 -0700 |
commit | ff86043037b4b58b16f3515a1536e3289a4709dd (patch) | |
tree | 0a7a63150a336c22363a02ef3754953c42cb15e2 /mm-video-v4l2/vidc/common | |
parent | de6a3125066053967d448ad73ca95d4b9fe957fb (diff) | |
download | media-ff86043037b4b58b16f3515a1536e3289a4709dd.tar.gz |
mm-video-v4l2: Publish supported profile/level correctly
Get supported profile/level from driver and publish them
correctly to client from OMX.
CRs-Fixed: 2054346
Change-Id: I56c8d1631445e02dd0330d664802d044cce4a26e
Diffstat (limited to 'mm-video-v4l2/vidc/common')
-rw-r--r-- | mm-video-v4l2/vidc/common/inc/vidc_common.h | 66 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/common/src/vidc_common.cpp | 227 |
2 files changed, 293 insertions, 0 deletions
diff --git a/mm-video-v4l2/vidc/common/inc/vidc_common.h b/mm-video-v4l2/vidc/common/inc/vidc_common.h new file mode 100644 index 00000000..012b246d --- /dev/null +++ b/mm-video-v4l2/vidc/common/inc/vidc_common.h @@ -0,0 +1,66 @@ +/*-------------------------------------------------------------------------- +Copyright (c) 2017, The Linux Foundation. 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 Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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 <unordered_map> + +using pl_map = std::unordered_map<int, int>; +using codec_map = std::unordered_map<int, pl_map *>; + +class profile_level_converter { + static pl_map profile_avc_omx_to_v4l2; + static pl_map profile_hevc_omx_to_v4l2; + static pl_map profile_mpeg2_omx_to_v4l2; + static pl_map level_avc_omx_to_v4l2; + static pl_map level_hevc_omx_to_v4l2; + static pl_map level_vp8_omx_to_v4l2; + static pl_map level_mpeg2_omx_to_v4l2; + static pl_map profile_avc_v4l2_to_omx; + static pl_map profile_hevc_v4l2_to_omx; + static pl_map profile_mpeg2_v4l2_to_omx; + static pl_map level_avc_v4l2_to_omx; + static pl_map level_hevc_v4l2_to_omx; + static pl_map level_vp8_v4l2_to_omx; + static pl_map level_mpeg2_v4l2_to_omx; + + static codec_map profile_omx_to_v4l2_map; + static codec_map profile_v4l2_to_omx_map; + static codec_map level_omx_to_v4l2_map; + static codec_map level_v4l2_to_omx_map; + + //Constructor that initializes and performs the mapping + profile_level_converter() = delete; + static bool find_item(pl_map *map, int key, int *value); + static bool find_map(codec_map map, int key, pl_map **value_map); + + public: + static void init(); + static bool convert_v4l2_profile_to_omx(int codec, int v4l2_profile, int *omx_profile); + static bool convert_omx_profile_to_v4l2(int codec, int omx_profile, int *v4l2_profile); + static bool convert_v4l2_level_to_omx(int codec, int v4l2_level, int *omx_level); + static bool convert_omx_level_to_v4l2(int codec, int omx_level, int *v4l2_level); +}; diff --git a/mm-video-v4l2/vidc/common/src/vidc_common.cpp b/mm-video-v4l2/vidc/common/src/vidc_common.cpp index 931e7c53..6336ef38 100644 --- a/mm-video-v4l2/vidc/common/src/vidc_common.cpp +++ b/mm-video-v4l2/vidc/common/src/vidc_common.cpp @@ -30,5 +30,232 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <utils/Log.h> #include "vidc_debug.h" +#include "vidc_common.h" +#include "OMX_Core.h" +#include "OMX_QCOMExtns.h" +#include "OMX_VideoExt.h" +#include "OMX_IndexExt.h" +#include <linux/videodev2.h> int debug_level = PRIO_ERROR; + + +pl_map profile_level_converter::profile_avc_omx_to_v4l2 ({ + {QOMX_VIDEO_AVCProfileConstrainedBaseline, + V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE}, + {QOMX_VIDEO_AVCProfileBaseline, + V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE}, + {QOMX_VIDEO_AVCProfileMain, + V4L2_MPEG_VIDEO_H264_PROFILE_MAIN}, + {QOMX_VIDEO_AVCProfileConstrainedHigh, + V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH}, + {QOMX_VIDEO_AVCProfileHigh, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH} + }); + +pl_map profile_level_converter::profile_avc_v4l2_to_omx ({}); + +pl_map profile_level_converter::profile_hevc_omx_to_v4l2 ({ + {OMX_VIDEO_HEVCProfileMain, + V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN}, + {OMX_VIDEO_HEVCProfileMain10, + V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10}, + }); + +pl_map profile_level_converter::profile_hevc_v4l2_to_omx ({}); + +pl_map profile_level_converter::profile_mpeg2_omx_to_v4l2 ({ + {OMX_VIDEO_MPEG2ProfileSimple, + V4L2_MPEG_VIDC_VIDEO_MPEG2_PROFILE_SIMPLE}, + {OMX_VIDEO_MPEG2ProfileMain, + V4L2_MPEG_VIDC_VIDEO_MPEG2_PROFILE_MAIN}, + }); + +pl_map profile_level_converter::profile_mpeg2_v4l2_to_omx ({}); + +pl_map profile_level_converter::level_avc_omx_to_v4l2 ({ + {OMX_VIDEO_AVCLevel1, V4L2_MPEG_VIDEO_H264_LEVEL_1_0}, + {OMX_VIDEO_AVCLevel11, V4L2_MPEG_VIDEO_H264_LEVEL_1_1}, + {OMX_VIDEO_AVCLevel12, V4L2_MPEG_VIDEO_H264_LEVEL_1_2}, + {OMX_VIDEO_AVCLevel13, V4L2_MPEG_VIDEO_H264_LEVEL_1_3}, + {OMX_VIDEO_AVCLevel1b, V4L2_MPEG_VIDEO_H264_LEVEL_1B}, + {OMX_VIDEO_AVCLevel2, V4L2_MPEG_VIDEO_H264_LEVEL_2_0}, + {OMX_VIDEO_AVCLevel21, V4L2_MPEG_VIDEO_H264_LEVEL_2_1}, + {OMX_VIDEO_AVCLevel22, V4L2_MPEG_VIDEO_H264_LEVEL_2_2}, + {OMX_VIDEO_AVCLevel3, V4L2_MPEG_VIDEO_H264_LEVEL_3_0}, + {OMX_VIDEO_AVCLevel31, V4L2_MPEG_VIDEO_H264_LEVEL_3_1}, + {OMX_VIDEO_AVCLevel32, V4L2_MPEG_VIDEO_H264_LEVEL_3_2}, + {OMX_VIDEO_AVCLevel4, V4L2_MPEG_VIDEO_H264_LEVEL_4_0}, + {OMX_VIDEO_AVCLevel41, V4L2_MPEG_VIDEO_H264_LEVEL_4_1}, + {OMX_VIDEO_AVCLevel42, V4L2_MPEG_VIDEO_H264_LEVEL_4_2}, + {OMX_VIDEO_AVCLevel5, V4L2_MPEG_VIDEO_H264_LEVEL_5_0}, + {OMX_VIDEO_AVCLevel51, V4L2_MPEG_VIDEO_H264_LEVEL_5_1}, + {OMX_VIDEO_AVCLevel52, V4L2_MPEG_VIDEO_H264_LEVEL_5_2}, + }); + +pl_map profile_level_converter::level_avc_v4l2_to_omx ({}); + +pl_map profile_level_converter::level_hevc_omx_to_v4l2 ({ + {OMX_VIDEO_HEVCMainTierLevel1, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1}, + {OMX_VIDEO_HEVCMainTierLevel2, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2}, + {OMX_VIDEO_HEVCMainTierLevel21, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2_1}, + {OMX_VIDEO_HEVCMainTierLevel3, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3}, + {OMX_VIDEO_HEVCMainTierLevel31, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3_1}, + {OMX_VIDEO_HEVCMainTierLevel4, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4}, + {OMX_VIDEO_HEVCMainTierLevel41, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4_1}, + {OMX_VIDEO_HEVCMainTierLevel5, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5}, + {OMX_VIDEO_HEVCMainTierLevel51, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_1}, + {OMX_VIDEO_HEVCMainTierLevel52, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_2}, + {OMX_VIDEO_HEVCMainTierLevel6, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6}, + {OMX_VIDEO_HEVCMainTierLevel61, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_1}, + {OMX_VIDEO_HEVCMainTierLevel62, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_2}, + {OMX_VIDEO_HEVCHighTierLevel1, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_1}, + {OMX_VIDEO_HEVCHighTierLevel2, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2}, + {OMX_VIDEO_HEVCHighTierLevel21, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2_1}, + {OMX_VIDEO_HEVCHighTierLevel3, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3}, + {OMX_VIDEO_HEVCHighTierLevel31, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3_1}, + {OMX_VIDEO_HEVCHighTierLevel4, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4}, + {OMX_VIDEO_HEVCHighTierLevel41, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4_1}, + {OMX_VIDEO_HEVCHighTierLevel5, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5}, + {OMX_VIDEO_HEVCHighTierLevel51, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_1}, + {OMX_VIDEO_HEVCHighTierLevel52, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_2}, + {OMX_VIDEO_HEVCHighTierLevel6, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6}, + {OMX_VIDEO_HEVCHighTierLevel61, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6_1}, + {OMX_VIDEO_HEVCHighTierLevel62, V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6_2}, + }); + +pl_map profile_level_converter::level_hevc_v4l2_to_omx ({}); + +pl_map profile_level_converter::level_vp8_omx_to_v4l2 ({ + {OMX_VIDEO_VP8Level_Version0, V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0}, + {OMX_VIDEO_VP8Level_Version1, V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1}, + {OMX_VIDEO_VP8Level_Version2, V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_2}, + {OMX_VIDEO_VP8Level_Version3, V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_3}, + }); + +pl_map profile_level_converter::level_vp8_v4l2_to_omx ({}); + +pl_map profile_level_converter::level_mpeg2_omx_to_v4l2 ({ + {OMX_VIDEO_MPEG2LevelLL, V4L2_MPEG_VIDC_VIDEO_MPEG2_LEVEL_0}, + {OMX_VIDEO_MPEG2LevelML, V4L2_MPEG_VIDC_VIDEO_MPEG2_LEVEL_1}, + {OMX_VIDEO_MPEG2LevelHL, V4L2_MPEG_VIDC_VIDEO_MPEG2_LEVEL_2}, + }); + +pl_map profile_level_converter::level_mpeg2_v4l2_to_omx ({}); + +codec_map profile_level_converter::profile_omx_to_v4l2_map ({ + {V4L2_PIX_FMT_H264, &profile_avc_omx_to_v4l2}, + {V4L2_PIX_FMT_HEVC, &profile_hevc_omx_to_v4l2}, + {V4L2_PIX_FMT_MPEG2, &profile_mpeg2_omx_to_v4l2}, + }); + +codec_map profile_level_converter::profile_v4l2_to_omx_map ({ + {V4L2_PIX_FMT_H264, &profile_avc_v4l2_to_omx}, + {V4L2_PIX_FMT_HEVC, &profile_hevc_v4l2_to_omx}, + {V4L2_PIX_FMT_MPEG2, &profile_mpeg2_v4l2_to_omx}, + }); + +codec_map profile_level_converter::level_omx_to_v4l2_map ({ + {V4L2_PIX_FMT_H264, &level_avc_omx_to_v4l2}, + {V4L2_PIX_FMT_HEVC, &level_hevc_omx_to_v4l2}, + {V4L2_PIX_FMT_MPEG2, &level_mpeg2_omx_to_v4l2}, + {V4L2_PIX_FMT_VP8, &level_vp8_omx_to_v4l2}, + /* VP9 uses same levels */ + {V4L2_PIX_FMT_VP9, &level_vp8_omx_to_v4l2}, + }); + +codec_map profile_level_converter::level_v4l2_to_omx_map ({ + {V4L2_PIX_FMT_H264, &level_avc_v4l2_to_omx}, + {V4L2_PIX_FMT_HEVC, &level_hevc_v4l2_to_omx}, + {V4L2_PIX_FMT_MPEG2, &level_mpeg2_v4l2_to_omx}, + {V4L2_PIX_FMT_VP8, &level_vp8_v4l2_to_omx}, + /* VP9 uses same levels */ + {V4L2_PIX_FMT_VP9, &level_vp8_v4l2_to_omx}, + }); + +void reverse_map(pl_map source_map, pl_map &dest_map) +{ + pl_map::iterator it; + + for(it = source_map.begin(); it != source_map.end(); it++) { + dest_map[it->second] = it->first; + } + return; +} + +void profile_level_converter::init() +{ + reverse_map(profile_avc_omx_to_v4l2, profile_avc_v4l2_to_omx); + reverse_map(profile_hevc_omx_to_v4l2, profile_hevc_v4l2_to_omx); + reverse_map(profile_mpeg2_omx_to_v4l2, profile_mpeg2_v4l2_to_omx); + reverse_map(level_avc_omx_to_v4l2, level_avc_v4l2_to_omx); + reverse_map(level_hevc_omx_to_v4l2, level_hevc_v4l2_to_omx); + reverse_map(level_vp8_omx_to_v4l2, level_vp8_v4l2_to_omx); + reverse_map(level_mpeg2_omx_to_v4l2, level_mpeg2_v4l2_to_omx); +} + +bool profile_level_converter::find_map(codec_map map, int key, pl_map **value_map) +{ + codec_map::iterator map_it; + + map_it = map.find (key); + if (map_it == map.end()) { + DEBUG_PRINT_ERROR(" Invalid codec : %d Cannot find map for this codec", key); + return false; + } + *value_map = map_it->second; + return true; +} + +bool profile_level_converter::find_item(pl_map *map, int key, int *value) +{ + pl_map::iterator it; + + it = map->find (key); + if (it == map->end()) { + DEBUG_PRINT_ERROR(" Invalid key : %d Cannot find key in map ", key); + return false; + } + *value = it->second; + return true; +} + +bool profile_level_converter::convert_v4l2_profile_to_omx(int codec, int v4l2_profile, int *omx_profile) +{ + pl_map *profile_map; + + if (!find_map(profile_v4l2_to_omx_map, codec, &profile_map)) + return false; + + return find_item(profile_map, v4l2_profile, omx_profile); +} + +bool profile_level_converter::convert_omx_profile_to_v4l2(int codec, int omx_profile, int *v4l2_profile) +{ + pl_map *profile_map; + + if (!find_map(profile_omx_to_v4l2_map, codec, &profile_map)) + return false; + + return find_item(profile_map, omx_profile, v4l2_profile); +} + +bool profile_level_converter::convert_v4l2_level_to_omx(int codec, int v4l2_level, int *omx_level) +{ + pl_map *level_map; + + if (!find_map(level_v4l2_to_omx_map, codec, &level_map)) + return false; + + return find_item(level_map, v4l2_level, omx_level); +} + +bool profile_level_converter::convert_omx_level_to_v4l2(int codec, int omx_level, int *v4l2_level) +{ + pl_map *level_map; + + if (!find_map(level_omx_to_v4l2_map, codec, &level_map)) + return false; + + return find_item(level_map, omx_level, v4l2_level); +} |