diff options
author | jk7744.park <jk7744.park@samsung.com> | 2015-09-08 22:08:42 +0900 |
---|---|---|
committer | jk7744.park <jk7744.park@samsung.com> | 2015-09-08 22:08:42 +0900 |
commit | f412b83af8df235cee2d5dec9c34f96e0719e4bb (patch) | |
tree | 3c560a4f352a42258e03a0377bba5c840a2fa55a | |
parent | 3a201e3e04372e0b8d4d349d80c38a2d45f0e58e (diff) | |
download | capi-media-tool-tizen_2.3.1.tar.gz capi-media-tool-tizen_2.3.1.tar.bz2 capi-media-tool-tizen_2.3.1.zip |
tizen 2.3.1 releasetizen_2.3.1_releasesubmit/tizen_2.3.1/20150915.075654tizen_2.3.1
-rwxr-xr-x | AUTHORS | 2 | ||||
-rwxr-xr-x | CMakeLists.txt | 98 | ||||
-rwxr-xr-x | LICENSE.APLv2 | 206 | ||||
-rwxr-xr-x | NOTICE | 3 | ||||
-rwxr-xr-x | capi-media-tool.manifest | 8 | ||||
-rwxr-xr-x | capi-media-tool.pc.in | 15 | ||||
-rwxr-xr-x | doc/capi_media_tool_doc.h | 55 | ||||
-rwxr-xr-x | include/media_format.h | 407 | ||||
-rwxr-xr-x | include/media_format_private.h | 151 | ||||
-rwxr-xr-x | include/media_packet.h | 714 | ||||
-rwxr-xr-x | include/media_packet_private.h | 135 | ||||
-rwxr-xr-x | packaging/capi-media-tool.spec | 74 | ||||
-rwxr-xr-x | src/media_format.c | 484 | ||||
-rwxr-xr-x | src/media_packet.c | 1312 | ||||
-rwxr-xr-x | src/media_packet_private.c | 20 | ||||
-rwxr-xr-x | test/CMakeLists.txt | 22 | ||||
-rwxr-xr-x | test/media_packet_test.c | 1357 |
17 files changed, 5063 insertions, 0 deletions
@@ -0,0 +1,2 @@ +Kangho Hur <kanho.hur@samsung.com> +Seungkeun Lee <sngn.lee@samsung.com> diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..6e75836 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,98 @@ + +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +SET(fw_name "capi-media-tool") + +PROJECT(${fw_name}) + +SET(CMAKE_INSTALL_PREFIX /usr) +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) + +SET(INC_DIR include) +INCLUDE_DIRECTORIES(${INC_DIR}) + +SET(dependents "dlog glib-2.0") +SET(pc_dependents "dlog capi-base-common libtbm") + +INCLUDE(FindPkgConfig) +pkg_check_modules(${fw_name} REQUIRED ${dependents}) +FOREACH(flag ${${fw_name}_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "-I./include -I./include/headers ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC -Wall -w") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") + +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DTIZEN_DEBUG") + +SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib") + +aux_source_directory(src SOURCES) +ADD_LIBRARY(${fw_name} SHARED ${SOURCES}) + +TARGET_LINK_LIBRARIES(${fw_name} ${${fw_name}_LDFLAGS}) + +SET_TARGET_PROPERTIES(${fw_name} + PROPERTIES + VERSION ${FULLVER} + SOVERSION ${MAJORVER} + CLEAN_DIRECT_OUTPUT 1 +) + +INSTALL(TARGETS ${fw_name} DESTINATION lib) +INSTALL( + DIRECTORY ${INC_DIR}/ DESTINATION include/media + FILES_MATCHING + PATTERN "*_private.h" EXCLUDE + PATTERN "${INC_DIR}/*.h" + ) + +SET(PC_NAME ${fw_name}) +SET(PC_REQUIRED ${pc_dependents}) +SET(PC_LDFLAGS -l${fw_name}) +SET(PC_CFLAGS -I\${includedir}/media) + +CONFIGURE_FILE( + ${fw_name}.pc.in + ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc + @ONLY +) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${fw_name}.pc DESTINATION lib/pkgconfig) + +ADD_SUBDIRECTORY(test) + +IF(UNIX) + +ADD_CUSTOM_TARGET (distclean @echo cleaning for source distribution) +ADD_CUSTOM_COMMAND( + DEPENDS clean + COMMENT "distribution clean" + COMMAND find + ARGS . + -not -name config.cmake -and \( + -name tester.c -or + -name Testing -or + -name CMakeFiles -or + -name cmake.depends -or + -name cmake.check_depends -or + -name CMakeCache.txt -or + -name cmake.check_cache -or + -name *.cmake -or + -name Makefile -or + -name core -or + -name core.* -or + -name gmon.out -or + -name install_manifest.txt -or + -name *.pc -or + -name *~ \) + | grep -v TC | xargs rm -rf + TARGET distclean + VERBATIM +) + +ENDIF(UNIX) + diff --git a/LICENSE.APLv2 b/LICENSE.APLv2 new file mode 100755 index 0000000..f94008a --- /dev/null +++ b/LICENSE.APLv2 @@ -0,0 +1,206 @@ +Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + @@ -0,0 +1,3 @@ +Copyright (c) Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Apache License, Version 2. +Please, see the LICENSE file for Apache License terms and conditions. diff --git a/capi-media-tool.manifest b/capi-media-tool.manifest new file mode 100755 index 0000000..59167d9 --- /dev/null +++ b/capi-media-tool.manifest @@ -0,0 +1,8 @@ +<manifest> + <request> + <domain name="_" /> + </request> + <assign> + <filesystem path="/usr/bin/media_packet_test" label="_" exec_label="none" /> + </assign> +</manifest> diff --git a/capi-media-tool.pc.in b/capi-media-tool.pc.in new file mode 100755 index 0000000..afda32e --- /dev/null +++ b/capi-media-tool.pc.in @@ -0,0 +1,15 @@ + +# Package Information for pkg-config + +prefix=@PREFIX@ +exec_prefix=/usr +libdir=/usr/lib +includedir=/usr/include/media + +Name: @PC_NAME@ +Description: @PACKAGE_DESCRIPTION@ +Version: @VERSION@ +Requires: @PC_REQUIRED@ +Libs: -L${libdir} @PC_LDFLAGS@ +Cflags: -I${includedir} + diff --git a/doc/capi_media_tool_doc.h b/doc/capi_media_tool_doc.h new file mode 100755 index 0000000..e58ec44 --- /dev/null +++ b/doc/capi_media_tool_doc.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __TIZEN_MEDIA_TOOL_DOC_H__ +#define __TIZEN_MEDIA_TOOL_DOC_H__ + + +/** + * @file capi_media_tool_doc.h + * @brief This file contains high level documentation of the CAPI MEDIA TOOL API. + */ + +/** + * @defgroup CAPI_MEDIA_TOOL_MODULE Media Tool + * @brief The @ref CAPI_MEDIA_TOOL_MODULE APIs provides functions for AV packet buffer for interworking between mutimedia framework module . + * @ingroup CAPI_MEDIA_FRAMEWORK + * + * @section CAPI_MEDIA_TOOL_MODULE_HEADER Required Header + * \#include <media_packet.h> + * + * @section CAPI_MEDIA_TOOL_MODULE_OVERVIEW Overview + * + * MEDIA TOOL API allows : + *- Create media_packet handle and Allocate buffer to heap or tbm_surface + *- Set and Get metadata of media packet + * + * The media packet handle is created by caller. + * After creating media_packet_h handle, the caller can set & get other meta datas. + * + */ + +/** + * @defgroup CAPI_MEDIA_TOOL_MEDIA_FORMAT_MODULE Media Format + * @brief The @ref CAPI_MEDIA_TOOL_MEDIA_FORMAT_MODULE APIs provides functions for specify video or audio information. + * @ingroup CAPI_MEDIA_TOOL_MODULE + * + * @section CAPI_MEDIA_TOOL_MEDIA_FORMAT_MODULE_HEADER Required Header + * \#include <media_format.h> + */ + +#endif // __TIZEN_MEDIA_TOOL_DOC_H__ diff --git a/include/media_format.h b/include/media_format.h new file mode 100755 index 0000000..53d4d82 --- /dev/null +++ b/include/media_format.h @@ -0,0 +1,407 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef __TIZEN_MEDIA_FORMAT_H__ +#define __TIZEN_MEDIA_FORMAT_H__ + +#include <stdbool.h> +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file media_format.h + * @brief This file contains the capi media tool API. + */ + +/** + * @addtogroup CAPI_MEDIA_TOOL_MEDIA_FORMAT_MODULE + * @{ + */ + +/** + * @brief Media Format handle type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef struct media_format_s* media_format_h; + + +/** + * @brief Enumerations of media format error + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum +{ + MEDIA_FORMAT_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + MEDIA_FORMAT_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + MEDIA_FORMAT_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + MEDIA_FORMAT_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Invalid operation */ + MEDIA_FORMAT_ERROR_FILE_NO_SPACE_ON_DEVICE = TIZEN_ERROR_FILE_NO_SPACE_ON_DEVICE, /**< No space left on device */ +} media_format_error_e; + + +/** + * @brief Enumeration for media format type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum { + MEDIA_FORMAT_NONE = 0x00000000, /**< media format type is NONE */ + MEDIA_FORMAT_AUDIO = 0x01000000, /**< media format type is AUDIO */ + MEDIA_FORMAT_VIDEO = 0x02000000, /**< media format type is VIDEO */ + MEDIA_FORMAT_TEXT = 0x03000000, /**< media format type is TEXT */ + MEDIA_FORMAT_UNKNOWN = 0x0a000000, /**< media format type is UNKNOWN */ +} media_format_type_e; + +/** + * @brief Enumeration for media format data type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum { + MEDIA_FORMAT_ENCODED = 0x10000000, /**< media format data type is encoded type */ + MEDIA_FORMAT_RAW = 0x20000000, /**< media format data type is raw type */ +} media_format_data_type_e; + +/** + * @brief Enumeration for media format MIME type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ + +/* TODO : More an more audio/video types are needed !!!! */ +/* TODO : consider to make those enumerations into a combination of bitwised structure + * Then we can check just few bits rather than compare all items. +*/ +typedef enum { + /* Audio */ + MEDIA_FORMAT_L16 = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1010), /**< media format mime type is L16, AUDIO*/ + MEDIA_FORMAT_ALAW = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1020), /**< media format mime type is ALAW, AUDIO*/ + MEDIA_FORMAT_ULAW = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1030), /**< media format mime type is ULAW, AUDIO */ + MEDIA_FORMAT_AMR = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1040), /**< media format mime type is AMR, AUDIO */ + MEDIA_FORMAT_G729 = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1050), /**< media format mime type is G729, AUDIO*/ + MEDIA_FORMAT_AAC = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1060), /**< media format mime type is AAC, AUDIO*/ + MEDIA_FORMAT_MP3 = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_ENCODED | 0x1070), /**< media format mime type is MP3, AUDIO*/ + + MEDIA_FORMAT_PCM = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_RAW | 0x1510), /**< media format mime type is PCM, AUDIO*/ + MEDIA_FORMAT_PCMA = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_RAW | 0x1520), /**< media format mime type is PCM A-law, AUDIO*/ + MEDIA_FORMAT_PCMU = (MEDIA_FORMAT_AUDIO | MEDIA_FORMAT_RAW | 0x1530), /**< media format mime type is PCM U-law, AUDIO */ + + /* Video */ + MEDIA_FORMAT_H261 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2010), /**< media format mime type is H261, VIDEO */ + MEDIA_FORMAT_H263 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2020), /**< media format mime type is H263, VIDEO */ + MEDIA_FORMAT_H263P = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2021), /**< media format mime type is H263P, VIDEO */ + MEDIA_FORMAT_H264_SP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2030), /**< media format mime type is H264_SP, VIDEO */ + MEDIA_FORMAT_H264_MP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2031), /**< media format mime type is H264_MP, VIDEO */ + MEDIA_FORMAT_H264_HP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2032), /**< media format mime type is H264_HP, VIDEO */ + MEDIA_FORMAT_MJPEG = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2040), /**< media format mime type is MJPEG, VIDEO */ + MEDIA_FORMAT_MPEG1 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2050), /**< media format mime type is MPEG1, VIDEO */ + MEDIA_FORMAT_MPEG2_SP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2060), /**< media format mime type is MPEG2_SP, VIDEO */ + MEDIA_FORMAT_MPEG2_MP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2061), /**< media format mime type is MPEG2_MP, VIDEO */ + MEDIA_FORMAT_MPEG2_HP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2062), /**< media format mime type is MPEG2_HP, VIDEO */ + MEDIA_FORMAT_MPEG4_SP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2070), /**< media format mime type is MPEG4_SP, VIDEO */ + MEDIA_FORMAT_MPEG4_ASP = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_ENCODED | 0x2071), /**< media format mime type is MPEG4_ASP, VIDEO */ + + MEDIA_FORMAT_I420 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2510), /**< media format mime type is I420, VIDEO */ + MEDIA_FORMAT_NV12 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2520), /**< media format mime type is NV12, VIDEO */ + MEDIA_FORMAT_NV12T = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2530), /**< media format mime type is NV12T, VIDEO */ + MEDIA_FORMAT_YV12 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2540), /**< media format mime type is YV12, VIDEO */ + MEDIA_FORMAT_NV21 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2550), /**< media format mime type is NV21, VIDEO */ + MEDIA_FORMAT_NV16 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2560), /**< media format mime type is NV16, VIDEO */ + MEDIA_FORMAT_YUYV = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2570), /**< media format mime type is YUYV, VIDEO */ + MEDIA_FORMAT_UYVY = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2580), /**< media format mime type is UYVY, VIDEO */ + MEDIA_FORMAT_422P = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x2590), /**< media format mime type is 422P, VIDEO */ + MEDIA_FORMAT_RGB565 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x25a0), /**< media format mime type is RGB565, VIDEO */ + MEDIA_FORMAT_RGB888 = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x25b0), /**< media format mime type is RGB888, VIDEO */ + MEDIA_FORMAT_RGBA = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x25c0), /**< media format mime type is RGBA, VIDEO */ + MEDIA_FORMAT_ARGB = (MEDIA_FORMAT_VIDEO | MEDIA_FORMAT_RAW | 0x25d0), /**< media format mime type is ARGB, VIDEO */ + + MEDIA_FORMAT_MAX /**< media format mime type is MEDIA_FORMAT_MAX, Do not use */ +} media_format_mimetype_e; + +/** + * @brief Enumeration for media color model. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum { + MEDIA_COLOR_MODEL_NONE, /**< media format color model is NONE */ + MEDIA_COLOR_MODEL_RGB, /**< media format color model is RGB */ + MEDIA_COLOR_MODEL_YUV /**< media format color model is YUV */ +} media_format_color_model_e; + + +/** + * @brief Creates a media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details It creates media format. and reference count will be set to 1 + For destroying media_format_h handle, use media_format_unref() + * @param[out] fmt allocated media_format_h + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_ref() + * @see media_format_unref() + */ +int media_format_create(media_format_h* fmt); + +/** + * @brief Gets video information of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details returns mimetype, width, height, average bps, max bps of this media format + * @param[in] fmt media_format_h to get video information + * @param[out] mimetype media_format_mimetype_e , ex) MEDIA_FORMAT_H264_HP + * @param[out] width width of the video + * @param[out] height height of the video + * @param[out] avg_bps average bps of the video + * @param[out] max_bps max bps of the video + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_set_video_mime() + * @see media_format_set_video_width() + * @see media_format_set_video_height() + * @see media_format_set_video_avg_bps() + * @see media_format_set_video_max_bps() + */ +int media_format_get_video_info(media_format_h fmt, media_format_mimetype_e* mimetype, int* width, int* height, int* avg_bps, int* max_bps); + +/** + * @brief Gets audio information of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details returns mimetype, channels, height, samplerate bps, max bps of this media format + * @param[in] fmt media_format_h to get audio information + * @param[out] mimetype media_format_mimetype_e , ex) MEDIA_FORMAT_PCM + * @param[out] channel channel of the audio + * @param[out] samplerate sampling rate of the audio + * @param[out] bit bit resolution of the audio + * @param[out] avg_bps average bps of the audio + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_set_audio_mime() + * @see media_format_set_audio_channel() + * @see media_format_set_audio_samplerate() + * @see media_format_set_audio_bit() + * @see media_format_set_audio_avg_bps() + */ +int media_format_get_audio_info(media_format_h fmt, media_format_mimetype_e* mimetype, int* channel, int* samplerate, int* bit, int* avg_bps); + +/** + * @brief Sets video MIME type of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets MIME type + * @param[in] fmt media_format_h to set + * @param[in] mimetype media_format_mimetype_e , ex) MEDIA_FORMAT_H264_HP + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_video() + */ +int media_format_set_video_mime(media_format_h fmt, media_format_mimetype_e mimetype); + +/** + * @brief Sets video width of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets video width + * @param[in] fmt media_format_h to set + * @param[in] width width of the video + * @pre must set video MIME type by media_format_set_video_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_video() + */ +int media_format_set_video_width(media_format_h fmt, int width); + + +/** + * @brief Sets video height of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets video height + * @param[in] fmt media_format_h to set + * @param[in] height height of the video + * @pre must set video MIME type by media_format_set_video_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_video() + */ +int media_format_set_video_height(media_format_h fmt, int height); + +/** + * @brief Sets video avg_bps of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets avg_bps + * @param[in] fmt media_format_h to set + * @param[in] avg_bps average bps of the video + * @pre must set video MIME type by media_format_set_video_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_video() + */ +int media_format_set_video_avg_bps(media_format_h fmt, int avg_bps); + +/** + * @brief Sets video max_bps of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets max_bps + * @param[in] fmt media_format_h to set + * @param[in] max_bps max bps of the video + * @pre must set video MIME type by media_format_set_video_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_video() + */ +int media_format_set_video_max_bps(media_format_h fmt, int max_bps); + +/** + * @brief Sets audio MIME type of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets MIME type + * @param[in] fmt media_format_h to set audio information + * @param[in] mimetype media_format_mimetype_e , ex) MEDIA_FORMAT_PCM + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_audio() + */ +int media_format_set_audio_mime(media_format_h fmt, media_format_mimetype_e mimetype); + +/** + * @brief Sets audio channel of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets audio channel + * @param[in] fmt media_format_h to set audio information + * @param[in] channel channel of the audio + * @pre must set audio MIME type by media_format_set_audio_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_audio() + */ +int media_format_set_audio_channel(media_format_h fmt, int channel); + +/** + * @brief Sets audio samplerate of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets audio samplerate of this media format + * @param[in] fmt media_format_h to set + * @param[in] samplerate sampling rate of the audio + * @pre must set audio MIME type by media_format_set_audio_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_audio() + */ +int media_format_set_audio_samplerate(media_format_h fmt, int samplerate); + + /** + * @brief Sets audio bit of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets audio bit resolution of this media format + * @param[in] fmt media_format_h to set + * @param[in] bit bit of the audio + * @pre must set audio MIME type by media_format_set_audio_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_audio() + */ +int media_format_set_audio_bit(media_format_h fmt, int bit); + + /** + * @brief Sets audio avg_bps of media format + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Sets audio avg_bps of this media format + * @param[in] fmt media_format_h to set + * @param[in] avg_bps avg_bps of the audio + * @pre must set audio MIME type by media_format_set_audio_mime() + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_get_audio() + */ +int media_format_set_audio_avg_bps(media_format_h fmt, int avg_bps); + +/** + * @brief Increase reference count of media_format_h object + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details increase ref_count of media_format_h + * @param[in] fmt exist media_format_h + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_unref() + */ +int media_format_ref(media_format_h fmt); + +/** + * @brief Decrease reference count of media_format_h object + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details decrease ref_count of media_format_h + * @param[in] fmt exist media_format_h + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_ref() + */ +int media_format_unref(media_format_h fmt); + +/** + * @brief Check whether the media_format_h is writable or not. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details Check the number of media_format's ref_count + * @param[in] fmt exist media_format_h + * @param[out] is_writable if ref_count is 1, return true. if not, return false + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + */ +int media_format_is_writable(media_format_h fmt, bool* is_writable); + + /** + * @brief Returns a writable copy of media_format_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @details If there is only one reference count on fmt, the caller must be the owner, + * and so this function will return the object unchanged. + * while, if there is more than one reference count on the object, a new object will be returned. + * The caller will own a reference to the returned object. + * In a nutshell, this function unrefs the fmt and refs the out_fmt returned. + * Don't access fmt after calling this function. + * @param[in] fmt exist media_format_h , don't access it after calling this function. + * @param[out] out_fmt new copied media_format_h, the caller is owner of this object. + * @retval #MEDIA_FORMAT_ERROR_NONE Successful + * @retval #MEDIA_FORMAT_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_FORMAT_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_FORMAT_ERROR_INVALID_OPERATION Invalid operation + */ +int media_format_make_writable(media_format_h fmt, media_format_h* out_fmt); + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MEDIA_AV_PACKET_BUFFER_H__ */ diff --git a/include/media_format_private.h b/include/media_format_private.h new file mode 100755 index 0000000..c44b1b7 --- /dev/null +++ b/include/media_format_private.h @@ -0,0 +1,151 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef __TIZEN_MEDIA_FORMAT_PRIVATE_H__ +#define __TIZEN_MEDIA_FORMAT_PRIVATE_H__ + +#include <media_format.h> +#include <glib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "TIZEN_MEDIA_TOOL" + +#define MEDIA_FORMAT_CHECK_CONDITION(condition,error,msg) \ + if(condition) {} else \ + { LOGE("[%s] %s(0x%08x)", __FUNCTION__, msg,error); return error;}; \ + +#define MEDIA_FORMAT_INSTANCE_CHECK(media_format) \ + MEDIA_FORMAT_CHECK_CONDITION(media_format != NULL, MEDIA_FORMAT_ERROR_INVALID_PARAMETER, "MEDIA_FORMAT_ERROR_INVALID_PARAMETER") + +#define MEDIA_FORMAT_NULL_ARG_CHECK(arg) \ + MEDIA_FORMAT_CHECK_CONDITION(arg != NULL, MEDIA_FORMAT_ERROR_INVALID_PARAMETER, "MEDIA_FORMAT_ERROR_INVALID_PARAMETER") + +#if 0 +#define atomic_int_inc(atomic) \ + (__extension__({ \ + STATIC_ASSERT (sizeof *(atomic) == sizeof (int)); \ + (void) (0 ? *(atomic) ^ *(atomic) : 0); \ + (void) __sync_fetch_and_add ((atomic), 1); \ + })) +#endif + + +#define MEDIA_FORMAT_CAST(obj) ((media_format_s*)(obj)) + +/** + * @brief Check whether given media format is for audio or not + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_IS_AUDIO(x_fmt) (MEDIA_FORMAT_CAST(x_fmt)->mimetype & MEDIA_FORMAT_AUDIO) + +/** + * @brief Check whether given media format is for video or not + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_IS_VIDEO(x_fmt) (MEDIA_FORMAT_CAST(x_fmt)->mimetype & MEDIA_FORMAT_VIDEO) + +/** + * @brief Check whether given media format is for text or not + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_IS_TEXT(x_fmt) (false) + +/** + * @brief Check whether given media format is for raw type or not + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_IS_RAW(x_fmt) (MEDIA_FORMAT_CAST(x_fmt)->mimetype & MEDIA_FORMAT_RAW) + +/** + * @brief Check whether given media format is for encoded type or not + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_IS_ENCODED(x_fmt) (MEDIA_FORMAT_CAST(x_fmt)->mimetype & MEDIA_FORMAT_ENCODED) + +/** + * @brief Gets the number of media format ref_count + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_GET_REFCOUNT(x_fmt) (g_atomic_int_get(&(MEDIA_FORMAT_CAST(x_fmt))->ref_count)) + +/** + * @brief Check whether given media format is writable or not + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_IS_WRITABLE(x_fmt) (MEDIA_FORMAT_GET_REFCOUNT(x_fmt) == 1) + +/** + * @brief increase the media format's ref_count + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_INC_REFCOUNT(x_fmt) (g_atomic_int_inc(&(MEDIA_FORMAT_CAST(x_fmt))->ref_count)) + +/** + * @brief decrease the media format's ref_count and return true if ref_count become zero. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_FORMAT_DEC_REFCOUNT_TEST(x_fmt) (g_atomic_int_dec_and_test(&(MEDIA_FORMAT_CAST(x_fmt))->ref_count)) + +/** + * @brief Media format for configuring video codec. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef struct _media_format_video_spec_s { + int width; /**< media format video width */ + int height; /**< media format video height */ + int avg_bps; /**< media format video average bps */ + int max_bps; /**< media format video max bps */ +} media_format_video_spec_s; + +/** + * @brief Media format for configuring audio codec. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef struct _media_fomat_audio_spec_s { + int channel; /**< media format audio's the number of channels */ + int samplerate; /**< media format audio sampling rate */ + int bit; /**< media format audio's the bit resolution */ + int avg_bps; /**< media format audio max bps */ +} media_format_audio_spec_s; + +/** + * @brief Structure of media format. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef struct _media_format_s +{ + int ref_count; /**< media format struct reference count */ + media_format_mimetype_e mimetype; /**< media format struct mimetype of media_format_mimetype_e */ + + union { + media_format_audio_spec_s audio; /**< media format struct audio of media_format_audio_spec_s */ + media_format_video_spec_s video; /**< media format struct video of media_format_video_spec_s */ + }detail; + +} media_format_s; + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MEDIA_FORMAT_PRIVATE_H__ */ + diff --git a/include/media_packet.h b/include/media_packet.h new file mode 100755 index 0000000..8c60d20 --- /dev/null +++ b/include/media_packet.h @@ -0,0 +1,714 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef __TIZEN_MEDIA_PACKET_H__ +#define __TIZEN_MEDIA_PACKET_H__ + +#include <tizen.h> +#include <stdint.h> + +#include <media_format.h> + +#include <tbm_type.h> +#include <tbm_surface.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file media_packet.h + * @brief This file contains the capi media tool API. + */ + +/** + * @addtogroup CAPI_MEDIA_TOOL_MODULE + * @{ + */ + +/** + * @brief The Media Packet handle. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef struct media_packet_s *media_packet_h; + +/** + * @brief Enumeration for media packet error. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum +{ + MEDIA_PACKET_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successful */ + MEDIA_PACKET_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */ + MEDIA_PACKET_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */ + MEDIA_PACKET_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Invalid operation */ + MEDIA_PACKET_ERROR_FILE_NO_SPACE_ON_DEVICE = TIZEN_ERROR_FILE_NO_SPACE_ON_DEVICE, /**< No space left on device */ +} media_packet_error_e; + +/** + * @brief Enumeration for media buffer flag. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +typedef enum +{ + MEDIA_PACKET_CODEC_CONFIG = 0x1, /**< The buffer marked as such contains codec initialization/codec specific data instead of media data */ + MEDIA_PACKET_END_OF_STREAM = 0x2, /**< The end of stream */ + MEDIA_PACKET_SYNC_FRAME = 0x4, /**< The buffer marked as such contains the data for a sync frame */ +} media_buffer_flags_e; + +/** + * @brief Enumeration for the return values of media packet finalize call back functions. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * @see media_packet_finalize_cb() + */ +typedef enum _finalize_cb_ret +{ + MEDIA_PACKET_REUSE = 0, /**< Packet handle is not destroyed */ + MEDIA_PACKET_FINALIZE, /**< Destroy packet handle */ +} media_packet_finalize_cb_ret_t; + +/** + * @brief Called when the media packet is destroyed. + * @details It will be invoked when media_packet_destroy() is called. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] error_code The error code of #media_packet_error_e + * @param[in] user_data The user data passed from the callback registration function + * + * @pre It will be invoked when media packet is destroyed. + * + * @retval #MEDIA_PACKET_REUSE Packet handle is not destroyed, the handle will be reused. + * @retval #MEDIA_PACKET_FINALIZE Destroy media packet handle, the handle will not be reused. + * + * @see media_packet_destroy() + * @see media_packet_create_alloc() + * @see media_packet_create() + * @see media_packet_copy() + * @see media_packet_create_from_tbm_surface() + */ +typedef int (*media_packet_finalize_cb)(media_packet_h packet, int error_code, void *user_data); + +/** + * @brief Creates a media packet handle and allocates buffer. + * @details The buffer will be allocated to heap or tbm_surface. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @remarks The @c packet must be released by using media_packet_destroy(). + * @param[in] fmt The allocated #media_format_h by caller + * @param[in] fcb The media_packet_finalize_cb() to register + * @param[in] fcb_data The user data to be passed to the media_packet_finalize_cb() function + * @param[out] packet A new handle for media packet + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @pre Must have media_format_h instance by media_format_create() + * @post Must do media_format_unref() + * + * @see media_packet_destroy() + * @see media_packet_finalize_cb() + * @see media_format_unref() + * @par Example + @code + #include <media_packet.h> + + { + media_format_h fmt; + media_packet_h packet; + + media_format_create(&fmt); + media_format_set_video_mime(fmt, MEDIA_FORMAT_H264_HP); + media_format_set_video_width(fmt, 640); + media_format_set_video_height(fmt, 480); + media_format_set_video_avg_bps(fmt, 10000000); + media_format_set_video_max_bps(fmt, 15000000); + + media_packet_create_alloc (fmt, _finalize_callback, fcb_data, &packet); + media_format_unref(fmt); + + ... + media_packet_destroy(packet); + } + + int _finalize_callback(media_packet_h packet, int err, void* userdata) + { + ... + return MEDIA_PACKET_FINALIZE; + } + + @endcode + */ +int media_packet_create_alloc(media_format_h fmt, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h *packet); + +/** + * @brief Creates a media packet handle. + * @details It creates only media packet handle without allocated buffer. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @remarks The @c packet must be released by using media_packet_destroy(). + * @param[in] fmt The allocated #media_format_h by caller + * @param[in] fcb The media_packet_finalize_cb() to register + * @param[in] fcb_data The user data to be passed to the media_packet_finalize_cb() function + * @param[out] packet A new handle for media packet + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @pre Must have media_format_h instance by media_format_create() + * @post Must do media_format_unref() + * + * @see media_packet_destroy() + * @see media_packet_finalize_cb() + * @see media_format_unref() + * @par Example + @code + #include <media_packet.h> + + { + media_format_h fmt; + media_packet_h packet; + + media_format_create(&fmt); + media_format_set_video_mime(fmt, MEDIA_FORMAT_H264_HP); + media_format_set_video_width(fmt, 640); + media_format_set_video_height(fmt, 480); + media_format_set_video_avg_bps(fmt, 10000000); + media_format_set_video_max_bps(fmt, 15000000); + + media_packet_create (fmt, _finalize_callback, fcb_data, &packet); + media_format_unref(fmt); + + ... + media_packet_destroy(packet); + } + + int _finalize_callback(media_packet_h packet, int err, void* userdata) + { + ... + return MEDIA_PACKET_FINALIZE; + } + + @endcode + */ +int media_packet_create(media_format_h fmt, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h *packet); + +/** + * @brief Copies a media packet handle. + * @details It re-creates only media packet handle with exist media packet handle. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @remarks The @c new_packet must be released by using media_packet_destroy(). + * @param[in] org_packet The existing media packet handle + * @param[in] fcb The media_packet_finalize_cb() to register + * @param[in] fcb_data The user data to be passed to the media_packet_finalize_cb() function + * @param[out] new_packet A new handle for media packet + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_packet_destroy() + * @see media_packet_finalize_cb() + */ +int media_packet_copy(media_packet_h org_packet, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h* new_packet); + +/** + * @brief Allocates buffer with media packet handle. + * @details Before using media_packet_alloc(), media packet handle must be exist. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The existing media packet handle + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_packet_create() + * @see media_packet_destroy() + */ +int media_packet_alloc(media_packet_h packet); + +/** + * @brief Creates media packet handle and allocates buffer with #tbm_surface_h. + * + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @remarks The @c packet must be released by using media_packet_destroy(). + * @param[in] fmt The allocated #media_format_h by caller + * @param[in] surface The #tbm_surface_h by caller + * @param[in] fcb The media_packet_finalize_cb() to register + * @param[in] fcb_data The user data to be passed to the media_packet_finalize_cb() function + * @param[out] packet A new handle for media packet + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_OUT_OF_MEMORY Out of memory + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @pre Must have media_format_h instance by media_format_create() + * @post Must do media_format_unref() + * + * @see media_packet_destroy() + * @see media_packet_finalize_cb() + * @see media_format_unref() + * @par Example + @code + #include <media_packet.h> + + { + media_format_h fmt; + media_packet_h packet; + + media_format_create(&fmt); + media_format_set_video_mime(fmt, MEDIA_FORMAT_H264_HP); + media_format_set_video_width(fmt, 640); + media_format_set_video_height(fmt, 480); + media_format_set_video_avg_bps(fmt, 10000000); + media_format_set_video_max_bps(fmt, 15000000); + + media_packet_create_from_tbm_surface (fmt, surface, _finalize_callback, fcb_data, &packet); + media_format_unref(fmt); + + ... + media_pacekt_destory(packet); + } + + int _finalize_callback(media_packet_h packet, int err, void* userdata) + { + ... + return MEDIA_PACKET_FINALIZE; + } + + @endcode + */ +int media_packet_create_from_tbm_surface(media_format_h fmt, tbm_surface_h surface, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h *packet); + +/** + * @brief Gets #media_format_h of media packet + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] fmt The media format of media packet + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see media_format_unref() + * @par Example + @code + #include <media_packet.h> + + { + media_format_h* fmt; + + media_packet_get_format (pakcet, &fmt); + .. + + media_format_unref(fmt); + ... + } + + @endcode + */ +int media_packet_get_format(media_packet_h packet, media_format_h *fmt); + +/** + * @brief Sets #media_format_h of media packet + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] fmt The #media_format_h to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * + * @see media_format_unref() + * @par Example + @code + #include <media_packet.h> + + { + media_format_h fmt; + + media_packet_set_format (pakcet, fmt); + .. + + media_format_unref(fmt); + ... + } + + @endcode + */ +int media_packet_set_format(media_packet_h packet, media_format_h fmt); + +/** + * @brief Sets PTS of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] pts The PTS value to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_set_pts(media_packet_h packet, uint64_t pts); + +/** + * @brief Sets DTS of media packet handle. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] dts The DTS value to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_set_dts(media_packet_h packet, uint64_t dts); + +/** + * @brief Sets PTS of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] duration The duration value to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_set_duration(media_packet_h packet, uint64_t duration); + +/** + * @brief Sets buffer size of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] size The buffer size value to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_set_buffer_size(media_packet_h packet, uint64_t size); + +/** + * @brief Gets PTS of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] pts The PTS value to get + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + */ +int media_packet_get_pts(media_packet_h packet, uint64_t *pts); + +/** + * @brief Gets DTS of media packet + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] dts The DTS value to get + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_get_dts(media_packet_h packet, uint64_t *dts); + +/** + * @brief Gets duration of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] duration The duration value to get + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_get_duration(media_packet_h packet, uint64_t *duration); + +/** + * @brief Gets buffer size of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] size The buffer size value to get + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_get_buffer_size(media_packet_h packet, uint64_t *size); + +/** + * @brief Gets buffer data pointer of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] data The allocated buffer data pointer + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_get_buffer_data_ptr(media_packet_h packet, void **data); + +/** + * @brief Gets TBM surface data of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] surface The tbm_surface data pointer + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_get_tbm_surface(media_packet_h packet, tbm_surface_h *surface); + +/** + * @brief Sets extra data of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] extra The extra data to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_set_extra(media_packet_h packet, void *extra); + +/** + * @brief Gets extra data of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] extra The extra data to get + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_get_extra(media_packet_h packet, void **extra); + +/** + * @brief Checks whether the given media packet is for video. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_video @c true if the given media packet is for video, + * otherwise @c false if the given media packet is not for video + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_format_mimetype_e + * @see media_format_type_e + */ +int media_packet_is_video(media_packet_h packet, bool *is_video); + +/** + * @brief Checks whether the given media packet is for audio. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_audio @c true if the given media packet is for audio, + * otherwise @c false if the given media packet is not for audio + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * @see media_format_mimetype_e + * @see media_format_type_e + */ +int media_packet_is_audio(media_packet_h packet, bool *is_audio); + +/** + * @brief Checks whether the given media packet is encoded type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_encoded @c true if the given media packet is encoded, + * otherwise @c false if the given media packet is not encoded + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_format_mimetype_e + * @see media_format_data_type_e + */ +int media_packet_is_encoded(media_packet_h packet, bool *is_encoded); + +/** + * @brief Checks whether the given media packet is raw type. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_raw @c true if the given media packet is for raw video, + * otherwise @c false if the given media packet is not for raw video + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_format_mimetype_e + * @see media_format_data_type_e + */ +int media_packet_is_raw(media_packet_h packet, bool *is_raw); + +/** + * @brief Sets #media_buffer_flags_e of media packet. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] flags The media_buffer_flags_e of media packet to set + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_buffer_flags_e + * @see media_packet_unset_flags() + */ +int media_packet_set_flags(media_packet_h packet, media_buffer_flags_e flags); + +/** + * @brief Unsets media_buffer_flags_e of media packet + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[in] flags The media_buffer_flags_e of media packet to unset + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_buffer_flags_e + * @see media_packet_set_flags() + * */ +int media_packet_unset_flags(media_packet_h packet, media_buffer_flags_e flags); + +/** + * @brief Checks whether the given media packet is codec data. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_codec_config @c true if the given media packet is for codec data, + * otherwise @c false if the given media packet is not for codec data + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_format_mimetype_e + * @see media_format_data_type_e + */ +int media_packet_is_codec_config(media_packet_h packet, bool *is_codec_config); + +/** + * @brief Checks whether the given media packet is eos. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_eos @c true if the given media packet is for eos, + * otherwise @c false if the given media packet is not for eos + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_format_mimetype_e + * @see media_format_data_type_e + */ +int media_packet_is_end_of_stream(media_packet_h packet, bool *is_eos); + +/** + * @brief Checks whether the given media packet is sync frame. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] is_sync @c true if the given media packet is for sync frame, + * otherwise @c false if the given media packet is not for sync frame + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_format_mimetype_e + * @see media_format_data_type_e + */ +int media_packet_is_sync_frame(media_packet_h packet, bool *is_sync); + +/** + * @brief Checks whether the allocated buffer is tbm surface or not. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The media packet handle + * @param[out] has_tbm_surface @c true if the given media packet's allocated buffer is tbm surface, + * otherwise @c false if the given media packet's allocated buffer is not tbm surface + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + */ +int media_packet_has_tbm_surface_buffer(media_packet_h packet, bool* has_tbm_surface); + +/** + * @brief Destroys the media packet handle. + * @details The registered finalize_callback() function will be invoked to destroy the media packet handle. + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + * + * @param[in] packet The handle to media packet to be destroyed + * + * @retval #MEDIA_PACKET_ERROR_NONE Successful + * @retval #MEDIA_PACKET_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #MEDIA_PACKET_ERROR_INVALID_OPERATION Invalid operation + * + * @see media_packet_create_alloc() + * @see media_packet_create() + * @see media_packet_copy() + * @see media_packet_create_from_tbm_surface() + */ +int media_packet_destroy(media_packet_h packet); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MEDIA_AV_PACKET_BUFFER_H__ */ diff --git a/include/media_packet_private.h b/include/media_packet_private.h new file mode 100755 index 0000000..e9d9176 --- /dev/null +++ b/include/media_packet_private.h @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef __TIZEN_MEDIA_PACKET_PRIVATE_H__ +#define __TIZEN_MEDIA_PACKET_PRIVATE_H__ + +#include <media_packet.h> +#include <media_format_private.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "TIZEN_MEDIA_TOOL" + +#define MEDIA_PACKET_CHECK_CONDITION(condition,error,msg) \ + if(condition) {} else \ + { LOGE("[%s] %s(0x%08x)", __FUNCTION__, msg,error); return error;}; \ + +#define MEDIA_PACKET_INSTANCE_CHECK(media_packet) \ + MEDIA_PACKET_CHECK_CONDITION(media_packet != NULL, MEDIA_PACKET_ERROR_INVALID_PARAMETER, "MEDIA_PACKET_ERROR_INVALID_PARAMETER") + +#define MEDIA_PACKET_NULL_ARG_CHECK(arg) \ + MEDIA_PACKET_CHECK_CONDITION(arg != NULL, MEDIA_PACKET_ERROR_INVALID_PARAMETER, "MEDIA_PACKET_ERROR_INVALID_PARAMETER") + +/** + * @brief Gets pts of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_PTS(arg) (MEDIA_PACKET_CAST(arg)->pts) + +/** + * @brief Gets dts of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_DTS(arg) (MEDIA_PACKET_CAST(arg)->dts) + +/** + * @brief Gets duration of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_DURATION(arg) (MEDIA_PACKET_CAST(arg)->duration) + +/** + * @brief Gets size of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_SIZE(arg) (MEDIA_PACKET_CAST(arg)->size) + +/** + * @brief Gets data of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_DATA(arg) (MEDIA_PACKET_CAST(arg)->data) + +/** + * @brief Gets the buffer flags of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_FLAGS(arg) (MEDIA_PACKET_CAST(arg)->flags) + +/** + * @brief Gets the buffer config flag of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_CODEC_CONFIG_DATA(arg) (((MEDIA_PACKET_CAST(arg)->flags) >> 0) & 0x001) + +/** + * @brief Gets the buffer eos flag of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_CODEC_END_OF_STREAM(arg) (((MEDIA_PACKET_CAST(arg)->flags) >> 1) & 0x001) + +/** + * @brief Gets the buffer sync flag of media_packet_h + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_CODEC_SYNC_FRAME(arg) (((MEDIA_PACKET_CAST(arg)->flags) >> 2) & 0x001) + +/** + * @brief Casting to media_packet_s + * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif + */ +#define MEDIA_PACKET_CAST(obj) ((media_packet_s*)(obj)) + + +typedef enum { + MEDIA_BUFFER_TYPE_TBM_SURFACE, + MEDIA_BUFFER_TYPE_EXTERNAL_TBM_SURFACE, + MEDIA_BUFFER_TYPE_NORMAL, + MEDIA_BUFFER_TYPE_AUTO, + MEDIA_BUFFER_TYPE_MAX +} media_buffer_type_e; + +typedef struct _media_packet_s{ + + uint64_t pts; + uint64_t dts; + uint64_t duration; + uint64_t size; + void* data; + void* surface_data; + media_packet_finalize_cb finalizecb_func; + void* userdata; + bool is_allocated; + void *extradata; + + media_format_s* format; + media_buffer_type_e type; + media_buffer_flags_e flags; + +} media_packet_s; + +#ifdef __cplusplus +} +#endif + +#endif /* __TIZEN_MEDIA_PACKET_PRIVATE_H__ */ + diff --git a/packaging/capi-media-tool.spec b/packaging/capi-media-tool.spec new file mode 100755 index 0000000..c78819f --- /dev/null +++ b/packaging/capi-media-tool.spec @@ -0,0 +1,74 @@ +Name: capi-media-tool +Summary: A Core API media tool library in Tizen Native API +Version: 0.1.1 +Release: 0 +Group: Multimedia/API +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(libtbm) + +Requires(post): /sbin/ldconfig +Requires(post): libprivilege-control +Requires(postun): /sbin/ldconfig + +%description + + +%package devel +Summary: A Core API media tool library in Tizen Native API (Development) +Group: TO_BE/FILLED_IN +Requires: %{name} = %{version}-%{release} +Requires: pkgconfig(libtbm) + +%description devel + +%prep +%setup -q + + +%build +%if 0%{?sec_build_binary_debug_enable} +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +%endif +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +cmake . -DCMAKE_INSTALL_PREFIX=/usr -DFULLVER=%{version} -DMAJORVER=${MAJORVER} + + +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +mkdir -p %{buildroot}/usr/bin +mkdir -p %{buildroot}/opt/usr/devel +cp test/media_packet_test %{buildroot}/opt/usr/devel +cp LICENSE.APLv2 %{buildroot}/usr/share/license/%{name} + +%make_install + +%post +/sbin/ldconfig + +%postun -p /sbin/ldconfig + + +%files +%manifest capi-media-tool.manifest +%{_libdir}/libcapi-media-tool.so.* +%{_datadir}/license/%{name} +/opt/usr/devel/* +#%{_bindir}/* + +%files devel +%{_includedir}/media/*.h +%{_libdir}/pkgconfig/*.pc +%{_libdir}/libcapi-media-tool.so + + diff --git a/src/media_format.c b/src/media_format.c new file mode 100755 index 0000000..e7a7fe8 --- /dev/null +++ b/src/media_format.c @@ -0,0 +1,484 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <dlog.h> +#include <media_format.h> +#include <media_format_private.h> + +static void _media_format_destroy(media_format_s* fmt); + +int media_format_create(media_format_h* fmt) +{ + MEDIA_FORMAT_NULL_ARG_CHECK(fmt); + int ret = MEDIA_FORMAT_ERROR_NONE; + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)malloc(sizeof(media_format_s)); + if (fmt_handle) + { + memset(fmt_handle, 0, sizeof(media_format_s)); + } + else + { + return MEDIA_FORMAT_ERROR_OUT_OF_MEMORY; + } + + fmt_handle->ref_count = 1; + + *fmt = (media_format_h)fmt_handle; + + LOGI("The new format handle: %p \n", *fmt); + + return ret; +} + +static void _media_format_destroy(media_format_s* fmt) +{ + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + free(fmt); + fmt = NULL; +} + +int media_format_get_video_info(media_format_h fmt, media_format_mimetype_e* mimetype, int* width, int* height, int* avg_bps, int* max_bps) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_VIDEO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_VIDEO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + if (mimetype) + *mimetype = fmt_handle->mimetype; + if (width) + *width = fmt_handle->detail.video.width; + if (height) + *height = fmt_handle->detail.video.height; + if (avg_bps) + *avg_bps = fmt_handle->detail.video.avg_bps; + if (max_bps) + *max_bps = fmt_handle->detail.video.max_bps; + + return ret; +} + +int media_format_get_audio_info(media_format_h fmt, media_format_mimetype_e* mimetype, int* channel, int* samplerate, int* bit, int* avg_bps) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_AUDIO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_AUDIO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + if (mimetype) + *mimetype = fmt_handle->mimetype; + if (channel) + *channel = fmt_handle->detail.audio.channel; + if (samplerate) + *samplerate = fmt_handle->detail.audio.samplerate; + if (bit) + *bit = fmt_handle->detail.audio.bit; + if (avg_bps) + *avg_bps = fmt_handle->detail.audio.avg_bps; + + return ret; +} + +int media_format_set_video_mime(media_format_h fmt, media_format_mimetype_e mimetype) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("The format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(mimetype & MEDIA_FORMAT_VIDEO)) + { + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->mimetype = mimetype; + + return ret; +} + +int media_format_set_video_width(media_format_h fmt, int width) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("the format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_VIDEO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_VIDEO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.video.width = width; + + return ret; +} + +int media_format_set_video_height(media_format_h fmt, int height) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("The format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_VIDEO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_VIDEO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.video.height = height; + + return ret; +} + +int media_format_set_video_avg_bps(media_format_h fmt, int avg_bps) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("The format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_VIDEO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_VIDEO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.video.avg_bps = avg_bps; + + return ret; +} + +int media_format_set_video_max_bps(media_format_h fmt, int max_bps) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("The format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_VIDEO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_VIDEO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.video.max_bps = max_bps; + + return ret; +} + + +int media_format_set_audio_mime(media_format_h fmt, media_format_mimetype_e mimetype) +{ + + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("the format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(mimetype & MEDIA_FORMAT_AUDIO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_AUDIO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->mimetype = mimetype; + + return ret; +} + +int media_format_set_audio_channel(media_format_h fmt, int channel) +{ + + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("the format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_AUDIO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_AUDIO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.audio.channel = channel; + + return ret; +} + +int media_format_set_audio_samplerate(media_format_h fmt, int samplerate) +{ + + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("the format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_AUDIO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_AUDIO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.audio.samplerate = samplerate; + + return ret; +} + +int media_format_set_audio_bit(media_format_h fmt, int bit) +{ + + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("the format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_AUDIO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_AUDIO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.audio.bit = bit; + + return ret; +} + +int media_format_set_audio_avg_bps(media_format_h fmt, int avg_bps) +{ + + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + if (!MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + LOGE("the format can not be changed..\n", __FUNCTION__); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (!(fmt_handle->mimetype & MEDIA_FORMAT_AUDIO)) + { + LOGE("The format handle is not for MEDIA_FORMAT_AUDIO..\n"); + return MEDIA_FORMAT_ERROR_INVALID_PARAMETER; + } + + fmt_handle->detail.audio.avg_bps = avg_bps; + + return ret; +} + +int media_format_ref(media_format_h fmt) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (MEDIA_FORMAT_GET_REFCOUNT(fmt) <= 0) + { + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + g_atomic_int_inc(&fmt_handle->ref_count); + + return ret; +} + +int media_format_unref(media_format_h fmt) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + bool is_zero; + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (MEDIA_FORMAT_GET_REFCOUNT(fmt) <= 0) + { + LOGE("The format ref_count is less than 0..\n"); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + is_zero = g_atomic_int_dec_and_test(&fmt_handle->ref_count); + if (is_zero) + { + LOGI("The format handle(%p) will be destroyed..\n", fmt); + /* if reference count become 0 , free fmt. */ + _media_format_destroy(fmt_handle); + } + + return ret; +} + +int media_format_is_writable(media_format_h fmt, bool* is_writable) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + if (MEDIA_FORMAT_GET_REFCOUNT(fmt) <= 0) + { + LOGE("The format ref_count is less than 0..\n."); + ret = MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (g_atomic_int_get(&fmt_handle->ref_count) == 1) + { + /* if reference count is 1, the caller must be owner. */ + *is_writable = true; + } + else + { + *is_writable = false; + } + + return ret; +} + +int media_format_make_writable(media_format_h fmt, media_format_h* out_fmt) +{ + int ret = MEDIA_FORMAT_ERROR_NONE; + MEDIA_FORMAT_INSTANCE_CHECK(fmt); + + media_format_s* fmt_handle; + fmt_handle = (media_format_s*)fmt; + + if (MEDIA_FORMAT_IS_WRITABLE(fmt)) + { + /* If there is only one reference count on @fmt, the caller must be the owner */ + *out_fmt = fmt; + } + else + { + /* If there is more than one reference on the object, a new media_format_h object will be returned. + The caller's reference on @fmt will be removed, and instead the caller will own a reference to the returned object.*/ + media_format_s* copy; + copy = (media_format_s*)malloc(sizeof(media_format_s)); + if (copy) + { + memset(copy, 0, sizeof(media_format_s)); + } + else + { + return MEDIA_FORMAT_ERROR_OUT_OF_MEMORY; + } + + memcpy(copy, fmt_handle, sizeof(media_format_s)); + copy->ref_count = 1; + + if (media_format_unref(fmt) != MEDIA_FORMAT_ERROR_NONE) + { + free(copy); + return MEDIA_FORMAT_ERROR_INVALID_OPERATION; + } + + *out_fmt = (media_format_h)copy; + LOGI("the copied new format handle: %p\n", *out_fmt); + + } + + return ret; +} + + diff --git a/src/media_packet.c b/src/media_packet.c new file mode 100755 index 0000000..9487a00 --- /dev/null +++ b/src/media_packet.c @@ -0,0 +1,1312 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <dlog.h> +#include <media_format.h> +#include <media_packet.h> +#include <media_packet_private.h> +#include <media_format_private.h> + +/* NOTE : static internal functions does not check anything on incomming parameters + * Caller should takecare it + */ +static int _pkt_alloc_buffer(media_packet_s* pkt); +static uint64_t _pkt_calculate_video_buffer_size(media_packet_s* pkt); +static uint64_t _pkt_calculate_audio_buffer_size(media_packet_s* pkt); +static uint32_t _convert_to_tbm_surface_format(media_format_mimetype_e format_type); +static void* _aligned_malloc_normal_buffer_type (uint64_t size, int alignment); +static void _aligned_free_normal_buffer_type (void* buffer_ptr); + + +int media_packet_create_alloc(media_format_h fmt, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h *packet) +{ + media_packet_s* handle = NULL; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(fmt); + MEDIA_PACKET_NULL_ARG_CHECK(packet); + if (MEDIA_FORMAT_GET_REFCOUNT(fmt) < 1) + { + LOGE("The media format handle is corrupted or Not set media info"); + return MEDIA_PACKET_ERROR_INVALID_PARAMETER; + } + + if (!MEDIA_FORMAT_IS_VIDEO(fmt) && !MEDIA_FORMAT_IS_AUDIO(fmt)) + { + LOGE("The media format handle is not specified. set video info or audio info..."); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } + /* TODO : need more validation on fmt */ + + handle = (media_packet_s*)malloc(sizeof(media_packet_s)); + if (handle != NULL) + memset(handle, 0, sizeof(media_packet_s)); + else + { + LOGE("[%s] MEDIA_PACKET_ERROR_OUT_OF_MEMORY(0x%08x)" ,__FUNCTION__, MEDIA_PACKET_ERROR_OUT_OF_MEMORY); + ret = MEDIA_PACKET_ERROR_OUT_OF_MEMORY; + goto fail; + } + + /* TODO : need to consider to give application to select buffer type(tbm or heap) */ + + /* check if tbm surface is needed. + * This time, Only raw video format is considered to be allocated in TBM + */ + if (MEDIA_FORMAT_IS_VIDEO(fmt) && MEDIA_FORMAT_IS_RAW(fmt)) + { + handle->type = MEDIA_BUFFER_TYPE_TBM_SURFACE; + } + else + { + handle->type = MEDIA_BUFFER_TYPE_NORMAL; + } + + /* take fmt */ + handle->format = MEDIA_FORMAT_CAST(fmt); + + /* alloc buffer */ + int err = _pkt_alloc_buffer(handle); + if (err != MEDIA_PACKET_ERROR_NONE) + { + LOGE("[%s] failed _pkt_alloc_buffer(), err = (0x%08x)", __FUNCTION__, err); + ret = err; + goto fail; + } + + /* allocated buffer */ + handle->is_allocated = true; + + /* set finalized callback and user data */ + handle->finalizecb_func = fcb; + handle->userdata = fcb_data; + + /* increase format reference count */ + media_format_ref((media_format_h)handle->format); + + /* take handle */ + *packet = (media_packet_h)handle; + LOGI("[%s] new handle : %p", __FUNCTION__, *packet); + return ret; + +fail: + + if (handle) + { + free(handle); + handle = NULL; + } + + *packet = NULL; + return ret; +} + +int media_packet_create(media_format_h fmt, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h *packet) +{ + media_packet_s* handle = NULL; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(fmt); + MEDIA_PACKET_NULL_ARG_CHECK(packet); + if (MEDIA_FORMAT_GET_REFCOUNT(fmt) < 1) + { + LOGE("The media format handle is corrupted or Not set media info"); + return MEDIA_PACKET_ERROR_INVALID_PARAMETER; + } + + if (!MEDIA_FORMAT_IS_VIDEO(fmt) && !MEDIA_FORMAT_IS_AUDIO(fmt)) + { + LOGE("The media format handle is not specified. set video info or audio info..."); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } + /* TODO : need more validation on fmt */ + + handle = (media_packet_s*)malloc(sizeof(media_packet_s)); + if (handle != NULL) + memset(handle, 0, sizeof(media_packet_s)); + else + { + LOGE("[%s] MEDIA_PACKET_ERROR_OUT_OF_MEMORY(0x%08x)" ,__FUNCTION__, MEDIA_PACKET_ERROR_OUT_OF_MEMORY); + return MEDIA_PACKET_ERROR_OUT_OF_MEMORY; + } + + /* TODO : need to consider to give application to select buffer type(tbm or heap) */ + + /* check if tbm surface is needed. + * This time, Only raw video format is considered to be allocated in TBM + */ + if (MEDIA_FORMAT_IS_VIDEO(fmt) && MEDIA_FORMAT_IS_RAW(fmt)) + { + handle->type = MEDIA_BUFFER_TYPE_TBM_SURFACE; + } + else + { + handle->type = MEDIA_BUFFER_TYPE_NORMAL; + } + + /* take fmt */ + handle->format = MEDIA_FORMAT_CAST(fmt); + + /* NOT allocated buffer */ + handle->is_allocated = false; + + /* set finalized callback and user data */ + handle->finalizecb_func = fcb; + handle->userdata = fcb_data; + + /* increase format reference count */ + media_format_ref((media_format_h)handle->format); + + /* take handle */ + *packet = (media_packet_h)handle; + LOGI("[%s] new handle : %p", __FUNCTION__, *packet); + return ret; + +} + +int media_packet_copy(media_packet_h org_packet, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h* new_packet) +{ + media_packet_s* handle; + media_packet_s* org_handle; + + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(org_packet); + MEDIA_PACKET_NULL_ARG_CHECK(new_packet); + + org_handle = (media_packet_s*)org_packet; + + handle = (media_packet_s*)malloc(sizeof(media_packet_s)); + if (handle != NULL) + memset(handle, 0, sizeof(media_packet_s)); + else + { + LOGE("[%s] MEDIA_PACKET_ERROR_OUT_OF_MEMORY(0x%08x)" ,__FUNCTION__, MEDIA_PACKET_ERROR_OUT_OF_MEMORY); + return MEDIA_PACKET_ERROR_OUT_OF_MEMORY; + } + + /* copy handle*/ + memcpy(handle, org_handle, sizeof(media_packet_s)); + + /* the caller can not get exist allocated buffer pointer */ + handle->data = NULL; + handle->surface_data = NULL; + handle->is_allocated = false; + handle->size = 0; + + /* set finalized callback and user data */ + handle->finalizecb_func = fcb; + handle->userdata = fcb_data; + + /* increase format reference count */ + media_format_ref((media_format_h)handle->format); + + /* take handle */ + *new_packet = (media_packet_h)handle; + LOGI("[%s] new handle : %p", __FUNCTION__, *new_packet); + return ret; + +} + +int media_packet_alloc(media_packet_h packet) +{ + LOGI("[%s] start", __FUNCTION__); + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + /* alloc buffer */ + int err = _pkt_alloc_buffer(handle); + if (err != MEDIA_PACKET_ERROR_NONE) + { + LOGE("[%s] MEDIA_PACKET_ERROR_OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_PACKET_ERROR_OUT_OF_MEMORY); + ret = err; + goto fail; + } + + /* allocated buffer */ + handle->is_allocated = true; + + LOGI("[%s] end", __FUNCTION__); + return ret; + +fail: + if(handle) + { + free(handle); + handle = NULL; + } + return ret; + +} + + +int _pkt_alloc_buffer(media_packet_s* pkt) +{ + /* skip validating pkt */ + uint64_t buffersize = 0; + + /* need to use format,width,height to get buffer size for raw video frame */ + if (pkt->type == MEDIA_BUFFER_TYPE_TBM_SURFACE) + { + buffersize = _pkt_calculate_video_buffer_size(pkt); + pkt->size = buffersize; + /* NOTE : size of buffer may not equal to w*h*bpp. Not sure we need to + * do some verifying between given size and calculated size. + */ + } + else + { + buffersize = pkt->size; + } + + if (pkt->type == MEDIA_BUFFER_TYPE_NORMAL) + { + /* need to use format,width,height to get buffer size */ + if (MEDIA_FORMAT_IS_VIDEO(pkt->format)) + { + buffersize = _pkt_calculate_video_buffer_size(pkt); + // 16bytes aligned malloc + pkt->data = _aligned_malloc_normal_buffer_type(buffersize, 16); + if (!pkt->data) + { + return MEDIA_PACKET_ERROR_OUT_OF_MEMORY; + } + } + else + { + buffersize = _pkt_calculate_audio_buffer_size(pkt); + pkt->data = (void*)malloc(buffersize); + if (!pkt->data) + { + return MEDIA_PACKET_ERROR_OUT_OF_MEMORY; + } + } + pkt->size = buffersize; + } + else if (pkt->type == MEDIA_BUFFER_TYPE_TBM_SURFACE) + { + + /* convert to tbm_format*/ + uint32_t tbm_format; + tbm_format = _convert_to_tbm_surface_format(pkt->format->mimetype); + +#if 0 + /*check whether given tbm_format is supported or not*/ + uint32_t *supported_formats; + uint32_t supported_format_num; + bool is_supported_format; + int i; + + if (tbm_surface_query_formats(&supported_formats, &supported_format_num)) + { + is_supported_format = false; + for (i = 0 ; i < supported_format_num ; i++) + { + if (supported_formats[i] == tbm_format) + { + is_supported_format = true; + break; + } + } + + free (supported_formats); + } + else + { + /* tbm_surface_query_format returns error */ + LOGE("tbm_surface_query_format is failed.."); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } + + /* if not supported tbm_format by backend, don't need to do tbm_surface_create() */ + if (!is_supported_format) + { + LOGE("the backend doesn't support 0x%x mimetype", pkt->format->mimetype); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } +#endif + /*create tbm_surface*/ + pkt->surface_data = (void*)tbm_surface_create(pkt->format->detail.video.width, pkt->format->detail.video.height, tbm_format); + if (pkt->surface_data != NULL) + { + + /* get tbm_surface_info */ + tbm_surface_info_s surface_info; + int err = tbm_surface_get_info((tbm_surface_h)pkt->surface_data, &surface_info); + if (err == TBM_SURFACE_ERROR_NONE) + { + pkt->data = surface_info.planes[0].ptr; + pkt->size = (uint64_t)surface_info.size; + LOGD("tbm_surface_created, pkt->size = %llu\n", pkt->size); + } + else + { + LOGE("tbm_surface_get_info() is failed.. err = 0x%08x \n", err); + tbm_surface_destroy((tbm_surface_h)pkt->surface_data); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } + } + else + { + LOGE("\n tbm_surface_create() is failed!! \n"); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } + + } + return MEDIA_PACKET_ERROR_NONE; +} + +/* TODO : rename below macro or make it able to use original from mm_transform */ +#define _ROUND_UP_16(num) (((num)+15)&~15) +#define _GEN_MASK(x) ((1<<(x))-1) +#define _ROUND_UP_X(v,x) (((v) + _GEN_MASK(x)) & ~_GEN_MASK(x)) +#define _DIV_ROUND_UP_X(v,x) (((v) + _GEN_MASK(x)) >> (x)) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +static uint64_t _pkt_calculate_video_buffer_size(media_packet_s* pkt) +{ + unsigned char x_chroma_shift = 0; + unsigned char y_chroma_shift = 0; + int size, w2, h2, size2; + int stride, stride2; + int width = 0; + int height = 0; + uint64_t buffersize = 0; + + if (MEDIA_FORMAT_IS_VIDEO(pkt->format)) { + width = pkt->format->detail.video.width; + height = pkt->format->detail.video.height; + } + + /* TODO : need to check type mapping again with mm_transform */ + switch (pkt->format->mimetype) + { + + case MEDIA_FORMAT_I420: + x_chroma_shift = 1; + y_chroma_shift = 1; + stride = _ROUND_UP_16 (width); + h2 = _ROUND_UP_X (height, x_chroma_shift); + size = stride * h2; + w2 = _DIV_ROUND_UP_X (width, x_chroma_shift); + stride2 = _ROUND_UP_16 (w2); + h2 = _DIV_ROUND_UP_X (height, y_chroma_shift); + size2 = stride2 * h2; + buffersize = size + 2 * size2; + break; + + case MEDIA_FORMAT_YUYV: + case MEDIA_FORMAT_UYVY: + case MEDIA_FORMAT_NV16: + stride = _ROUND_UP_16 (width * 2); + size = stride * height; + buffersize = size; + break; + + case MEDIA_FORMAT_RGB565: + stride = _ROUND_UP_16 (width * 2); + size = stride * height; + buffersize = size; + break; + + case MEDIA_FORMAT_RGB888: + stride = _ROUND_UP_16 (width * 3); + size = stride * height; + buffersize = size; + break; + + case MEDIA_FORMAT_ARGB: + case MEDIA_FORMAT_RGBA: + stride = width * 4; + size = stride * height; + buffersize = size; + break; + + case MEDIA_FORMAT_NV12: + case MEDIA_FORMAT_NV12T: + case MEDIA_FORMAT_H261: + case MEDIA_FORMAT_H263: + case MEDIA_FORMAT_H263P: + case MEDIA_FORMAT_H264_SP: + case MEDIA_FORMAT_H264_MP: + case MEDIA_FORMAT_H264_HP: + case MEDIA_FORMAT_MJPEG: + case MEDIA_FORMAT_MPEG1: + case MEDIA_FORMAT_MPEG2_SP: + case MEDIA_FORMAT_MPEG2_MP: + case MEDIA_FORMAT_MPEG2_HP: + case MEDIA_FORMAT_MPEG4_SP: + case MEDIA_FORMAT_MPEG4_ASP: + x_chroma_shift = 1; + y_chroma_shift = 1; + stride = _ROUND_UP_16 (width); + h2 = _ROUND_UP_X (height, y_chroma_shift); + size = stride * h2; + w2 = 2 * _DIV_ROUND_UP_X (width, x_chroma_shift); + stride2 = _ROUND_UP_16 (w2); + h2 = _DIV_ROUND_UP_X (height, y_chroma_shift); + size2 = stride2 * h2; + buffersize = size + size2; + break; + default: + LOGE("Not supported format\n"); + return 0; + } + + LOGD("format 0x%x, buffersize %llu\n", pkt->format->mimetype, buffersize); + + return buffersize; +} + + +#define PCM_MAX_FRM_SIZE (2048) +#define PCM_MIN_FRM_SIZE (1024) +#define AAC_MAX_SAMPLE_SIZE (1024) +#define MP3_MAX_SAMPLE_SIZE (1152) +#define MPEG_MAX_FRM_SIZE (6144/4) /* 1536 */ +#define MPEG_MIN_NCH (2) + +static uint64_t _pkt_calculate_audio_buffer_size(media_packet_s* pkt) +{ + int channel = 0; + int bit = 0; + uint64_t buffersize = 0; + + if (!MEDIA_FORMAT_IS_VIDEO(pkt->format)) { + channel = pkt->format->detail.audio.channel; + bit = pkt->format->detail.audio.bit; + } + + switch (pkt->format->mimetype) + { + case MEDIA_FORMAT_PCM: + buffersize = (PCM_MAX_FRM_SIZE * channel) * (uint64_t)(bit /8); + break; + case MEDIA_FORMAT_AAC: + case MEDIA_FORMAT_MP3: + buffersize = (MPEG_MAX_FRM_SIZE * MPEG_MIN_NCH) * (uint64_t)(2); /* 2 = (16bit/8)*/ + break; + /* TODO : extenstion format */ + default: + LOGE("Not supported format\n"); + return 0; + } + + LOGD("format 0x%x, buffersize %llu\n", pkt->format->mimetype, buffersize); + + return buffersize; +} + +int media_packet_create_from_tbm_surface(media_format_h fmt, tbm_surface_h surface, media_packet_finalize_cb fcb, void *fcb_data, media_packet_h *packet) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + if (surface == NULL) + return MEDIA_PACKET_ERROR_INVALID_PARAMETER; + + MEDIA_PACKET_INSTANCE_CHECK(fmt); + MEDIA_PACKET_INSTANCE_CHECK(surface); + MEDIA_PACKET_NULL_ARG_CHECK(packet); + /* TODO : need more validation on fmt */ + + handle = (media_packet_s*)malloc( sizeof(media_packet_s)); + if (handle != NULL) + { + memset(handle, 0 , sizeof(media_packet_s)); + } + else + { + LOGE("[%s] MEDIA_PACKET_ERROR_OUT_OF_MEMORY(0x%08x)" ,__FUNCTION__,MEDIA_PACKET_ERROR_OUT_OF_MEMORY); + return MEDIA_PACKET_ERROR_OUT_OF_MEMORY; + } + + handle->type = MEDIA_BUFFER_TYPE_EXTERNAL_TBM_SURFACE; + handle->surface_data = (void*)surface; + + /* alloc handle->format */ + handle->format = MEDIA_FORMAT_CAST(fmt); + + /* get tbm_surface_info */ + tbm_surface_info_s surface_info; + int err = tbm_surface_get_info((tbm_surface_h)handle->surface_data, &surface_info); + if (err == TBM_SURFACE_ERROR_NONE) + { + handle->data = surface_info.planes[0].ptr; + handle->size = (uint64_t)surface_info.size; + } + else + { + LOGE("tbm_surface_get_info() is failed.. err =0x%08x", err); + ret = MEDIA_PACKET_ERROR_INVALID_OPERATION; + goto fail; + } + + /* allocated buffer */ + handle->is_allocated = true; + + /* set finalized callback and user data */ + handle->finalizecb_func = fcb; + handle->userdata = fcb_data; + + /* increase format reference count */ + ret = media_format_ref((media_format_h)handle->format); + + /* take handle */ + *packet = (media_packet_h)handle; + LOGI("[%s] new handle : %p", __FUNCTION__, *packet); + return ret; + +fail: + + if (handle) + { + free(handle); + handle = NULL; + } + + *packet = NULL; + return ret; +} + +int media_packet_get_buffer_data_ptr(media_packet_h packet, void **data) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(data); + + handle = (media_packet_s*) packet; + + *data = handle->data; + + return ret; + +} + +int media_packet_get_tbm_surface(media_packet_h packet, tbm_surface_h *surface) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(surface); + + handle = (media_packet_s*) packet; + + *surface = (tbm_surface_h)handle->surface_data; + + return ret; +} + +int media_packet_get_format(media_packet_h packet, media_format_h *fmt) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(fmt); + + handle = (media_packet_s*) packet; + + /* ref exist format */ + media_format_ref((media_format_h)handle->format); + + *fmt = (media_format_h)handle->format; + + return ret; +} + +int media_packet_set_format(media_packet_h packet, media_format_h fmt) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(fmt); + + handle = (media_packet_s*) packet; + + /* if trying to set same format, return*/ + if (handle->format == MEDIA_FORMAT_CAST(fmt)) + { + LOGE("The packet handle already refers the format handle..\n"); + return MEDIA_PACKET_ERROR_INVALID_OPERATION; + } + + /* unref exist format */ + media_format_unref((media_format_h)handle->format); + + /* set as new format to packet */ + handle->format = MEDIA_FORMAT_CAST(fmt); + + /* ref new format */ + media_format_ref(fmt); + + return ret; +} + +int media_packet_set_pts(media_packet_h packet, uint64_t pts) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + handle->pts = pts; + + return ret; +} + +int media_packet_set_dts(media_packet_h packet, uint64_t dts) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + handle->dts = dts; + + return ret; +} + +int media_packet_set_duration(media_packet_h packet, uint64_t duration) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + handle->duration = duration; + + return ret; +} + +int media_packet_set_buffer_size(media_packet_h packet, uint64_t size) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + handle->size = size; + + return ret; +} + +int media_packet_get_pts(media_packet_h packet, uint64_t *pts) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(pts); + + handle = (media_packet_s*) packet; + + *pts = handle->pts; + + return ret; +} + +int media_packet_get_dts(media_packet_h packet, uint64_t *dts) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(dts); + + handle = (media_packet_s*) packet; + + *dts = handle->dts; + + return ret; +} + +int media_packet_get_duration(media_packet_h packet, uint64_t *duration) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(duration); + + handle = (media_packet_s*) packet; + + *duration = handle->duration; + + return ret; +} + +int media_packet_get_buffer_size(media_packet_h packet, uint64_t *size) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(size); + + handle = (media_packet_s*) packet; + + *size = handle->size; + + return ret; +} + +int media_packet_set_extra(media_packet_h packet, void *extra) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(extra); + + handle = (media_packet_s*) packet; + + handle->extradata = extra; + + return ret; +} + +int media_packet_get_extra(media_packet_h packet, void **extra) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(extra); + + handle = (media_packet_s*) packet; + + *extra = handle->extradata; + + return ret; +} + +int media_packet_is_video(media_packet_h packet, bool *is_video) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_video); + + handle = (media_packet_s*) packet; + + if (MEDIA_FORMAT_IS_VIDEO(handle->format)) + *is_video = true; + else + *is_video = false; + + return ret; +} + +int media_packet_is_audio(media_packet_h packet, bool *is_audio) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_audio); + + handle = (media_packet_s*) packet; + + if (MEDIA_FORMAT_IS_AUDIO(handle->format)) + *is_audio = true; + else + *is_audio = false; + + return ret; +} + +int media_packet_is_encoded(media_packet_h packet, bool *is_encoded) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_encoded); + + handle = (media_packet_s*) packet; + + if (MEDIA_FORMAT_IS_ENCODED(handle->format)) + *is_encoded = true; + else + *is_encoded = false; + + return ret; +} + +int media_packet_is_raw(media_packet_h packet, bool *is_raw) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_raw); + + handle = (media_packet_s*) packet; + + if (MEDIA_FORMAT_IS_RAW(handle->format)) + *is_raw = true; + else + *is_raw = false; + + return ret; +} + +int media_packet_set_flags(media_packet_h packet, media_buffer_flags_e flags) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + handle->flags |= flags; + + return ret; +} + +int media_packet_unset_flags(media_packet_h packet, media_buffer_flags_e flags) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + handle->flags &= ~flags; + + return ret; +} + +int media_packet_is_codec_config(media_packet_h packet, bool *is_codec_config) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_codec_config); + + handle = (media_packet_s*) packet; + + if (MEDIA_PACKET_CODEC_CONFIG_DATA(packet)) + *is_codec_config = true; + else + *is_codec_config = false; + + return ret; +} + +int media_packet_is_end_of_stream(media_packet_h packet, bool *is_eos) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_eos); + + handle = (media_packet_s*) packet; + + if (MEDIA_PACKET_CODEC_END_OF_STREAM(packet)) + *is_eos = true; + else + *is_eos = false; + + return ret; +} + +int media_packet_is_sync_frame(media_packet_h packet, bool *is_sync) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(is_sync); + + handle = (media_packet_s*) packet; + + if (MEDIA_PACKET_CODEC_SYNC_FRAME(packet)) + *is_sync = true; + else + *is_sync = false; + + return ret; +} + +int media_packet_has_tbm_surface_buffer(media_packet_h packet, bool* has_tbm_surface) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + MEDIA_PACKET_NULL_ARG_CHECK(has_tbm_surface); + + handle = (media_packet_s*) packet; + + if ((handle->type == MEDIA_BUFFER_TYPE_TBM_SURFACE || handle->type == MEDIA_BUFFER_TYPE_EXTERNAL_TBM_SURFACE) && handle->surface_data) + { + *has_tbm_surface = true; + } + else + { + *has_tbm_surface = false; + } + return ret; +} + +int media_packet_destroy(media_packet_h packet) +{ + media_packet_s* handle; + int ret = MEDIA_PACKET_ERROR_NONE; + + MEDIA_PACKET_INSTANCE_CHECK(packet); + + handle = (media_packet_s*) packet; + + /* finailize callback */ + if (handle->finalizecb_func) + { + int finalize_cb_ret; + finalize_cb_ret = handle->finalizecb_func((media_packet_h)handle, MEDIA_PACKET_ERROR_NONE, handle->userdata); + + /* creator do not want to destroy media packet handle*/ + if(finalize_cb_ret == MEDIA_PACKET_REUSE) + { + LOGI("the media packet handle will be reused."); + return MEDIA_PACKET_ERROR_NONE; + } + } + + if(handle->type == MEDIA_BUFFER_TYPE_TBM_SURFACE) + { + if(handle->surface_data) + { + tbm_surface_destroy((tbm_surface_h)handle->surface_data); + } + } + else if (handle->type == MEDIA_BUFFER_TYPE_NORMAL) + { + if(handle->data) + { + _aligned_free_normal_buffer_type(handle->data); + handle->data = NULL; + } + } + else if (handle->type == MEDIA_BUFFER_TYPE_EXTERNAL_TBM_SURFACE) + { + // there is nothing to do + } + + /* unreference media_format */ + media_format_unref(handle->format); + + LOGI("The packet handle(%p) is will be destroyed..\n", handle); + + free(handle); + handle = NULL; + + return ret; +} + +static uint32_t _convert_to_tbm_surface_format(media_format_mimetype_e format_type) +{ + uint32_t tbm_format; + + switch(format_type) { + case MEDIA_FORMAT_NV12: + case MEDIA_FORMAT_NV12T: + tbm_format = TBM_FORMAT_NV12; + break; + case MEDIA_FORMAT_NV16: + tbm_format = TBM_FORMAT_NV16; + break; + case MEDIA_FORMAT_NV21: + tbm_format = TBM_FORMAT_NV21; + break; + case MEDIA_FORMAT_YUYV: + tbm_format = TBM_FORMAT_YUYV; + break; + case MEDIA_FORMAT_UYVY: + tbm_format = TBM_FORMAT_UYVY; + break; + case MEDIA_FORMAT_422P: + tbm_format = TBM_FORMAT_YUV422; + break; + case MEDIA_FORMAT_I420: + tbm_format = TBM_FORMAT_YUV420; + break; + case MEDIA_FORMAT_YV12: + tbm_format = TBM_FORMAT_YVU420; + break; + case MEDIA_FORMAT_RGB565: + tbm_format = TBM_FORMAT_RGB565; + break; + case MEDIA_FORMAT_RGB888: + tbm_format = TBM_FORMAT_RGB888; + break; + case MEDIA_FORMAT_RGBA: + tbm_format = TBM_FORMAT_RGBA8888; + break; + case MEDIA_FORMAT_ARGB: + tbm_format = TBM_FORMAT_ARGB8888; + break; + default: + LOGE("Invalid format mime type!"); + tbm_format = 0; + break; + } + + return tbm_format; +} + + +static void* _aligned_malloc_normal_buffer_type (uint64_t size, int alignment) +{ + unsigned char* buffer_ptr; + unsigned char* temp_ptr; + + if((temp_ptr = (void*)malloc(size + alignment)) != NULL) + { + buffer_ptr = (void*)((unsigned int)(temp_ptr + alignment - 1) & (~(unsigned int)(alignment -1))); + + if(buffer_ptr == temp_ptr) + { + buffer_ptr += alignment; + } + + *(buffer_ptr - 1) = (unsigned int)(buffer_ptr - temp_ptr); + return (void*)buffer_ptr; + } + + return NULL; +} + +static void _aligned_free_normal_buffer_type (void* buffer_ptr) +{ + unsigned char* ptr; + if (buffer_ptr == NULL) + return; + + ptr = (unsigned char*)buffer_ptr; + + // *(ptr - 1) holds the offset to the real allocated block + // we sub that offset os we free the real pointer + ptr -= *(ptr - 1); + + // Free the memory + free(ptr); + ptr = NULL; +} + +#if 0 +int media_tool_create(mediatool_h *mediatool) +{ + MediaTool_s *handle; + int ret; + handle = (MediaTool_s*)malloc(sizeof(MediaTool_s)); + + if (handle != NULL) + memset(handle, 0, sizeof(MediaTool_s)); + else + return MEDIA_TOOL_ERROR_OUT_OF_MEMORY; + + //TODO : make _media_tool_create function + //ret = _media_tool_create(&handle->mediatool_handle); + if(ret != MEDIA_TOOL_ERROR_NONE) + { + free(handle); + handle = NULL; + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + } + else + { + *mediatool = (mediatool_h*)handle; + handle->refcount = 1; + return MEDIA_TOOL_ERROR_NONE; + } +} + +int media_tool_destroy(mediatool_h mediatool) +{ + MediaTool_s* handle = (MediaTool_s *) mediatool; + int ret; + + if (handle == NULL) + return MEDIA_TOOL_ERROR_INVALID_PARAMETER; + + //TODO : make _media_tool_create function + ret = _media_tool_destroy(handle->mediatool_handle); + if (ret != MEDIA_TOOL_ERROR_NONE) + { + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + } + else + { + free(handle); + handle = NULL; + return MEDIA_TOOL_ERROR_NONE; + } +} + +int media_tool_is_Iframe(mediatool_h mediatool, bool *isIFrame) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + if (handle == NULL) + return MEDIA_TOOL_ERROR_INVALID_PARAMETER; + + *isIFrame = handle->videocodecformat->isIFrame; + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_set_buffer(mediatool_h mediatool, MediaToolBufferPrivate_s* privBuffer) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + handle->bufferpriv = (MediaToolBufferPrivate_s *)malloc(sizeof(MediaToolBufferPrivate_s)); + + if (handle->bufferpriv != NULL) + memset(handle->bufferpriv, 0, sizeof(MediaToolBufferPrivate_s)); + else + return MEDIA_TOOL_ERROR_OUT_OF_MEMORY; + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_get_buffer(mediatool_h mediatool, MediaToolBufferPrivate_s** privBuffer) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + if (handle->bufferpriv == NULL) + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + + memcpy(*privBuffer, handle->bufferpriv, sizeof(handle->bufferpriv)); + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_set_video_codec_format(mediatool_h mediatool, VideoCodecFormat_s* videoCodecFormat) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + handle->videocodecformat = (VideoCodecFormat_s *)malloc(sizeof(VideoCodecFormat_s)); + + if (handle->videocodecformat != NULL) + memset(handle->videocodecformat, 0, sizeof(VideoCodecFormat_s)); + else + return MEDIA_TOOL_ERROR_OUT_OF_MEMORY; + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_get_video_codec_format(mediatool_h mediatool, VideoCodecFormat_s** videoCodecFormat) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + if (handle->videocodecformat == NULL) + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + + memcpy(*videoCodecFormat, handle->videocodecformat, sizeof(handle->videocodecformat)); + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_set_audio_codec_format(mediatool_h mediatool, AudioCodecFormat_s* audioCodecFormat) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + handle->audiocodecformat = (AudioCodecFormat_s *)malloc(sizeof(AudioCodecFormat_s)); + + if (handle->audiocodecformat != NULL) + memset(handle->audiocodecformat, 0, sizeof(AudioCodecFormat_s)); + else + return MEDIA_TOOL_ERROR_OUT_OF_MEMORY; + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_get_audio_codec_format(mediatool_h mediatool, AudioCodecFormat_s** audioCodecFormat) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + int ret; + if (handle->audiocodecformat == NULL) + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + + memcpy(*audioCodecFormat, handle->audiocodecformat, sizeof(handle->audiocodecformat)); + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_ref(mediatool_h mediatool) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + + if (handle == NULL) + return MEDIA_TOOL_ERROR_INVALID_PARAMETER; + + if (!(handle->refcount> 0)) + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + + g_atomic_int_inc (&handle->refcount); + + return MEDIA_TOOL_ERROR_NONE; +} + +int media_tool_unref(mediatool_h mediatool) +{ + MediaTool_s *handle = (MediaTool_s *) mediatool; + + if (handle == NULL) + return MEDIA_TOOL_ERROR_INVALID_PARAMETER; + + if (!(handle->refcount> 0)) + return MEDIA_TOOL_ERROR_INVALID_OPERATION; + + int zero; + + zero = g_atomic_int_dec_and_test (&handle->refcount); + if (zero) + { + free(handle); + handle = NULL; + } + return MEDIA_TOOL_ERROR_NONE; +} + +#endif + diff --git a/src/media_packet_private.c b/src/media_packet_private.c new file mode 100755 index 0000000..5b20107 --- /dev/null +++ b/src/media_packet_private.c @@ -0,0 +1,20 @@ +/* +* Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include <glib.h> +#include <media_packet_private.h> + + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100755 index 0000000..aed006f --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,22 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +SET(fw_test "${fw_name}-test") + +INCLUDE_DIRECTORIES(../include) +link_directories(${CMAKE_SOURCE_DIR}/../) + +INCLUDE(FindPkgConfig) +pkg_check_modules(${fw_test} REQUIRED libtbm appcore-efl) +FOREACH(flag ${${fw_test}_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -pie") + +aux_source_directory(. sources) +FOREACH(src ${sources}) + GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) + MESSAGE("${src_name}") + ADD_EXECUTABLE(${src_name} ${src}) + TARGET_LINK_LIBRARIES(${src_name} capi-media-tool ${${fw_test}_LDFLAGS}) +ENDFOREACH() + diff --git a/test/media_packet_test.c b/test/media_packet_test.c new file mode 100755 index 0000000..ade3cde --- /dev/null +++ b/test/media_packet_test.c @@ -0,0 +1,1357 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <glib.h> + +#include <media_packet_private.h> +#include <media_format.h> +#include <media_format_private.h> + + +#include <appcore-efl.h> + +#define PACKAGE "media_tool_test" +#define MAX_STRING_LEN 2048 +#define MAX_HANDLE 10 +#define MEDIA_FORMAT_MAX_HANDLE 3 + + +enum +{ + CURRENT_STATUS_MAINMENU, + CURRENT_STATUS_PACKET_SET_FORMAT, + CURRENT_STATUS_DURATION, + CURRENT_STATUS_FORMAT_SET_VIDEO_MIME, + CURRENT_STATUS_FORMAT_SET_VIDEO_WIDTH, + CURRENT_STATUS_FORMAT_SET_VIDEO_HEIGHT, + CURRENT_STATUS_FORMAT_SET_VIDEO_AVG_BPS, + CURRENT_STATUS_FORMAT_SET_VIDEO_MAX_BPS, + CURRENT_STATUS_FORMAT_SET_AUDIO_MIME, + CURRENT_STATUS_FORMAT_SET_AUDIO_CHANNEL, + CURRENT_STATUS_FORMAT_SET_AUDIO_SAMPLERATE, + CURRENT_STATUS_FORMAT_SET_AUDIO_BIT, + CURRENT_STATUS_FORMAT_SET_AUDIO_AVG_BPS, +}; + + +char g_uri[MAX_STRING_LEN]; +int g_menu_state = CURRENT_STATUS_MAINMENU; +int g_handle_num = 1; +static media_packet_h g_media_packet[MAX_HANDLE] = {0}; + media_format_h g_media_format[MEDIA_FORMAT_MAX_HANDLE] = {0}; +int media_format_idx = -1; +bool is_only_created_handle; +bool is_excute_create; + +/***********************************************/ +/*** Test API part +/***********************************************/ +static void _media_format_create(void) +{ + int ret; + + if (g_media_format[0] == NULL) + { + int ret = media_format_create(&g_media_format[0]); + if (ret == MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_h[0] is created successfully! \n"); + media_format_idx = 0; + g_print("ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + } + else + { + g_print("media_format_create failed...\n"); + g_print("==> ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + } + } + else + { + ret = MEDIA_FORMAT_ERROR_INVALID_OPERATION; + g_print("\n can not create media_format_h handle anymore...already exist.\n"); + } + + +} + +static void _media_format_set_video_mime(int num) +{ + int ret; + if (num == 0) + { + ret = media_format_set_video_mime(g_media_format[media_format_idx], MEDIA_FORMAT_H264_HP); + } + else if (num == 1) + { + ret = media_format_set_video_mime(g_media_format[media_format_idx], MEDIA_FORMAT_RGB888); + } + else if (num == 2) + { + ret = media_format_set_video_mime(g_media_format[media_format_idx], MEDIA_FORMAT_I420); + } + else + { + g_print("Invalid number...\n"); + } + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_video_mime is succeeded!!\n"); + else + g_print("media_format_set_video_mime is failed...!!\n"); + +} + +static void _media_format_set_video_width(int w) +{ + int ret; + ret = media_format_set_video_width(g_media_format[media_format_idx], w); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_video_width is succeeded!!\n"); + else + g_print("media_format_set_video_width is failed...!!\n"); +} + +static void _media_format_set_video_height(int h) +{ + int ret; + ret = media_format_set_video_height(g_media_format[media_format_idx], h); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_video_height is succeeded!!\n"); + else + g_print("media_format_set_video_height is failed...!!\n"); + + +} + +static void _media_format_set_video_avg_bps(int avg_bps) +{ + int ret; + ret = media_format_set_video_avg_bps(g_media_format[media_format_idx], avg_bps); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_video_avg_bps is succeeded!!\n"); + else + g_print("media_format_set_video_avg_bps is failed...!!\n"); +} + +static void _media_format_set_video_max_bps(int max_bps) +{ + int ret; + ret = media_format_set_video_max_bps(g_media_format[media_format_idx], max_bps); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_video_max_bps is succeeded!!\n"); + else + g_print("media_format_set_video_max_bps is failed...!!\n"); +} + +static void _media_format_set_audio_mime(int num) +{ + int ret; + if (num == 0) + { + ret = media_format_set_audio_mime(g_media_format[media_format_idx], MEDIA_FORMAT_AMR); + } + else if (num == 1) + { + ret = media_format_set_audio_mime(g_media_format[media_format_idx], MEDIA_FORMAT_PCM); + } + else if (num == 2) + { + ret = media_format_set_audio_mime(g_media_format[media_format_idx], MEDIA_FORMAT_AAC); + } + else + { + g_print("Invalid number...\n"); + } + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_audio_mime is succeeded!!\n"); + else + g_print("media_format_set_audio_mime is failed...!!\n"); + +} + +static void _media_format_set_audio_channel(int channel) +{ + int ret; + ret = media_format_set_audio_channel(g_media_format[media_format_idx], channel); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_audio_channel is succeeded!!\n"); + else + g_print("media_format_set_audio_channel is failed...!!\n"); +} + +static void _media_format_set_audio_samplerate(int samplerate) +{ + int ret; + ret = media_format_set_audio_samplerate(g_media_format[media_format_idx], samplerate); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_audio_samplerate is succeeded!!\n"); + else + g_print("media_format_set_audio_samplerate is failed...!!\n"); +} + +static void _media_format_set_audio_bit(int bit) +{ + int ret; + ret = media_format_set_audio_bit(g_media_format[media_format_idx], bit); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_audio_bit is succeeded!!\n"); + else + g_print("media_format_set_audio_bit is failed...!!\n"); +} + +static void _media_format_set_audio_avg_bps(int avg_bps) +{ + int ret; + ret = media_format_set_audio_avg_bps(g_media_format[media_format_idx], avg_bps); + + if (ret == MEDIA_FORMAT_ERROR_NONE) + g_print("media_format_set_audio_avg_bps is succeeded!!\n"); + else + g_print("media_format_set_audio_avg_bps is failed...!!\n"); +} + +static void _create_format_320_240_es(void) +{ + + if (media_format_create(&g_media_format[1]) == MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_create is succeeded! \n"); + g_print("the media_format_h[1] is created..\n"); + int ret = MEDIA_FORMAT_ERROR_NONE; + media_format_idx = 1; + + media_format_mimetype_e mime = MEDIA_FORMAT_H264_HP; + int w = 320; + int h = 240; + int avg_bps = 3000000; + int max_bps = 15000000; + ret = media_format_set_video_mime(g_media_format[1], MEDIA_FORMAT_H264_HP); + ret = media_format_set_video_width(g_media_format[1], 320); + ret = media_format_set_video_height(g_media_format[1], 240); + ret = media_format_set_video_avg_bps(g_media_format[1], 3000000); + ret = media_format_set_video_max_bps(g_media_format[1], 15000000); + if (ret == MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_set_video_xxx succeed! w:%d, h:%d, 0x%x, avg_bps: %d, max_bps: %d\n", w, h, mime, avg_bps, max_bps); + g_print("\t\t\t\t ====>> ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[1])); + } + else + g_print("media_format_set_video_xxx failed..\n"); + } + else + { + g_print("media_format_create failed..\n"); + } + +} + + +static void _create_format_raw(void) +{ + + if (media_format_create(&g_media_format[2]) == MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_create is succeeded! \n"); + int ret = MEDIA_FORMAT_ERROR_NONE; + + media_format_mimetype_e mime = MEDIA_FORMAT_I420; + int w = 128; + int h = 128; + int avg_bps = 2000000; + int max_bps = 15000000; + ret = media_format_set_video_mime(g_media_format[2], mime); + ret = media_format_set_video_width(g_media_format[2], w); + ret = media_format_set_video_height(g_media_format[2], h); + ret = media_format_set_video_avg_bps(g_media_format[2], avg_bps); + ret = media_format_set_video_max_bps(g_media_format[2], max_bps); + if (ret == MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_set_video_xxx success! w:%d, h:%d, 0x%x, avg_bps: %d, max_bps: %d\n", w, h, mime, avg_bps, max_bps); + g_print("\t\t\t\t ====>> ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[2])); + } + else + g_print("media_format_set_video_xxx failed..\n"); + } + else + { + g_print("media_format_create failed..\n"); + } + + +} + +static int _finalize_callback(media_packet_h packet, int err, void* userdata) +{ + g_print("==> finalize callback func is called\n"); + return MEDIA_PACKET_FINALIZE; +} + +static void _media_packet_create_alloc(void) +{ + g_print("=== create_and_alloc!!\n"); + int i; + + for(i = 0; i < g_handle_num; i++) + { + if(g_media_packet[i] != NULL) + { + int ref_count = MEDIA_FORMAT_GET_REFCOUNT(g_media_format[media_format_idx]); + media_packet_destroy(g_media_packet[i]); + if (ref_count == 1) + { + g_media_format[media_format_idx] = NULL; + g_print("media_format_h[%d] is destroyed...\n", media_format_idx); + } + g_media_packet[i] = NULL; + } + + if(g_media_format[0] == NULL) + { + g_print("media_format_h is NULL!! create media_format_h handle \n"); + break; + } + + if (media_packet_create_alloc(g_media_format[0], _finalize_callback, NULL, &g_media_packet[i]) != MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet create is failed\n"); + } + else + { + media_format_idx = 0; + g_print("succeeded media_packet_create_alloc !!\n"); + g_print(" ==> media_format_h[0] ref_count =%d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + media_format_unref(g_media_format[0]); + g_print(" ====> media_format_unref, media_format_h[0] ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + is_excute_create = true; + } + + } +} + +static void _media_packet_create(void) +{ + g_print("=== create!!\n"); + is_only_created_handle = true; + int i; + + for(i = 0; i < g_handle_num; i++) + { + if(g_media_packet[i] != NULL) + { + int ref_count = MEDIA_FORMAT_GET_REFCOUNT(g_media_format[media_format_idx]); + media_packet_destroy(g_media_packet[i]); + if (ref_count == 1) + { + g_media_format[media_format_idx] = NULL; + g_print("media_format_h[%d] is destroyed...\n", media_format_idx); + } + g_media_packet[i] = NULL; + } + + if(g_media_format[0] == NULL) + { + g_print("media_format_h is NULL!! create media_format_h handle \n"); + break; + } + + /* only ES format , if you want to another format, see _create_format_es() */ + if (media_packet_create(g_media_format[0], _finalize_callback, NULL, &g_media_packet[i]) != MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet create is failed\n"); + } + else + { + media_format_idx = 0; + g_print("media_packet_create is sucess!!\n"); + g_print(" ==> media_format_h[0] ref_count =%d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + media_format_unref(g_media_format[0]); + g_print(" ====> media_format_unref, media_format_h[0] ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + is_excute_create = true; + } + } +} + +static void _media_packet_alloc(void) +{ + g_print("=== alloc!!\n"); + if (is_only_created_handle) + { + if (media_packet_alloc(g_media_packet[0]) == MEDIA_PACKET_ERROR_NONE) + g_print("media_packet_alloc is sucess\n"); + else + g_print("media_packet_alloc is failed\n"); + } + else + { + g_print("*** can not excute!! fisrt excute media_packet_create() before this alloc. \n"); + } +} + +static void _media_packet_create_from_tbm_surface(void) +{ + g_print("=== create_from_tbm_surface!!\n"); + + tbm_surface_h surface; + surface = tbm_surface_create(128, 128, TBM_FORMAT_YUV420); + + if (surface) + { + int i; + + for(i = 0; i < g_handle_num; i++) + { + if(g_media_packet[i] != NULL) + { + int ref_count = MEDIA_FORMAT_GET_REFCOUNT(g_media_format[media_format_idx]); + media_packet_destroy(g_media_packet[i]); + + if (ref_count == 1 ) + { + g_media_format[media_format_idx] = NULL; + g_print("media_format_h[%d] is destroyed...\n", media_format_idx); + } + + g_media_packet[i] = NULL; + } + + if(g_media_format[2] == NULL) + { + g_print("create raw video type media_format_h[2]... \n"); + _create_format_raw(); + } + + /* only RAW format , if you want to another format, see _create_format_raw() */ + if (media_packet_create_from_tbm_surface(g_media_format[2], surface, _finalize_callback, NULL, &g_media_packet[i]) != MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_create_from_tbm_surface is failed\n"); + } + else + { + g_print("media_packet_create_from_tbm_surface is sucess!!\n"); + g_print(" ==> media_format_h[2] ref_count =%d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[2])); + media_format_unref(g_media_format[2]); + g_print(" ====> media_format_unref, media_format_h[2] ref_count = %d\n", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[2])); + media_format_idx = 2; + is_excute_create = true; + } + } + + } + else + { + g_print("tbm_surface_create failed...\n"); + } +} + +static void _media_packet_copy(void) +{ + g_print("=== copy!!\n"); + + if (is_excute_create) + { + if (media_packet_copy(g_media_packet[0], _finalize_callback, NULL, &g_media_packet[1]) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_copy sucess !!"); + is_only_created_handle = true; + memset (g_media_packet[0], 0, sizeof(media_packet_s)); + memcpy (g_media_packet[0], g_media_packet[1], sizeof(media_packet_s)); + if(g_media_packet[1]) + { + free(g_media_packet[1]); + g_media_packet[1] = NULL; + } + + } + else + { + g_print("media_packet_copy failed"); + } + } + else + { + g_print("denied... excute create or create_alloc or create_from_surface"); + } + +} + +static void _media_packet_destroy() +{ + g_print("=== destroy!!\n"); + int i; + int ret; + + int ref_count; + + for (i = 0; i < g_handle_num ; i++) + { + if(g_media_packet[i]!=NULL) + { + ref_count = MEDIA_FORMAT_GET_REFCOUNT(g_media_format[media_format_idx]); + ret = media_packet_destroy(g_media_packet[i]); + g_media_packet[i] = NULL; + + if (ref_count == 1) + { + g_media_format[media_format_idx] = NULL; + g_print("media_format_h[%d] is destroyed...\n", media_format_idx); + } + + if (ret == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_destroy is succeeded!!\n"); + if (g_media_format[media_format_idx] != NULL) + g_print(" ==> media_format_h[%d] ref_count = %d\n", media_format_idx, MEDIA_FORMAT_GET_REFCOUNT(g_media_format[media_format_idx])); + } + else + g_print("media_packet_destroy is failed...\n"); + } + else + g_print("There is nothing to destroy media_packet_h[%d] handle...\n", i); + } +} + +static void _media_packet_get_buffer_size(void) +{ + uint64_t size; + if (media_packet_get_buffer_size(g_media_packet[0],&size) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_get_buffer_size is sucess!!"); + g_print("\t\t[media_packet]===> size = %llu", size); + } + else + { + g_print("media_packet_get_buffer_size is failed..."); + } +} + +static void _media_packet_get_duration(void) +{ + uint64_t duration; + + if (media_packet_get_duration(g_media_packet[0], &duration) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_get_duration is sucess!!"); + g_print("\t\t[media_packet]===> duration = %llu", duration); + } + else + { + g_print("media_packet_get_duration is failed..."); + } +} + +static void _media_packet_get_buffer_data_ptr(void) +{ + void* ptr; + media_packet_s* packet = g_media_packet[0]; + ptr = (void*)malloc(sizeof(packet->size)); + + if (ptr) + memset(packet, 0, sizeof(packet->size)); + else + g_print("_get_buffer_ptr , malloc failed..."); + + if (media_packet_get_buffer_data_ptr(g_media_packet[0], &ptr) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_get_buffer_data_ptr is sucess!!"); + g_print("\t\t[media_packet]===> buffer_data_ptr = %p", ptr); + } + else + { + g_print("media_packet_get_buffer_data_ptr is failed..."); + } + +} + +static void _media_packet_get_tbm_surface() +{ + tbm_surface_h tbm_surface; + + if (media_packet_get_tbm_surface(g_media_packet[0], &tbm_surface) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_get_tbm_surface is sucess!!"); + g_print("\t\t[media_packet]===> tbm_surface = %p", (void*)tbm_surface); + } + else + { + g_print("media_packet_get_duration is failed..."); + } +} + +static void _media_packet_set_duration(uint64_t duration) +{ + if (media_packet_set_duration(g_media_packet[0], duration) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_set_duration is sucess!!\n"); + } + else + { + g_print("media_packet_set_duration is failed..\n"); + } +} + +static void _media_packet_is_video(void) +{ + bool is_video; + if (media_packet_is_video(g_media_packet[0], &is_video) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_is_video is sucess!!\n"); + g_print("\t\t[media_packet]===> is_video = %d", is_video); + } + else + { + g_print("media_packet_is_video is failed..."); + } +} + +static void _media_packet_is_audio(void) +{ + bool is_audio; + if (media_packet_is_audio(g_media_packet[0], &is_audio) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_is_audio is sucess!!\n"); + g_print("\t\t[media_packet]===> is_audio = %d", is_audio); + } + else + { + g_print("media_packet_is_audio is failed..."); + } +} + +static void _media_packet_is_encoded(void) +{ + bool is_encoded; + if (media_packet_is_encoded(g_media_packet[0], &is_encoded) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_is_encoded is sucess!!\n"); + g_print("\t\t[media_packet]===> is_encoded = %d", is_encoded); + } + else + { + g_print("media_packet_is_encoded is failed..."); + } + +} +static void _media_packet_is_raw(void) +{ + bool is_raw; + if (media_packet_is_raw(g_media_packet[0], &is_raw) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_is_raw is sucess!!\n"); + g_print("\t\t[media_packet]===> is_raw = %d", is_raw); + } + else + { + g_print("media_packet_is_raw is failed..."); + } + +} + +static void _media_packet_get_format(void) +{ + media_format_h fmt; + if (media_packet_get_format(g_media_packet[0], &fmt) == MEDIA_PACKET_ERROR_NONE) + { + int w; + int h; + + int channel; + int samplerate; + int bit; + int audio_avg_bps; + + g_print("media_packet_get_format is sucess! %p \n", fmt); + + if (MEDIA_FORMAT_IS_VIDEO(fmt)) + { + if (media_format_get_video_info(fmt, NULL, &w, &h, NULL, NULL) == MEDIA_PACKET_ERROR_NONE) + { + g_print("\t\t [media_format] width = %d, height =%d", w, h); + } + else + { + g_print("media_format_get_video is failed..."); + } + } + else if (MEDIA_FORMAT_IS_AUDIO(fmt)) + { + if (media_format_get_audio_info(fmt, NULL, &channel, &samplerate, &bit, &audio_avg_bps) == MEDIA_PACKET_ERROR_NONE) + { + g_print("\t\t [media_format] channel = %d, samplerate = %d, bit = %d, avg_bps = %d", channel, samplerate, bit, audio_avg_bps); + } + else + { + g_print("media_format_get_video is failed..."); + } + } + + } + else + { + g_print("media_packet_get_format is failed..."); + } + +} + + +static void _media_packet_set_format(media_format_h fmt) +{ + if (media_packet_set_format(g_media_packet[0], fmt) == MEDIA_PACKET_ERROR_NONE) + { + media_format_unref(fmt); + g_print("media_packet_set_format is sucess!\n"); + } + else + { + g_print("media_packet_get_format is failed..."); + } + +} + +static void _media_packet_set_extra(void) +{ + char* extra = "extra"; + + if (media_packet_set_extra(g_media_packet[0], (void*)extra) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_set_extra is sucess!\n"); + } + else + { + g_print("media_packet_set_extra is failed..."); + } + +} + +static void _media_packet_get_extra(void) +{ + void* extra; + + if (media_packet_get_extra(g_media_packet[0], &extra) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_get_extra is sucess!\n"); + g_print("\t\t extra = %s\n", (char*)extra); + } + else + { + g_print("media_packet_get_extra is failed..."); + } + +} + +static void _media_packet_has_tbm_surface_buffer(void) +{ + bool has_tbm; + + if (media_packet_has_tbm_surface_buffer(g_media_packet[0], &has_tbm) == MEDIA_PACKET_ERROR_NONE) + { + g_print("media_packet_has_tbm_surface_buffer is sucess! \n"); + g_print("\t\t has_tbm_surface_buffer = %d \n", has_tbm); + } + else + { + g_print("media_packet_has_tbm_surface_buffer is failed! \n"); + } +} + +static void _media_format_get_video_info(void) +{ + media_format_mimetype_e mime; + int w = 0; + int h = 0; + int avg_bps = 0; + int max_bps = 0; + + if (media_format_get_video_info(g_media_format[0], &mime, &w, &h, &avg_bps, &max_bps) == MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_get_video is sucess!\n"); + g_print("\t\t[media_format_get_video]mime:0x%x, width :%d, height :%d\n", mime, w, h); + g_print("packet format ref_count: %d", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + } + else + { + g_print("media_format_get_video is failed.."); + } +} + +static void _media_format_get_audio_info(void) +{ + media_format_mimetype_e mime; + int channel = 0; + int samplerate = 0; + int bit = 0; + int avg_bps = 0; + + if (media_format_get_audio_info(g_media_format[0], &mime, &channel, &samplerate, &bit, &avg_bps)== MEDIA_FORMAT_ERROR_NONE) + { + g_print("media_format_get_audio_info is sucess!\n"); + g_print("\t\t[media_format_get_audio_info]mime:0x%x, channel :%d, samplerate :%d, bit: %d, avg_bps:%d \n", mime, channel, samplerate, bit, avg_bps); + g_print("packet format ref_count: %d", MEDIA_FORMAT_GET_REFCOUNT(g_media_format[0])); + } + else + { + g_print("media_format_get_audio_info is failed.."); + } +} + + +/***********************************************/ +/*** Test suit frame API part +/***********************************************/ +static int _create_app(void *data) +{ + printf("media_packet_test is started!\n"); + return 0; +} + +static int _terminate_app(void *data) +{ + printf("media_packet_test is terminated!\n"); + return 0; +} + + +struct appcore_ops ops = { + .create = _create_app, + .terminate = _terminate_app, +}; + +void reset_menu_state() +{ + g_menu_state = CURRENT_STATUS_MAINMENU; +} + +void quit_program(void) +{ + int i = 0; + int ref_count; + + for (i = 0; i < g_handle_num; i++) + { + if(g_media_packet[i] != NULL) + { + ref_count = MEDIA_FORMAT_GET_REFCOUNT(g_media_format[media_format_idx]); + media_packet_destroy(g_media_packet[i]); + g_media_packet[i] = NULL; + if (ref_count == 1) + { + g_media_format[media_format_idx] = NULL; + g_print("media_format_h[%d] is destroyed...\n", media_format_idx); + } + } + } + + + for (i = 0; i < MEDIA_FORMAT_MAX_HANDLE; i++) + { + if (g_media_format[i] != NULL) + { + int ref_count = MEDIA_FORMAT_GET_REFCOUNT(g_media_format[i]); + g_print("media_format_h[%d] ref_count:%d. excute media_format_unref().\n", i, ref_count); + + if (ref_count == 1) + { + media_format_unref(g_media_format[i]); + g_media_format[i] = NULL; + g_print("media_format_h[%d] is destroyed...\n", i); + } + else + { + + int j = 1; + for (j = 1; j <= ref_count; j++) + { + g_print("(%d) media_format_unref\n", j); + media_format_unref(g_media_format[i]); + + } + g_media_format[i] = NULL; + g_print("media_format_h[%d] is destroyed...\n", i); + } + + } + } + + elm_exit(); +} + +void _interpret_main_menu(char *cmd) +{ + int len = strlen(cmd); + if (len == 1) + { + if (strncmp(cmd, "a", 1) == 0) + { + _media_packet_create_alloc(); + } + else if (strncmp(cmd, "d", 1) == 0) + { + _media_packet_destroy(); + } + else if (strncmp(cmd, "b", 1) == 0) + { + _media_packet_create_from_tbm_surface(); + } + else if (strncmp(cmd, "c", 1) == 0) + { + _media_packet_copy(); + } + else if (strncmp(cmd, "q", 1) == 0) + { + quit_program(); + } + } + else if (len == 2) + { + if (strncmp(cmd, "aa", 2) == 0) + { + _media_packet_create(); + } + else if (strncmp(cmd, "ab", 2) == 0) + { + _media_packet_alloc(); + } + else if (strncmp(cmd, "iv", 2) == 0) + { + _media_packet_is_video(); + } + else if (strncmp(cmd, "ia", 2) == 0) + { + _media_packet_is_audio(); + } + else if (strncmp(cmd, "ie", 2) == 0) + { + _media_packet_is_encoded(); + } + else if (strncmp(cmd, "ir", 2) == 0) + { + _media_packet_is_raw(); + } + else if (strncmp(cmd, "gd", 2) == 0) + { + _media_packet_get_duration(); + } + else if (strncmp(cmd, "sd", 2) == 0) + { + g_menu_state = CURRENT_STATUS_DURATION; + } + else if (strncmp(cmd, "gf", 2) == 0) + { + _media_packet_get_format(); + } + else if (strncmp(cmd, "gs", 2) == 0) + { + _media_packet_get_buffer_size(); + } + else if (strncmp(cmd, "sf", 2) == 0) + { + g_menu_state = CURRENT_STATUS_PACKET_SET_FORMAT; + } + else if (strncmp(cmd, "se", 2) == 0) + { + _media_packet_set_extra(); + } + else if (strncmp(cmd, "ge", 2) == 0) + { + _media_packet_get_extra(); + } + else if (strncmp(cmd, "ht", 2) == 0) + { + _media_packet_has_tbm_surface_buffer(); + } + else if (strncmp(cmd, "cf", 2) == 0) + { + _media_format_create(); + } + + } + else if (len == 3) + { + if (strncmp(cmd, "gbp", 3) == 0) + { + _media_packet_get_buffer_data_ptr(); + } + else if (strncmp(cmd, "gts", 3) == 0) + { + _media_packet_get_tbm_surface(); + } + else if (strncmp(cmd, "fgv", 3) == 0) + { + _media_format_get_video_info(); + } + else if (strncmp(cmd, "fga", 3) == 0) + { + _media_format_get_audio_info(); + } + else if (strncmp(cmd, "svm", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_VIDEO_MIME; + } + else if (strncmp(cmd, "svw", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_VIDEO_WIDTH; + } + else if (strncmp(cmd, "svh", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_VIDEO_HEIGHT; + } + else if (strncmp(cmd, "sam", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_AUDIO_MIME; + } + else if (strncmp(cmd, "sac", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_AUDIO_CHANNEL; + } + else if (strncmp(cmd, "sas", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_AUDIO_SAMPLERATE; + } + else if (strncmp(cmd, "sab", 3) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_AUDIO_BIT; + } + } + else if (len == 4) + { + if (strncmp(cmd, "fraw", 4) == 0) + { + _create_format_raw(); + } + else if (strncmp(cmd, "fes2", 4) == 0) + { + _create_format_320_240_es(); + } + else if (strncmp(cmd, "svab", 4) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_VIDEO_AVG_BPS; + } + else if (strncmp(cmd, "svmb", 4) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_VIDEO_MAX_BPS; + } + else if (strncmp(cmd, "saab", 4) == 0) + { + g_menu_state = CURRENT_STATUS_FORMAT_SET_AUDIO_AVG_BPS; + } + } + + +} + +static void displaymenu(void) +{ + if (g_menu_state == CURRENT_STATUS_MAINMENU) + { + display_sub_basic(); + } + else if (g_menu_state == CURRENT_STATUS_PACKET_SET_FORMAT) + { + g_print("*** choose format.\n"); + g_print("1. 320x240 , MEDIA_FORMAT_H264_HP\n"); + g_print("2. 128x128 , MEDIA_FORMAT_I420\n"); + } + else if (g_menu_state == CURRENT_STATUS_DURATION) + { + g_print("*** input duration: \n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_VIDEO_MIME) + { + g_print("choose video media format mime type\n"); + g_print("0. MEDIA_FORMAT_H264_HP\n"); + g_print("1. MEDIA_FORMAT_RGB888\n"); + g_print("2. MEDIA_FORMAT_I420\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_VIDEO_WIDTH) + { + g_print("input video width:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_VIDEO_HEIGHT) + { + g_print("input video height:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_VIDEO_AVG_BPS) + { + g_print("input video avg_bps:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_VIDEO_MAX_BPS) + { + g_print("input video max_bps:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_AUDIO_MIME) + { + g_print("choose audio media format mime type\n"); + g_print("0. MEDIA_FORMAT_AMR\n"); + g_print("1. MEDIA_FORMAT_PCM\n"); + g_print("2. MEDIA_FORMAT_AAC\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_AUDIO_CHANNEL) + { + g_print("input audio channel:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_AUDIO_SAMPLERATE) + { + g_print("input audio sample rate:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_AUDIO_BIT) + { + g_print("input audio bit:\n"); + } + else if (g_menu_state == CURRENT_STATUS_FORMAT_SET_AUDIO_AVG_BPS) + { + g_print("input audio average bps:\n"); + } + else + { + g_print("*** unknown status.\n"); + quit_program(); + } + g_print(" >>> "); +} + + +gboolean timeout_menu_display(void* data) +{ + displaymenu(); + return FALSE; +} + +static void interpret (char *cmd) +{ + switch (g_menu_state) + { + case CURRENT_STATUS_MAINMENU: + { + _interpret_main_menu(cmd); + } + break; + case CURRENT_STATUS_PACKET_SET_FORMAT: + { + int num = atoi(cmd); + switch (num) + { + case 1: + if(g_media_format[1]) + { + _media_packet_set_format(g_media_format[1]); + } + else + { + _create_format_320_240_es(); + _media_packet_set_format(g_media_format[1]); + } + break; + case 2: + if(g_media_format[2]) + { + _media_packet_set_format(g_media_format[2]); + } + else + { + _create_format_raw(); + _media_packet_set_format(g_media_format[2]); + } + break; + default: + g_print("invalid number.."); + + + } + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_VIDEO_MIME: + { + int video_mime_idx = atoi(cmd); + _media_format_set_video_mime(video_mime_idx); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_VIDEO_WIDTH: + { + int width = atoi(cmd); + _media_format_set_video_width(width); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_VIDEO_HEIGHT: + { + int height = atoi(cmd); + _media_format_set_video_height(height); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_VIDEO_AVG_BPS: + { + int video_avg_bps = atoi(cmd); + _media_format_set_video_avg_bps(video_avg_bps); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_VIDEO_MAX_BPS: + { + int max_bps = atoi(cmd); + _media_format_set_video_max_bps(max_bps); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_AUDIO_MIME: + { + int audio_mime_idx = atoi(cmd); + _media_format_set_audio_mime(audio_mime_idx); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_AUDIO_CHANNEL: + { + int channel = atoi(cmd); + _media_format_set_audio_channel(channel); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_AUDIO_SAMPLERATE: + { + int samplerate = atoi(cmd); + _media_format_set_audio_samplerate(samplerate); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_AUDIO_BIT: + { + int bit = atoi(cmd); + _media_format_set_audio_bit(bit); + reset_menu_state(); + } + break; + case CURRENT_STATUS_FORMAT_SET_AUDIO_AVG_BPS: + { + int audio_avg_bps = atoi(cmd); + _media_format_set_audio_avg_bps(audio_avg_bps); + reset_menu_state(); + } + break; + case CURRENT_STATUS_DURATION: + { + uint64_t duration = atoi(cmd); + _media_packet_set_duration(duration); + reset_menu_state(); + } + } + + g_timeout_add(100, timeout_menu_display, 0); +} + +void display_sub_basic() +{ + g_print("\n"); + g_print("=========================================================================================\n"); + g_print(" media tool test\n"); + g_print("-----------------------------------------------------------------------------------------\n"); + g_print(" *** How to use ***\n"); + g_print(" : You can create 1 media_format_h handle by 'cf' and 1 media_packet_handle \n"); + g_print(" : ex) cf > svm > svw > svh > svab > svmb >fgv > > a > iv > ir ...> d\n"); + g_print(" : media_format_create is set to 'media_format_h[0]' \n"); + g_print(" : media_packet_create_alloc & media_packet_create use 'media_format_h[0]' \n"); + g_print(" : media_packet_create_from_tbm_surface use 'media_format_h[2]' \n"); + g_print("\n"); + g_print("cf. media_format_create\t\t"); + g_print("\n"); + g_print("svm. media_format_set_video_mime\t"); + g_print("svw. media_format_set_video_width\t"); + g_print("svh. media_format_set_video_height\t"); + g_print("svab. media_format_set_video_avg_bps\t"); + g_print("svmb. media_format_set_video_max_bps\t"); + g_print("\n"); + g_print("sam. media_format_set_audio_mime\t"); + g_print("sac. media_format_set_audio_channel\t"); + g_print("sas. media_format_set_audio_samplerate\t"); + g_print("sab. media_format_set_audio_bit \t"); + g_print("saab. media_format_set_audio_avg_bps\t"); + g_print("\n"); + g_print("fgv. media_format_get_video_info \t"); + g_print("fga. media_format_get_audio_info \t\t"); + g_print("\n"); + g_print("\n"); + g_print("a. media_packet_create_alloc(+media_format_unref) \t"); + g_print("aa. media_packet_create(+media_format_unref) \t"); + g_print("b. media_packet_create_from_tbm_surface(+media_format_unref) \n"); + g_print("ab. media_packet_alloc \t\t"); + g_print("c. media_packet_copy \t"); + g_print("\n"); + g_print("\n"); + g_print("iv. media_packet_is_video \t"); + g_print("ia. media_packet_is_audio \t"); + g_print("ie. media_packet_is_encoded \t"); + g_print("ir. media_packet_is_raw \t"); + g_print("ht. media_packet_has_tbm_surface_buffer \t"); + g_print("\n"); + g_print("sd. media_packet_set_duration \t"); + g_print("sf. media_packet_set_format(+media_format_unref) \t"); + g_print("se. media_packet_set_extra \t"); + g_print("\n"); + g_print("gd. media_packet_get_duration \t"); + g_print("gbp. media_packet_get_buffer_data_ptr \t"); + g_print("gts. media_packet_get_tbm_surface \t"); + g_print("gf. media_packet_get_format \t"); + g_print("ge. media_packet_get_extra \t"); + g_print("\n"); + g_print("gs. media_packet_get_buffer_size\t"); + g_print("\n"); + g_print("\n"); + g_print("d. media_packet_destroy \n"); + g_print("q. quit test suite(if exist alive media_format, do media_format_unref)"); + g_print("\n"); + g_print("=========================================================================================\n"); +} + + +gboolean input (GIOChannel *channel) +{ + gchar buf[MAX_STRING_LEN]; + gsize read; + GError *error = NULL; + + g_io_channel_read_chars(channel, buf, MAX_STRING_LEN, &read, &error); + buf[read] = '\0'; + g_strstrip(buf); + interpret (buf); + + return TRUE; +} + +int main(int argc, char *argv[]) +{ + GIOChannel *stdin_channel; + stdin_channel = g_io_channel_unix_new(0); + g_io_channel_set_flags (stdin_channel, G_IO_FLAG_NONBLOCK, NULL); + g_io_add_watch (stdin_channel, G_IO_IN, (GIOFunc)input, NULL); + + displaymenu(); + + ops.data = NULL; + + return appcore_efl_main(PACKAGE, &argc, &argv, &ops); + +} + |