summaryrefslogtreecommitdiff
path: root/mm-video-v4l2/vidc/common
diff options
context:
space:
mode:
authorVaibhav Deshu Venkatesh <vdeshuve@codeaurora.org>2017-07-27 18:19:13 -0700
committerVaibhav Deshu Venkatesh <vdeshuve@codeaurora.org>2017-08-18 12:11:40 -0700
commitff86043037b4b58b16f3515a1536e3289a4709dd (patch)
tree0a7a63150a336c22363a02ef3754953c42cb15e2 /mm-video-v4l2/vidc/common
parentde6a3125066053967d448ad73ca95d4b9fe957fb (diff)
downloadmedia-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.h66
-rw-r--r--mm-video-v4l2/vidc/common/src/vidc_common.cpp227
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);
+}