162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Coda multi-standard codec IP - MPEG-4 helper functions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2019 Pengutronix, Philipp Zabel 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/kernel.h> 962306a36Sopenharmony_ci#include <linux/videodev2.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "coda.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciint coda_mpeg4_profile(int profile_idc) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci switch (profile_idc) { 1662306a36Sopenharmony_ci case 0: 1762306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE; 1862306a36Sopenharmony_ci case 15: 1962306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE; 2062306a36Sopenharmony_ci case 2: 2162306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_CORE; 2262306a36Sopenharmony_ci case 1: 2362306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE_SCALABLE; 2462306a36Sopenharmony_ci case 11: 2562306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY; 2662306a36Sopenharmony_ci default: 2762306a36Sopenharmony_ci return -EINVAL; 2862306a36Sopenharmony_ci } 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ciint coda_mpeg4_level(int level_idc) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci switch (level_idc) { 3462306a36Sopenharmony_ci case 0: 3562306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_0; 3662306a36Sopenharmony_ci case 1: 3762306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_1; 3862306a36Sopenharmony_ci case 2: 3962306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_2; 4062306a36Sopenharmony_ci case 3: 4162306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_3; 4262306a36Sopenharmony_ci case 4: 4362306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_4; 4462306a36Sopenharmony_ci case 5: 4562306a36Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 4662306a36Sopenharmony_ci default: 4762306a36Sopenharmony_ci return -EINVAL; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* 5262306a36Sopenharmony_ci * Check if the buffer starts with the MPEG-4 visual object sequence and visual 5362306a36Sopenharmony_ci * object headers, for example: 5462306a36Sopenharmony_ci * 5562306a36Sopenharmony_ci * 00 00 01 b0 f1 5662306a36Sopenharmony_ci * 00 00 01 b5 a9 13 00 00 01 00 00 00 01 20 08 5762306a36Sopenharmony_ci * d4 8d 88 00 f5 04 04 08 14 30 3f 5862306a36Sopenharmony_ci * 5962306a36Sopenharmony_ci * Returns the detected header size in bytes or 0. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_ciu32 coda_mpeg4_parse_headers(struct coda_ctx *ctx, u8 *buf, u32 size) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci static const u8 vos_start[4] = { 0x00, 0x00, 0x01, 0xb0 }; 6462306a36Sopenharmony_ci static const union { 6562306a36Sopenharmony_ci u8 vo_start[4]; 6662306a36Sopenharmony_ci u8 start_code_prefix[3]; 6762306a36Sopenharmony_ci } u = { { 0x00, 0x00, 0x01, 0xb5 } }; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci if (size < 30 || 7062306a36Sopenharmony_ci memcmp(buf, vos_start, 4) != 0 || 7162306a36Sopenharmony_ci memcmp(buf + 5, u.vo_start, 4) != 0) 7262306a36Sopenharmony_ci return 0; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci if (size == 30 || 7562306a36Sopenharmony_ci (size >= 33 && memcmp(buf + 30, u.start_code_prefix, 3) == 0)) 7662306a36Sopenharmony_ci return 30; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci if (size == 31 || 7962306a36Sopenharmony_ci (size >= 34 && memcmp(buf + 31, u.start_code_prefix, 3) == 0)) 8062306a36Sopenharmony_ci return 31; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci if (size == 32 || 8362306a36Sopenharmony_ci (size >= 35 && memcmp(buf + 32, u.start_code_prefix, 3) == 0)) 8462306a36Sopenharmony_ci return 32; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci return 0; 8762306a36Sopenharmony_ci} 88