18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Coda multi-standard codec IP - MPEG-4 helper functions 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2019 Pengutronix, Philipp Zabel 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/kernel.h> 98c2ecf20Sopenharmony_ci#include <linux/videodev2.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include "coda.h" 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciint coda_mpeg4_profile(int profile_idc) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci switch (profile_idc) { 168c2ecf20Sopenharmony_ci case 0: 178c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE; 188c2ecf20Sopenharmony_ci case 15: 198c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE; 208c2ecf20Sopenharmony_ci case 2: 218c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_CORE; 228c2ecf20Sopenharmony_ci case 1: 238c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE_SCALABLE; 248c2ecf20Sopenharmony_ci case 11: 258c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY; 268c2ecf20Sopenharmony_ci default: 278c2ecf20Sopenharmony_ci return -EINVAL; 288c2ecf20Sopenharmony_ci } 298c2ecf20Sopenharmony_ci} 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ciint coda_mpeg4_level(int level_idc) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci switch (level_idc) { 348c2ecf20Sopenharmony_ci case 0: 358c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_0; 368c2ecf20Sopenharmony_ci case 1: 378c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_1; 388c2ecf20Sopenharmony_ci case 2: 398c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_2; 408c2ecf20Sopenharmony_ci case 3: 418c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_3; 428c2ecf20Sopenharmony_ci case 4: 438c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_4; 448c2ecf20Sopenharmony_ci case 5: 458c2ecf20Sopenharmony_ci return V4L2_MPEG_VIDEO_MPEG4_LEVEL_5; 468c2ecf20Sopenharmony_ci default: 478c2ecf20Sopenharmony_ci return -EINVAL; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* 528c2ecf20Sopenharmony_ci * Check if the buffer starts with the MPEG-4 visual object sequence and visual 538c2ecf20Sopenharmony_ci * object headers, for example: 548c2ecf20Sopenharmony_ci * 558c2ecf20Sopenharmony_ci * 00 00 01 b0 f1 568c2ecf20Sopenharmony_ci * 00 00 01 b5 a9 13 00 00 01 00 00 00 01 20 08 578c2ecf20Sopenharmony_ci * d4 8d 88 00 f5 04 04 08 14 30 3f 588c2ecf20Sopenharmony_ci * 598c2ecf20Sopenharmony_ci * Returns the detected header size in bytes or 0. 608c2ecf20Sopenharmony_ci */ 618c2ecf20Sopenharmony_ciu32 coda_mpeg4_parse_headers(struct coda_ctx *ctx, u8 *buf, u32 size) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci static const u8 vos_start[4] = { 0x00, 0x00, 0x01, 0xb0 }; 648c2ecf20Sopenharmony_ci static const union { 658c2ecf20Sopenharmony_ci u8 vo_start[4]; 668c2ecf20Sopenharmony_ci u8 start_code_prefix[3]; 678c2ecf20Sopenharmony_ci } u = { { 0x00, 0x00, 0x01, 0xb5 } }; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci if (size < 30 || 708c2ecf20Sopenharmony_ci memcmp(buf, vos_start, 4) != 0 || 718c2ecf20Sopenharmony_ci memcmp(buf + 5, u.vo_start, 4) != 0) 728c2ecf20Sopenharmony_ci return 0; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci if (size == 30 || 758c2ecf20Sopenharmony_ci (size >= 33 && memcmp(buf + 30, u.start_code_prefix, 3) == 0)) 768c2ecf20Sopenharmony_ci return 30; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci if (size == 31 || 798c2ecf20Sopenharmony_ci (size >= 34 && memcmp(buf + 31, u.start_code_prefix, 3) == 0)) 808c2ecf20Sopenharmony_ci return 31; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci if (size == 32 || 838c2ecf20Sopenharmony_ci (size >= 35 && memcmp(buf + 32, u.start_code_prefix, 3) == 0)) 848c2ecf20Sopenharmony_ci return 32; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci return 0; 878c2ecf20Sopenharmony_ci} 88